1 //==========================================================================
5 // Test network "address" functions
7 //==========================================================================
8 //####BSDCOPYRIGHTBEGIN####
10 // -------------------------------------------
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.
15 // -------------------------------------------
17 //####BSDCOPYRIGHTEND####
18 //==========================================================================
19 //#####DESCRIPTIONBEGIN####
22 // Contributors: gthomas, andrew.lunn@ascom.ch
28 //####DESCRIPTIONEND####
30 //==========================================================================
32 // Networking library test code
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;
47 diag_sprintf(msg, "%s: %s", s, strerror(errno));
48 CYG_TEST_FAIL_FINISH(msg);
52 walk_addrs(struct addrinfo *ai, char *title)
56 diag_printf("INFO: %s\n", title);
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) {
63 if (ai->ai_addrlen != sizeof(struct sockaddr_in)) {
64 CYG_TEST_FAIL("ai_addrlen wrong for an IPv4 address");
67 #ifdef CYGPKG_NET_INET6
69 if (ai->ai_addrlen != sizeof(struct sockaddr_in6)) {
70 CYG_TEST_FAIL("ai_addrlen wrong for an IPv6 address");
75 CYG_TEST_FAIL("Unknown address family");
82 net_test(CYG_ADDRWORD data)
85 struct addrinfo *addrs, hints;
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));
99 walk_addrs(addrs, "all passive");
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");
107 diag_printf("INFO: service: %s\n",serv);
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");
118 walk_addrs(addrs, "all active");
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");
129 walk_addrs(addrs, "IPv4 passive");
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");
140 walk_addrs(addrs, "IPv4 passive 192.168.1.2");
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");
148 diag_printf("INFO: host: %s service: %s\n",host, serv);
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");
159 walk_addrs(addrs, "all passive 192.168.1.2");
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");
171 walk_addrs(addrs, "IPv6 passive");
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");
179 diag_printf("INFO: service: %s\n",serv);
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");
190 walk_addrs(addrs, "all passive");
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))
199 diag_printf("<ERROR> can't getaddrinfo(): %s\n", gai_strerror(err));
200 pexit("getaddrinfo");
202 walk_addrs(addrs, "all passive fe80::260:97ff:feb0:866e");
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");
210 diag_printf("INFO: host: %s service: %s\n",host, serv);
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");
221 walk_addrs(addrs, "all snmp/udp");
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");
229 diag_printf("INFO: service: %s\n",serv);
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");
240 walk_addrs(addrs, "all snmp/udp");
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");
248 diag_printf("INFO: service: %s\n",serv);
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");
259 walk_addrs(addrs, "all snmp/*");
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");
267 diag_printf("INFO: service: %s\n",serv);
270 CYG_TEST_PASS_FINISH("Address [library] test OK");
276 // Create a main thread, so we can run the scheduler and have time 'pass'
277 cyg_thread_create(10, // Priority - just a number
279 0, // entry parameter
280 "Network test", // Name
283 &thread_handle, // Handle
284 &thread_data // Thread data structure
286 cyg_thread_resume(thread_handle); // Start it
287 cyg_scheduler_start();