From: Sean Hefty Date: Mon, 10 Jun 2013 19:33:20 +0000 (-0700) Subject: rsockets: Add ability to set the IB route directly X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=37b02022a84c4755549c3a74ed932b02e40d0509;p=~shefty%2Flibrdmacm.git rsockets: Add ability to set the IB route directly 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 --- 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 e2b1cc70..e3406a48 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -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,7 +1245,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) @@ -3312,6 +3322,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; }