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>
This commit is contained in:
parent
e2e626972e
commit
6266ed6e41
|
@ -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);
|
memcpy(dev_addr->broadcast, dev->broadcast, MAX_ADDR_LEN);
|
||||||
if (dst_dev_addr)
|
if (dst_dev_addr)
|
||||||
memcpy(dev_addr->dst_dev_addr, dst_dev_addr, MAX_ADDR_LEN);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rdma_copy_addr);
|
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;
|
struct net_device *dev;
|
||||||
int ret = -EADDRNOTAVAIL;
|
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) {
|
switch (addr->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
dev = ip_dev_find(&init_net,
|
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);
|
memset(&fl, 0, sizeof fl);
|
||||||
fl.nl_u.ip4_u.daddr = dst_ip;
|
fl.nl_u.ip4_u.daddr = dst_ip;
|
||||||
fl.nl_u.ip4_u.saddr = src_ip;
|
fl.nl_u.ip4_u.saddr = src_ip;
|
||||||
|
fl.oif = addr->bound_dev_if;
|
||||||
|
|
||||||
ret = ip_route_output_key(&init_net, &rt, &fl);
|
ret = ip_route_output_key(&init_net, &rt, &fl);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -279,6 +290,7 @@ static int addr6_resolve_remote(struct sockaddr_in6 *src_in,
|
||||||
memset(&fl, 0, sizeof fl);
|
memset(&fl, 0, sizeof fl);
|
||||||
fl.nl_u.ip6_u.daddr = dst_in->sin6_addr;
|
fl.nl_u.ip6_u.daddr = dst_in->sin6_addr;
|
||||||
fl.nl_u.ip6_u.saddr = src_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);
|
dst = ip6_route_output(&init_net, NULL, &fl);
|
||||||
if (!dst)
|
if (!dst)
|
||||||
|
|
|
@ -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;
|
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)) {
|
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",
|
printk(KERN_INFO "RDMA CM addr change for ndev %s used by id %p\n",
|
||||||
ndev->name, &id_priv->id);
|
ndev->name, &id_priv->id);
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct rdma_dev_addr {
|
||||||
unsigned char dst_dev_addr[MAX_ADDR_LEN];
|
unsigned char dst_dev_addr[MAX_ADDR_LEN];
|
||||||
unsigned char broadcast[MAX_ADDR_LEN];
|
unsigned char broadcast[MAX_ADDR_LEN];
|
||||||
enum rdma_node_type dev_type;
|
enum rdma_node_type dev_type;
|
||||||
struct net_device *src_dev;
|
int bound_dev_if;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue