From: Dan van der Ster Date: Tue, 23 Mar 2021 10:28:37 +0000 (+0100) Subject: test_ipaddr: check that we correctly skip loopback X-Git-Tag: v16.2.0~7^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F40425%2Fhead;p=ceph.git test_ipaddr: check that we correctly skip loopback We should skip devices named 'lo' or of the form 'lo:0' regardless of their IP address. Signed-off-by: Dan van der Ster Related-to: https://tracker.ceph.com/issues/49938 (cherry picked from commit 780125d1ed93cd7b17172752b3e76186a524103b) --- diff --git a/src/test/test_ipaddr.cc b/src/test/test_ipaddr.cc index 7aff80cdb9421..748ecf05eb8a2 100644 --- a/src/test/test_ipaddr.cc +++ b/src/test/test_ipaddr.cc @@ -183,6 +183,41 @@ TEST(CommonIPAddr, TestV4_PrefixZero) ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr); } +static char lo[] = "lo"; +static char lo0[] = "lo:0"; + +TEST(CommonIPAddr, TestV4_SkipLoopback) +{ + struct ifaddrs one, two, three; + struct sockaddr_in a_one; + struct sockaddr_in a_two; + struct sockaddr_in a_three; + struct sockaddr_in net; + const struct ifaddrs *result; + + memset(&net, 0, sizeof(net)); + + one.ifa_next = &two; + one.ifa_addr = (struct sockaddr*)&a_one; + one.ifa_name = lo; + + two.ifa_next = &three; + two.ifa_addr = (struct sockaddr*)&a_two; + two.ifa_name = lo0; + + three.ifa_next = NULL; + three.ifa_addr = (struct sockaddr*)&a_three; + three.ifa_name = eth0; + + ipv4(&a_one, "127.0.0.1"); + ipv4(&a_two, "127.0.0.1"); + ipv4(&a_three, "10.1.2.3"); + ipv4(&net, "255.0.0.0"); + + result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0); + ASSERT_EQ((struct sockaddr*)&a_three, result->ifa_addr); +} + TEST(CommonIPAddr, TestV6_Simple) { struct ifaddrs one, two; @@ -279,6 +314,38 @@ TEST(CommonIPAddr, TestV6_PrefixZero) ASSERT_EQ((struct sockaddr*)&a_two, result->ifa_addr); } +TEST(CommonIPAddr, TestV6_SkipLoopback) +{ + struct ifaddrs one, two, three; + struct sockaddr_in6 a_one; + struct sockaddr_in6 a_two; + struct sockaddr_in6 a_three; + struct sockaddr_in6 net; + const struct ifaddrs *result; + + memset(&net, 0, sizeof(net)); + + one.ifa_next = &two; + one.ifa_addr = (struct sockaddr*)&a_one; + one.ifa_name = lo; + + two.ifa_next = &three; + two.ifa_addr = (struct sockaddr*)&a_two; + two.ifa_name = lo0; + + three.ifa_next = NULL; + three.ifa_addr = (struct sockaddr*)&a_three; + three.ifa_name = eth0; + + ipv6(&a_one, "::1"); + ipv6(&a_two, "::1"); + ipv6(&a_three, "2001:1234:5678:90ab::beef"); + ipv6(&net, "ff00::1"); + + result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0); + ASSERT_EQ((struct sockaddr*)&a_three, result->ifa_addr); +} + TEST(CommonIPAddr, ParseNetwork_Empty) { struct sockaddr_storage network;