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[] */
};
long fd_flags;
uint64_t so_opts;
uint64_t tcp_opts;
+ uint64_t ipv6_opts;
int state;
int cq_armed;
int retries;
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);
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: