}
static int
-ksocknal_enumerate_interfaces(struct ksock_net *net, char *iname)
-{
- struct net_device *dev;
-
- rtnl_lock();
- for_each_netdev(&init_net, dev) {
- /* The iname specified by an user land configuration can
- * map to an ifa_label so always treat iname as an ifa_label.
- * If iname is NULL then fall back to the net device name.
- */
- const char *name = iname ? iname : dev->name;
- struct in_device *in_dev;
-
- if (strcmp(dev->name, "lo") == 0) /* skip the loopback IF */
- continue;
-
- if (!(dev_get_flags(dev) & IFF_UP)) {
- CWARN("Ignoring interface %s (down)\n", dev->name);
- continue;
- }
-
- in_dev = __in_dev_get_rtnl(dev);
- if (!in_dev) {
- CWARN("Interface %s has no IPv4 status.\n", dev->name);
- continue;
- }
-
- for_ifa(in_dev)
- if (strcmp(name, ifa->ifa_label) == 0) {
- int idx = net->ksnn_ninterfaces;
- struct ksock_interface *ksi;
-
- if (idx >= ARRAY_SIZE(net->ksnn_interfaces)) {
- rtnl_unlock();
- return -E2BIG;
- }
-
- ksi = &net->ksnn_interfaces[idx];
- ksi->ksni_ipaddr = ntohl(ifa->ifa_local);
- ksi->ksni_netmask = ifa->ifa_mask;
- strlcpy(ksi->ksni_name,
- name, sizeof(ksi->ksni_name));
- net->ksnn_ninterfaces++;
- break;
- }
- endfor_ifa(in_dev);
- }
- rtnl_unlock();
-
- if (net->ksnn_ninterfaces == 0)
- CERROR("Can't find any usable interfaces\n");
-
- return net->ksnn_ninterfaces > 0 ? 0 : -ENOENT;
-}
-
-static int
ksocknal_search_new_ipif(struct ksock_net *net)
{
int new_ipif = 0;
{
struct ksock_net *net;
struct lnet_ioctl_config_lnd_cmn_tunables *net_tunables;
+ struct ksock_interface *ksi = NULL;
+ struct lnet_inetdev *ifaces = NULL;
+ int i = 0;
int rc;
- int i;
- struct net_device *net_dev;
- int node_id;
LASSERT (ni->ni_net->net_lnd == &the_ksocklnd);
net_tunables->lct_peer_rtr_credits =
*ksocknal_tunables.ksnd_peerrtrcredits;
+ rc = lnet_inet_enumerate(&ifaces);
+ if (rc < 0)
+ goto fail_1;
+
if (!ni->ni_interfaces[0]) {
- rc = ksocknal_enumerate_interfaces(net, NULL);
- if (rc < 0)
- goto fail_1;
+ ksi = &net->ksnn_interfaces[0];
+
+ /* Use the first discovered interface */
+ net->ksnn_ninterfaces = 1;
+ ni->ni_dev_cpt = ifaces[0].li_cpt;
+ ksi->ksni_ipaddr = ifaces[0].li_ipaddr;
+ ksi->ksni_netmask = ifaces[0].li_netmask;
+ strlcpy(ksi->ksni_name, ifaces[0].li_name,
+ sizeof(ksi->ksni_name));
} else {
/* Before Multi-Rail ksocklnd would manage
* multiple interfaces with its own tcp bonding.
if (!ni->ni_interfaces[i])
break;
- for (j = 0; j < net->ksnn_ninterfaces; j++) {
- struct ksock_interface *ksi;
-
- ksi = &net->ksnn_interfaces[j];
-
- if (strcmp(ni->ni_interfaces[i],
- ksi->ksni_name) == 0) {
- CERROR("found duplicate %s\n",
- ksi->ksni_name);
+ for (j = 0; j < LNET_INTERFACES_NUM; j++) {
+ if (i != j && ni->ni_interfaces[j] &&
+ strcmp(ni->ni_interfaces[i],
+ ni->ni_interfaces[j]) == 0) {
rc = -EEXIST;
+ CERROR("ksocklnd: found duplicate %s at %d and %d, rc = %d\n",
+ ni->ni_interfaces[i], i, j, rc);
goto fail_1;
}
}
- rc = ksocknal_enumerate_interfaces(net, ni->ni_interfaces[i]);
- if (rc < 0)
- goto fail_1;
- }
- }
+ for (j = 0; j < rc; j++) {
+ if (strcmp(ifaces[j].li_name,
+ ni->ni_interfaces[i]) != 0)
+ continue;
- net_dev = dev_get_by_name(&init_net,
- net->ksnn_interfaces[0].ksni_name);
- if (net_dev != NULL) {
- node_id = dev_to_node(&net_dev->dev);
- ni->ni_dev_cpt = cfs_cpt_of_node(lnet_cpt_table(), node_id);
- dev_put(net_dev);
- } else {
- ni->ni_dev_cpt = CFS_CPT_ANY;
+ ksi = &net->ksnn_interfaces[j];
+ ni->ni_dev_cpt = ifaces[j].li_cpt;
+ ksi->ksni_ipaddr = ifaces[j].li_ipaddr;
+ ksi->ksni_netmask = ifaces[j].li_netmask;
+ strlcpy(ksi->ksni_name, ifaces[j].li_name,
+ sizeof(ksi->ksni_name));
+ net->ksnn_ninterfaces++;
+ break;
+ }
+ }
+ /* ni_interfaces don't map to all network interfaces */
+ if (!ksi || net->ksnn_ninterfaces != i) {
+ CERROR("ksocklnd: requested %d but only %d interfaces found\n",
+ i, net->ksnn_ninterfaces);
+ goto fail_1;
+ }
}
/* call it before add it to ksocknal_data.ksnd_nets */
if (rc != 0)
goto fail_1;
- ni->ni_nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid),
- net->ksnn_interfaces[0].ksni_ipaddr);
+ LASSERT(ksi);
+ ni->ni_nid = LNET_MKNID(LNET_NIDNET(ni->ni_nid), ksi->ksni_ipaddr);
list_add(&net->ksnn_list, &ksocknal_data.ksnd_nets);
ksocknal_data.ksnd_nnets++;