From e94a0ece135ea4a06249edf171d2dea6a79fe307 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Thu, 6 May 2010 15:44:29 -0700 Subject: [PATCH] librdmacm: add support for AF_IB to resolve_addr Allow user to specify AF_IB addresses to rdma_resolve_addr. Signed-off-by: Sean Hefty --- include/rdma/rdma_cma_abi.h | 13 ++++++++++- src/cma.c | 44 ++++++++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/include/rdma/rdma_cma_abi.h b/include/rdma/rdma_cma_abi.h index 8c75c9d2..1e3cb573 100644 --- a/include/rdma/rdma_cma_abi.h +++ b/include/rdma/rdma_cma_abi.h @@ -67,7 +67,8 @@ enum { UCMA_CMD_LEAVE_MCAST, UCMA_CMD_MIGRATE_ID, UCMA_CMD_QUERY, - UCMA_CMD_BIND + UCMA_CMD_BIND, + UCMA_CMD_RESOLVE_ADDR }; struct ucma_abi_cmd_hdr { @@ -117,6 +118,16 @@ struct ucma_abi_resolve_ip { __u32 timeout_ms; }; +struct ucma_abi_resolve_addr { + __u32 id; + __u32 timeout_ms; + __u16 src_size; + __u16 dst_size; + __u32 reserved; + struct sockaddr_storage src_addr; + struct sockaddr_storage dst_addr; +}; + struct ucma_abi_resolve_route { __u32 id; __u32 timeout_ms; diff --git a/src/cma.c b/src/cma.c index 5d6d9f73..d2205d4b 100644 --- a/src/cma.c +++ b/src/cma.c @@ -721,31 +721,63 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr) return ucma_query_route(id); } +static int rdma_resolve_addr2(struct rdma_cm_id *id, struct sockaddr *src_addr, + socklen_t src_len, struct sockaddr *dst_addr, + socklen_t dst_len, int timeout_ms) +{ + struct ucma_abi_resolve_addr *cmd; + struct cma_id_private *id_priv; + void *msg; + int ret, size; + + CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_RESOLVE_ADDR, size); + id_priv = container_of(id, struct cma_id_private, id); + cmd->id = id_priv->handle; + if ((cmd->src_size = src_len)) + memcpy(&cmd->src_addr, src_addr, src_len); + memcpy(&cmd->dst_addr, dst_addr, dst_len); + cmd->dst_size = dst_len; + cmd->timeout_ms = timeout_ms; + cmd->reserved = 0; + + ret = write(id->channel->fd, msg, size); + if (ret != size) + return (ret >= 0) ? ERR(ENODATA) : -1; + + memcpy(&id->route.addr.dst_addr, dst_addr, dst_len); + return 0; +} + int rdma_resolve_addr(struct rdma_cm_id *id, struct sockaddr *src_addr, struct sockaddr *dst_addr, int timeout_ms) { struct ucma_abi_resolve_ip *cmd; struct cma_id_private *id_priv; void *msg; - int ret, size, daddrlen; + int ret, size, dst_len, src_len; - daddrlen = ucma_addrlen(dst_addr); - if (!daddrlen) + dst_len = ucma_addrlen(dst_addr); + if (!dst_len) return ERR(EINVAL); + src_len = ucma_addrlen(src_addr); + if (af_ib_support) + return rdma_resolve_addr2(id, src_addr, src_len, dst_addr, + dst_len, timeout_ms); + CMA_CREATE_MSG_CMD(msg, cmd, UCMA_CMD_RESOLVE_IP, size); id_priv = container_of(id, struct cma_id_private, id); cmd->id = id_priv->handle; if (src_addr) - memcpy(&cmd->src_addr, src_addr, ucma_addrlen(src_addr)); - memcpy(&cmd->dst_addr, dst_addr, daddrlen); + memcpy(&cmd->src_addr, src_addr, src_len); + memcpy(&cmd->dst_addr, dst_addr, dst_len); cmd->timeout_ms = timeout_ms; ret = write(id->channel->fd, msg, size); if (ret != size) return (ret >= 0) ? ERR(ENODATA) : -1; - memcpy(&id->route.addr.dst_addr, dst_addr, daddrlen); + memcpy(&id->route.addr.dst_addr, dst_addr, dst_len); return 0; } -- 2.46.0