Whamcloud - gitweb
LU-10391 lnet: support IPv6 in lnet_inet_enumerate()
[fs/lustre-release.git] / lnet / klnds / socklnd / socklnd.c
index 7d991a1..216a578 100644 (file)
@@ -1729,11 +1729,13 @@ ksocknal_ctl(struct lnet_ni *ni, unsigned int cmd, void *arg)
                        iface = &net->ksnn_interface;
 
                        sa = (void *)&iface->ksni_addr;
-                       if (sa->sin_family == AF_INET)
+                       if (sa->sin_family == AF_INET) {
                                data->ioc_u32[0] = ntohl(sa->sin_addr.s_addr);
-                       else
+                               data->ioc_u32[1] = iface->ksni_netmask;
+                       } else {
                                data->ioc_u32[0] = 0xFFFFFFFF;
-                       data->ioc_u32[1] = iface->ksni_netmask;
+                               data->ioc_u32[1] = 0;
+                       }
                        data->ioc_u32[2] = iface->ksni_npeers;
                        data->ioc_u32[3] = iface->ksni_nroutes;
                }
@@ -2430,16 +2432,15 @@ ksocknal_startup(struct lnet_ni *ni)
        struct ksock_net *net;
        struct ksock_interface *ksi = NULL;
        struct lnet_inetdev *ifaces = NULL;
-       struct sockaddr_in *sa;
        int i = 0;
        int rc;
 
-        LASSERT (ni->ni_net->net_lnd == &the_ksocklnd);
-        if (ksocknal_data.ksnd_init == SOCKNAL_INIT_NOTHING) {
-                rc = ksocknal_base_startup();
-                if (rc != 0)
-                        return rc;
-        }
+       LASSERT (ni->ni_net->net_lnd == &the_ksocklnd);
+       if (ksocknal_data.ksnd_init == SOCKNAL_INIT_NOTHING) {
+               rc = ksocknal_base_startup();
+               if (rc != 0)
+                       return rc;
+       }
        LIBCFS_ALLOC(net, sizeof(*net));
        if (net == NULL)
                goto fail_0;
@@ -2448,7 +2449,7 @@ ksocknal_startup(struct lnet_ni *ni)
 
        ksocknal_tunables_setup(ni);
 
-       rc = lnet_inet_enumerate(&ifaces, ni->ni_net_ns);
+       rc = lnet_inet_enumerate(&ifaces, ni->ni_net_ns, true);
        if (rc < 0)
                goto fail_1;
 
@@ -2470,11 +2471,26 @@ ksocknal_startup(struct lnet_ni *ni)
 
        ni->ni_dev_cpt = ifaces[i].li_cpt;
        ksi->ksni_index = ifaces[i].li_index;
-       sa = (void *)&ksi->ksni_addr;
-       memset(sa, 0, sizeof(*sa));
-       sa->sin_family = AF_INET;
-       sa->sin_addr.s_addr = htonl(ifaces[i].li_ipaddr);
-       ksi->ksni_netmask = ifaces[i].li_netmask;
+       if (ifaces[i].li_ipv6) {
+               struct sockaddr_in6 *sa;
+               sa = (void *)&ksi->ksni_addr;
+               memset(sa, 0, sizeof(*sa));
+               sa->sin6_family = AF_INET6;
+               memcpy(&sa->sin6_addr, ifaces[i].li_ipv6addr,
+                      sizeof(struct in6_addr));
+               ni->ni_nid.nid_size = sizeof(struct in6_addr) - 4;
+               memcpy(&ni->ni_nid.nid_addr, ifaces[i].li_ipv6addr,
+                      sizeof(struct in6_addr));
+       } else {
+               struct sockaddr_in *sa;
+               sa = (void *)&ksi->ksni_addr;
+               memset(sa, 0, sizeof(*sa));
+               sa->sin_family = AF_INET;
+               sa->sin_addr.s_addr = htonl(ifaces[i].li_ipaddr);
+               ksi->ksni_netmask = ifaces[i].li_netmask;
+               ni->ni_nid.nid_size = 4 - 4;
+               ni->ni_nid.nid_addr[0] = sa->sin_addr.s_addr;
+       }
        strlcpy(ksi->ksni_name, ifaces[i].li_name, sizeof(ksi->ksni_name));
 
        /* call it before add it to ksocknal_data.ksnd_nets */
@@ -2482,10 +2498,6 @@ ksocknal_startup(struct lnet_ni *ni)
        if (rc != 0)
                goto fail_1;
 
-       LASSERT(ksi);
-       LASSERT(ksi->ksni_addr.ss_family == AF_INET);
-       ni->ni_nid.nid_addr[0] =
-               ((struct sockaddr_in *)&ksi->ksni_addr)->sin_addr.s_addr;
        list_add(&net->ksnn_list, &ksocknal_data.ksnd_nets);
        net->ksnn_ni = ni;
        ksocknal_data.ksnd_nnets++;