]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librdmacm: Set connection information for AF_IB
authorSean Hefty <sean.hefty@intel.com>
Fri, 21 Sep 2012 22:38:15 +0000 (15:38 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sat, 19 Jan 2013 00:16:13 +0000 (16:16 -0800)
If an rdma_cm id is associated with AF_IB, then all private
data is exposed to the user.  Format the private data
according to the rdma_cm service annex.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
include/rdma/rdma_cma.h
src/acm.c
src/cma.c
src/cma.h

index 4c4a057eaec530d0768ec8e352ed2e60e439b18f..70f7f6bb2333d56337be8888aeb04360181174ab 100755 (executable)
@@ -38,6 +38,7 @@
 #include <sys/socket.h>
 #include <infiniband/verbs.h>
 #include <infiniband/sa.h>
+#include <infiniband/ib.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -96,12 +97,14 @@ struct rdma_addr {
                struct sockaddr         src_addr;
                struct sockaddr_in      src_sin;
                struct sockaddr_in6     src_sin6;
+               struct sockaddr_ib      src_ib;
                struct sockaddr_storage src_storage;
        };
        union {
                struct sockaddr         dst_addr;
                struct sockaddr_in      dst_sin;
                struct sockaddr_in6     dst_sin6;
+               struct sockaddr_ib      dst_ib;
                struct sockaddr_storage dst_storage;
        };
        union {
index c9ca5b56ef4d256aa82eaa76d8e28fce7c29e378..08036adc99b04a067e8bfe5bf4faf81609ac4f7d 100755 (executable)
--- a/src/acm.c
+++ b/src/acm.c
@@ -64,18 +64,6 @@ static pthread_mutex_t acm_lock = PTHREAD_MUTEX_INITIALIZER;
 static int sock = -1;
 static short server_port;
 
-struct ib_connect_hdr {
-       uint8_t  cma_version;
-       uint8_t  ip_version; /* IP version: 7:4 */
-       uint16_t port;
-       uint32_t src_addr[4];
-       uint32_t dst_addr[4];
-#define cma_src_ip4 src_addr[3]
-#define cma_src_ip6 src_addr[0]
-#define cma_dst_ip4 dst_addr[3]
-#define cma_dst_ip6 dst_addr[0]
-};
-
 static int ucma_set_server_port(void)
 {
        FILE *f;
@@ -170,9 +158,6 @@ static int ucma_ib_set_connect(struct rdma_addrinfo *ib_rai,
 {
        struct ib_connect_hdr *hdr;
 
-       if (rai->ai_family == AF_IB)
-               return 0;
-
        hdr = calloc(1, sizeof *hdr);
        if (!hdr)
                return ERR(ENOMEM);
@@ -183,12 +168,21 @@ static int ucma_ib_set_connect(struct rdma_addrinfo *ib_rai,
                       &((struct sockaddr_in *) rai->ai_src_addr)->sin_addr, 4);
                memcpy(&hdr->cma_dst_ip4,
                       &((struct sockaddr_in *) rai->ai_dst_addr)->sin_addr, 4);
-       } else {
+       } else if (rai->ai_family == AF_INET6) {
                hdr->ip_version = 6 << 4;
                memcpy(&hdr->cma_src_ip6,
                       &((struct sockaddr_in6 *) rai->ai_src_addr)->sin6_addr, 16);
                memcpy(&hdr->cma_dst_ip6,
                       &((struct sockaddr_in6 *) rai->ai_dst_addr)->sin6_addr, 16);
+       } else if (rai->ai_family == AF_IB) {
+               hdr->ip_version = 6 << 4;
+               memcpy(&hdr->cma_src_ip6,
+                      &((struct sockaddr_ib *) rai->ai_src_addr)->sib_addr, 16);
+               memcpy(&hdr->cma_dst_ip6,
+                      &((struct sockaddr_ib *) rai->ai_dst_addr)->sib_addr, 16);
+       } else {
+               free(hdr);
+               return ERR(EINVAL);
        }
 
        ib_rai->ai_connect = hdr;
index ff9b426ccee3d0a840ae593da7473ec3a37c7618..85f32eb965cf03322b6881e28f93366c5d5127ab 100755 (executable)
--- a/src/cma.c
+++ b/src/cma.c
@@ -1285,6 +1285,12 @@ static void ucma_copy_conn_param_to_kern(struct cma_id_private *id_priv,
        if (id_priv->connect_len) {
                memcpy(dst->private_data, id_priv->connect, id_priv->connect_len);
                dst->private_data_len = id_priv->connect_len;
+       } else if (id_priv->id.route.addr.src_addr.sa_family == AF_IB) {
+               struct ib_connect_hdr *hdr = (struct ib_connect_hdr *) dst->private_data;
+               hdr->ip_version = 6 << 4;
+               memcpy(&hdr->cma_src_ip6, &id_priv->id.route.addr.src_ib.sib_addr, 16);
+               memcpy(&hdr->cma_dst_ip6, &id_priv->id.route.addr.dst_ib.sib_addr, 16);
+               dst->private_data_len = sizeof(*hdr);
        }
 
        if (src) {
index bdd6a8586b3282114eb18e50859a19cdd4d9a2c3..bd55ddc4079ba0ecbfcd303b6e321ddc9c8b1131 100644 (file)
--- a/src/cma.h
+++ b/src/cma.h
@@ -171,6 +171,18 @@ void ucma_ib_resolve(struct rdma_addrinfo **rai, struct rdma_addrinfo *hints);
 #define ucma_ib_resolve(x, y)
 #endif
 
+struct ib_connect_hdr {
+       uint8_t  cma_version;
+       uint8_t  ip_version; /* IP version: 7:4 */
+       uint16_t port;
+       uint32_t src_addr[4];
+       uint32_t dst_addr[4];
+#define cma_src_ip4 src_addr[3]
+#define cma_src_ip6 src_addr[0]
+#define cma_dst_ip4 dst_addr[3]
+#define cma_dst_ip6 dst_addr[0]
+};
+
 /* Define path record definition if using older version of libibverbs */
 #ifdef DEFINE_PATH_RECORD
 #define IBV_PATH_RECORD_REVERSIBLE 0x80