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 NELEM(x) sizeof(x)/sizeof(*x)
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;
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 };
51 static char name2oid[] = "sysctl.name2oid";
53 net_test(cyg_addrword_t q)
57 char pbuff[128], name[64], *p;
62 diag_printf("Start sysctl1 test\n");
64 // init_all_network_interfaces();
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");
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)),
84 /* Walk the table using the next function of sysclt */
85 num_elem = NELEM(mib_next)+1;
86 new_oid = mib + NELEM(mib_next);
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);
93 if (errno != ENOENT) {
94 CYG_TEST_FAIL_FINISH("sysclt(mib_name) failed");
100 num_elem = NELEM(mib_next) + (ret / 4);
103 p+=diag_sprintf(p, "%d ",new_oid[i++]);
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");
112 p += diag_sprintf(p, "= %s (", name);
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) {
121 p += diag_sprintf(p, "NODE");
124 p += diag_sprintf(p, "INT");
127 p += diag_sprintf(p, "STRING");
130 p += diag_sprintf(p, "QUAD");
133 p += diag_sprintf(p, "STRUCT");
136 p += diag_sprintf(p, "UINT");
139 p += diag_sprintf(p, "LONG");
142 p += diag_sprintf(p, "ULONG");
145 p += diag_sprintf(p,"Unknown type! (%d)", oid_kind & CTLTYPE);
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");
162 p += diag_sprintf(p," )");
164 p += diag_sprintf(p,"{%d}", num_elem);
165 CYG_TEST_INFO(pbuff);
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)),
177 /* This time with too small a results buffer */
179 ret = sysctlnametomib(name2oid, mib,&num_elem);
180 CYG_TEST_PASS_FAIL((ret == -1) && (errno = ENOMEM),
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),
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)),
198 CYG_TEST_EXIT ("sysctl1 exit");
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
209 0, // entry parameter
210 "Loopback ping test", // Name
213 &thread_handle, // Handle
214 &thread_data // Thread data structure
216 cyg_thread_resume(thread_handle); // Start it
217 cyg_scheduler_start();