[openib-general] Re: [PATCH] sdp: replace ip_dev_find withdev_base scan (was Re: ip_dev_find resolution?)

Michael S. Tsirkin mst at mellanox.co.il
Mon Dec 19 15:46:57 PST 2005


Quoting r. Sean Hefty <mshefty at ichips.intel.com>:
> Subject: Re: [PATCH] sdp: replace ip_dev_find withdev_base scan (was Re: ip_dev_find resolution?)
> 
> Michael S. Tsirkin wrote:
> > Right. So lets map 127.0.0.1 to an arbitrary local device for now?
> 
> Sounds good for now.

OK, thats what the patch did. Something along the following lines
would be a good fit for cma, wouldnt it:

> 1. Get rid of ip_dev_find.
> 2. Add support for local addresses such as 127.0.0.1,
>    resolving them to an arbitrary rdma device, while we are at it.
>
> Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>
 
+static int tryaddrmatch(struct net_device *dev, u32 s_addr, u32 d_addr)
+{
+	struct in_ifaddr **ifap;
+	struct in_ifaddr *ifa;
+	struct in_device *in_dev;
+	int rc = -ENETUNREACH;
+	__be32 addr;
+
+	if (dev->type != ARPHRD_INFINIBAND)
+		return rc;
+
+	in_dev = in_dev_get(dev);
+	if (!in_dev)
+		return rc;
+
+	addr = (ZERONET(s_addr) || LOOPBACK(s_addr)) ? d_addr : s_addr;
+
+	/* Hack to enable using SDP on addresses such as 127.0.0.1 */
+	if (ZERONET(addr) || LOOPBACK(addr)) {
+		rc = (dev->flags & IFF_UP) ? 0 : -ENETUNREACH;
+		goto done;
+	}
+
+	for (ifap = &in_dev->ifa_list; (ifa = *ifap); ifap = &ifa->ifa_next) {
+		if (s_addr == ifa->ifa_address) {
+			rc = 0;
+			break; /* found */
+		}
+	}
+
+done:
+	in_dev_put(in_dev);
+	return rc;
+}
+
 

And, after resolving the route:

 	if (dev->flags & IFF_LOOPBACK) {
 		dev_put(dev);
 		read_lock(&dev_base_lock);
+		for (dev = dev_base; dev; dev = dev->next)
+			if (!tryaddrmatch(dev, rt->rt_src, rt->rt_dst)) {
+ 				dev_hold(dev);
+ 				break;
+ 			}
 		read_unlock(&dev_base_lock);
	}
-- 
MST



More information about the general mailing list