]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
Refresh of afib
authorSean Hefty <sean.hefty@intel.com>
Tue, 11 Jun 2013 17:58:50 +0000 (10:58 -0700)
committerSean Hefty <sean.hefty@intel.com>
Tue, 11 Jun 2013 17:58:50 +0000 (10:58 -0700)
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;
                }