aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/core/cma.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index d2d5d004f16d..2d762a2ecd81 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1265,15 +1265,17 @@ static bool cma_protocol_roce(const struct rdma_cm_id *id)
1265 return cma_protocol_roce_dev_port(device, port_num); 1265 return cma_protocol_roce_dev_port(device, port_num);
1266} 1266}
1267 1267
1268static bool cma_match_net_dev(const struct rdma_id_private *id_priv, 1268static bool cma_match_net_dev(const struct rdma_cm_id *id,
1269 const struct net_device *net_dev) 1269 const struct net_device *net_dev,
1270 u8 port_num)
1270{ 1271{
1271 const struct rdma_addr *addr = &id_priv->id.route.addr; 1272 const struct rdma_addr *addr = &id->route.addr;
1272 1273
1273 if (!net_dev) 1274 if (!net_dev)
1274 /* This request is an AF_IB request or a RoCE request */ 1275 /* This request is an AF_IB request or a RoCE request */
1275 return addr->src_addr.ss_family == AF_IB || 1276 return (!id->port_num || id->port_num == port_num) &&
1276 cma_protocol_roce(&id_priv->id); 1277 (addr->src_addr.ss_family == AF_IB ||
1278 cma_protocol_roce_dev_port(id->device, port_num));
1277 1279
1278 return !addr->dev_addr.bound_dev_if || 1280 return !addr->dev_addr.bound_dev_if ||
1279 (net_eq(dev_net(net_dev), addr->dev_addr.net) && 1281 (net_eq(dev_net(net_dev), addr->dev_addr.net) &&
@@ -1295,13 +1297,13 @@ static struct rdma_id_private *cma_find_listener(
1295 hlist_for_each_entry(id_priv, &bind_list->owners, node) { 1297 hlist_for_each_entry(id_priv, &bind_list->owners, node) {
1296 if (cma_match_private_data(id_priv, ib_event->private_data)) { 1298 if (cma_match_private_data(id_priv, ib_event->private_data)) {
1297 if (id_priv->id.device == cm_id->device && 1299 if (id_priv->id.device == cm_id->device &&
1298 cma_match_net_dev(id_priv, net_dev)) 1300 cma_match_net_dev(&id_priv->id, net_dev, req->port))
1299 return id_priv; 1301 return id_priv;
1300 list_for_each_entry(id_priv_dev, 1302 list_for_each_entry(id_priv_dev,
1301 &id_priv->listen_list, 1303 &id_priv->listen_list,
1302 listen_list) { 1304 listen_list) {
1303 if (id_priv_dev->id.device == cm_id->device && 1305 if (id_priv_dev->id.device == cm_id->device &&
1304 cma_match_net_dev(id_priv_dev, net_dev)) 1306 cma_match_net_dev(&id_priv_dev->id, net_dev, req->port))
1305 return id_priv_dev; 1307 return id_priv_dev;
1306 } 1308 }
1307 } 1309 }