]> 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>
Mon, 10 Jun 2013 19:33:20 +0000 (12:33 -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.

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 abdd392ed215955dc1c84597b370ee4f8f2d8953..35d62eade37f7a859f5b3c868594ac866480ac51 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;
                }