diff options
| author | Sean Hefty <sean.hefty@intel.com> | 2009-11-19 12:55:22 -0800 | 
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2009-11-19 12:55:22 -0800 | 
| commit | 6266ed6e4164466177238b11ecb825a3a108a3e4 (patch) | |
| tree | 6960dcaeb66aa368b8e856022b8aafb81b255428 | |
| parent | e2e626972e652d18520f84d69fc06cfa307d11ff (diff) | |
| download | olio-linux-3.10-6266ed6e4164466177238b11ecb825a3a108a3e4.tar.xz olio-linux-3.10-6266ed6e4164466177238b11ecb825a3a108a3e4.zip  | |
RDMA/cma: Replace net_device pointer with index
Provide the device interface when resolving route information to
ensure that the correct outbound device is used.  This will also
simplify processing of sin6_scope_id for IPv6 support.
Based on work from:
David Wilder <dwilder@us.ibm.com>
Jason Gunthorpe <jgunthrope@obsidianresearch.com>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/core/addr.c | 14 | ||||
| -rw-r--r-- | drivers/infiniband/core/cma.c | 2 | ||||
| -rw-r--r-- | include/rdma/ib_addr.h | 2 | 
3 files changed, 15 insertions, 3 deletions
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index 373f1118d57..788a02ef01d 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c @@ -107,7 +107,7 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,  	memcpy(dev_addr->broadcast, dev->broadcast, MAX_ADDR_LEN);  	if (dst_dev_addr)  		memcpy(dev_addr->dst_dev_addr, dst_dev_addr, MAX_ADDR_LEN); -	dev_addr->src_dev = dev; +	dev_addr->bound_dev_if = dev->ifindex;  	return 0;  }  EXPORT_SYMBOL(rdma_copy_addr); @@ -117,6 +117,15 @@ int rdma_translate_ip(struct sockaddr *addr, struct rdma_dev_addr *dev_addr)  	struct net_device *dev;  	int ret = -EADDRNOTAVAIL; +	if (dev_addr->bound_dev_if) { +		dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); +		if (!dev) +			return -ENODEV; +		ret = rdma_copy_addr(dev_addr, dev, NULL); +		dev_put(dev); +		return ret; +	} +  	switch (addr->sa_family) {  	case AF_INET:  		dev = ip_dev_find(&init_net, @@ -231,6 +240,8 @@ static int addr4_resolve_remote(struct sockaddr_in *src_in,  	memset(&fl, 0, sizeof fl);  	fl.nl_u.ip4_u.daddr = dst_ip;  	fl.nl_u.ip4_u.saddr = src_ip; +	fl.oif = addr->bound_dev_if; +  	ret = ip_route_output_key(&init_net, &rt, &fl);  	if (ret)  		goto out; @@ -279,6 +290,7 @@ static int addr6_resolve_remote(struct sockaddr_in6 *src_in,  	memset(&fl, 0, sizeof fl);  	fl.nl_u.ip6_u.daddr = dst_in->sin6_addr;  	fl.nl_u.ip6_u.saddr = src_in->sin6_addr; +	fl.oif = addr->bound_dev_if;  	dst = ip6_route_output(&init_net, NULL, &fl);  	if (!dst) diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 052b4c01745..699ad12b3a2 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -2820,7 +2820,7 @@ static int cma_netdev_change(struct net_device *ndev, struct rdma_id_private *id  	dev_addr = &id_priv->id.route.addr.dev_addr; -	if ((dev_addr->src_dev == ndev) && +	if ((dev_addr->bound_dev_if == ndev->ifindex) &&  	    memcmp(dev_addr->src_dev_addr, ndev->dev_addr, ndev->addr_len)) {  		printk(KERN_INFO "RDMA CM addr change for ndev %s used by id %p\n",  		       ndev->name, &id_priv->id); diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index 483057b2f4b..27f17cc2c91 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h @@ -61,7 +61,7 @@ struct rdma_dev_addr {  	unsigned char dst_dev_addr[MAX_ADDR_LEN];  	unsigned char broadcast[MAX_ADDR_LEN];  	enum rdma_node_type dev_type; -	struct net_device *src_dev; +	int bound_dev_if;  };  /**  |