]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
librdmacm: support querying AF_IB addresses
authorSean Hefty <sean.hefty@intel.com>
Wed, 7 Apr 2010 18:01:52 +0000 (11:01 -0700)
committerSean Hefty <sean.hefty@intel.com>
Wed, 7 Apr 2010 18:01:52 +0000 (11:01 -0700)
The current query route command returns path record data and address
information.  The latter is restricted to sizeof(sockaddr_in6).  In
order to support AF_IB, modify the library to use the new query addr
command, which supports larger address sizes and avoids querying for
path records data when none are available.

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

index e51a372c520bd63f40dcf1aae8dcf4476c6141ad..5c736fb72d045791c13e5c3827a2d8dc3bd7fe6d 100644 (file)
@@ -64,7 +64,8 @@ enum {
        UCMA_CMD_NOTIFY,
        UCMA_CMD_JOIN_IP_MCAST,
        UCMA_CMD_LEAVE_MCAST,
-       UCMA_CMD_MIGRATE_ID
+       UCMA_CMD_MIGRATE_ID,
+       UCMA_CMD_QUERY
 };
 
 struct ucma_abi_cmd_hdr {
@@ -112,10 +113,14 @@ struct ucma_abi_resolve_route {
        __u32 timeout_ms;
 };
 
-struct ucma_abi_query_route {
+enum {
+       UCMA_QUERY_ADDR
+};
+
+struct ucma_abi_query {
        __u64 response;
        __u32 id;
-       __u32 reserved;
+       __u32 option;
 };
 
 struct ucma_abi_query_route_resp {
@@ -128,6 +133,17 @@ struct ucma_abi_query_route_resp {
        __u8 reserved[3];
 };
 
+struct ucma_abi_query_addr_resp {
+       __u64 node_guid;
+       __u8  port_num;
+       __u8  reserved;
+       __u16 pkey;
+       __u16 src_size;
+       __u16 dst_size;
+       struct sockaddr_storage src_addr;
+       struct sockaddr_storage dst_addr;
+};
+
 struct ucma_abi_conn_param {
        __u32 qp_num;
        __u32 reserved;
index b5f71d0aa1b9dfb108971acbb2738c7a2a0d8c44..2aef594e38d5626590bb992fa72c90a99464c0a8 100644 (file)
--- a/src/cma.c
+++ b/src/cma.c
@@ -473,10 +473,43 @@ static int ucma_addrlen(struct sockaddr *addr)
        }
 }
 
+static int ucma_query_addr(struct rdma_cm_id *id)
+{
+       struct ucma_abi_query_addr_resp *resp;
+       struct ucma_abi_query *cmd;
+       struct cma_id_private *id_priv;
+       void *msg;
+       int ret, size;
+       
+       CMA_CREATE_MSG_CMD_RESP(msg, cmd, resp, UCMA_CMD_QUERY, size);
+       id_priv = container_of(id, struct cma_id_private, id);
+       cmd->id = id_priv->handle;
+       cmd->option = UCMA_QUERY_ADDR;
+
+       ret = write(id->channel->fd, msg, size);
+       if (ret != size)
+               return (ret >= 0) ? ERR(ENODATA) : -1;
+
+       VALGRIND_MAKE_MEM_DEFINED(resp, sizeof *resp);
+
+       memcpy(&id->route.addr.src_addr, &resp->src_addr, resp->src_size);
+       memcpy(&id->route.addr.dst_addr, &resp->dst_addr, resp->dst_size);
+
+       if (!id_priv->cma_dev && resp->node_guid) {
+               ret = ucma_get_device(id_priv, resp->node_guid);
+               if (ret)
+                       return ret;
+               id->port_num = resp->port_num;
+               id->route.addr.addr.ibaddr.pkey = resp->pkey;
+       }
+
+       return 0;
+}
+
 static int ucma_query_route(struct rdma_cm_id *id)
 {
        struct ucma_abi_query_route_resp *resp;
-       struct ucma_abi_query_route *cmd;
+       struct ucma_abi_query *cmd;
        struct cma_id_private *id_priv;
        void *msg;
        int ret, size, i;