]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/net/common/v2_0/tests/addr_test.c
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / net / common / v2_0 / tests / addr_test.c
1 //==========================================================================
2 //
3 //      tests/addr_test.c
4 //
5 //      Test network "address" functions
6 //
7 //==========================================================================
8 //####BSDCOPYRIGHTBEGIN####
9 //
10 // -------------------------------------------
11 //
12 // Portions of this software may have been derived from OpenBSD 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):    gthomas
22 // Contributors: gthomas, andrew.lunn@ascom.ch
23 // Date:         2002-03-19
24 // Purpose:      
25 // Description:  
26 //              
27 //
28 //####DESCRIPTIONEND####
29 //
30 //==========================================================================
31
32 // Networking library test code
33
34 #include <network.h>
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 void
43 pexit(char *s)
44 {
45     char msg[256];
46
47     diag_sprintf(msg, "%s: %s", s, strerror(errno));
48     CYG_TEST_FAIL_FINISH(msg);
49 }
50
51 static void
52 walk_addrs(struct addrinfo *ai, char *title)
53 {
54     char addr_buf[256];
55
56     diag_printf("INFO: %s\n", title);
57     while (ai) {
58         _inet_ntop(ai->ai_addr, addr_buf, sizeof(addr_buf));
59         diag_printf("INFO: Family: %2d, Socket: %d, Addr: %s, Port: %d\n", 
60                     ai->ai_family, ai->ai_socktype, addr_buf, _inet_port(ai->ai_addr));
61         switch (ai->ai_family) {
62         case AF_INET:
63           if (ai->ai_addrlen != sizeof(struct sockaddr_in)) {
64             CYG_TEST_FAIL("ai_addrlen wrong for an IPv4 address");
65           }
66           break;
67 #ifdef CYGPKG_NET_INET6
68         case AF_INET6:
69           if (ai->ai_addrlen != sizeof(struct sockaddr_in6)) {
70             CYG_TEST_FAIL("ai_addrlen wrong for an IPv6 address");
71           }
72           break;
73 #endif
74         default:
75           CYG_TEST_FAIL("Unknown address family");
76         }
77         ai = ai->ai_next;
78     }
79 }
80
81 void 
82 net_test(CYG_ADDRWORD data)
83 {
84     int err;
85     struct addrinfo *addrs, hints;
86     size_t hostlen = 128;
87     size_t servlen = 64;
88     char host[hostlen];
89     char serv[servlen];
90
91     bzero(&hints, sizeof(hints));
92     hints.ai_family = PF_UNSPEC;
93     hints.ai_socktype = SOCK_STREAM;
94     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
95     if ((err = getaddrinfo(NULL, "7734", &hints, &addrs)) != EAI_NONE) {
96         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
97         pexit("getaddrinfo");
98     }
99     walk_addrs(addrs, "all passive");
100
101     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
102                       NULL, 0, serv,servlen, 0);
103     if (err != EAI_NONE) {
104         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
105         pexit("getnameinfo");
106     }
107     diag_printf("INFO: service: %s\n",serv);
108     freeaddrinfo(addrs);
109
110     bzero(&hints, sizeof(hints));
111     hints.ai_family = PF_UNSPEC;
112     hints.ai_socktype = SOCK_STREAM;
113     hints.ai_flags = AI_NUMERICHOST;
114     if ((err = getaddrinfo(NULL, "7734", &hints, &addrs)) != EAI_NONE) {
115         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
116         pexit("getaddrinfo");
117     }
118     walk_addrs(addrs, "all active");
119     freeaddrinfo(addrs);
120
121     bzero(&hints, sizeof(hints));
122     hints.ai_family = PF_INET;
123     hints.ai_socktype = SOCK_STREAM;
124     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
125     if ((err = getaddrinfo(NULL, "7734", &hints, &addrs)) != EAI_NONE) {
126         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
127         pexit("getaddrinfo");
128     }
129     walk_addrs(addrs, "IPv4 passive");
130     freeaddrinfo(addrs);
131
132     bzero(&hints, sizeof(hints));
133     hints.ai_family = PF_INET;
134     hints.ai_socktype = SOCK_STREAM;
135     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
136     if ((err = getaddrinfo("192.168.1.2", "7734", &hints, &addrs)) != EAI_NONE) {
137         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
138         pexit("getaddrinfo");
139     }
140     walk_addrs(addrs, "IPv4 passive 192.168.1.2");
141
142     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
143                       host, hostlen, serv, servlen, NI_NUMERICHOST);
144     if (err != EAI_NONE) {
145         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
146         pexit("getnameinfo");
147     }
148     diag_printf("INFO: host: %s service: %s\n",host, serv);
149     freeaddrinfo(addrs);
150
151     bzero(&hints, sizeof(hints));
152     hints.ai_family = PF_UNSPEC;
153     hints.ai_socktype = SOCK_STREAM;
154     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
155     if ((err = getaddrinfo("192.168.1.2", "7734", &hints, &addrs)) != EAI_NONE) {
156         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
157         pexit("getaddrinfo");
158     }
159     walk_addrs(addrs, "all passive 192.168.1.2");
160     freeaddrinfo(addrs);
161
162 #ifdef CYGPKG_NET_INET6
163     bzero(&hints, sizeof(hints));
164     hints.ai_family = PF_INET6;
165     hints.ai_socktype = SOCK_STREAM;
166     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
167     if ((err = getaddrinfo(NULL, "7734", &hints, &addrs)) != EAI_NONE) {
168         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
169         pexit("getaddrinfo");
170     }
171     walk_addrs(addrs, "IPv6 passive");
172
173     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
174                       NULL, 0, serv,servlen, 0);
175     if (err != EAI_NONE) {
176         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
177         pexit("getnameinfo");
178     }
179     diag_printf("INFO: service: %s\n",serv);
180     freeaddrinfo(addrs);
181     
182     bzero(&hints, sizeof(hints));
183     hints.ai_family = PF_UNSPEC;
184     hints.ai_socktype = SOCK_STREAM;
185     hints.ai_flags = AI_NUMERICHOST;
186     if ((err = getaddrinfo(NULL, "7734", &hints, &addrs)) != EAI_NONE) {
187         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
188         pexit("getaddrinfo");
189     }
190     walk_addrs(addrs, "all passive");
191     freeaddrinfo(addrs);
192     
193     bzero(&hints, sizeof(hints));
194     hints.ai_family = PF_UNSPEC;
195     hints.ai_socktype = SOCK_STREAM;
196     hints.ai_flags = AI_NUMERICHOST;
197     if ((err = getaddrinfo("fe80::260:97ff:feb0:866e", "7734", &hints, &addrs)) 
198         != EAI_NONE) {
199         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
200         pexit("getaddrinfo");
201     }
202     walk_addrs(addrs, "all passive fe80::260:97ff:feb0:866e");
203
204     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
205                       host, hostlen, serv, servlen, NI_NUMERICHOST);
206     if (err != EAI_NONE) {
207         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
208         pexit("getnameinfo");
209     }
210     diag_printf("INFO: host: %s service: %s\n",host, serv);
211     freeaddrinfo(addrs);
212 #endif
213
214     bzero(&hints, sizeof(hints));
215     hints.ai_family = PF_UNSPEC;
216     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
217     if ((err = getaddrinfo(NULL, "ftp", &hints, &addrs)) != EAI_NONE) {
218         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
219         pexit("getaddrinfo");
220     }
221     walk_addrs(addrs, "all snmp/udp");
222
223     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
224                       NULL, 0, serv,servlen, 0);
225     if (err != EAI_NONE) {
226         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
227         pexit("getnameinfo");
228     }
229     diag_printf("INFO: service: %s\n",serv);
230     freeaddrinfo(addrs);
231
232     bzero(&hints, sizeof(hints));
233     hints.ai_family = PF_UNSPEC;
234     hints.ai_socktype = SOCK_DGRAM;
235     hints.ai_flags = AI_PASSIVE|AI_NUMERICHOST;
236     if ((err = getaddrinfo(NULL, "snmp", &hints, &addrs)) != EAI_NONE) {
237         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
238         pexit("getaddrinfo");
239     }
240     walk_addrs(addrs, "all snmp/udp");
241
242     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
243                       NULL, 0, serv,servlen, 0);
244     if (err != EAI_NONE) {
245         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
246         pexit("getnameinfo");
247     }
248     diag_printf("INFO: service: %s\n",serv);
249     freeaddrinfo(addrs);
250     
251     bzero(&hints, sizeof(hints));
252     hints.ai_family = PF_UNSPEC;
253     hints.ai_socktype = 0;
254     hints.ai_flags = AI_NUMERICHOST;
255     if ((err = getaddrinfo(NULL, "snmp", &hints, &addrs)) != EAI_NONE) {
256         diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
257         pexit("getaddrinfo");
258     }
259     walk_addrs(addrs, "all snmp/*");
260
261     err = getnameinfo(addrs->ai_addr, addrs->ai_addrlen, 
262                       NULL, 0, serv,servlen, NI_NUMERICSERV);
263     if (err != EAI_NONE) {
264         diag_printf("<ERROR> can't getnameinfo(): %s\n", gai_strerror(err));
265         pexit("getnameinfo");
266     }
267     diag_printf("INFO: service: %s\n",serv);
268     freeaddrinfo(addrs);
269
270     CYG_TEST_PASS_FINISH("Address [library] test OK");
271
272 }
273 void
274 cyg_start(void)
275 {
276     // Create a main thread, so we can run the scheduler and have time 'pass'
277     cyg_thread_create(10,                // Priority - just a number
278                       net_test,          // entry
279                       0,                 // entry parameter
280                       "Network test",    // Name
281                       &stack[0],         // Stack
282                       STACK_SIZE,        // Size
283                       &thread_handle,    // Handle
284                       &thread_data       // Thread data structure
285             );
286     cyg_thread_resume(thread_handle);  // Start it
287     cyg_scheduler_start();
288 }