From e9d9cbb072956f2582c97263184aecd196bba14a Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 7 Jan 2019 14:13:21 -0500 Subject: [PATCH] LU-11838 socklnd: use for_each_netdev() instead of lnet_ipif_enumerate() for_each_netdev() is a more direct interface and doesn't require library support. Also get the ip address directly from the net_device, rather than using lnet_ipif_query(). Linux-commit: f703f71afd98e6e7ec70f92ffc52ef3ffffcd849 Linux-commit: 9eb957b98aa6322abde33240bf50dd483c5d1190 Change-Id: I82894991b9a4a250d0560af31325b6c765cc0620 Signed-off-by: NeilBrown Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/33966 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Sonia Sharma Reviewed-by: Doug Oucharek Reviewed-by: Oleg Drokin --- lnet/klnds/socklnd/socklnd.c | 71 +++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index ef20ef4..7bd3b52 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -37,8 +37,8 @@ * Author: Eric Barton */ -#include #include "socklnd.h" +#include static struct lnet_lnd the_ksocklnd; struct ksock_nal_data ksocknal_data; @@ -2573,53 +2573,50 @@ ksocknal_shutdown(struct lnet_ni *ni) static int ksocknal_enumerate_interfaces(struct ksock_net *net) { - char **names; - int i; - int j; - int rc; - int n; - - n = lnet_ipif_enumerate(&names); - if (n <= 0) { - CERROR("Can't enumerate interfaces: %d\n", n); - return n; - } + int j = 0; + struct net_device *dev; - for (i = j = 0; i < n; i++) { - int up; - __u32 ip; - __u32 mask; + rtnl_lock(); + for_each_netdev(&init_net, dev) { + const char *name = dev->name; + struct in_device *in_dev; + struct ksock_interface *ksi; - if (!strcmp(names[i], "lo")) /* skip the loopback IF */ - continue; - - rc = lnet_ipif_query(names[i], &up, &ip, &mask); - if (rc != 0) { - CWARN("Can't get interface %s info: %d\n", - names[i], rc); - continue; - } + if (strcmp(name, "lo") == 0) /* skip the loopback IF */ + continue; - if (!up) { - CWARN("Ignoring interface %s (down)\n", - names[i]); - continue; - } + if (!(dev_get_flags(dev) & IFF_UP)) { + CWARN("Ignoring interface %s (down)\n", name); + continue; + } if (j == LNET_INTERFACES_NUM) { CWARN("Ignoring interface %s (too many interfaces)\n", - names[i]); + name); + continue; + } + + in_dev = __in_dev_get_rtnl(dev); + if (!in_dev) { + CWARN("Interface %s has no IPv4 status.\n", name); continue; } - net->ksnn_interfaces[j].ksni_ipaddr = ip; - net->ksnn_interfaces[j].ksni_netmask = mask; - strlcpy(net->ksnn_interfaces[j].ksni_name, - names[i], sizeof(net->ksnn_interfaces[j].ksni_name)); - j++; + ksi = &net->ksnn_interfaces[j]; + + for_primary_ifa(in_dev) + if (strcmp(ifa->ifa_label, name) == 0) { + ksi->ksni_ipaddr = ntohl(ifa->ifa_local); + ksi->ksni_netmask = ifa->ifa_mask; + strlcpy(ksi->ksni_name, + name, sizeof(ksi->ksni_name)); + j++; + break; + } + endfor_ifa(in_dev); } - lnet_ipif_free_enumeration(names, n); + rtnl_unlock(); if (j == 0) CERROR("Can't find any usable interfaces\n"); -- 1.8.3.1