From 56e2b4566930fa7b05debec8b247e8dfe9df7ffe Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Tue, 12 Jun 2012 12:02:04 -0700 Subject: [PATCH] rsocket: Support IPV6_V6ONLY socket option Signed-off-by: Sean Hefty --- include/rdma/rdma_cma.h | 1 + src/rsocket.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 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 bdb756f9..ed125b3b 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -166,6 +166,7 @@ struct rsocket { long fd_flags; uint64_t so_opts; uint64_t tcp_opts; + uint64_t ipv6_opts; int state; int cq_armed; int retries; @@ -1849,6 +1850,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_opening) { ret = ERR(EINVAL); @@ -1942,6 +1955,17 @@ 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; + } + break; case SOL_RDMA: switch (optname) { case RDMA_SQSIZE: -- 2.41.0