static void ucma_convert_to_ai(struct addrinfo *ai, struct rdma_addrinfo *rai)
{
memset(ai, 0, sizeof *ai);
- ai->ai_flags = (rai->ai_flags & RAI_PASSIVE) ? AI_PASSIVE : 0;
- ai->ai_flags |= (rai->ai_flags & RAI_NUMERICHOST) ? AI_NUMERICHOST : 0;
- ai->ai_family = rai->ai_family;
+ if (rai->ai_flags & RAI_PASSIVE)
+ ai->ai_flags = AI_PASSIVE;
+ if (rai->ai_flags & RAI_NUMERICHOST)
+ ai->ai_flags |= AI_NUMERICHOST;
+ if (rai->ai_family != AF_IB)
+ ai->ai_family = rai->ai_family;
switch (rai->ai_qp_type) {
case IBV_QPT_RC:
ai->ai_next = NULL;
}
+static int ucma_copy_addr(struct sockaddr **dst, socklen_t *dst_len,
+ struct sockaddr *src, socklen_t src_len)
+{
+ *dst = malloc(src_len);
+ if (!(*dst))
+ return ERR(ENOMEM);
+
+ memcpy(*dst, src, src_len);
+ *dst_len = src_len;
+ return 0;
+}
+
+static int ucma_convert_in6(struct sockaddr_ib **dst, socklen_t *dst_len,
+ struct sockaddr_in6 *src, socklen_t src_len)
+{
+ *dst = calloc(1, sizeof(struct sockaddr_ib));
+ if (!(*dst))
+ return ERR(ENOMEM);
+
+ (*dst)->sib_family = AF_IB;
+ (*dst)->sib_flowinfo = src->sin6_flowinfo;
+ ib_addr_set(&(*dst)->sib_addr, src->sin6_addr.s6_addr32[0],
+ src->sin6_addr.s6_addr32[1], src->sin6_addr.s6_addr32[2],
+ src->sin6_addr.s6_addr32[3]);
+ if (src->sin6_port) {
+ (*dst)->sib_sid = htonll((uint64_t) ntohs(src->sin6_port));
+ (*dst)->sib_sid_mask = htonll((uint64_t) 0x0000FFFF);
+ }
+ (*dst)->sib_scope_id = src->sin6_scope_id;
+
+ *dst_len = sizeof(struct sockaddr_ib);
+ return 0;
+}
+
static int ucma_convert_to_rai(struct rdma_addrinfo *rai,
struct rdma_addrinfo *hints, struct addrinfo *ai)
{
- struct sockaddr *addr;
- char *canonname;
+ int ret;
rai->ai_family = ai->ai_family;
}
}
- addr = malloc(ai->ai_addrlen);
- if (!addr)
- return ERR(ENOMEM);
-
- canonname = ai->ai_canonname ? strdup(ai->ai_canonname) : NULL;
-
- memcpy(addr, ai->ai_addr, ai->ai_addrlen);
if (ai->ai_flags & RAI_PASSIVE) {
- rai->ai_src_addr = addr;
- rai->ai_src_len = ai->ai_addrlen;
- rai->ai_src_canonname = canonname;
+ if (ai->ai_canonname)
+ rai->ai_src_canonname = strdup(ai->ai_canonname);
+
+ if ((ai->ai_flags & RAI_FAMILY) && (rai->ai_family == AF_IB) &&
+ (ai->ai_flags & RAI_NUMERICHOST)) {
+ 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 {
+ ret = ucma_copy_addr(&rai->ai_src_addr, &rai->ai_src_len,
+ ai->ai_addr, ai->ai_addrlen);
+ }
} else {
- rai->ai_dst_addr = addr;
- rai->ai_dst_len = ai->ai_addrlen;
- rai->ai_dst_canonname = canonname;
+ if (ai->ai_canonname)
+ rai->ai_dst_canonname = strdup(ai->ai_canonname);
+
+ if ((ai->ai_flags & RAI_FAMILY) && (rai->ai_family == AF_IB) &&
+ (ai->ai_flags & RAI_NUMERICHOST)) {
+ 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 {
+ ret = ucma_copy_addr(&rai->ai_dst_addr, &rai->ai_dst_len,
+ ai->ai_addr, ai->ai_addrlen);
+ }
}
-
- return 0;
+ return ret;
}
static int ucma_convert_gai(char *node, char *service,
return ret;
}
-static int ucma_copy_ai_addr(struct sockaddr **dst, socklen_t *dst_len,
- struct sockaddr *src, socklen_t src_len)
-{
- *dst = calloc(1, src_len);
- if (!(*dst))
- return ERR(ENOMEM);
-
- memcpy(*dst, src, src_len);
- *dst_len = src_len;
- return 0;
-}
-
int rdma_getaddrinfo(char *node, char *service,
struct rdma_addrinfo *hints,
struct rdma_addrinfo **res)
rai->ai_qp_type = hints->ai_qp_type;
rai->ai_port_space = hints->ai_port_space;
if (hints->ai_dst_len) {
- ret = ucma_copy_ai_addr(&rai->ai_dst_addr, &rai->ai_dst_len,
- hints->ai_dst_addr, hints->ai_dst_len);
+ ret = ucma_copy_addr(&rai->ai_dst_addr, &rai->ai_dst_len,
+ hints->ai_dst_addr, hints->ai_dst_len);
}
}
if (ret)
goto err;
if (!rai->ai_src_len && hints && hints->ai_src_len) {
- ret = ucma_copy_ai_addr(&rai->ai_src_addr, &rai->ai_src_len,
- hints->ai_src_addr, 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)
goto err;
}