]> 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>
Wed, 31 Jul 2013 01:37:21 +0000 (18:37 -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 e2b1cc70f6bb491b97eb84f3b2b985323b2918a9..57df2907f64aaba4438fc6f770ea5d5bd79a1f00 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,13 +1245,26 @@ resolve_addr:
                rs->retries = 0;
 resolve_route:
                to = 1000 << rs->retries++;
-               ret = rdma_resolve_route(rs->cm_id, to);
-               if (!ret)
-                       goto do_connect;
+               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 = NULL;
+                       if (!ret) {
+                               rs->state = rs_resolving_route;
+                               goto resolving_route;
+                       }
+               } else {
+                       ret = rdma_resolve_route(rs->cm_id, to);
+                       if (!ret)
+                               goto do_connect;
+               }
                if (errno == EAGAIN || errno == EWOULDBLOCK)
                        rs->state = rs_resolving_route;
                break;
        case rs_resolving_route:
+resolving_route:
                ret = ucma_complete(rs->cm_id);
                if (ret) {
                        if (errno == ETIMEDOUT && rs->retries <= RS_CONN_RETRIES)
@@ -3312,6 +3327,15 @@ 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;
+                               ret = 0;
+                       } else {
+                               ret = ERR(ENOMEM);
+                       }
+                       break;
                default:
                        break;
                }