+static struct ksock_interface *
+ksocknal_index2iface(struct lnet_ni *ni, int index)
+{
+ struct ksock_net *net = ni->ni_data;
+ int i;
+ struct ksock_interface *iface;
+
+ for (i = 0; i < net->ksnn_ninterfaces; i++) {
+ LASSERT(i < LNET_INTERFACES_NUM);
+ iface = &net->ksnn_interfaces[i];
+
+ if (iface->ksni_index == index)
+ return iface;
+ }
+
+ return NULL;
+}
+
+static int ksocknal_ip2index(__u32 ipaddress, struct lnet_ni *ni)
+{
+ struct net_device *dev;
+ int ret = -1;
+ DECLARE_CONST_IN_IFADDR(ifa);
+
+ rcu_read_lock();
+ for_each_netdev(ni->ni_net_ns, dev) {
+ int flags = dev_get_flags(dev);
+ struct in_device *in_dev;
+
+ if (flags & IFF_LOOPBACK) /* skip the loopback IF */
+ continue;
+
+ if (!(flags & IFF_UP))
+ continue;
+
+ in_dev = __in_dev_get_rcu(dev);
+ if (!in_dev)
+ continue;
+
+ in_dev_for_each_ifa_rcu(ifa, in_dev) {
+ if (ntohl(ifa->ifa_local) == ipaddress)
+ ret = dev->ifindex;
+ }
+ endfor_ifa(in_dev);
+ if (ret >= 0)
+ break;
+ }
+ rcu_read_unlock();
+
+ return ret;
+}
+