]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
rdma/cm: Allow user to specify AF_IB when binding
authorSean Hefty <sean.hefty@intel.com>
Wed, 7 Apr 2010 00:22:30 +0000 (17:22 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sat, 7 Jan 2012 00:49:52 +0000 (16:49 -0800)
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.)

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
drivers/infiniband/core/cma.c

index 25ce53a441e089b871aaaf32f7db92b693ef1586..5c39895acf0bc569ac55ee54e4a1f6f93f6ab603 100644 (file)
@@ -352,6 +352,27 @@ static int find_gid_port(struct ib_device *device, union ib_gid *gid, u8 port_nu
        return -EAGAIN;
 }
 
+static void cma_translate_ib(struct sockaddr_ib *sib, struct rdma_dev_addr *dev_addr)
+{
+       dev_addr->dev_type = ARPHRD_INFINIBAND;
+       rdma_addr_set_sgid(dev_addr, (union ib_gid *) &sib->sib_addr);
+       ib_addr_set_pkey(dev_addr, ntohs(sib->sib_pkey));
+}
+
+static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_addr)
+{
+       int ret;
+
+       if (addr->sa_family != AF_IB) {
+               ret = rdma_translate_ip(addr, dev_addr);
+       } else {
+               cma_translate_ib((struct sockaddr_ib *) addr, dev_addr);
+               ret = 0;
+       }
+
+       return ret;
+}
+
 static int cma_acquire_dev(struct rdma_id_private *id_priv)
 {
        struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr;
@@ -1130,8 +1151,8 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
                rdma_addr_set_sgid(&rt->addr.dev_addr, &rt->path_rec[0].sgid);
                ib_addr_set_pkey(&rt->addr.dev_addr, be16_to_cpu(rt->path_rec[0].pkey));
        } else {
-               ret = rdma_translate_ip((struct sockaddr *) &rt->addr.src_addr,
-                                       &rt->addr.dev_addr);
+               ret = cma_translate_addr((struct sockaddr *) &rt->addr.src_addr,
+                                        &rt->addr.dev_addr);
                if (ret)
                        goto err;
        }
@@ -1170,8 +1191,8 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
                          ip_ver, port, src, dst);
 
        if (!cma_any_addr((struct sockaddr *) &id->route.addr.src_addr)) {
-               ret = rdma_translate_ip((struct sockaddr *) &id->route.addr.src_addr,
-                                       &id->route.addr.dev_addr);
+               ret = cma_translate_addr((struct sockaddr *) &id->route.addr.src_addr,
+                                        &id->route.addr.dev_addr);
                if (ret)
                        goto err;
        }
@@ -2416,7 +2437,8 @@ 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)
                return -EAFNOSUPPORT;
 
        id_priv = container_of(id, struct rdma_id_private, id);
@@ -2428,7 +2450,7 @@ 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);
+               ret = cma_translate_addr(addr, &id->route.addr.dev_addr);
                if (ret)
                        goto err1;