+ /* 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 we encounter an old configuration using
+ * this tcp bonding approach then we need to
+ * handle more than one ni_interfaces.
+ *
+ * In Multi-Rail configuration only ONE ni_interface
+ * should exist. Each IP alias should be mapped to
+ * each 'struct net_ni'.
+ */
+ for (i = 0; i < LNET_INTERFACES_NUM; i++) {
+ int j;
+
+ if (!ni->ni_interfaces[i])
+ break;
+
+ 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;
+ }
+ }
+
+ for (j = 0; j < rc; j++) {
+ if (strcmp(ifaces[j].li_name,
+ ni->ni_interfaces[i]) != 0)
+ continue;
+
+ 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;