static int rs, lrs;
static int use_async;
+static int use_rgai;
static int verify;
static int flags = MSG_DONTWAIT;
static int poll_timeout = 0;
struct addrinfo *ai;
int val, ret;
- if (rai_hints.ai_flags) {
- rai_hints.ai_flags |= RAI_PASSIVE;
- ret = rdma_getaddrinfo(src_addr, port, &rai_hints, &rai);
- } else {
+ if (use_getaddrinfo) {
ai_hints.ai_flags |= AI_PASSIVE;
ret = getaddrinfo(src_addr, port, &ai_hints, &ai);
+ } else {
+ rai_hints.ai_flags |= RAI_PASSIVE;
+ ret = rdma_getaddrinfo(src_addr, port, &rai_hints, &rai);
}
if (ret) {
perror("getaddrinfo");
return ret;
}
- lrs = rai_hints.ai_flags ?
+ lrs = rai->ai_family ?
rs_socket(rai->ai_family, SOCK_STREAM, 0) :
rs_socket(ai->ai_family, SOCK_STREAM, 0);
if (lrs < 0) {
static int client_connect(void)
{
- struct rdma_addrinfo *rai;
+ struct rdma_addrinfo *rai = NULL;
struct addrinfo *ai;
struct pollfd fds;
int ret, err;
socklen_t len;
- ret = rai_hints.ai_flags ?
- rdma_getaddrinfo(dst_addr, port, &rai_hints, &rai) :
- getaddrinfo(dst_addr, port, &ai_hints, &ai);
+ ret = use_rgai ? rdma_getaddrinfo(dst_addr, port, &rai_hints, &rai) :
+ getaddrinfo(dst_addr, port, &ai_hints, &ai);
+
if (ret) {
perror("getaddrinfo");
return ret;
}
- rs = rai_hints.ai_flags ?
- rs_socket(rai->ai_family, SOCK_STREAM, 0) :
- rs_socket(ai->ai_family, SOCK_STREAM, 0);
+ rs = rai ? rs_socket(rai->ai_family, SOCK_STREAM, 0) :
+ rs_socket(ai->ai_family, SOCK_STREAM, 0);
if (rs < 0) {
perror("rsocket");
ret = rs;
set_options(rs);
/* TODO: bind client to src_addr */
- ret = rai_hints.ai_flags ?
- rs_connect(rs, rai->ai_dst_addr, rai->ai_dst_len) :
- rs_connect(rs, ai->ai_addr, ai->ai_addrlen);
+ if (rai && rai->ai_route) {
+ ret = rs_setsockopt(rs, SOL_RDMA, RDMA_ROUTE, rai->ai_route,
+ rai->ai_route_len);
+ if (ret) {
+ perror("rsetsockopt RDMA_ROUTE");
+ goto close;
+ }
+ }
+
+ ret = rai ? rs_connect(rs, rai->ai_dst_addr, rai->ai_dst_len) :
+ rs_connect(rs, ai->ai_addr, ai->ai_addrlen);
if (ret && (errno != EINPROGRESS)) {
perror("rconnect");
goto close;
if (ret)
rs_close(rs);
free:
- if (rai_hints.ai_flags)
+ if (rai)
rdma_freeaddrinfo(rai);
else
freeaddrinfo(ai);
case 'n':
flags |= MSG_DONTWAIT;
break;
+ case 'r':
+ use_rgai = 1;
+ break;
case 'v':
verify = 1;
break;
flags = (flags & ~MSG_DONTWAIT) | MSG_WAITALL;
} else if (!strncasecmp("nonblock", optarg, 8)) {
flags |= MSG_DONTWAIT;
+ } else if (strncasecmp("resolve", optarg, 7)) {
+ use_rgai = 1;
} else if (!strncasecmp("verify", optarg, 6)) {
verify = 1;
} else if (!strncasecmp("fork", optarg, 4)) {
} else if (!strncasecmp("gid", optarg, 3)) {
rai_hints.ai_flags = RAI_NUMERICHOST | RAI_FAMILY;
rai_hints.ai_family = AF_IB;
+ use_rgai = 1;
}
break;
case 'B':
printf("\t b|blocking - use blocking calls\n");
printf("\t f|fork - fork server processing\n");
printf("\t n|nonblocking - use nonblocking calls\n");
+ printf("\t r|resolve - use rdma cm to resolve address\n");
printf("\t v|verify - verify data\n");
exit(1);
}