]> 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>
Sun, 21 Jul 2013 02:20:41 +0000 (19:20 -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 1a6d989d46e3f699147eba5f45d05dd674d3808b..cfced22becd0ec5aa7b86e4b5a0d0948baaefce2 100644 (file)
@@ -319,6 +319,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;
@@ -1227,7 +1229,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)
@@ -3293,6 +3303,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;
                }