socket cm will now walk list of interfaces and ignore loopback
and ignore IB devices, unless the IB netdev is the only device.
Works better in a heterogeneous environment with a mix of net device.
Tested with br0, mic0, and mic0:ib netdev mixes.
Overriding with DAPL_SCM_NETDEV still works as is.

Signed-off-by: Patrick Mccormick <[email protected]>
Signed-off-by: Arlin Davis <[email protected]>
---
 dapl/openib_common/util.c |   70 +++++++++++++++++++++++---------------------
 1 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/dapl/openib_common/util.c b/dapl/openib_common/util.c
index 8b97263..20fb8b2 100644
--- a/dapl/openib_common/util.c
+++ b/dapl/openib_common/util.c
@@ -28,6 +28,7 @@
 #include "dapl_osd.h"
 
 #include <stdlib.h>
+#include <ifaddrs.h>
 
 int g_dapl_loopback_connection = 0;
 
@@ -148,7 +149,6 @@ int getipaddr_netdev(char *name, char *addr, int addr_len)
 
        /* Fill in the structure */
        snprintf(ifr.ifr_name, IFNAMSIZ, "%s", name);
-       ifr.ifr_hwaddr.sa_family = ARPHRD_INFINIBAND;
 
        /* Create a socket fd */
        skfd = socket(PF_INET, SOCK_STREAM, 0);
@@ -178,51 +178,54 @@ int getipaddr_netdev(char *name, char *addr, int addr_len)
        return ret;
 }
 
-DAT_RETURN getlocalipaddr(char *addr, int addr_len)
+/* IPv4 only, use IB if netdev set or it's the only interface */
+DAT_RETURN getlocalipaddr (char *addr, int addr_len)
 {
-       struct sockaddr_in *sin;
-       int ret, skfd, i;
+       struct ifaddrs *ifap, *ifa;
+       int ret, found=0, ib_ok=0;
        char *netdev = getenv("DAPL_SCM_NETDEV");
-       struct ifreq ifr[10];
-       struct ifconf ifc;
 
-       /* use provided netdev instead of default hostname */
        if (netdev != NULL) {
                ret = getipaddr_netdev(netdev, addr, addr_len);
                if (ret) {
-                       dapl_log(DAPL_DBG_TYPE_ERR,
-                                " getlocalipaddr: NETDEV = %s"
-                                " but not configured on system? ERR = %s\n",
-                                netdev, strerror(ret));
-                       return dapl_convert_errno(ret, "getlocalipaddr");
-               } else
+                       dapl_log(DAPL_DBG_TYPE_ERR, " ERR: NETDEV = %s"
+                                " but not configured on system?\n", netdev);
+                       return dapl_convert_errno(errno, "getlocalipaddr");
+               } else {
+                       dapl_log(DAPL_DBG_TYPE_UTIL," my_addr %s NETDEV = %s\n",
+                                inet_ntoa(((struct sockaddr_in 
*)addr)->sin_addr),
+                                netdev);
                        return DAT_SUCCESS;
+               }
        }
 
-       if (addr_len < sizeof(*sin))
-               return DAT_INTERNAL_ERROR;
-
-       memset(&ifc,0,sizeof(ifc));
-       ifc.ifc_buf = (char *)ifr;
-       ifc.ifc_len = sizeof(ifr);
-
-       skfd = socket(PF_INET, SOCK_STREAM, 0);
-       ret = ioctl(skfd, SIOCGIFCONF, &ifc);
-       if (ret)
-               goto bail;
+       if ((ret = getifaddrs (&ifap)))
+               return dapl_convert_errno(errno, "getifaddrs");
 
-       /* first non-loopback interface in list */
-       for (i=0; i < ifc.ifc_len/sizeof(struct ifreq); i++) {
-               if (strcmp(ifr[i].ifr_name, "lo"))
-                       break;
+retry:
+       for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+               if (ifa->ifa_addr->sa_family == AF_INET) {
+                       if (!found && !(ifa->ifa_flags & IFF_LOOPBACK) &&
+                           ((!ib_ok && dapl_os_pstrcmp("ib", ifa->ifa_name)) ||
+                            (ib_ok && !dapl_os_pstrcmp("ib", ifa->ifa_name)))) 
{
+                               memcpy(addr, ifa->ifa_addr, sizeof(struct 
sockaddr_in));
+                               found++;
+                       }
+                       dapl_log(DAPL_DBG_TYPE_UTIL,
+                                " getifaddrs: %s -> %s\n", ifa->ifa_name,
+                                inet_ntoa(((struct sockaddr_in 
*)ifa->ifa_addr)->sin_addr));
+               }
+       }
+       if (!found && !ib_ok) {
+               ib_ok = 1;
+               goto retry;
        }
-       memcpy(addr, &ifr[i].ifr_addr, sizeof(struct sockaddr_in));
+       dapl_log(DAPL_DBG_TYPE_UTIL," my_addr %s\n",
+                inet_ntoa(((struct sockaddr_in *)addr)->sin_addr));
 
-bail:
-       close(skfd);
-       return dapl_convert_errno(ret, "getlocalipaddr");
+       freeifaddrs(ifap);
+       return (found ? DAT_SUCCESS:DAT_INVALID_ADDRESS);
 }
-
 #endif
 
 enum ibv_mtu dapl_ib_mtu(int mtu)
@@ -811,3 +814,4 @@ ib_cm_events_t dapls_ib_get_cm_event(IN DAT_EVENT_NUMBER 
dat_event_num)
        }
        return ib_cm_event;
 }
+
-- 
1.7.3



_______________________________________________
ofw mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw

Reply via email to