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);