]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/net/bsd_tcpip/v2_0/tests/sysctl1.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / net / bsd_tcpip / v2_0 / tests / sysctl1.c
1 //==========================================================================
2 //
3 //      tests/sysctl1.c
4 //
5 //      Simple test of sysclt API
6 //
7 //==========================================================================
8 //####BSDCOPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 //
12 // Portions of this software may have been derived from FreeBSD or other sources,
13 // and are covered by the appropriate copyright disclaimers included herein.
14 //
15 // -------------------------------------------
16 //
17 //####BSDCOPYRIGHTEND####
18 //==========================================================================
19 //#####DESCRIPTIONBEGIN####
20 //
21 // Author(s):    andrew lunn
22 // Contributors: andrew lunn
23 // Date:         2003-06-28
24 // Purpose:      
25 // Description:  
26 //              
27 //
28 //####DESCRIPTIONEND####
29 //
30 //==========================================================================
31
32 #include <network.h>
33 #include <sys/sysctl.h>
34
35 #include <cyg/infra/testcase.h>
36
37 #define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x1000)
38 static char stack[STACK_SIZE];
39 static cyg_thread thread_data;
40 static cyg_handle_t thread_handle;
41
42 static int mib_name[] =     { CTL_DEBUG, 1 }; 
43 static int mib_next[] =     { CTL_DEBUG, 2 };
44 static int mib_name2oid[] = { CTL_DEBUG, 3 };
45 static int mib_oidfmt[] =   { CTL_DEBUG, 4 };
46 static int mib_name_debug_name[] = { CTL_DEBUG, 1, CTL_DEBUG, 1 }; 
47 static int mib[10];
48 static char name2oid[] = "sysctl.name2oid";
49 void
50 net_test(cyg_addrword_t q)
51 {
52     char oldbuff[128];
53     size_t oldbuffsize;
54     char pbuff[128], name[64], *p;
55     int *new_oid;
56     size_t num_elem;
57     int ret, i, oid_kind; 
58
59     diag_printf("Start sysctl1 test\n");
60
61     //    init_all_network_interfaces();
62
63     /* Test the OID to name function of sysctl*/
64     oldbuffsize = sizeof(oldbuff);
65     ret = sysctl(mib_name_debug_name, CYG_NELEM(mib_name_debug_name), 
66                  oldbuff, &oldbuffsize, NULL, 0);
67     if (ret == -1) CYG_TEST_FAIL("sysclt(mib_name) failed");
68     CYG_TEST_INFO(oldbuff);
69     CYG_TEST_PASS_FAIL(!strcmp(oldbuff, "sysctl.name"), "sysctl.name");
70
71     /* Test the name to OID function of sysclt */
72     oldbuffsize = sizeof(oldbuff);
73     ret = sysctl(mib_name2oid, CYG_NELEM(mib_name2oid), oldbuff, &oldbuffsize, 
74                  name2oid, sizeof(name2oid));
75     if (ret == -1) CYG_TEST_FAIL("sysclt(mib_name) failed");
76     CYG_TEST_PASS_FAIL(((ret == 8 ) && 
77                         (((int *)&oldbuff)[0] == CTL_DEBUG) &&
78                         (((int *)&oldbuff)[1] == 3)), 
79                        "sysctl.name2oid");
80     
81     /* Walk the table using the next function of sysclt */
82     num_elem = CYG_NELEM(mib_next)+1;
83     new_oid = mib + CYG_NELEM(mib_next);
84     mib[2] = 0;
85     do {
86       memcpy(mib,mib_next,sizeof(mib_next));
87       oldbuffsize = sizeof(mib) - sizeof(mib_next);
88       ret = sysctl(mib, num_elem, new_oid, &oldbuffsize, NULL, 0);
89       if (ret == -1) {
90         if (errno != ENOENT) {
91           CYG_TEST_FAIL_FINISH("sysclt(mib_name) failed");
92         } else {
93           break;
94         }
95       }
96       p = pbuff;
97       num_elem = CYG_NELEM(mib_next) + (ret / 4);
98       i=0;
99       while (ret > 0) {
100         p+=diag_sprintf(p, "%d ",new_oid[i++]);
101         ret -= sizeof(int);
102       }
103       /* Get the name of this oid */
104       oldbuffsize = sizeof(name);
105       memcpy(mib,mib_name,sizeof(mib_name));
106       ret = sysctl(mib, num_elem, name, &oldbuffsize, NULL, 0);
107       if (ret == -1) CYG_TEST_FAIL("sysclt(mib2name) failed");
108       name[ret] = 0;
109       p += diag_sprintf(p, "= %s (", name);
110
111       /* Get the find and format */
112       memcpy(mib,mib_oidfmt,sizeof(mib_oidfmt));
113       ret = sysctl(mib, num_elem, name, &oldbuffsize, NULL, 0);
114       if (ret == -1) CYG_TEST_FAIL("sysclt(mib2name) failed");
115       oid_kind = *(int *)name;
116       switch (oid_kind & CTLTYPE) {
117       case CTLTYPE_NODE:
118         p += diag_sprintf(p, "NODE");
119         break;
120       case CTLTYPE_INT:
121         p += diag_sprintf(p, "INT");
122         break;
123       case CTLTYPE_STRING:
124         p += diag_sprintf(p, "STRING");
125         break;
126       case CTLTYPE_QUAD:
127         p += diag_sprintf(p, "QUAD");
128         break;
129       case CTLTYPE_STRUCT:
130         p += diag_sprintf(p, "STRUCT");
131         break;
132       case CTLTYPE_UINT:
133         p += diag_sprintf(p, "UINT");
134         break;
135       case CTLTYPE_LONG:
136         p += diag_sprintf(p, "LONG");
137         break;
138       case CTLTYPE_ULONG:
139         p += diag_sprintf(p, "ULONG");
140         break;
141       default:
142         p += diag_sprintf(p,"Unknown type! (%d)", oid_kind & CTLTYPE);
143       }
144       if (oid_kind & CTLFLAG_RD) 
145         p += diag_sprintf(p," Read");
146       if (oid_kind & CTLFLAG_WR) 
147         p += diag_sprintf(p," Write");
148       if (oid_kind & CTLFLAG_NOLOCK) 
149         p += diag_sprintf(p," Nolock");
150       if (oid_kind & CTLFLAG_ANYBODY) 
151         p += diag_sprintf(p," Anybody");
152       if (oid_kind & CTLFLAG_SECURE) 
153         p += diag_sprintf(p," Secure");
154       if (oid_kind & CTLFLAG_PRISON) 
155         p += diag_sprintf(p," Prison");
156       if (oid_kind & CTLFLAG_DYN) 
157         p += diag_sprintf(p," Dynamic");
158       
159       p += diag_sprintf(p," )");
160
161       p += diag_sprintf(p,"{%d}", num_elem);
162       CYG_TEST_INFO(pbuff);
163     } while (ret != -1);
164
165     /* Tests for sysctlnametomib */
166     num_elem = CYG_NELEM(mib);
167     ret = sysctlnametomib(name2oid, mib,&num_elem);
168     if (ret == -1) CYG_TEST_FAIL("sysctlnametomib failed");
169     CYG_TEST_PASS_FAIL(((num_elem == 2 ) && 
170                         (((int *)&oldbuff)[0] == CTL_DEBUG) &&
171                         (((int *)&oldbuff)[1] == 3)), 
172                        "sysctlnametooid1");
173
174     /* This time with too small a results buffer */
175     num_elem = 1;
176     ret = sysctlnametomib(name2oid, mib,&num_elem);
177     CYG_TEST_PASS_FAIL((ret == -1) && (errno = ENOMEM), 
178                        "sysctlnametooid2");
179     /* This time with an unknown name */
180     num_elem = CYG_NELEM(mib);
181     ret = sysctlnametomib("unknown.unknown", mib,&num_elem);
182     CYG_TEST_PASS_FAIL((ret == -1) && (errno = ENOENT), 
183                        "sysctlnametooid3");
184
185     /* Tests for sysctlbyname */
186     oldbuffsize = sizeof(oldbuff);
187     ret = sysctlbyname("sysctl.name2oid", oldbuff, &oldbuffsize, 
188                  name2oid, sizeof(name2oid));
189     if (ret == -1) CYG_TEST_FAIL("sysclt(mib_name) failed");
190     CYG_TEST_PASS_FAIL(((ret == 8 ) && 
191                         (((int *)&oldbuff)[0] == CTL_DEBUG) &&
192                         (((int *)&oldbuff)[1] == 3)), 
193                        "sysctlbyname");
194
195     CYG_TEST_EXIT ("sysctl1 exit");
196 }
197
198 void
199 cyg_start(void)
200 {
201     CYG_TEST_INIT();
202
203     // Create a main thread, so we can run the scheduler and have time 'pass'
204     cyg_thread_create(CYGPKG_NET_THREAD_PRIORITY-4,// Priority - just a number
205                       net_test,                 // entry
206                       0,                        // entry parameter
207                       "Loopback ping  test",    // Name
208                       &stack[0],                // Stack
209                       STACK_SIZE,               // Size
210                       &thread_handle,           // Handle
211                       &thread_data              // Thread data structure
212             );
213     cyg_thread_resume(thread_handle);           // Start it
214     cyg_scheduler_start();
215 }
216