1 #include "include/ipaddr.h"
2 #include "common/pick_address.h"
3 #include "global/global_context.h"
4 #include "gtest/gtest.h"
6 #if defined(__FreeBSD__)
8 #include <sys/socket.h>
9 #include <netinet/in.h>
11 #include <arpa/inet.h>
14 static void ipv4(struct sockaddr_in
*addr
, const char *s
) {
17 addr
->sin_family
= AF_INET
;
18 err
= inet_pton(AF_INET
, s
, &addr
->sin_addr
);
22 static void ipv6(struct sockaddr_in6
*addr
, const char *s
) {
25 addr
->sin6_family
= AF_INET6
;
26 err
= inet_pton(AF_INET6
, s
, &addr
->sin6_addr
);
30 static char eth0
[] = "eth0";
31 static char eth1
[] = "eth1";
33 TEST(CommonIPAddr
, TestNotFound
)
35 struct ifaddrs one
, two
;
36 struct sockaddr_in a_one
;
37 struct sockaddr_in6 a_two
;
38 struct sockaddr_in net
;
39 const struct ifaddrs
*result
;
41 memset(&net
, '0', sizeof(net
));
44 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
48 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
51 ipv4(&a_one
, "10.11.12.13");
52 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
53 ipv4(&net
, "10.11.234.56");
55 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 24);
59 TEST(CommonIPAddr
, TestV4_Simple
)
61 struct ifaddrs one
, two
;
62 struct sockaddr_in a_one
;
63 struct sockaddr_in6 a_two
;
64 struct sockaddr_in net
;
65 const struct ifaddrs
*result
;
67 memset(&net
, '0', sizeof(net
));
70 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
74 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
77 ipv4(&a_one
, "10.11.12.13");
78 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
79 ipv4(&net
, "10.11.12.42");
81 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 24);
82 ASSERT_EQ((struct sockaddr
*)&a_one
, result
->ifa_addr
);
85 TEST(CommonIPAddr
, TestV4_Prefix25
)
87 struct ifaddrs one
, two
;
88 struct sockaddr_in a_one
;
89 struct sockaddr_in a_two
;
90 struct sockaddr_in net
;
91 const struct ifaddrs
*result
;
93 memset(&net
, '0', sizeof(net
));
96 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
100 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
103 ipv4(&a_one
, "10.11.12.13");
104 ipv4(&a_two
, "10.11.12.129");
105 ipv4(&net
, "10.11.12.128");
107 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 25);
108 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
111 TEST(CommonIPAddr
, TestV4_Prefix16
)
113 struct ifaddrs one
, two
;
114 struct sockaddr_in a_one
;
115 struct sockaddr_in a_two
;
116 struct sockaddr_in net
;
117 const struct ifaddrs
*result
;
119 memset(&net
, '0', sizeof(net
));
122 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
126 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
129 ipv4(&a_one
, "10.1.1.2");
130 ipv4(&a_two
, "10.2.1.123");
131 ipv4(&net
, "10.2.0.0");
133 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 16);
134 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
137 TEST(CommonIPAddr
, TestV4_PrefixTooLong
)
140 struct sockaddr_in a_one
;
141 struct sockaddr_in net
;
142 const struct ifaddrs
*result
;
144 memset(&net
, '0', sizeof(net
));
147 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
150 ipv4(&a_one
, "10.11.12.13");
151 ipv4(&net
, "10.11.12.12");
153 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 42);
154 ASSERT_EQ(0, result
);
157 TEST(CommonIPAddr
, TestV4_PrefixZero
)
159 struct ifaddrs one
, two
;
160 struct sockaddr_in6 a_one
;
161 struct sockaddr_in a_two
;
162 struct sockaddr_in net
;
163 const struct ifaddrs
*result
;
165 memset(&net
, '0', sizeof(net
));
168 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
172 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
175 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
176 ipv4(&a_two
, "10.1.2.3");
177 ipv4(&net
, "255.0.1.2");
179 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 0);
180 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
183 TEST(CommonIPAddr
, TestV6_Simple
)
185 struct ifaddrs one
, two
;
186 struct sockaddr_in a_one
;
187 struct sockaddr_in6 a_two
;
188 struct sockaddr_in6 net
;
189 const struct ifaddrs
*result
;
191 memset(&net
, '0', sizeof(net
));
194 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
198 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
201 ipv4(&a_one
, "10.11.12.13");
202 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
203 ipv6(&net
, "2001:1234:5678:90ab::dead:beef");
205 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 64);
206 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
209 TEST(CommonIPAddr
, TestV6_Prefix57
)
211 struct ifaddrs one
, two
;
212 struct sockaddr_in6 a_one
;
213 struct sockaddr_in6 a_two
;
214 struct sockaddr_in6 net
;
215 const struct ifaddrs
*result
;
217 memset(&net
, '0', sizeof(net
));
220 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
224 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
227 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
228 ipv6(&a_two
, "2001:1234:5678:90ab::cdef");
229 ipv6(&net
, "2001:1234:5678:90ab::dead:beef");
231 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 57);
232 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
235 TEST(CommonIPAddr
, TestV6_PrefixTooLong
)
238 struct sockaddr_in6 a_one
;
239 struct sockaddr_in6 net
;
240 const struct ifaddrs
*result
;
242 memset(&net
, '0', sizeof(net
));
245 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
248 ipv6(&a_one
, "2001:1234:5678:900F::cdef");
249 ipv6(&net
, "2001:1234:5678:900F::cdee");
251 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 9000);
252 ASSERT_EQ(0, result
);
255 TEST(CommonIPAddr
, TestV6_PrefixZero
)
257 struct ifaddrs one
, two
;
258 struct sockaddr_in a_one
;
259 struct sockaddr_in6 a_two
;
260 struct sockaddr_in6 net
;
261 const struct ifaddrs
*result
;
264 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
268 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
271 ipv4(&a_one
, "10.2.3.4");
272 ipv6(&a_two
, "2001:f00b::1");
273 ipv6(&net
, "ff00::1");
275 result
= find_ip_in_subnet(&one
, (struct sockaddr
*)&net
, 0);
276 ASSERT_EQ((struct sockaddr
*)&a_two
, result
->ifa_addr
);
279 TEST(CommonIPAddr
, ParseNetwork_Empty
)
281 struct sockaddr_storage network
;
282 unsigned int prefix_len
;
285 ok
= parse_network("", &network
, &prefix_len
);
286 ASSERT_EQ(ok
, false);
289 TEST(CommonIPAddr
, ParseNetwork_Bad_Junk
)
291 struct sockaddr_storage network
;
292 unsigned int prefix_len
;
295 ok
= parse_network("foo", &network
, &prefix_len
);
296 ASSERT_EQ(ok
, false);
299 TEST(CommonIPAddr
, ParseNetwork_Bad_SlashNum
)
301 struct sockaddr_storage network
;
302 unsigned int prefix_len
;
305 ok
= parse_network("/24", &network
, &prefix_len
);
306 ASSERT_EQ(ok
, false);
309 TEST(CommonIPAddr
, ParseNetwork_Bad_Slash
)
311 struct sockaddr_storage network
;
312 unsigned int prefix_len
;
315 ok
= parse_network("/", &network
, &prefix_len
);
316 ASSERT_EQ(ok
, false);
319 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4
)
321 struct sockaddr_storage network
;
322 unsigned int prefix_len
;
325 ok
= parse_network("123.123.123.123", &network
, &prefix_len
);
326 ASSERT_EQ(ok
, false);
329 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4Slash
)
331 struct sockaddr_storage network
;
332 unsigned int prefix_len
;
335 ok
= parse_network("123.123.123.123/", &network
, &prefix_len
);
336 ASSERT_EQ(ok
, false);
339 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4SlashNegative
)
341 struct sockaddr_storage network
;
342 unsigned int prefix_len
;
345 ok
= parse_network("123.123.123.123/-3", &network
, &prefix_len
);
346 ASSERT_EQ(ok
, false);
349 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv4SlashJunk
)
351 struct sockaddr_storage network
;
352 unsigned int prefix_len
;
355 ok
= parse_network("123.123.123.123/foo", &network
, &prefix_len
);
356 ASSERT_EQ(ok
, false);
359 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6
)
361 struct sockaddr_storage network
;
362 unsigned int prefix_len
;
365 ok
= parse_network("2001:1234:5678:90ab::dead:beef", &network
, &prefix_len
);
366 ASSERT_EQ(ok
, false);
369 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6Slash
)
371 struct sockaddr_storage network
;
372 unsigned int prefix_len
;
375 ok
= parse_network("2001:1234:5678:90ab::dead:beef/", &network
, &prefix_len
);
376 ASSERT_EQ(ok
, false);
379 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6SlashNegative
)
381 struct sockaddr_storage network
;
382 unsigned int prefix_len
;
385 ok
= parse_network("2001:1234:5678:90ab::dead:beef/-3", &network
, &prefix_len
);
386 ASSERT_EQ(ok
, false);
389 TEST(CommonIPAddr
, ParseNetwork_Bad_IPv6SlashJunk
)
391 struct sockaddr_storage network
;
392 unsigned int prefix_len
;
395 ok
= parse_network("2001:1234:5678:90ab::dead:beef/foo", &network
, &prefix_len
);
396 ASSERT_EQ(ok
, false);
399 TEST(CommonIPAddr
, ParseNetwork_IPv4_0
)
401 struct sockaddr_in network
;
402 struct sockaddr_storage net_storage
;
403 unsigned int prefix_len
;
406 ok
= parse_network("123.123.123.123/0", &net_storage
, &prefix_len
);
407 network
= *(struct sockaddr_in
*) &net_storage
;
409 ASSERT_EQ(0U, prefix_len
);
410 ASSERT_EQ(AF_INET
, network
.sin_family
);
411 ASSERT_EQ(0, network
.sin_port
);
412 struct sockaddr_in want
;
413 ipv4(&want
, "123.123.123.123");
414 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
417 TEST(CommonIPAddr
, ParseNetwork_IPv4_13
)
419 struct sockaddr_in network
;
420 struct sockaddr_storage net_storage
;
421 unsigned int prefix_len
;
424 ok
= parse_network("123.123.123.123/13", &net_storage
, &prefix_len
);
425 network
= *(struct sockaddr_in
*) &net_storage
;
427 ASSERT_EQ(13U, prefix_len
);
428 ASSERT_EQ(AF_INET
, network
.sin_family
);
429 ASSERT_EQ(0, network
.sin_port
);
430 struct sockaddr_in want
;
431 ipv4(&want
, "123.123.123.123");
432 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
435 TEST(CommonIPAddr
, ParseNetwork_IPv4_32
)
437 struct sockaddr_in network
;
438 struct sockaddr_storage net_storage
;
439 unsigned int prefix_len
;
442 ok
= parse_network("123.123.123.123/32", &net_storage
, &prefix_len
);
443 network
= *(struct sockaddr_in
*) &net_storage
;
445 ASSERT_EQ(32U, prefix_len
);
446 ASSERT_EQ(AF_INET
, network
.sin_family
);
447 ASSERT_EQ(0, network
.sin_port
);
448 struct sockaddr_in want
;
449 ipv4(&want
, "123.123.123.123");
450 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
453 TEST(CommonIPAddr
, ParseNetwork_IPv4_42
)
455 struct sockaddr_in network
;
456 struct sockaddr_storage net_storage
;
457 unsigned int prefix_len
;
460 ok
= parse_network("123.123.123.123/42", &net_storage
, &prefix_len
);
461 network
= *(struct sockaddr_in
*) &net_storage
;
463 ASSERT_EQ(42U, prefix_len
);
464 ASSERT_EQ(AF_INET
, network
.sin_family
);
465 ASSERT_EQ(0, network
.sin_port
);
466 struct sockaddr_in want
;
467 ipv4(&want
, "123.123.123.123");
468 ASSERT_EQ(want
.sin_addr
.s_addr
, network
.sin_addr
.s_addr
);
471 TEST(CommonIPAddr
, ParseNetwork_IPv6_0
)
473 struct sockaddr_in6 network
;
474 struct sockaddr_storage net_storage
;
475 unsigned int prefix_len
;
478 ok
= parse_network("2001:1234:5678:90ab::dead:beef/0", &net_storage
, &prefix_len
);
479 network
= *(struct sockaddr_in6
*) &net_storage
;
481 ASSERT_EQ(0U, prefix_len
);
482 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
483 ASSERT_EQ(0, network
.sin6_port
);
484 struct sockaddr_in6 want
;
485 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
486 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
489 TEST(CommonIPAddr
, ParseNetwork_IPv6_67
)
491 struct sockaddr_in6 network
;
492 struct sockaddr_storage net_storage
;
493 unsigned int prefix_len
;
496 ok
= parse_network("2001:1234:5678:90ab::dead:beef/67", &net_storage
, &prefix_len
);
497 network
= *(struct sockaddr_in6
*) &net_storage
;
499 ASSERT_EQ(67U, prefix_len
);
500 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
501 ASSERT_EQ(0, network
.sin6_port
);
502 struct sockaddr_in6 want
;
503 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
504 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
507 TEST(CommonIPAddr
, ParseNetwork_IPv6_128
)
509 struct sockaddr_in6 network
;
510 struct sockaddr_storage net_storage
;
511 unsigned int prefix_len
;
514 ok
= parse_network("2001:1234:5678:90ab::dead:beef/128", &net_storage
, &prefix_len
);
515 network
= *(struct sockaddr_in6
*) &net_storage
;
517 ASSERT_EQ(128U, prefix_len
);
518 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
519 ASSERT_EQ(0, network
.sin6_port
);
520 struct sockaddr_in6 want
;
521 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
522 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
525 TEST(CommonIPAddr
, ParseNetwork_IPv6_9000
)
527 struct sockaddr_in6 network
;
528 struct sockaddr_storage net_storage
;
529 unsigned int prefix_len
;
532 ok
= parse_network("2001:1234:5678:90ab::dead:beef/9000", &net_storage
, &prefix_len
);
533 network
= *(struct sockaddr_in6
*) &net_storage
;
535 ASSERT_EQ(9000U, prefix_len
);
536 ASSERT_EQ(AF_INET6
, network
.sin6_family
);
537 ASSERT_EQ(0, network
.sin6_port
);
538 struct sockaddr_in6 want
;
539 ipv6(&want
, "2001:1234:5678:90ab::dead:beef");
540 ASSERT_EQ(0, memcmp(want
.sin6_addr
.s6_addr
, network
.sin6_addr
.s6_addr
, sizeof(network
.sin6_addr
.s6_addr
)));
543 TEST(pick_address
, find_ip_in_subnet_list
)
545 struct ifaddrs one
, two
;
546 struct sockaddr_in a_one
;
547 struct sockaddr_in a_two
;
548 const struct sockaddr
*result
;
551 one
.ifa_addr
= (struct sockaddr
*)&a_one
;
555 two
.ifa_addr
= (struct sockaddr
*)&a_two
;
558 ipv4(&a_one
, "10.1.1.2");
559 ipv4(&a_two
, "10.2.1.123");
562 result
= find_ip_in_subnet_list(
567 ASSERT_EQ((struct sockaddr
*)&a_one
, result
);
569 result
= find_ip_in_subnet_list(
574 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);
577 result
= find_ip_in_subnet_list(
582 ASSERT_EQ((struct sockaddr
*)&a_one
, result
);
584 result
= find_ip_in_subnet_list(
589 ASSERT_EQ((struct sockaddr
*)&a_two
, result
);