{
uint16_t port;
- if (addr->sa_family == AF_INET)
- port = ((struct sockaddr_in *) addr)->sin_port;
- else
- port = ((struct sockaddr_in6 *) addr)->sin6_port;
-
+ port = addr ? ucma_get_port(addr) : 0;
sib->sib_sid = htonll(((uint64_t) ps << 16) + ntohs(port));
+
+ if (ps)
+ sib->sib_sid_mask = htonll(RDMA_IB_IP_PORT_MASK);
if (port)
- sib->sib_sid_mask = ~0ULL;
- else
- sib->sib_sid_mask = htonll(RDMA_IB_IP_PS_MASK);
+ sib->sib_sid_mask |= htonll(RDMA_IB_IP_PORT_MASK);
}
static int ucma_ib_set_addr(struct rdma_addrinfo *ib_rai,
{
struct ib_connect_hdr *hdr;
+ if (rai->ai_family == AF_IB)
+ return 0;
+
hdr = calloc(1, sizeof *hdr);
if (!hdr)
return ERR(ENOMEM);
if (ucma_inet_addr((*rai)->ai_dst_addr, (*rai)->ai_dst_len)) {
data->flags = ACM_EP_FLAG_DEST;
- if ((*rai)->ai_flags & (RAI_NUMERICHOST | RAI_NOROUTE))
+ if (hints->ai_flags & (RAI_NUMERICHOST | RAI_NOROUTE))
data->flags |= ACM_FLAGS_NODELAY;
ucma_set_ep_addr(data, (*rai)->ai_dst_addr);
data++;
msg.hdr.length += ACM_MSG_EP_LENGTH;
}
- if (hints && (hints->ai_route_len ||
+ if (hints->ai_route_len ||
ucma_ib_addr((*rai)->ai_src_addr, (*rai)->ai_src_len) ||
- ucma_ib_addr((*rai)->ai_dst_addr, (*rai)->ai_dst_len))) {
+ ucma_ib_addr((*rai)->ai_dst_addr, (*rai)->ai_dst_len)) {
struct ibv_path_record *path;
if (hints->ai_route_len == sizeof(struct ibv_path_record))
ucma_ib_save_resp(*rai, &msg);
- if (af_ib_support && !((*rai)->ai_flags & RAI_ROUTEONLY) &&
- (*rai)->ai_route_len && ((*rai)->ai_family != AF_IB))
+ if (af_ib_support && !(hints->ai_flags & RAI_ROUTEONLY) && (*rai)->ai_route_len)
ucma_resolve_af_ib(rai);
}
#define RDMA_QPT_XRC_RECV 10
#endif
+struct rdma_addrinfo nohints;
+
static void ucma_convert_to_ai(struct addrinfo *ai, struct rdma_addrinfo *rai)
{
memset(ai, 0, sizeof *ai);
{
int ret;
- rai->ai_family = ai->ai_family;
-
- if (hints && hints->ai_qp_type) {
+ if (hints->ai_qp_type) {
rai->ai_qp_type = hints->ai_qp_type;
} else {
switch (ai->ai_socktype) {
}
}
- if (hints && hints->ai_port_space) {
+ if (hints->ai_port_space) {
rai->ai_port_space = hints->ai_port_space;
} else {
switch (ai->ai_protocol) {
}
}
- if (ai->ai_flags & RAI_PASSIVE) {
+ if (ai->ai_flags & AI_PASSIVE) {
+ rai->ai_flags = RAI_PASSIVE
if (ai->ai_canonname)
rai->ai_src_canonname = strdup(ai->ai_canonname);
if ((hints->ai_flags & RAI_FAMILY) && (hints->ai_family == AF_IB) &&
(hints->ai_flags & RAI_NUMERICHOST)) {
+ rai->ai_family = AF_IB;
ret = ucma_convert_in6((struct sockaddr_ib **) &rai->ai_src_addr,
&rai->ai_src_len,
(struct sockaddr_in6 *) ai->ai_addr,
ai->ai_addrlen);
} else {
+ rai->ai_family = ai->ai_family;
ret = ucma_copy_addr(&rai->ai_src_addr, &rai->ai_src_len,
ai->ai_addr, ai->ai_addrlen);
}
if ((hints->ai_flags & RAI_FAMILY) && (hints->ai_family == AF_IB) &&
(hints->ai_flags & RAI_NUMERICHOST)) {
+ rai->ai_family = AF_IB;
ret = ucma_convert_in6((struct sockaddr_ib **) &rai->ai_dst_addr,
&rai->ai_dst_len,
(struct sockaddr_in6 *) ai->ai_addr,
ai->ai_addrlen);
} else {
+ rai->ai_family = ai->ai_family;
ret = ucma_copy_addr(&rai->ai_dst_addr, &rai->ai_dst_len,
ai->ai_addr, ai->ai_addrlen);
}
return ret;
}
-static int ucma_convert_gai(char *node, char *service,
+static int ucma_getaddrinfo(char *node, char *service,
struct rdma_addrinfo *hints,
struct rdma_addrinfo *rai)
{
struct addrinfo ai_hints;
- struct addrinfo *ai, *aih;
+ struct addrinfo *ai;
int ret;
- if (hints) {
+ if (hints != &nohints) {
ucma_convert_to_ai(&ai_hints, hints);
- rai->ai_flags = hints->ai_flags;
- aih = &ai_hints;
+ ret = getaddrinfo(node, service, &ai_hints, &ai);
} else {
- aih = NULL;
+ ret = getaddrinfo(node, service, NULL, &ai);
}
-
- ret = getaddrinfo(node, service, aih, &ai);
if (ret)
return ret;
if (!rai)
return ERR(ENOMEM);
+ if (!hints)
+ hints = &nohints;
+
if (node || service) {
- ret = ucma_convert_gai(node, service, hints, rai);
+ ret = ucma_getaddrinfo(node, service, hints, rai);
} else {
rai->ai_flags = hints->ai_flags;
rai->ai_family = hints->ai_family;
if (ret)
goto err;
- if (!rai->ai_src_len && hints && hints->ai_src_len) {
+ if (!rai->ai_src_len && hints->ai_src_len) {
ret = ucma_copy_addr(&rai->ai_src_addr, &rai->ai_src_len,
hints->ai_src_addr, hints->ai_src_len);
if (ret)