]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
Refresh of v6only
authorSean Hefty <sean.hefty@intel.com>
Thu, 28 Jun 2012 18:19:34 +0000 (11:19 -0700)
committerSean Hefty <sean.hefty@intel.com>
Thu, 28 Jun 2012 18:19:34 +0000 (11:19 -0700)
include/rdma/rdma_cma.h
src/rsocket.c

index c0f83b1be30edd488d01b557b68ca1ed31003f12..1487f8f0e9a446849a3d8524247fabfaa72424bb 100755 (executable)
@@ -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[] */
 };
 
index bdb756f9836f718140a6410e2eb5f6207529596b..ed125b3b3a382dafc7ed64b3a4fd65a3ff0c06c9 100644 (file)
@@ -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: