]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/common/ipaddr.cc
import ceph 15.2.14
[ceph.git] / ceph / src / common / ipaddr.cc
index 0abf7f20ca71f1acbe21dadef072f9b6db9ffc43..bd11cbfc1808f8c93f8221b8f39767eb4e8e7568 100644 (file)
@@ -3,7 +3,6 @@
 #include <ifaddrs.h>
 #include <stdlib.h>
 #include <string.h>
-#include <boost/algorithm/string/predicate.hpp>
 #if defined(__FreeBSD__)
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -29,54 +28,23 @@ void netmask_ipv4(const struct in_addr *addr,
   out->s_addr = addr->s_addr & mask;
 }
 
-
-static bool match_numa_node(const string& if_name, int numa_node)
+bool matches_ipv4_in_subnet(const struct ifaddrs& addrs,
+                         const struct sockaddr_in* net,
+                         unsigned int prefix_len)
 {
-#ifdef WITH_SEASTAR
-  return true;
-#else
-  int if_node = -1;
-  int r = get_iface_numa_node(if_name, &if_node);
-  if (r < 0) {
+  if (addrs.ifa_addr == nullptr)
     return false;
-  }
-  return if_node == numa_node;
-#endif
-}
-
-const struct ifaddrs *find_ipv4_in_subnet(const struct ifaddrs *addrs,
-                                         const struct sockaddr_in *net,
-                                         unsigned int prefix_len,
-                                         int numa_node) {
-  struct in_addr want, temp;
 
+  if (addrs.ifa_addr->sa_family != net->sin_family)
+      return false;
+  struct in_addr want;
   netmask_ipv4(&net->sin_addr, prefix_len, &want);
-  for (; addrs != NULL; addrs = addrs->ifa_next) {
-
-    if (addrs->ifa_addr == NULL)
-      continue;
-
-    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))
-      continue;
-
-    if (addrs->ifa_addr->sa_family != net->sin_family)
-      continue;
-
-    struct in_addr *cur = &((struct sockaddr_in*)addrs->ifa_addr)->sin_addr;
-    netmask_ipv4(cur, prefix_len, &temp);
-
-    if (temp.s_addr == want.s_addr) {
-      return addrs;
-    }
-  }
-
-  return NULL;
+  struct in_addr *cur = &((struct sockaddr_in*)addrs.ifa_addr)->sin_addr;
+  struct in_addr temp;
+  netmask_ipv4(cur, prefix_len, &temp);
+  return temp.s_addr == want.s_addr;
 }
 
-
 void netmask_ipv6(const struct in6_addr *addr,
                  unsigned int prefix_len,
                  struct in6_addr *out) {
@@ -90,59 +58,25 @@ void netmask_ipv6(const struct in6_addr *addr,
     memset(out->s6_addr+prefix_len/8+1, 0, 16-prefix_len/8-1);
 }
 
+bool matches_ipv6_in_subnet(const struct ifaddrs& addrs,
+                           const struct sockaddr_in6* net,
+                           unsigned int prefix_len)
+{
+  if (addrs.ifa_addr == nullptr)
+    return false;
 
-const struct ifaddrs *find_ipv6_in_subnet(const struct ifaddrs *addrs,
-                                         const struct sockaddr_in6 *net,
-                                         unsigned int prefix_len,
-                                         int numa_node) {
-  struct in6_addr want, temp;
-
+  if (addrs.ifa_addr->sa_family != net->sin6_family)
+    return false;
+  struct in6_addr want;
   netmask_ipv6(&net->sin6_addr, prefix_len, &want);
-  for (; addrs != NULL; addrs = addrs->ifa_next) {
-
-    if (addrs->ifa_addr == NULL)
-      continue;
-
-    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))
-      continue;
-
-    if (addrs->ifa_addr->sa_family != net->sin6_family)
-      continue;
-
-    struct in6_addr *cur = &((struct sockaddr_in6*)addrs->ifa_addr)->sin6_addr;
-    if (IN6_IS_ADDR_LINKLOCAL(cur))
-      continue;
-    netmask_ipv6(cur, prefix_len, &temp);
-
-    if (IN6_ARE_ADDR_EQUAL(&temp, &want))
-      return addrs;
-  }
-
-  return NULL;
-}
-
-
-const struct ifaddrs *find_ip_in_subnet(const struct ifaddrs *addrs,
-                                       const struct sockaddr *net,
-                                       unsigned int prefix_len,
-                                       int numa_node) {
-  switch (net->sa_family) {
-    case AF_INET:
-      return find_ipv4_in_subnet(addrs, (struct sockaddr_in*)net, prefix_len,
-                                numa_node);
-
-    case AF_INET6:
-      return find_ipv6_in_subnet(addrs, (struct sockaddr_in6*)net, prefix_len,
-                                numa_node);
-    }
-
-  return NULL;
+  struct in6_addr temp;
+  struct in6_addr *cur = &((struct sockaddr_in6*)addrs.ifa_addr)->sin6_addr;
+  if (IN6_IS_ADDR_LINKLOCAL(cur))
+    return false;
+  netmask_ipv6(cur, prefix_len, &temp);
+  return IN6_ARE_ADDR_EQUAL(&temp, &want);
 }
 
-
 bool parse_network(const char *s, struct sockaddr_storage *network, unsigned int *prefix_len) {
   char *slash = strchr((char*)s, '/');
   if (!slash) {