]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rsockets: Add ability to set the IB route directly
authorSean Hefty <sean.hefty@intel.com>
Mon, 10 Jun 2013 19:33:20 +0000 (12:33 -0700)
committerSean Hefty <sean.hefty@intel.com>
Fri, 26 Jul 2013 16:48:23 +0000 (09:48 -0700)
Add an RDMA specific rsocket option that allows the user
to program the RDMA route directly.  This is useful
for apps that have path record data available, either
through the ibacm or SSA, and is needed by SSA itself
to connect over rsockets.

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

index f220c134f306701971e32f72a42637a47620d55a..efd0db58bf96fbaed165797f80757ce8aeca6189 100644 (file)
@@ -78,7 +78,8 @@ enum {
        RDMA_SQSIZE,
        RDMA_RQSIZE,
        RDMA_INLINE,
-       RDMA_IOMAPSIZE
+       RDMA_IOMAPSIZE,
+       RDMA_ROUTE
 };
 
 int rsetsockopt(int socket, int level, int optname,
index 6339c47f6bf534747b94028718516f92a7558326..1851b3c5a78345636e2c68eaa51148c48b476475 100644 (file)
@@ -329,6 +329,8 @@ struct rsocket {
        long              fd_flags;
        uint64_t          so_opts;
        uint64_t          ipv6_opts;
+       void              *optval;
+       size_t            optlen;
        int               state;
        int               cq_armed;
        int               retries;
@@ -1243,7 +1245,15 @@ resolve_addr:
                rs->retries = 0;
 resolve_route:
                to = 1000 << rs->retries++;
-               ret = rdma_resolve_route(rs->cm_id, to);
+               if (rs->optval) {
+                       ret = rdma_set_option(rs->cm_id,  RDMA_OPTION_IB,
+                                             RDMA_OPTION_IB_PATH, rs->optval,
+                                             rs->optlen);
+                       free(rs->optval);
+                       rs->optval = 0;
+               } else {
+                       ret = rdma_resolve_route(rs->cm_id, to);
+               }
                if (!ret)
                        goto do_connect;
                if (errno == EAGAIN || errno == EWOULDBLOCK)
@@ -3312,6 +3322,14 @@ int rsetsockopt(int socket, int level, int optname,
                        rs->target_iomap_size = (uint16_t) rs_scale_to_value(
                                (uint8_t) rs_value_to_scale(*(int *) optval, 8), 8);
                        break;
+               case RDMA_ROUTE:
+                       if ((rs->optval = calloc(optlen, 1))) {
+                               memcpy(rs->optval, optval, optlen);
+                               rs->optlen = optlen;
+                       } else {
+                               ret = ERR(ENOMEM);
+                       }
+                       break;
                default:
                        break;
                }