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