From a71c8b60bc12c2c1023c7caac295e868fdf57022 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 12 Jun 2012 12:43:39 -0700 Subject: [PATCH] Refresh of v6only --- include/rdma/rdma_cma.h | 1 + src/rsocket.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/rdma/rdma_cma.h b/include/rdma/rdma_cma.h index c0f83b1b..1487f8f0 100755 --- a/include/rdma/rdma_cma.h +++ b/include/rdma/rdma_cma.h @@ -650,6 +650,7 @@ enum { enum { RDMA_OPTION_ID_TOS = 0, /* uint8_t: RFC 2474 */ RDMA_OPTION_ID_REUSEADDR = 1, /* int: ~SO_REUSEADDR */ + RDMA_OPTION_ID_AFONLY = 2, /* int: ~IPV6_V6ONLY */ RDMA_OPTION_IB_PATH = 1 /* struct ibv_path_data[] */ }; diff --git a/src/rsocket.c b/src/rsocket.c index a3c2c6ac..860c63ed 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -161,6 +161,7 @@ struct rsocket { long fd_flags; uint64_t so_opts; uint64_t tcp_opts; + uint64_t ipv6_opts; enum rs_state state; int cq_armed; int retries; @@ -1817,6 +1818,18 @@ int rsetsockopt(int socket, int level, int optname, break; } break; + case IPPROTO_IPV6: + opts = &rs->ipv6_opts; + switch (optname) { + case IPV6_V6ONLY: + ret = rdma_set_option(rs->cm_id, RDMA_OPTION_ID, + RDMA_OPTION_ID_AFONLY, + (void *) optval, optlen); + opt_on = *(int *) optval; + break; + default: + break; + } case SOL_RDMA: if (rs->state > rs_listening) { ret = ERR(EINVAL); @@ -1910,6 +1923,16 @@ int rgetsockopt(int socket, int level, int optname, break; } break; + case IPPROTO_IPV6: + switch (optname) { + case IPV6_V6ONLY: + *((int *) optval) = !!(rs->ipv6_opts & (1 << optname)); + *optlen = sizeof(int); + break; + default: + ret = ENOTSUP; + break; + } case SOL_RDMA: switch (optname) { case RDMA_SQSIZE: -- 2.45.2