20 #include <netinet/in.h>
23 #include <arpa/inet.h>
90 CPPUNIT_ASSERT( !anIPA.
isIPv4() );
92 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
93 CPPUNIT_ASSERT( anIPA.
isIPv6() );
100 struct in_addr outval;
102 inval.s_addr = htonl(0xC0A8640C);
103 outval.s_addr = htonl(0x00000000);
109 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
110 CPPUNIT_ASSERT( anIPA.
isIPv4() );
111 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
113 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
115 CPPUNIT_ASSERT( memcmp(&inval, &outval,
sizeof(
struct in_addr)) == 0 );
121 struct in6_addr inval;
122 struct in6_addr outval = IN6ADDR_ANY_INIT;
124 inval.s6_addr32[0] = htonl(0xC0A8640C);
125 inval.s6_addr32[1] = htonl(0xFFFFFFFF);
126 inval.s6_addr32[2] = htonl(0xFFFFFFFF);
127 inval.s6_addr32[3] = htonl(0xFFFFFFFF);
133 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
134 CPPUNIT_ASSERT( !anIPA.
isIPv4() );
135 CPPUNIT_ASSERT( anIPA.
isIPv6() );
137 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
139 CPPUNIT_ASSERT( memcmp( &inval, &outval,
sizeof(
struct in6_addr)) == 0 );
145 struct sockaddr_in insock;
146 struct sockaddr_in outsock;
148 memset(&insock, 0,
sizeof(
struct sockaddr_in));
149 memset(&outsock, 0,
sizeof(
struct sockaddr_in));
151 insock.sin_family = AF_INET;
152 insock.sin_port = htons(80);
153 insock.sin_addr.s_addr = htonl(0xC0A8640C);
154 #if HAVE_SIN_LEN_IN_SAI
155 insock.sin_len =
sizeof(
struct sockaddr_in);
162 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
163 CPPUNIT_ASSERT( anIPA.
isIPv4() );
164 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
166 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 80, anIPA.
port() );
168 CPPUNIT_ASSERT( memcmp( &insock, &outsock,
sizeof(
struct sockaddr_in)) == 0 );
174 struct sockaddr_in6 insock;
175 struct sockaddr_in6 outsock;
177 memset(&insock, 0,
sizeof(
struct sockaddr_in6));
178 memset(&outsock, 0,
sizeof(
struct sockaddr_in6));
180 insock.sin6_family = AF_INET6;
181 insock.sin6_port = htons(80);
182 insock.sin6_addr.s6_addr32[0] = htonl(0xFFFFFFFF);
183 insock.sin6_addr.s6_addr32[1] = htonl(0x00000000);
184 insock.sin6_addr.s6_addr32[2] = htonl(0x0000FFFF);
185 insock.sin6_addr.s6_addr32[3] = htonl(0xC0A8640C);
186 #if HAVE_SIN6_LEN_IN_SAI
187 insock.sin6_len =
sizeof(
struct sockaddr_in6);
190 Ip::Address anIPA((
const struct sockaddr_in6)insock);
194 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
195 CPPUNIT_ASSERT( !anIPA.
isIPv4() );
196 CPPUNIT_ASSERT( anIPA.
isIPv6() );
198 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 80, anIPA.
port() );
200 CPPUNIT_ASSERT( memcmp( &insock, &outsock,
sizeof(
struct sockaddr_in6)) == 0 );
206 struct sockaddr_in insock;
207 struct sockaddr_in outsock;
209 memset(&insock, 0,
sizeof(
struct sockaddr_in));
210 memset(&outsock, 0,
sizeof(
struct sockaddr_in));
212 insock.sin_family = AF_INET;
213 insock.sin_port = htons(80);
214 insock.sin_addr.s_addr = htonl(0xC0A8640C);
215 #if HAVE_SIN_LEN_IN_SAI
216 insock.sin_len =
sizeof(
struct sockaddr_in);
224 CPPUNIT_ASSERT( !outIPA.
isNoAddr() );
225 CPPUNIT_ASSERT( outIPA.
isIPv4() );
226 CPPUNIT_ASSERT( !outIPA.
isIPv6() );
228 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 80, outIPA.
port() );
230 CPPUNIT_ASSERT( memcmp( &insock, &outsock,
sizeof(
struct sockaddr_in)) == 0 );
236 struct in_addr outval;
237 struct in_addr expectval;
239 expectval.s_addr = htonl(0xC0A8640C);
242 CPPUNIT_ASSERT( hp !=
nullptr );
248 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
249 CPPUNIT_ASSERT( anIPA.
isIPv4() );
250 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
252 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
254 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );
260 struct in_addr outval;
261 struct in_addr expectval;
263 expectval.s_addr = htonl(0xC0A8640C);
269 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
270 CPPUNIT_ASSERT( anIPA.
isIPv4() );
271 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
272 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
275 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );
277 struct in6_addr expectv6;
278 struct in6_addr outval6;
280 expectv6.s6_addr32[0] = htonl(0x20000800);
281 expectv6.s6_addr32[1] = htonl(0x00000000);
282 expectv6.s6_addr32[2] = htonl(0x00000000);
283 expectv6.s6_addr32[3] = htonl(0x00000045);
293 CPPUNIT_ASSERT( !bnIPA.
isNoAddr() );
294 CPPUNIT_ASSERT( !bnIPA.
isIPv4() );
295 CPPUNIT_ASSERT( bnIPA.
isIPv6() );
297 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, bnIPA.
port() );
299 CPPUNIT_ASSERT( memcmp( &expectv6, &outval6,
sizeof(
struct in6_addr)) == 0 );
304 expectv6.s6_addr32[0] = htonl(0xFFFFFFFF);
305 expectv6.s6_addr32[1] = htonl(0xFFF00000);
306 expectv6.s6_addr32[2] = htonl(0x00000000);
307 expectv6.s6_addr32[3] = htonl(0x00000000);
311 CPPUNIT_ASSERT( !cnIPA.
isNoAddr() );
312 CPPUNIT_ASSERT( !cnIPA.
isIPv4() );
313 CPPUNIT_ASSERT( cnIPA.
isIPv6() );
315 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, cnIPA.
port() );
317 CPPUNIT_ASSERT( memcmp( &expectv6, &outval6,
sizeof(
struct in6_addr)) == 0 );
324 struct in_addr inval;
326 inval.s_addr = htonl(0xC0A8640C);
332 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
333 CPPUNIT_ASSERT( anIPA.
isIPv4() );
334 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
336 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
342 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
343 CPPUNIT_ASSERT( !anIPA.
isIPv4() );
344 CPPUNIT_ASSERT( anIPA.
isIPv6() );
346 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
354 struct in_addr valLow;
355 struct in_addr valHigh;
357 valLow.s_addr = htonl(0xC0A8640C);
358 valHigh.s_addr = htonl(0xC0A8640F);
364 CPPUNIT_ASSERT( ( lhsIPA == rhsIPA ) );
365 CPPUNIT_ASSERT( !( lhsIPA != rhsIPA ) );
366 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
367 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
368 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
369 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
375 CPPUNIT_ASSERT( ( lhsIPA == rhsIPA ) );
376 CPPUNIT_ASSERT( !( lhsIPA != rhsIPA ) );
377 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
378 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
379 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
380 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
386 CPPUNIT_ASSERT( ( lhsIPA == rhsIPA ) );
387 CPPUNIT_ASSERT( !( lhsIPA != rhsIPA ) );
388 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
389 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
390 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
391 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
397 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
398 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
399 CPPUNIT_ASSERT( !( lhsIPA >= rhsIPA ) );
400 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
401 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
402 CPPUNIT_ASSERT( ( lhsIPA < rhsIPA ) );
408 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
409 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
410 CPPUNIT_ASSERT( !( lhsIPA >= rhsIPA ) );
411 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
412 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
413 CPPUNIT_ASSERT( ( lhsIPA < rhsIPA ) );
419 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
420 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
421 CPPUNIT_ASSERT( !( lhsIPA >= rhsIPA ) );
422 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
423 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
424 CPPUNIT_ASSERT( ( lhsIPA < rhsIPA ) );
430 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
431 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
432 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
433 CPPUNIT_ASSERT( ( lhsIPA > rhsIPA ) );
434 CPPUNIT_ASSERT( !( lhsIPA <= rhsIPA ) );
435 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
441 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
442 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
443 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
444 CPPUNIT_ASSERT( ( lhsIPA > rhsIPA ) );
445 CPPUNIT_ASSERT( !( lhsIPA <= rhsIPA ) );
446 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
452 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
453 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
454 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
455 CPPUNIT_ASSERT( ( lhsIPA > rhsIPA ) );
456 CPPUNIT_ASSERT( !( lhsIPA <= rhsIPA ) );
457 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
464 struct in_addr inval;
473 inval.s_addr = htonl(0xC0A8640C);
477 CPPUNIT_ASSERT( memcmp(
"192.168.100.12",anIPA.
toStr(buf,
MAX_IPSTRLEN), 14) == 0 );
482 CPPUNIT_ASSERT( memcmp(
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",anIPA.
toStr(buf,
MAX_IPSTRLEN), 39) == 0 );
490 struct in_addr inval;
492 inval.s_addr = htonl(0xC0A8640C);
498 CPPUNIT_ASSERT( memcmp(
"192.168.100.12", buf, 14) == 0 );
501 struct in6_addr ip6val;
503 ip6val.s6_addr32[0] = htonl(0xC0A8640C);
504 ip6val.s6_addr32[1] = htonl(0xFFFFFFFF);
505 ip6val.s6_addr32[2] = htonl(0xFFFFFFFF);
506 ip6val.s6_addr32[3] = htonl(0xFFFFFFFF);
511 CPPUNIT_ASSERT( memcmp(
"[c0a8:640c:ffff:ffff:ffff:ffff:ffff:ffff]", buf, 41) == 0 );
517 struct sockaddr_in sock;
518 sock.sin_addr.s_addr = htonl(0xC0A8640C);
519 sock.sin_port = htons(80);
520 sock.sin_family = AF_INET;
521 #if HAVE_SIN_LEN_IN_SAI
522 sock.sin_len =
sizeof(
struct sockaddr_in);
530 CPPUNIT_ASSERT( memcmp(
"192.168.100.12:80", buf, 17) == 0 );
533 struct sockaddr_in6 ip6val;
535 ip6val.sin6_addr.s6_addr32[0] = htonl(0xC0A8640C);
536 ip6val.sin6_addr.s6_addr32[1] = htonl(0xFFFFFFFF);
537 ip6val.sin6_addr.s6_addr32[2] = htonl(0xFFFFFFFF);
538 ip6val.sin6_addr.s6_addr32[3] = htonl(0xFFFFFFFF);
539 ip6val.sin6_port = htons(80);
540 ip6val.sin6_family = AF_INET6;
541 #if HAVE_SIN6_LEN_IN_SAI
542 ip6val.sin6_len =
sizeof(
struct sockaddr_in6);
548 CPPUNIT_ASSERT( memcmp(
"[c0a8:640c:ffff:ffff:ffff:ffff:ffff:ffff]:80", buf, 44) == 0 );
556 struct in_addr ipv4val;
557 ipv4val.s_addr = htonl(0xC0A8640C);
563 CPPUNIT_ASSERT( memcmp(
"12.100.168.192.in-addr.arpa.",buf, 28) == 0 );
566 CPPUNIT_ASSERT( memcmp(
"12.100.168.192.in-addr.arpa.",buf, 28) == 0 );
569 CPPUNIT_ASSERT( memcmp(
"",buf, 1) == 0 );
571 struct in6_addr ip6val;
573 ip6val.s6_addr32[0] = htonl(0xC0A8640C);
574 ip6val.s6_addr32[1] = htonl(0xFFFFFFFF);
575 ip6val.s6_addr32[2] = htonl(0xFFFFFFFF);
576 ip6val.s6_addr32[3] = htonl(0xFFFFFFFF);
582 CPPUNIT_ASSERT( memcmp(
"f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.c.0.4.6.8.a.0.c.ip6.arpa.",buf,73) == 0 );
594 CPPUNIT_ASSERT_EQUAL( 0,anIPA.
cidr() );
597 CPPUNIT_ASSERT_EQUAL( 128, anIPA.
cidr() );
601 CPPUNIT_ASSERT( !anIPA.
applyMask(129,AF_INET6) );
602 CPPUNIT_ASSERT( !anIPA.
applyMask(33,AF_INET) );
605 CPPUNIT_ASSERT( anIPA.
applyMask(31,AF_INET) );
606 CPPUNIT_ASSERT_EQUAL( 127, anIPA.
cidr() );
609 CPPUNIT_ASSERT( anIPA.
applyMask(127,AF_INET6) );
610 CPPUNIT_ASSERT_EQUAL( 127, anIPA.
cidr() );
614 CPPUNIT_ASSERT_EQUAL( 80, anIPA.
cidr() );
618 CPPUNIT_ASSERT( memcmp(
"ffff:ffff:ffff:ffff:ffff::", buf, 26) == 0 );
622 maskIPA =
"255.255.240.0";
623 CPPUNIT_ASSERT_EQUAL( 20, maskIPA.
cidr() );
625 CPPUNIT_ASSERT_EQUAL( 20, anIPA.
cidr() );
628 struct in_addr btest;
629 CPPUNIT_ASSERT( anIPA.
isIPv4() );
630 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
632 CPPUNIT_ASSERT_EQUAL( (uint32_t)htonl(0xFFFFF000), btest.s_addr );
635 CPPUNIT_ASSERT( memcmp(
"255.255.240.0",anIPA.
toStr(buf,
MAX_IPSTRLEN), 13) == 0 );
642 maskIPA =
"ffff:ffff:fff0::";
644 CPPUNIT_ASSERT( !maskIPA.
isNoAddr() );
646 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
647 CPPUNIT_ASSERT_EQUAL( 44, anIPA.
cidr() );
653 maskIPA =
"::ffff:ffff:f000";
655 CPPUNIT_ASSERT( !maskIPA.
isNoAddr() );
656 CPPUNIT_ASSERT( maskIPA.
isIPv4() );
657 CPPUNIT_ASSERT( !maskIPA.
isIPv6() );
660 CPPUNIT_ASSERT( !maskIPA.
isNoAddr() );
661 CPPUNIT_ASSERT( maskIPA.
isIPv4() );
662 CPPUNIT_ASSERT( !maskIPA.
isIPv6() );
663 CPPUNIT_ASSERT_EQUAL( 20, anIPA.
cidr() );
669 struct addrinfo *expect;
670 struct addrinfo *ipval =
nullptr;
671 struct addrinfo hints;
673 memset(&hints, 0,
sizeof(
struct addrinfo));
675 hints.ai_flags = AI_NUMERICHOST;
680 CPPUNIT_ASSERT( getaddrinfo(
"127.0.0.1",
nullptr, &hints, &expect ) == 0 );
686 CPPUNIT_ASSERT_EQUAL( expect->ai_flags, ipval->ai_flags );
687 CPPUNIT_ASSERT_EQUAL( expect->ai_family, ipval->ai_family );
689 CPPUNIT_ASSERT_EQUAL( expect->ai_addrlen, ipval->ai_addrlen );
691 #if HAVE_SS_LEN_IN_SS
692 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_storage*)expect->ai_addr)->ss_len,
693 ((
struct sockaddr_storage*)ipval->ai_addr)->ss_len );
694 CPPUNIT_ASSERT_EQUAL( (
socklen_t)((
struct sockaddr_storage*)ipval->ai_addr)->ss_len, ipval->ai_addrlen );
696 #if HAVE_SIN6_LEN_IN_SAI
697 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in6*)expect->ai_addr)->sin6_len,
698 ((
struct sockaddr_in6*)ipval->ai_addr)->sin6_len );
699 CPPUNIT_ASSERT_EQUAL( (
socklen_t)((
struct sockaddr_in6*)ipval->ai_addr)->sin6_len, ipval->ai_addrlen );
701 #if HAVE_SIN_LEN_IN_SAI
702 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in*)expect->ai_addr)->sin_len,
703 ((
struct sockaddr_in*)ipval->ai_addr)->sin_len );
704 CPPUNIT_ASSERT_EQUAL( (
socklen_t)((
struct sockaddr_in*)ipval->ai_addr)->sin_len, ipval->ai_addrlen );
707 if (expect->ai_addrlen ==
sizeof(
struct sockaddr_in)) {
709 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in*)expect->ai_addr)->sin_family,
710 ((
struct sockaddr_in*)ipval->ai_addr)->sin_family );
712 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in*)expect->ai_addr)->sin_port,
713 ((
struct sockaddr_in*)ipval->ai_addr)->sin_port );
715 if (expect->ai_addrlen ==
sizeof(
struct sockaddr_in6)) {
717 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in6*)expect->ai_addr)->sin6_family,
718 ((
struct sockaddr_in6*)ipval->ai_addr)->sin6_family );
720 CPPUNIT_ASSERT_EQUAL( ((
struct sockaddr_in6*)expect->ai_addr)->sin6_port,
721 ((
struct sockaddr_in6*)ipval->ai_addr)->sin6_port );
724 CPPUNIT_ASSERT( memcmp( expect->ai_addr, ipval->ai_addr, expect->ai_addrlen ) == 0 );
726 freeaddrinfo(expect);
741 struct in_addr outval;
742 struct in_addr expectval;
744 expectval.s_addr = htonl(0xC0A8640C);
750 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
751 CPPUNIT_ASSERT( anIPA.
isIPv4() );
752 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
753 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
756 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );
763 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
764 CPPUNIT_ASSERT( anIPA.
isIPv4() );
765 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
766 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
769 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );
776 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
777 CPPUNIT_ASSERT( anIPA.
isIPv4() );
778 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
779 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
782 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );
789 CPPUNIT_ASSERT( !anIPA.
isNoAddr() );
790 CPPUNIT_ASSERT( anIPA.
isIPv4() );
791 CPPUNIT_ASSERT( !anIPA.
isIPv6() );
792 CPPUNIT_ASSERT_EQUAL( (
unsigned short) 0, anIPA.
port() );
795 CPPUNIT_ASSERT( memcmp( &expectval, &outval,
sizeof(
struct in_addr)) == 0 );