From fbdbf1167b1e040ce639de21052ad146feaea5b3 Mon Sep 17 00:00:00 2001 From: Dan van der Ster Date: Tue, 23 Mar 2021 09:00:11 +0100 Subject: [PATCH 1/2] common/ipaddr: also skip just `lo` Skip iface's with name like 'lo' or of the form 'lo:0', 'lo:1'. This brings back the original behavior from b6d0fc9e0e515e50894c08217d688a8c94db7570 Signed-off-by: Dan van der Ster Fixes: https://tracker.ceph.com/issues/49938 (cherry picked from commit 6147c0917157efd2d35610e759685656a4989abb) --- src/common/ipaddr.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/ipaddr.cc b/src/common/ipaddr.cc index f9cfbd5598adf..5eddc9b162890 100644 --- a/src/common/ipaddr.cc +++ b/src/common/ipaddr.cc @@ -60,7 +60,7 @@ const struct ifaddrs *find_ipv4_in_subnet(const struct ifaddrs *addrs, if (addrs->ifa_addr == NULL) continue; - if (boost::starts_with(addrs->ifa_name, "lo:")) + if (strcmp(addrs->ifa_name, "lo") == 0 || boost::starts_with(addrs->ifa_name, "lo:")) continue; if (numa_node >= 0 && !match_numa_node(addrs->ifa_name, numa_node)) @@ -107,7 +107,7 @@ const struct ifaddrs *find_ipv6_in_subnet(const struct ifaddrs *addrs, if (addrs->ifa_addr == NULL) continue; - if (boost::starts_with(addrs->ifa_name, "lo")) + if (strcmp(addrs->ifa_name, "lo") == 0 || boost::starts_with(addrs->ifa_name, "lo:")) continue; if (numa_node >= 0 && !match_numa_node(addrs->ifa_name, numa_node)) From bf9e580d8a0a0ae3b71f1c65924047a274d02f12 Mon Sep 17 00:00:00 2001 From: Dan van der Ster Date: Tue, 23 Mar 2021 11:28:37 +0100 Subject: [PATCH 2/2] 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 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;