From 367ea037a491a449f8c14973e5f9a6f094a7d5d5 Mon Sep 17 00:00:00 2001 From: Dan van der Ster Date: Tue, 23 Mar 2021 11:28:37 +0100 Subject: [PATCH] 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) --- src/test/test_ipaddr.cc | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/test/test_ipaddr.cc b/src/test/test_ipaddr.cc index 2fc5d48398671..d904a6819fffd 100644 --- a/src/test/test_ipaddr.cc +++ b/src/test/test_ipaddr.cc @@ -182,6 +182,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; @@ -278,6 +313,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; -- 2.39.5