int rgetsockname(int socket, struct sockaddr *addr, socklen_t *addrlen);
#define SOL_RDMA 0x10000
+enum {
+ RDMA_SQSIZE,
+ RDMA_RQSIZE
+};
int rsetsockopt(int socket, int level, int optname,
const void *optval, socklen_t optlen);
static inline uint64_t ntohll(uint64_t x) { return x; }
#endif
+#define max(a, b) ((a) > (b) ? a : b)
#define min(a, b) ((a) < (b) ? a : b)
/*
if (rs->sq_size > max_size)
rs->sq_size = max_size;
+ else if (rs->sq_size < 2)
+ rs->sq_size = 2;
+ if (rs->sq_size <= (RS_QP_CTRL_SIZE << 2))
+ rs->ctrl_avail = 1;
+
if (rs->rq_size > max_size)
rs->rq_size = max_size;
+ else if (rs->rq_size < 2)
+ rs->rq_size = 2;
}
static int rs_init_bufs(struct rsocket *rs)
}
break;
case SOL_RDMA:
+ if (rs->state > rs_listening) {
+ ret = ERR(EINVAL);
+ break;
+ }
+
+ switch (optname) {
+ case RDMA_SQSIZE:
+ rs->sq_size = min((*(uint32_t *) optval), RS_QP_MAX_SIZE);
+ break;
+ case RDMA_RQSIZE:
+ rs->rq_size = min((*(uint32_t *) optval), RS_QP_MAX_SIZE);
+ break;
+ default:
+ break;
+ }
break;
default:
break;
}
- if (!ret) {
+ if (!ret && opts) {
if (opt_on)
*opts |= (1 << optname);
else
}
break;
case SOL_RDMA:
- ret = ENOTSUP;
+ switch (optname) {
+ case RDMA_SQSIZE:
+ *((int *) optval) = rs->sq_size;
+ *optlen = sizeof(int);
+ break;
+ case RDMA_RQSIZE:
+ *((int *) optval) = rs->rq_size;
+ *optlen = sizeof(int);
+ break;
+ default:
+ ret = ENOTSUP;
+ break;
+ }
break;
default:
ret = ENOTSUP;