IB/core: Honor port_num while resolving GID for IB link layer
authorParav Pandit <parav@mellanox.com>
Tue, 13 Mar 2018 14:06:14 +0000 (16:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 May 2018 05:52:32 +0000 (07:52 +0200)
[ Upstream commit 563c4ba3bd2b8b0b21c65669ec2226b1cfa1138b ]

ah_attr contains the port number to which cm_id is bound. However, while
searching for GID table for matching GID entry, the port number is
ignored.

This could cause the wrong GID to be used when the ah_attr is converted to
an AH.

Reviewed-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/infiniband/core/multicast.c

index 45f2f09..4eb72ff 100644 (file)
@@ -724,21 +724,19 @@ int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
 {
        int ret;
        u16 gid_index;
-       u8 p;
-
-       if (rdma_protocol_roce(device, port_num)) {
-               ret = ib_find_cached_gid_by_port(device, &rec->port_gid,
-                                                gid_type, port_num,
-                                                ndev,
-                                                &gid_index);
-       } else if (rdma_protocol_ib(device, port_num)) {
-               ret = ib_find_cached_gid(device, &rec->port_gid,
-                                        IB_GID_TYPE_IB, NULL, &p,
-                                        &gid_index);
-       } else {
-               ret = -EINVAL;
-       }
 
+       /* GID table is not based on the netdevice for IB link layer,
+        * so ignore ndev during search.
+        */
+       if (rdma_protocol_ib(device, port_num))
+               ndev = NULL;
+       else if (!rdma_protocol_roce(device, port_num))
+               return -EINVAL;
+
+       ret = ib_find_cached_gid_by_port(device, &rec->port_gid,
+                                        gid_type, port_num,
+                                        ndev,
+                                        &gid_index);
        if (ret)
                return ret;