From c11ce25641abe5d85be86940a60a16a271011a30 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 6 Apr 2010 17:22:30 -0700 Subject: [PATCH] rdma/cm: Allow user to specify AF_IB when binding Modify rdma_bind_addr to allow the user to specify AF_IB when binding to a device. AF_IB indicates that the user is not mapping an IP address to the native IB addressing. (The mapping may have already been done, or is not needed.) AF_IB is restricted to the RDMA_PS_IB port space. Signed-off-by: Sean Hefty --- drivers/infiniband/core/cma.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index fba593f8e93..73f1b4a2f74 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c @@ -329,6 +329,13 @@ static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey) return ret; } +static void cma_translate_ib(struct sockaddr_ib *addr, struct rdma_dev_addr *dev_addr) +{ + dev_addr->dev_type = ARPHRD_INFINIBAND; + rdma_addr_set_sgid(dev_addr, (union ib_gid *) &addr->sib_addr); + ib_addr_set_pkey(dev_addr, ntohs(addr->sib_pkey)); +} + static int cma_acquire_dev(struct rdma_id_private *id_priv) { struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; @@ -2187,7 +2194,9 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) struct rdma_id_private *id_priv; int ret; - if (addr->sa_family != AF_INET && addr->sa_family != AF_INET6) + if ((addr->sa_family != AF_INET && addr->sa_family != AF_INET6 && + addr->sa_family != AF_IB) || + (addr->sa_family == AF_IB && id->ps != RDMA_PS_IB)) return -EAFNOSUPPORT; id_priv = container_of(id, struct rdma_id_private, id); @@ -2199,9 +2208,14 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) goto err1; if (!cma_any_addr(addr)) { - ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); - if (ret) - goto err1; + if (addr->sa_family == AF_IB) { + cma_translate_ib((struct sockaddr_ib *) addr, + &id->route.addr.dev_addr); + } else { + ret = rdma_translate_ip(addr, &id->route.addr.dev_addr); + if (ret) + goto err1; + } mutex_lock(&lock); ret = cma_acquire_dev(id_priv); -- 2.41.0