1 //==========================================================================
5 // Simple test of sysclt API
7 //==========================================================================
8 //####BSDCOPYRIGHTBEGIN####
10 // -------------------------------------------
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.
15 // -------------------------------------------
17 //####BSDCOPYRIGHTEND####
18 //==========================================================================
19 //#####DESCRIPTIONBEGIN####
21 // Author(s): andrew lunn
22 // Contributors: andrew lunn
28 //####DESCRIPTIONEND####
30 //==========================================================================
33 #include <sys/sysctl.h>
35 #include <cyg/infra/testcase.h>
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;
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 };
48 static char name2oid[] = "sysctl.name2oid";
50 net_test(cyg_addrword_t q)
54 char pbuff[128], name[64], *p;
59 diag_printf("Start sysctl1 test\n");
61 // init_all_network_interfaces();
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");
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)),
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);
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);
90 if (errno != ENOENT) {
91 CYG_TEST_FAIL_FINISH("sysclt(mib_name) failed");
97 num_elem = CYG_NELEM(mib_next) + (ret / 4);
100 p+=diag_sprintf(p, "%d ",new_oid[i++]);
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");
109 p += diag_sprintf(p, "= %s (", name);
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) {
118 p += diag_sprintf(p, "NODE");
121 p += diag_sprintf(p, "INT");
124 p += diag_sprintf(p, "STRING");
127 p += diag_sprintf(p, "QUAD");
130 p += diag_sprintf(p, "STRUCT");
133 p += diag_sprintf(p, "UINT");
136 p += diag_sprintf(p, "LONG");
139 p += diag_sprintf(p, "ULONG");
142 p += diag_sprintf(p,"Unknown type! (%d)", oid_kind & CTLTYPE);
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");
159 p += diag_sprintf(p," )");
161 p += diag_sprintf(p,"{%d}", num_elem);
162 CYG_TEST_INFO(pbuff);
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)),
174 /* This time with too small a results buffer */
176 ret = sysctlnametomib(name2oid, mib,&num_elem);
177 CYG_TEST_PASS_FAIL((ret == -1) && (errno = ENOMEM),
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),
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)),
195 CYG_TEST_EXIT ("sysctl1 exit");
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
206 0, // entry parameter
207 "Loopback ping test", // Name
210 &thread_handle, // Handle
211 &thread_data // Thread data structure
213 cyg_thread_resume(thread_handle); // Start it
214 cyg_scheduler_start();