RDMA/ucma: Use rdma cm API to query GID
authorParav Pandit <parav@mellanox.com>
Thu, 18 Jan 2018 08:11:17 +0000 (10:11 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 19 Jan 2018 20:05:38 +0000 (13:05 -0700)
Make use of rdma_read_gids() API to read SGID and DGID which returns
correct GIDs for RoCE and other transports.

rdma_addr_get_dgid() for RoCE for client side connections returns MAC
address, instead of DGID.
rdma_addr_get_sgid() for RoCE doesn't return correct SGID for IPv6 and
when more than one IP address is assigned to the netdevice.

Therefore use transport agnostic rdma_read_gids() API provided by rdma_cm
module.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/ucma.c

index 2ec0f89035fb7610bc3bae932474c1348247618e..d67219db99be813518942a44daa47b7a9f93b2f7 100644 (file)
@@ -944,8 +944,8 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
        } else {
                addr->sib_family = AF_IB;
                addr->sib_pkey = (__force __be16) resp.pkey;
-               rdma_addr_get_sgid(&ctx->cm_id->route.addr.dev_addr,
-                                  (union ib_gid *) &addr->sib_addr);
+               rdma_read_gids(ctx->cm_id, (union ib_gid *)&addr->sib_addr,
+                              NULL);
                addr->sib_sid = rdma_get_service_id(ctx->cm_id, (struct sockaddr *)
                                                    &ctx->cm_id->route.addr.src_addr);
        }
@@ -957,8 +957,8 @@ static ssize_t ucma_query_gid(struct ucma_context *ctx,
        } else {
                addr->sib_family = AF_IB;
                addr->sib_pkey = (__force __be16) resp.pkey;
-               rdma_addr_get_dgid(&ctx->cm_id->route.addr.dev_addr,
-                                  (union ib_gid *) &addr->sib_addr);
+               rdma_read_gids(ctx->cm_id, NULL,
+                              (union ib_gid *)&addr->sib_addr);
                addr->sib_sid = rdma_get_service_id(ctx->cm_id, (struct sockaddr *)
                                                    &ctx->cm_id->route.addr.dst_addr);
        }