1 //==========================================================================
5 // Simple test of DNS client support
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 // Copyright (C) 2003 Andrew Lunn
14 // eCos is free software; you can redistribute it and/or modify it under
15 // the terms of the GNU General Public License as published by the Free
16 // Software Foundation; either version 2 or (at your option) any later version.
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 // You should have received a copy of the GNU General Public License along
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
27 // As a special exception, if other files instantiate templates or use macros
28 // or inline functions from this file, or you compile this file and link it
29 // with other works to produce a work based on this file, this file does not
30 // by itself cause the resulting work to be covered by the GNU General Public
31 // License. However the source code for this file must still be made available
32 // in accordance with section (3) of the GNU General Public License.
34 // This exception does not invalidate any other reasons why a work based on
35 // this file might be covered by the GNU General Public License.
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
38 // at http://sources.redhat.com/ecos/ecos-license/
39 // -------------------------------------------
40 //####ECOSGPLCOPYRIGHTEND####
41 //==========================================================================
42 //#####DESCRIPTIONBEGIN####
44 // Author(s): andrew.lunn
45 // Contributors: andrew.lunn, jskov
48 // Description: Test DNS functions. Note that the structure below that
49 // control what addresses the test uses. These must be
50 // changed to match the particular testing network in which
51 // the test is to be run.
53 //####DESCRIPTIONEND####
55 //==========================================================================
56 #include <pkgconf/ns_dns.h>
61 #include <arpa/inet.h>
63 #include <cyg/infra/testcase.h>
65 #define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x1000)
66 static char stack[STACK_SIZE];
67 static cyg_thread thread_data;
68 static cyg_handle_t thread_handle;
70 #define NELEM(x) (sizeof(x) / sizeof(x[0]))
84 char * ip_addr_v46_v4;
85 char * ip_addr_v46_v6;
88 struct test_info_s test_info[] = {
89 #if CYGPKG_NS_DNS_TESTS_ELSIS
106 #ifdef CYGPKG_NS_DNS_TESTS_LUNN
109 "3ffe:bc0:8000::839",
125 char * familytoa(int family) {
130 #ifdef CYGPKG_NET_INET6
139 void dns_test(struct test_info_s *info) {
141 struct hostent *hent;
147 size_t hostlen = 128;
149 struct addrinfo * res;
150 struct addrinfo hints;
151 struct sockaddr_in sa4;
152 #ifdef CYGPKG_NET_INET6
153 struct sockaddr_in6 sa6;
154 struct addrinfo *ai4, *ai6;
158 if (inet_pton(AF_INET, info->dns_server_v4, (void *)&addr) < 0) {
159 CYG_TEST_FAIL_FINISH("Error with DNS server address");
161 cyg_dns_res_init(&addr);
163 setdomainname(NULL,0);
165 inet_aton(info->ip_addr_v4, &addr);
166 strcpy(name,info->hostname_v4);
168 strcat(name,info->domain_name);
169 strcpy(cname,info->cname_v4);
171 strcat(cname,info->domain_name);
173 // Lookup the IPv4 FQDN hostname
174 hent = gethostbyname(name);
176 diag_sprintf(buffer,"Lookup %s: Result <%s is %s>",
179 inet_ntoa(*(struct in_addr *)hent->h_addr));
180 CYG_TEST_INFO(buffer);
181 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
182 (void*)(hent->h_addr),
183 sizeof(struct in_addr))),
184 "IPv4 FQDN hostname address");
185 CYG_TEST_PASS_FAIL((0 == strcmp(name, hent->h_name)),
186 "IPv4 FQDN hostname name");
188 diag_sprintf(buffer,"IPv4 FQDN hostname: error %s",
190 CYG_TEST_FAIL(buffer);
193 // Lookup the IPv4 FQDN cname
194 hent = gethostbyname(cname);
196 diag_sprintf(buffer,"Lookup %s: Result <%s is %s>",
199 inet_ntoa(*(struct in_addr *)hent->h_addr));
200 CYG_TEST_INFO(buffer);
201 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
202 (void*)(hent->h_addr),
203 sizeof(struct in_addr))),
204 "IPv4 FQDN cname address");
205 CYG_TEST_PASS_FAIL((0 == strcmp(name, hent->h_name)),
206 "IPv4 FQDN hostname name");
208 diag_sprintf(buffer,"IPv4 FQDN cname: error %s", hstrerror(h_errno));
209 CYG_TEST_FAIL(buffer);
212 // Lookup the IP address as a string. This does not require a DNS
213 // lookup. Just turn the value into binary
214 hent = gethostbyname(info->ip_addr_v4);
216 diag_sprintf(buffer,"Lookup %s: Result <%s is %s>",
219 inet_ntoa(*(struct in_addr *)hent->h_addr));
220 CYG_TEST_INFO(buffer);
221 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
222 (void*)(hent->h_addr),
223 sizeof(struct in_addr))),
225 CYG_TEST_PASS_FAIL((0 == strcmp(info->ip_addr_v4, hent->h_name)),
226 "IPv4 IP address name");
229 diag_sprintf(buffer,"IPv4 IP address: error %s", hstrerror(h_errno));
230 CYG_TEST_FAIL(buffer);
233 // Reverse lookup the IPv4 address, expect the FQDN hostname
234 hent = gethostbyaddr((char *)&addr, sizeof(struct in_addr), AF_INET);
236 inet_ntop(AF_INET,(void *)&addr, buff, sizeof(buff));
237 diag_sprintf(buffer,"Reverse lookup %s: Result <%s is %s>",
240 inet_ntoa(*(struct in_addr *)hent->h_addr));
241 CYG_TEST_INFO(buffer);
242 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
243 (void*)(hent->h_addr),
244 sizeof(struct in_addr))),
245 "Reverse lookup IPv4 IP address");
247 CYG_TEST_PASS_FAIL((0 == strcmp(name, hent->h_name)),
248 "Reverse lookup IPv4 IP address name");
250 diag_sprintf(buffer,"Reverse lookup IPv4 IP address: error %s",
252 CYG_TEST_FAIL(buffer);
255 // Setup a domainname. We now don't have to use fully qualified
257 setdomainname(info->domain_name, strlen(info->domain_name));
258 getdomainname(dn, sizeof(dn));
259 CYG_TEST_PASS_FAIL(0 == strcmp(info->domain_name, dn),
260 "{get|set}domainname");
262 // Make sure FQDN still work
263 strcpy(name,info->hostname_v4);
265 strcat(name,info->domain_name);
267 hent = gethostbyname(name);
269 diag_sprintf(buffer,"Lookup %s: Result <%s is %s>",
272 inet_ntoa(*(struct in_addr *)hent->h_addr));
273 CYG_TEST_INFO(buffer);
274 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
275 (void*)(hent->h_addr),
276 sizeof(struct in_addr))),
277 "IPv4 FQDN hostname address");
278 CYG_TEST_PASS_FAIL((0 == strcmp(name, hent->h_name)),
279 "IPv4 FQDN hostname name");
281 diag_sprintf(buffer,"IPv4 FQDN hostname: error %s",
283 CYG_TEST_FAIL(buffer);
286 // Now just the hostname
287 hent = gethostbyname(info->hostname_v4);
289 diag_sprintf(buffer,"Lookup %s: Result <%s is %s>",
292 inet_ntoa(*(struct in_addr *)hent->h_addr));
293 CYG_TEST_INFO(buffer);
294 CYG_TEST_PASS_FAIL((0 == memcmp((void*)&addr,
295 (void*)(hent->h_addr),
296 sizeof(struct in_addr))),
297 "IPv4 hostname address");
298 CYG_TEST_PASS_FAIL((0 == strcmp(name, hent->h_name)),
299 "IPv4 hostname name");
301 diag_sprintf(buffer,"IPv4 hostname: error %s", hstrerror(h_errno));
302 CYG_TEST_FAIL(buffer);
305 // Run the same tests as above, but this time use getaddrinfo and
307 setdomainname(NULL,0);
309 memset(&hints,0,sizeof(hints));
310 hints.ai_flags = AI_CANONNAME;
311 memset(&sa4,0,sizeof(sa4));
312 memcpy(&sa4.sin_addr, &addr, sizeof(addr));
313 sa4.sin_family=AF_INET;
314 sa4.sin_len = sizeof(sa4);
316 // Lookup the IPv4 FQDN hostname
317 error = getaddrinfo(name, NULL, &hints, &res);
319 if (error == EAI_NONE) {
320 getnameinfo(res->ai_addr, res->ai_addrlen,
322 NULL,0,NI_NUMERICHOST);
323 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
326 familytoa(res->ai_family),
328 CYG_TEST_INFO(buffer);
329 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
332 (res->ai_family == AF_INET),
333 "IPv4 FQDN hostname address");
334 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
335 "IPv4 FQDN hostname name");
336 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
337 "IPv4 FQDN hostname one result");
340 diag_sprintf(buffer,"IPv4 FQDN hostname: error %s",
341 gai_strerror(error));
342 CYG_TEST_FAIL(buffer);
345 // Lookup the IPv4 FQDN cname
346 error = getaddrinfo(cname, NULL, &hints, &res);
348 if (error == EAI_NONE) {
349 getnameinfo(res->ai_addr, res->ai_addrlen,
351 NULL,0,NI_NUMERICHOST);
352 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
355 familytoa(res->ai_family),
357 CYG_TEST_INFO(buffer);
358 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
361 (res->ai_family == AF_INET),
362 "IPv4 FQDN cname address");
363 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
364 "IPv4 FQDN cname name");
365 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
366 "IPv4 FQDN cname one result");
369 diag_sprintf(buffer,"IPv4 FQDN cname: error %s", gai_strerror(error));
370 CYG_TEST_FAIL(buffer);
373 // Lookup the IP address as a string. This does not require a DNS
374 // lookup. Just turn the value into binary
375 hints.ai_flags = AI_NUMERICHOST;
376 error = getaddrinfo(info->ip_addr_v4, NULL, &hints, &res);
378 if (error == EAI_NONE) {
379 getnameinfo(res->ai_addr, res->ai_addrlen,
381 NULL,0,NI_NUMERICHOST);
382 diag_sprintf(buffer,"Lookup %s: Result <%s %s>",
384 familytoa(res->ai_family),
386 CYG_TEST_INFO(buffer);
387 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
390 (res->ai_family == AF_INET),
392 CYG_TEST_PASS_FAIL((NULL == res->ai_canonname),
393 "IPv4 IP address name");
394 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
395 "IPv4 IP address one result");
396 // Don't free results - use for next test.
398 diag_sprintf(buffer,"IPv4 IP address: error %s", gai_strerror(error));
399 CYG_TEST_FAIL(buffer);
402 // Reverse lookup the IPv4 address, expect the FQDN hostname
403 error = getnameinfo(res->ai_addr,res->ai_addrlen,
404 host, hostlen, NULL, 0, 0);
405 if (error == EAI_NONE) {
406 diag_sprintf(buffer, "IPv4 Reverse lookup FDQN %s: Result %s",
409 CYG_TEST_INFO(buffer);
410 CYG_TEST_PASS_FAIL((0 == strcmp(name, host)),
411 "IPv4 Reverse lookup FQDN");
413 diag_sprintf(buffer,"IPv4 Reverse lookup FQDN: error %s",
414 gai_strerror(error));
415 CYG_TEST_FAIL(buffer);
417 // Reverse lookup the IPv4 address, expect just the hostname part
418 error = getnameinfo(res->ai_addr,res->ai_addrlen,
419 host, hostlen, NULL, 0, NI_NOFQDN);
420 if (error == EAI_NONE) {
421 diag_sprintf(buffer, "IPv4 Reverse lookup hostname part %s: Result %s",
424 CYG_TEST_INFO(buffer);
425 CYG_TEST_PASS_FAIL((0 == strcmp(info->hostname_v4, host)),
426 "IPv4 Reverse lookup hostname part");
428 diag_sprintf(buffer,"IPv4 Reverse lookup hostname part: error %s",
429 gai_strerror(error));
430 CYG_TEST_FAIL(buffer);
434 // Setup a domainname. We now don't have to use fully qualified
436 setdomainname(info->domain_name, strlen(info->domain_name));
437 getdomainname(dn, sizeof(dn));
438 CYG_TEST_PASS_FAIL(0 == strcmp(info->domain_name, dn),
439 "{get|set}domainname");
441 // Lookup the IPv4 FQDN hostname to make sure it still works
442 hints.ai_flags = AI_CANONNAME;
443 error = getaddrinfo(name, NULL, &hints, &res);
445 if (error == EAI_NONE) {
446 getnameinfo(res->ai_addr, res->ai_addrlen,
448 NULL,0,NI_NUMERICHOST);
449 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
452 familytoa(res->ai_family),
454 CYG_TEST_INFO(buffer);
455 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
458 (res->ai_family == AF_INET),
459 "IPv4 FQDN hostname address");
460 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
461 "IPv4 FQDN hostname name");
462 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
463 "IPv4 FQDN hostname one result");
466 diag_sprintf(buffer,"IPv4 FQDN hostname: error %s",
467 gai_strerror(error));
468 CYG_TEST_FAIL(buffer);
471 // Now the host name without the domain name
472 error = getaddrinfo(info->hostname_v4, NULL, &hints, &res);
474 if (error == EAI_NONE) {
475 getnameinfo(res->ai_addr, res->ai_addrlen,
477 NULL,0,NI_NUMERICHOST);
478 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
481 familytoa(res->ai_family),
483 CYG_TEST_INFO(buffer);
484 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
487 (res->ai_family == AF_INET),
488 "IPv4 hostname address");
489 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
490 "IPv4 hostname name");
491 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
492 "IPv4 hostname one result");
495 diag_sprintf(buffer,"IPv4 hostname: error %s",
496 gai_strerror(error));
497 CYG_TEST_FAIL(buffer);
499 #ifdef CYGPKG_NET_INET6
500 // Check we have the needed information for the IPv6 tests
501 if (!info->hostname_v6 || !info->cname_v6 || !info->ip_addr_v6) {
505 setdomainname(NULL,0);
507 strcpy(name,info->hostname_v6);
509 strcat(name,info->domain_name);
510 strcpy(cname,info->cname_v6);
512 strcat(cname,info->domain_name);
514 memset(&sa6,0,sizeof(sa6));
515 sa6.sin6_family = AF_INET6;
516 sa6.sin6_len = sizeof(sa6);
517 inet_pton(AF_INET6, info->ip_addr_v6, (void *)&sa6.sin6_addr);
519 // Lookup the IPv6 FQDN hostname
520 error = getaddrinfo(name, NULL, &hints, &res);
522 if (error == EAI_NONE) {
523 getnameinfo(res->ai_addr, res->ai_addrlen,
525 NULL,0,NI_NUMERICHOST);
526 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
529 familytoa(res->ai_family),
531 CYG_TEST_INFO(buffer);
532 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
535 (res->ai_family == AF_INET6),
536 "IPv6 FQDN hostname address");
537 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
538 "IPv6 FQDN hostname name");
539 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
540 "IPv6 FQDN hostname one result");
543 diag_sprintf(buffer,"IPv6 FQDN hostname: error %s",
544 gai_strerror(error));
545 CYG_TEST_FAIL(buffer);
548 // Lookup the IPv6 FQDN cname
549 error = getaddrinfo(cname, NULL, &hints, &res);
551 if (error == EAI_NONE) {
552 getnameinfo(res->ai_addr, res->ai_addrlen,
554 NULL,0,NI_NUMERICHOST);
555 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
558 familytoa(res->ai_family),
560 CYG_TEST_INFO(buffer);
561 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
564 (res->ai_family == AF_INET6),
565 "IPv6 FQDN cname address");
566 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
567 "IPv6 FQDN cname name");
568 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
569 "IPv6 FQDN cname one result");
572 diag_sprintf(buffer,"IPv6 FQDN cname: error %s",
573 gai_strerror(error));
574 CYG_TEST_FAIL(buffer);
577 // Lookup the IP address as a string. This does not require a DNS
578 // lookup. Just turn the value into binary
579 hints.ai_flags = AI_NUMERICHOST;
580 error = getaddrinfo(info->ip_addr_v6, NULL, &hints, &res);
582 if (error == EAI_NONE) {
583 getnameinfo(res->ai_addr, res->ai_addrlen,
585 NULL,0,NI_NUMERICHOST);
586 diag_sprintf(buffer,"Lookup %s: Result <%s %s>",
588 familytoa(res->ai_family),
590 CYG_TEST_INFO(buffer);
591 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
594 (res->ai_family == AF_INET6),
596 CYG_TEST_PASS_FAIL((NULL == res->ai_canonname),
597 "IPv6 IP address name");
598 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
599 "IPv6 IP address one result");
600 // Don't free the result, use it in the next tests
602 diag_sprintf(buffer,"IPv6 IP address: error %s", gai_strerror(error));
603 CYG_TEST_FAIL(buffer);
606 // Reverse lookup the IPv6 address, expect the FQDN hostname
607 error = getnameinfo(res->ai_addr,res->ai_addrlen,
608 host, hostlen, NULL, 0, 0);
609 if (error == EAI_NONE) {
610 diag_sprintf(buffer, "IPv6 Reverse lookup FDQN %s: Result %s",
613 CYG_TEST_INFO(buffer);
614 CYG_TEST_PASS_FAIL((0 == strcmp(name, host)),
615 "IPv6 Reverse lookup FQDN");
617 diag_sprintf(buffer,"IPv6 Reverse lookup FQDN: error %s",
618 gai_strerror(error));
619 CYG_TEST_FAIL(buffer);
621 // Reverse lookup the IPv6 address, expect just the hostname part
622 error = getnameinfo(res->ai_addr,res->ai_addrlen,
623 host, hostlen, NULL, 0, NI_NOFQDN);
624 if (error == EAI_NONE) {
625 diag_sprintf(buffer, "IPv6 Reverse lookup hostname part %s: Result %s",
628 CYG_TEST_INFO(buffer);
629 CYG_TEST_PASS_FAIL((0 == strcmp(info->hostname_v6, host)),
630 "IPv6 Reverse lookup hostname part");
632 diag_sprintf(buffer,"IPv6 Reverse lookup hostname part: error %s",
633 gai_strerror(error));
634 CYG_TEST_FAIL(buffer);
638 // Setup a domainname. We now don't have to use fully qualified
640 setdomainname(info->domain_name, strlen(info->domain_name));
641 getdomainname(dn, sizeof(dn));
642 CYG_TEST_PASS_FAIL(0 == strcmp(info->domain_name, dn),
643 "{get|set}domainname");
645 // Lookup the IPv6 FQDN hostname to make sure it still works
646 hints.ai_flags = AI_CANONNAME;
647 error = getaddrinfo(name, NULL, &hints, &res);
649 if (error == EAI_NONE) {
650 getnameinfo(res->ai_addr, res->ai_addrlen,
652 NULL,0,NI_NUMERICHOST);
653 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
656 familytoa(res->ai_family),
658 CYG_TEST_INFO(buffer);
659 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
662 (res->ai_family == AF_INET6),
663 "IPv6 FQDN hostname address");
664 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
665 "IPv6 FQDN hostname name");
666 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
667 "IPv6 FQDN hostname one result");
670 diag_sprintf(buffer,"IPv6 FQDN hostname: error %s",
671 gai_strerror(error));
672 CYG_TEST_FAIL(buffer);
675 // Now the host name without the domain name
676 error = getaddrinfo(info->hostname_v6, NULL, &hints, &res);
678 if (error == EAI_NONE) {
679 getnameinfo(res->ai_addr, res->ai_addrlen,
681 NULL,0,NI_NUMERICHOST);
682 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
685 familytoa(res->ai_family),
687 CYG_TEST_INFO(buffer);
688 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
691 (res->ai_family == AF_INET6),
692 "IPv6 hostname address");
693 CYG_TEST_PASS_FAIL((0 == strcmp(name, res->ai_canonname)),
694 "IPv6 hostname name");
695 CYG_TEST_PASS_FAIL((NULL == res->ai_next),
696 "IPv6 hostname one result");
699 diag_sprintf(buffer,"IPv6 hostname: error %s",
700 gai_strerror(error));
701 CYG_TEST_FAIL(buffer);
704 // Check if we have the information to do tests which result in two
705 // answers, an AF_INET and an AF_INET6
706 if (!info->hostname_v46 || !info->cname_v46 ||
707 !info->ip_addr_v46_v4 || !info->ip_addr_v46_v6 ) {
710 setdomainname(NULL,0);
712 strcpy(name,info->hostname_v46);
714 strcat(name,info->domain_name);
715 strcpy(cname,info->cname_v46);
717 strcat(cname,info->domain_name);
719 inet_aton(info->ip_addr_v46_v4, &addr);
720 memset(&sa4,0,sizeof(sa4));
721 memcpy(&sa4.sin_addr, &addr, sizeof(addr));
722 sa4.sin_family=AF_INET;
723 sa4.sin_len = sizeof(sa4);
725 memset(&sa6,0,sizeof(sa6));
726 sa6.sin6_family = AF_INET6;
727 sa6.sin6_len = sizeof(sa6);
728 inet_pton(AF_INET6, info->ip_addr_v46_v6, (void *)&sa6.sin6_addr);
730 // Lookup the IPv4 and IPv6 FQDN hostname
731 error = getaddrinfo(name, NULL, &hints, &res);
733 if (error == EAI_NONE) {
734 #ifdef CYGOPT_NS_DNS_FIRST_FAMILY_AF_INET6
737 CYG_TEST_PASS_FAIL((NULL != ai6->ai_next),
738 "IPv6 FQDN hostname not one result");
739 CYG_TEST_PASS_FAIL((NULL == ai4->ai_next),
740 "IPv4 & IPv6 FQDN hostname two results");
744 CYG_TEST_PASS_FAIL((NULL != ai4->ai_next),
745 "IPv6 FQDN hostname not one result");
746 CYG_TEST_PASS_FAIL((NULL == ai6->ai_next),
747 "IPv4 & IPv6 FQDN hostname two results");
749 getnameinfo(ai4->ai_addr, ai4->ai_addrlen,
751 NULL,0,NI_NUMERICHOST);
752 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
755 familytoa(ai4->ai_family),
757 CYG_TEST_INFO(buffer);
758 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
761 (ai4->ai_family == AF_INET),
762 "IPv4 & IPv6 FQDN hostname address IPv4");
763 CYG_TEST_PASS_FAIL((0 == strcmp(name, ai4->ai_canonname)),
764 "IPv4 & IPv6 FQDN hostname name");
765 getnameinfo(ai6->ai_addr, ai6->ai_addrlen,
767 NULL,0,NI_NUMERICHOST);
768 diag_sprintf(buffer,"Lookup %s: Result <%s %s>",
770 familytoa(ai6->ai_family),
772 CYG_TEST_INFO(buffer);
773 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
776 (ai6->ai_family == AF_INET6),
777 "IPv4 & IPv6 FQDN hostname address IPv6");
780 diag_sprintf(buffer,"IPv4 & IPv6 FQDN hostname: error %s",
781 gai_strerror(error));
782 CYG_TEST_FAIL(buffer);
785 // Lookup the IPv4 and IPv6 FQDN cname
786 error = getaddrinfo(cname, NULL, &hints, &res);
788 if (error == EAI_NONE) {
789 #ifdef CYGOPT_NS_DNS_FIRST_FAMILY_AF_INET6
792 CYG_TEST_PASS_FAIL((NULL != ai6->ai_next),
793 "IPv6 FQDN hostname not one result");
794 CYG_TEST_PASS_FAIL((NULL == ai4->ai_next),
795 "IPv4 & IPv6 FQDN hostname two results");
799 CYG_TEST_PASS_FAIL((NULL != ai4->ai_next),
800 "IPv6 FQDN hostname not one result");
801 CYG_TEST_PASS_FAIL((NULL == ai6->ai_next),
802 "IPv4 & IPv6 FQDN hostname two results");
804 getnameinfo(ai4->ai_addr, ai4->ai_addrlen,
806 NULL,0,NI_NUMERICHOST);
807 diag_sprintf(buffer,"Lookup %s: Result <%s is %s %s>",
810 familytoa(ai4->ai_family),
812 CYG_TEST_INFO(buffer);
813 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
816 (ai4->ai_family == AF_INET),
817 "IPv4 & IPv6 FQDN cname address IPv4");
818 CYG_TEST_PASS_FAIL((0 == strcmp(name, ai4->ai_canonname)),
819 "IPv4 & IPv6 FQDN cname name");
820 getnameinfo(ai6->ai_addr, ai6->ai_addrlen,
822 NULL,0,NI_NUMERICHOST);
823 diag_sprintf(buffer,"Lookup %s: Result <%s %s>",
825 familytoa(ai6->ai_family),
827 CYG_TEST_INFO(buffer);
828 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
831 (ai6->ai_family == AF_INET6),
832 "IPv4 & IPv6 FQDN cname address IPv6");
835 diag_sprintf(buffer,"IPv4 & IPv6 FQDN cname: error %s",
836 gai_strerror(error));
837 CYG_TEST_FAIL(buffer);
840 if (info->dns_server_v6) {
841 cyg_dns_res_start(info->dns_server_v6);
842 // Lookup the IPv4 and IPv6 FQDN cname
843 error = getaddrinfo(cname, NULL, &hints, &res);
845 if (error == EAI_NONE) {
846 #ifdef CYGOPT_NS_DNS_FIRST_FAMILY_AF_INET6
849 CYG_TEST_PASS_FAIL((NULL != ai6->ai_next),
850 "[IPv6] IPv6 FQDN hostname not one result");
851 CYG_TEST_PASS_FAIL((NULL == ai4->ai_next),
852 "[IPv6] IPv4 & IPv6 FQDN hostname two results");
856 CYG_TEST_PASS_FAIL((NULL != ai4->ai_next),
857 "[IPv6] IPv6 FQDN hostname not one result");
858 CYG_TEST_PASS_FAIL((NULL == ai6->ai_next),
859 "[IPv6] IPv4 & IPv6 FQDN hostname two results");
861 getnameinfo(ai4->ai_addr, ai4->ai_addrlen,
863 NULL,0,NI_NUMERICHOST);
864 diag_sprintf(buffer,"[IPv6] Lookup %s: Result <%s is %s %s>",
867 familytoa(ai4->ai_family),
869 CYG_TEST_INFO(buffer);
870 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa4,
873 (ai4->ai_family == AF_INET),
874 "[IPv6] IPv4 & IPv6 FQDN cname address IPv4");
875 CYG_TEST_PASS_FAIL((0 == strcmp(name, ai4->ai_canonname)),
876 "[IPv6] IPv4 & IPv6 FQDN cname name");
877 getnameinfo(ai6->ai_addr, ai6->ai_addrlen,
879 NULL,0,NI_NUMERICHOST);
880 diag_sprintf(buffer,"[IPv6] Lookup %s: Result <%s %s>",
882 familytoa(ai6->ai_family),
884 CYG_TEST_INFO(buffer);
885 CYG_TEST_PASS_FAIL((0 == memcmp((void *)&sa6,
888 (ai6->ai_family == AF_INET6),
889 "[IPv6] IPv4 & IPv6 FQDN cname address IPv6");
892 diag_sprintf(buffer,"[IPv6] IPv4 & IPv6 FQDN cname: error %s",
893 gai_strerror(error));
894 CYG_TEST_FAIL(buffer);
901 dns_test_thread(cyg_addrword_t p)
907 init_all_network_interfaces();
909 CYG_TEST_INFO("Starting dns1 test");
911 for (i = 0; i < NELEM(test_info); i++) {
912 dns_test(&test_info[i]);
915 CYG_TEST_FINISH("dns1 test completed");
921 // Create a main thread, so we can run the scheduler and have time 'pass'
922 cyg_thread_create(10, // Priority - just a number
923 dns_test_thread, // entry
924 0, // entry parameter
928 &thread_handle, // Handle
929 &thread_data // Thread data structure
931 cyg_thread_resume(thread_handle); // Start it
932 cyg_scheduler_start();