From: Sean Hefty Date: Tue, 11 Jun 2013 17:58:50 +0000 (-0700) Subject: Refresh of afib X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=5e91ce4fb5ac0e1ce20ee24cf64e3b778f722f09;p=~shefty%2Flibrdmacm.git Refresh of afib --- diff --git a/include/rdma/rsocket.h b/include/rdma/rsocket.h index f220c134..efd0db58 100644 --- a/include/rdma/rsocket.h +++ b/include/rdma/rsocket.h @@ -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, diff --git a/src/rsocket.c b/src/rsocket.c index abdd392e..35d62ead 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -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; }