]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librdmacm: add support for AF_IB to resolve_addr
authorSean Hefty <sean.hefty@intel.com>
Thu, 6 May 2010 22:44:29 +0000 (15:44 -0700)
committerSean Hefty <sean.hefty@intel.com>
Thu, 6 May 2010 22:44:29 +0000 (15:44 -0700)
Allow user to specify AF_IB addresses to rdma_resolve_addr.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
include/rdma/rdma_cma_abi.h
src/cma.c

index 8c75c9d2e14e2dfc0e49b2f44a67f84483004bdc..1e3cb57300d6185a0d00c4a5795b743eacd81700 100644 (file)
@@ -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;
index 5d6d9f73146c9c702a78550f25aec3c5ea5421a7..d2205d4bc015d49bc07d2ecfa977438dfe316748 100644 (file)
--- 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;
 }