]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
rdma/cm: Expose private data when using AF_IB
authorSean Hefty <sean.hefty@intel.com>
Wed, 7 Apr 2010 00:22:35 +0000 (17:22 -0700)
committerSean Hefty <sean.hefty@intel.com>
Sat, 7 Jan 2012 00:49:54 +0000 (16:49 -0800)
If the source or destination address is AF_IB, then do not
reserve a portion of the private data in the IB CM REQ or SIDR
REQ messages for the cma header.  Instead, all private data
should be exported to the user.  When AF_IB is used, the
rdma cm does not have sufficient information to fill in the
cma header.  Additionally, this will be necessary to support
any IB connection through the rdma cm interface,

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
drivers/infiniband/core/cma.c

index 66c751fc4b43a3c971bd8233379e126a781cb389..389ec68c1d74f4d11a7afafb234fc7fa3ace626c 100644 (file)
@@ -906,14 +906,10 @@ static void cma_save_net_info(struct rdma_addr *addr,
        }
 }
 
-static inline int cma_user_data_offset(enum rdma_port_space ps)
+static inline int cma_user_data_offset(struct rdma_id_private *id_priv)
 {
-       switch (ps) {
-       case RDMA_PS_SDP:
-               return 0;
-       default:
-               return sizeof(struct cma_hdr);
-       }
+       return (cma_family(id_priv) == AF_IB || id_priv->id.ps == RDMA_PS_SDP) ?
+               0 : sizeof(struct cma_hdr);
 }
 
 static void cma_cancel_route(struct rdma_id_private *id_priv)
@@ -1309,7 +1305,7 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
                return -ECONNABORTED;
 
        memset(&event, 0, sizeof event);
-       offset = cma_user_data_offset(listen_id->id.ps);
+       offset = cma_user_data_offset(listen_id);
        event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
        if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED) {
                conn_id = cma_new_udp_id(&listen_id->id, ib_event);
@@ -2631,7 +2627,7 @@ static int cma_format_hdr(void *hdr, struct rdma_id_private *id_priv)
                        cma_hdr->port = src4->sin_port;
                        break;
                }
-       } else {
+       } else if (cma_family(id_priv) == AF_INET6) {
                struct sockaddr_in6 *src6, *dst6;
 
                src6 = (struct sockaddr_in6 *) cma_src_addr(id_priv);
@@ -2729,10 +2725,10 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
 {
        struct ib_cm_sidr_req_param req;
        struct ib_cm_id *id;
-       int ret;
+       int offset, ret;
 
-       req.private_data_len = sizeof(struct cma_hdr) +
-                              conn_param->private_data_len;
+       offset = cma_user_data_offset(id_priv);
+       req.private_data_len = offset + conn_param->private_data_len;
        if (req.private_data_len < conn_param->private_data_len)
                return -EINVAL;
 
@@ -2741,7 +2737,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
                return -ENOMEM;
 
        if (conn_param->private_data && conn_param->private_data_len)
-               memcpy((void *) req.private_data + sizeof(struct cma_hdr),
+               memcpy((void *) req.private_data + offset,
                       conn_param->private_data, conn_param->private_data_len);
 
        ret = cma_format_hdr((void *) req.private_data, id_priv);
@@ -2781,7 +2777,7 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
        int offset, ret;
 
        memset(&req, 0, sizeof req);
-       offset = cma_user_data_offset(id_priv->id.ps);
+       offset = cma_user_data_offset(id_priv);
        req.private_data_len = offset + conn_param->private_data_len;
        if (req.private_data_len < conn_param->private_data_len)
                return -EINVAL;