Commit abae1b71 authored by Matan Barak's avatar Matan Barak Committed by Doug Ledford

IB/cma: cma_validate_port should verify the port and netdevice

Previously, cma_validate_port searched for GIDs in IB cache and then
tried to verify the found port. This could fail when there are
identical GIDs on both ports. In addition, netdevice should be taken
into account when searching the GID table.
Fixing cma_validate_port to search only the relevant port's cache
and netdevice.
Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent c2c6ff13
...@@ -427,10 +427,11 @@ static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_a ...@@ -427,10 +427,11 @@ static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_a
} }
static inline int cma_validate_port(struct ib_device *device, u8 port, static inline int cma_validate_port(struct ib_device *device, u8 port,
union ib_gid *gid, int dev_type) union ib_gid *gid, int dev_type,
int bound_if_index)
{ {
u8 found_port;
int ret = -ENODEV; int ret = -ENODEV;
struct net_device *ndev = NULL;
if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port)) if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port))
return ret; return ret;
...@@ -438,9 +439,13 @@ static inline int cma_validate_port(struct ib_device *device, u8 port, ...@@ -438,9 +439,13 @@ static inline int cma_validate_port(struct ib_device *device, u8 port,
if ((dev_type != ARPHRD_INFINIBAND) && rdma_protocol_ib(device, port)) if ((dev_type != ARPHRD_INFINIBAND) && rdma_protocol_ib(device, port))
return ret; return ret;
ret = ib_find_cached_gid(device, gid, NULL, &found_port, NULL); if (dev_type == ARPHRD_ETHER)
if (port != found_port) ndev = dev_get_by_index(&init_net, bound_if_index);
return -ENODEV;
ret = ib_find_cached_gid_by_port(device, gid, port, ndev, NULL);
if (ndev)
dev_put(ndev);
return ret; return ret;
} }
...@@ -472,7 +477,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv, ...@@ -472,7 +477,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv,
&iboe_gid : &gid; &iboe_gid : &gid;
ret = cma_validate_port(cma_dev->device, port, gidp, ret = cma_validate_port(cma_dev->device, port, gidp,
dev_addr->dev_type); dev_addr->dev_type,
dev_addr->bound_dev_if);
if (!ret) { if (!ret) {
id_priv->id.port_num = port; id_priv->id.port_num = port;
goto out; goto out;
...@@ -490,7 +496,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv, ...@@ -490,7 +496,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv,
&iboe_gid : &gid; &iboe_gid : &gid;
ret = cma_validate_port(cma_dev->device, port, gidp, ret = cma_validate_port(cma_dev->device, port, gidp,
dev_addr->dev_type); dev_addr->dev_type,
dev_addr->bound_dev_if);
if (!ret) { if (!ret) {
id_priv->id.port_num = port; id_priv->id.port_num = port;
goto out; goto out;
...@@ -2296,8 +2303,11 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv) ...@@ -2296,8 +2303,11 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
route->num_paths = 1; route->num_paths = 1;
if (addr->dev_addr.bound_dev_if) if (addr->dev_addr.bound_dev_if) {
ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if); ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if);
route->path_rec->net = &init_net;
route->path_rec->ifindex = addr->dev_addr.bound_dev_if;
}
if (!ndev) { if (!ndev) {
ret = -ENODEV; ret = -ENODEV;
goto err2; goto err2;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment