1 #include "include/ipaddr.h"
2 #include "gtest/gtest.h"
4 #if defined(__FreeBSD__)
6 #include <sys/socket.h>
7 #include <netinet/in.h>
12 static void ipv4(struct sockaddr_in
*addr
, const char *s
) {
15 addr
->sin_family
= AF_INET
;
16 err
= inet_pton(AF_INET
, s
, &addr
->sin_addr
);
20 static void ipv6(struct sockaddr_in6
*addr
, const char *s
) {
23 addr
->sin6_family
= AF_INET6
;
24 err
= inet_pton(AF_INET6
, s
, &addr
->sin6_addr
);
28 static char eth0
[] = "eth0";
29 static char eth1
[] = "eth1";
31 TEST(CommonIPAddr
, TestNotFound
)
33 struct ifaddrs one
, two
;
34 struct sockaddr_in a_one
;
35 struct sockaddr_in6 a_two
;
36 struct sockaddr_in net
;
37 const struct sockaddr
*result
;
39 memset(&net
, '0', sizeof(net
));
42 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
46 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
49 ipv4(&a_one
, "10.11.12.13");
50 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
51 ipv4(&net
, "10.11.234.56");
53 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 24);
57 TEST(CommonIPAddr
, TestV4_Simple
)
59 struct ifaddrs one
, two
;
60 struct sockaddr_in a_one
;
61 struct sockaddr_in6 a_two
;
62 struct sockaddr_in net
;
63 const struct sockaddr
*result
;
65 memset(&net
, '0', sizeof(net
));
68 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
72 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
75 ipv4(&a_one
, "10.11.12.13");
76 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
77 ipv4(&net
, "10.11.12.42");
79 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 24);
80 ASSERT_EQ((struct sockaddr
*)&a_one
, result
);
83 TEST(CommonIPAddr
, TestV4_Prefix25
)
85 struct ifaddrs one
, two
;
86 struct sockaddr_in a_one
;
87 struct sockaddr_in a_two
;
88 struct sockaddr_in net
;
89 const struct sockaddr
*result
;
91 memset(&net
, '0', sizeof(net
));
94 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
98 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
101 ipv4(&a_one
, "10.11.12.13");
102 ipv4(&a_two
, "10.11.12.129");
103 ipv4(&net
, "10.11.12.128");
105 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 25);
106 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
109 TEST(CommonIPAddr
, TestV4_Prefix16
)
111 struct ifaddrs one
, two
;
112 struct sockaddr_in a_one
;
113 struct sockaddr_in a_two
;
114 struct sockaddr_in net
;
115 const struct sockaddr
*result
;
117 memset(&net
, '0', sizeof(net
));
120 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
124 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
127 ipv4(&a_one
, "10.1.1.2");
128 ipv4(&a_two
, "10.2.1.123");
129 ipv4(&net
, "10.2.0.0");
131 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 16);
132 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
135 TEST(CommonIPAddr
, TestV4_PrefixTooLong
)
138 struct sockaddr_in a_one
;
139 struct sockaddr_in net
;
140 const struct sockaddr
*result
;
142 memset(&net
, '0', sizeof(net
));
145 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
148 ipv4(&a_one
, "10.11.12.13");
149 ipv4(&net
, "10.11.12.12");
151 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 42);
152 ASSERT_EQ(0, result
);
155 TEST(CommonIPAddr
, TestV4_PrefixZero
)
157 struct ifaddrs one
, two
;
158 struct sockaddr_in6 a_one
;
159 struct sockaddr_in a_two
;
160 struct sockaddr_in net
;
161 const struct sockaddr
*result
;
163 memset(&net
, '0', sizeof(net
));
166 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
170 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
173 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
174 ipv4(&a_two
, "10.1.2.3");
175 ipv4(&net
, "255.0.1.2");
177 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 0);
178 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
181 TEST(CommonIPAddr
, TestV6_Simple
)
183 struct ifaddrs one
, two
;
184 struct sockaddr_in a_one
;
185 struct sockaddr_in6 a_two
;
186 struct sockaddr_in6 net
;
187 const struct sockaddr
*result
;
189 memset(&net
, '0', sizeof(net
));
192 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
196 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
199 ipv4(&a_one
, "10.11.12.13");
200 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
201 ipv6(&net
, "2001:1234:5678:90ab::dead:beef");
203 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 64);
204 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
207 TEST(CommonIPAddr
, TestV6_Prefix57
)
209 struct ifaddrs one
, two
;
210 struct sockaddr_in6 a_one
;
211 struct sockaddr_in6 a_two
;
212 struct sockaddr_in6 net
;
213 const struct sockaddr
*result
;
215 memset(&net
, '0', sizeof(net
));
218 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
222 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
225 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
226 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
227 ipv6(&net
, "2001:1234:5678:90ab::dead:beef");
229 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 57);
230 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
233 TEST(CommonIPAddr
, TestV6_PrefixTooLong
)
236 struct sockaddr_in6 a_one
;
237 struct sockaddr_in6 net
;
238 const struct sockaddr
*result
;
240 memset(&net
, '0', sizeof(net
));
243 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
246 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
247 ipv6(&net
, "2001:1234:5678:900F::cdee");
249 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 9000);
250 ASSERT_EQ(0, result
);
253 TEST(CommonIPAddr
, TestV6_PrefixZero
)
255 struct ifaddrs one
, two
;
256 struct sockaddr_in a_one
;
257 struct sockaddr_in6 a_two
;
258 struct sockaddr_in6 net
;
259 const struct sockaddr
*result
;
262 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
266 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
269 ipv4(&a_one
, "10.2.3.4");
270 ipv6(&a_two
, "2001:f00b::1");
271 ipv6(&net
, "ff00::1");
273 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 0);
274 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
277 TEST(CommonIPAddr
, ParseNetwork_Empty
)
279 struct sockaddr_storage network
;
280 unsigned int prefix_len
;
283 ok
= parse_network("", &network
, &prefix_len
);
284 ASSERT_EQ(ok
, false);
287 TEST(CommonIPAddr
, ParseNetwork_Bad_Junk
)
289 struct sockaddr_storage network
;
290 unsigned int prefix_len
;
293 ok
= parse_network("foo", &network
, &prefix_len
);
294 ASSERT_EQ(ok
, false);
297 TEST(CommonIPAddr
, ParseNetwork_Bad_SlashNum
)
299 struct sockaddr_storage network
;
300 unsigned int prefix_len
;
303 ok
= parse_network("/24", &network
, &prefix_len
);
304 ASSERT_EQ(ok
, false);
307 TEST(CommonIPAddr
, ParseNetwork_Bad_Slash
)
309 struct sockaddr_storage network
;
310 unsigned int prefix_len
;
313 ok
= parse_network("/", &network
, &prefix_len
);
314 ASSERT_EQ(ok
, false);
317 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4
)
319 struct sockaddr_storage network
;
320 unsigned int prefix_len
;
323 ok
= parse_network("123.123.123.123", &network
, &prefix_len
);
324 ASSERT_EQ(ok
, false);
327 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4Slash
)
329 struct sockaddr_storage network
;
330 unsigned int prefix_len
;
333 ok
= parse_network("123.123.123.123/", &network
, &prefix_len
);
334 ASSERT_EQ(ok
, false);
337 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4SlashNegative
)
339 struct sockaddr_storage network
;
340 unsigned int prefix_len
;
343 ok
= parse_network("123.123.123.123/-3", &network
, &prefix_len
);
344 ASSERT_EQ(ok
, false);
347 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4SlashJunk
)
349 struct sockaddr_storage network
;
350 unsigned int prefix_len
;
353 ok
= parse_network("123.123.123.123/foo", &network
, &prefix_len
);
354 ASSERT_EQ(ok
, false);
357 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6
)
359 struct sockaddr_storage network
;
360 unsigned int prefix_len
;
363 ok
= parse_network("2001:1234:5678:90ab::dead:beef", &network
, &prefix_len
);
364 ASSERT_EQ(ok
, false);
367 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6Slash
)
369 struct sockaddr_storage network
;
370 unsigned int prefix_len
;
373 ok
= parse_network("2001:1234:5678:90ab::dead:beef/", &network
, &prefix_len
);
374 ASSERT_EQ(ok
, false);
377 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6SlashNegative
)
379 struct sockaddr_storage network
;
380 unsigned int prefix_len
;
383 ok
= parse_network("2001:1234:5678:90ab::dead:beef/-3", &network
, &prefix_len
);
384 ASSERT_EQ(ok
, false);
387 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6SlashJunk
)
389 struct sockaddr_storage network
;
390 unsigned int prefix_len
;
393 ok
= parse_network("2001:1234:5678:90ab::dead:beef/foo", &network
, &prefix_len
);
394 ASSERT_EQ(ok
, false);
397 TEST(CommonIPAddr
, ParseNetwork_IPv4_0
)
399 struct sockaddr_in network
;
400 struct sockaddr_storage net_storage
;
401 unsigned int prefix_len
;
404 ok
= parse_network("123.123.123.123/0", &net_storage
, &prefix_len
);
405 network
= *(struct sockaddr_in
*) &net_storage
;
407 ASSERT_EQ(0U, prefix_len
);
408 ASSERT_EQ(AF_INET
, network
.sin_family
);
409 ASSERT_EQ(0, network
.sin_port
);
410 struct sockaddr_in want
;
411 ipv4(&want
, "123.123.123.123");
412 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
415 TEST(CommonIPAddr
, ParseNetwork_IPv4_13
)
417 struct sockaddr_in network
;
418 struct sockaddr_storage net_storage
;
419 unsigned int prefix_len
;
422 ok
= parse_network("123.123.123.123/13", &net_storage
, &prefix_len
);
423 network
= *(struct sockaddr_in
*) &net_storage
;
425 ASSERT_EQ(13U, prefix_len
);
426 ASSERT_EQ(AF_INET
, network
.sin_family
);
427 ASSERT_EQ(0, network
.sin_port
);
428 struct sockaddr_in want
;
429 ipv4(&want
, "123.123.123.123");
430 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
433 TEST(CommonIPAddr
, ParseNetwork_IPv4_32
)
435 struct sockaddr_in network
;
436 struct sockaddr_storage net_storage
;
437 unsigned int prefix_len
;
440 ok
= parse_network("123.123.123.123/32", &net_storage
, &prefix_len
);
441 network
= *(struct sockaddr_in
*) &net_storage
;
443 ASSERT_EQ(32U, prefix_len
);
444 ASSERT_EQ(AF_INET
, network
.sin_family
);
445 ASSERT_EQ(0, network
.sin_port
);
446 struct sockaddr_in want
;
447 ipv4(&want
, "123.123.123.123");
448 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
451 TEST(CommonIPAddr
, ParseNetwork_IPv4_42
)
453 struct sockaddr_in network
;
454 struct sockaddr_storage net_storage
;
455 unsigned int prefix_len
;
458 ok
= parse_network("123.123.123.123/42", &net_storage
, &prefix_len
);
459 network
= *(struct sockaddr_in
*) &net_storage
;
461 ASSERT_EQ(42U, prefix_len
);
462 ASSERT_EQ(AF_INET
, network
.sin_family
);
463 ASSERT_EQ(0, network
.sin_port
);
464 struct sockaddr_in want
;
465 ipv4(&want
, "123.123.123.123");
466 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
469 TEST(CommonIPAddr
, ParseNetwork_IPv6_0
)
471 struct sockaddr_in6 network
;
472 struct sockaddr_storage net_storage
;
473 unsigned int prefix_len
;
476 ok
= parse_network("2001:1234:5678:90ab::dead:beef/0", &net_storage
, &prefix_len
);
477 network
= *(struct sockaddr_in6
*) &net_storage
;
479 ASSERT_EQ(0U, prefix_len
);
480 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
481 ASSERT_EQ(0, network
.sin6_port
);
482 struct sockaddr_in6 want
;
483 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
484 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
487 TEST(CommonIPAddr
, ParseNetwork_IPv6_67
)
489 struct sockaddr_in6 network
;
490 struct sockaddr_storage net_storage
;
491 unsigned int prefix_len
;
494 ok
= parse_network("2001:1234:5678:90ab::dead:beef/67", &net_storage
, &prefix_len
);
495 network
= *(struct sockaddr_in6
*) &net_storage
;
497 ASSERT_EQ(67U, prefix_len
);
498 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
499 ASSERT_EQ(0, network
.sin6_port
);
500 struct sockaddr_in6 want
;
501 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
502 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
505 TEST(CommonIPAddr
, ParseNetwork_IPv6_128
)
507 struct sockaddr_in6 network
;
508 struct sockaddr_storage net_storage
;
509 unsigned int prefix_len
;
512 ok
= parse_network("2001:1234:5678:90ab::dead:beef/128", &net_storage
, &prefix_len
);
513 network
= *(struct sockaddr_in6
*) &net_storage
;
515 ASSERT_EQ(128U, prefix_len
);
516 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
517 ASSERT_EQ(0, network
.sin6_port
);
518 struct sockaddr_in6 want
;
519 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
520 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
523 TEST(CommonIPAddr
, ParseNetwork_IPv6_9000
)
525 struct sockaddr_in6 network
;
526 struct sockaddr_storage net_storage
;
527 unsigned int prefix_len
;
530 ok
= parse_network("2001:1234:5678:90ab::dead:beef/9000", &net_storage
, &prefix_len
);
531 network
= *(struct sockaddr_in6
*) &net_storage
;
533 ASSERT_EQ(9000U, prefix_len
);
534 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
535 ASSERT_EQ(0, network
.sin6_port
);
536 struct sockaddr_in6 want
;
537 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
538 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));