[ofw] [PATCH] dapl: use private_data_len for mem copies

Davis, Arlin R arlin.r.davis at intel.com
Fri Jan 29 10:35:58 PST 2010


Sean,

On the linux side you have RDMA_MAX_PRIVATE_DATA defined in rdma_cma_abi.h as:

#define RDMA_MAX_PRIVATE_DATA           256

This is the user/kernel interface max value.

Where do I get the actual private data max value for the rdma_cm protocol?

-arlin

>-----Original Message-----
>From: Hefty, Sean
>Sent: Saturday, January 23, 2010 12:19 AM
>To: Hefty, Sean; ofw_list; Davis, Arlin R
>Subject: [PATCH] dapl: use private_data_len for mem copies
>
>When copying private_data out of rdma_cm events, use the
>reported private_data_len for the size, and not IB maximums.
>This fixes a bug running over the librdmacm on windows, where
>DAPL accessed invalid memory.
>
>Signed-off-by: Sean Hefty <sean.hefty at intel.com>
>---
>This is a more substantial fix to the private data length issue.
>This fix is for review and the upstream dapl.git tree (eventually
>making its way back into the trunk).  I do NOT recommend this for
>the 2.2 release given the scope of the changes.
>
>This change has only been lightly tested.
>
> trunk/ulp/dapl2/dapl/common/dapl_adapter_util.h    |    6 -
> trunk/ulp/dapl2/dapl/common/dapl_cr_callback.c     |   19 ++--
> trunk/ulp/dapl2/dapl/common/dapl_cr_util.h         |    3 -
> trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c      |   11 ---
> trunk/ulp/dapl2/dapl/common/dapl_ep_util.c         |    4 -
> .../dapl2/dapl/common/dapl_evd_connection_callb.c  |   20 -----
> trunk/ulp/dapl2/dapl/common/dapl_evd_util.h        |    3 -
> trunk/ulp/dapl2/dapl/common/dapl_ia_query.c        |    3 -
> trunk/ulp/dapl2/dapl/ibal/dapl_ibal_cm.c           |   88
>+++-----------------
> trunk/ulp/dapl2/dapl/openib_cma/cm.c               |   77
>+++---------------
> trunk/ulp/dapl2/dapl/openib_scm/cm.c               |   58
>+++----------
> trunk/ulp/dapl2/dapl/openib_ucm/cm.c               |   58
>+++----------
> 12 files changed, 65 insertions(+), 285 deletions(-)
>
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_adapter_util.h
>b/trunk/ulp/dapl2/dapl/common/dapl_adapter_util.h
>index 97ab42e..92cb9b7 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_adapter_util.h
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_adapter_util.h
>@@ -239,10 +239,8 @@ DAT_RETURN dapls_ib_cm_remote_addr (
>       IN  DAT_HANDLE                  dat_handle,
>       OUT DAT_SOCK_ADDR6              *remote_ia_address);
>
>-int dapls_ib_private_data_size (
>-      IN  DAPL_PRIVATE                *prd_ptr,
>-      IN  DAPL_PDATA_OP               conn_op,
>-      IN  DAPL_HCA                    *hca_ptr);
>+int dapls_ib_private_data_size(
>+      IN DAPL_HCA                     *hca_ptr);
>
> void
> dapls_query_provider_specific_attr(
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_cr_callback.c
>b/trunk/ulp/dapl2/dapl/common/dapl_cr_callback.c
>index 2340489..af68f85 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_cr_callback.c
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_cr_callback.c
>@@ -51,6 +51,7 @@
> DAT_RETURN dapli_connection_request(IN dp_ib_cm_handle_t ib_cm_handle,
>                                   IN DAPL_SP * sp_ptr,
>                                   IN DAPL_PRIVATE * prd_ptr,
>+                                  IN int private_data_size,
>                                   IN DAPL_EVD * evd_ptr);
>
> DAPL_EP *dapli_get_sp_ep(IN dp_ib_cm_handle_t ib_cm_handle,
>@@ -74,7 +75,8 @@ DAPL_EP *dapli_get_sp_ep(IN
>dp_ib_cm_handle_t ib_cm_handle,
>  *    None
>  *
>  */
>-void dapls_cr_callback(IN dp_ib_cm_handle_t ib_cm_handle, IN
>const ib_cm_events_t ib_cm_event, IN const void *private_data_ptr,
>/* event data */
>+void dapls_cr_callback(IN dp_ib_cm_handle_t ib_cm_handle, IN
>const ib_cm_events_t ib_cm_event,
>+                     IN const void *private_data_ptr, IN
>const int private_data_size,
>                      IN const void *context)
> {
>       DAPL_EP *ep_ptr;
>@@ -174,8 +176,7 @@ void dapls_cr_callback(IN
>dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_
>                        * event if appropriate.
>                        */
>                       dat_status =
>dapli_connection_request(ib_cm_handle,
>-                                                            sp_ptr,
>-
>prd_ptr, evd_ptr);
>+
>sp_ptr, prd_ptr, private_data_size, evd_ptr);
>                       /* Set evd_ptr = NULL so we don't
>generate an event below */
>                       evd_ptr = NULL;
>
>@@ -308,7 +309,8 @@ void dapls_cr_callback(IN
>dp_ib_cm_handle_t ib_cm_handle, IN const ib_cm_events_
> DAT_RETURN
> dapli_connection_request(IN dp_ib_cm_handle_t ib_cm_handle,
>                        IN DAPL_SP * sp_ptr,
>-                       IN DAPL_PRIVATE * prd_ptr, IN DAPL_EVD
>* evd_ptr)
>+                       IN DAPL_PRIVATE * prd_ptr, IN int
>private_data_size,
>+                       IN DAPL_EVD * evd_ptr)
> {
>       DAT_RETURN dat_status;
>
>@@ -346,14 +348,7 @@ dapli_connection_request(IN
>dp_ib_cm_handle_t ib_cm_handle,
>
>       /* Private data size will be determined by the provider layer */
>       cr_ptr->param.private_data = cr_ptr->private_data;
>-      if (prd_ptr == NULL) {
>-              cr_ptr->param.private_data_size = 0;
>-      } else {
>-              cr_ptr->param.private_data_size =
>-                  dapls_ib_private_data_size(prd_ptr,
>DAPL_PDATA_CONN_REQ,
>-                                             sp_ptr->header.owner_ia->
>-                                             hca_ptr);
>-      }
>+      cr_ptr->param.private_data_size = private_data_size;
>       if (cr_ptr->param.private_data_size > 0) {
>               dapl_os_memcpy(cr_ptr->private_data,
>                              prd_ptr->private_data,
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_cr_util.h
>b/trunk/ulp/dapl2/dapl/common/dapl_cr_util.h
>index 33aed7c..cec980f 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_cr_util.h
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_cr_util.h
>@@ -52,7 +52,8 @@ void
> dapls_cr_callback (
>     IN    dp_ib_cm_handle_t     ib_cm_handle,
>     IN    const ib_cm_events_t  ib_cm_event,
>-    IN          const void            *instant_data_p,
>+    IN          const void            *private_data_ptr,
>+    IN    const int           private_data_size,
>     IN    const void          *context);
>
> #endif /* _DAPL_CR_UTIL_H_ */
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
>b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
>index 5e4dc41..4e5e112 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_connect.c
>@@ -79,7 +79,6 @@ dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,
>       DAPL_EP alloc_ep;
>       DAT_RETURN dat_status;
>       DAT_COUNT req_hdr_size;
>-      DAT_UINT32 max_req_pdata_size;
>       void *private_data_ptr;
>
>       dapl_dbg_log(DAPL_DBG_TYPE_API | DAPL_DBG_TYPE_CM,
>@@ -258,16 +257,6 @@ dapl_ep_connect(IN DAT_EP_HANDLE ep_handle,
>        */
>       req_hdr_size = (sizeof(DAPL_PRIVATE) -
>DAPL_MAX_PRIVATE_DATA_SIZE);
>
>-      max_req_pdata_size =
>-          dapls_ib_private_data_size(NULL, DAPL_PDATA_CONN_REQ,
>-
>ep_ptr->header.owner_ia->hca_ptr);
>-
>-      if (private_data_size + req_hdr_size > (DAT_COUNT)
>max_req_pdata_size) {
>-              dapl_os_unlock(&ep_ptr->header.lock);
>-              dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
>DAT_INVALID_ARG5);
>-              goto bail;
>-      }
>-
>       /* transition the state before requesting a connection to avoid
>        * race conditions
>        */
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
>b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
>index a50a6cb..505a9f2 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_ep_util.c
>@@ -565,11 +565,11 @@ dapl_ep_legacy_post_disconnect(DAPL_EP * ep_ptr,
>                                    ep_ptr, cr_ptr->ib_cm_handle);
>
>                       dapls_cr_callback(cr_ptr->ib_cm_handle,
>-                                        ib_cm_event, NULL,
>cr_ptr->sp_ptr);
>+                                        ib_cm_event, NULL, 0,
>cr_ptr->sp_ptr);
>               } else {
>                       dapl_evd_connection_callback(ep_ptr->cm_handle,
>                                                    ib_cm_event,
>-                                                   NULL,
>(void *)ep_ptr);
>+                                                   NULL, 0,
>(void *)ep_ptr);
>               }
>       } else {
>               dapl_os_unlock(&ep_ptr->header.lock);
>diff --git
>a/trunk/ulp/dapl2/dapl/common/dapl_evd_connection_callb.c
>b/trunk/ulp/dapl2/dapl/common/dapl_evd_connection_callb.c
>index e2fb93b..8881362 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_evd_connection_callb.c
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_connection_callb.c
>@@ -65,6 +65,7 @@ void
> dapl_evd_connection_callback(IN dp_ib_cm_handle_t ib_cm_handle,
>                            IN const ib_cm_events_t ib_cm_event,
>                            IN const void *private_data_ptr,
>+                           IN const int private_data_size,
>                            IN const void *context)
> {
>       DAPL_EP *ep_ptr;
>@@ -72,7 +73,6 @@ dapl_evd_connection_callback(IN
>dp_ib_cm_handle_t ib_cm_handle,
>       DAPL_PRIVATE *prd_ptr;
>       DAT_EVENT_NUMBER dat_event_num;
>       DAT_RETURN dat_status;
>-      int private_data_size;
>
>       dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK,
>                    "--> dapl_evd_connection_callback: ctxt:
>%p event: %x cm_handle %p\n",
>@@ -96,7 +96,6 @@ dapl_evd_connection_callback(IN
>dp_ib_cm_handle_t ib_cm_handle,
>       DAPL_CNTR(evd_ptr, DCNT_EVD_CONN_CALLBACK);
>
>       prd_ptr = (DAPL_PRIVATE *) private_data_ptr;
>-      private_data_size = 0;
>       /*
>        * All operations effect the EP, so lock it once and unlock
>        * when necessary
>@@ -132,16 +131,6 @@ dapl_evd_connection_callback(IN
>dp_ib_cm_handle_t ib_cm_handle,
>                       }
>                       ep_ptr->param.ep_state = DAT_EP_STATE_CONNECTED;
>                       ep_ptr->cm_handle = ib_cm_handle;
>-                      if (prd_ptr == NULL) {
>-                              private_data_size = 0;
>-                      } else {
>-                              private_data_size =
>-                                  dapls_ib_private_data_size(prd_ptr,
>-
DAPL_PDATA_CONN_REP,
>-
>ep_ptr->header.
>-
>owner_ia->
>-                                                             hca_ptr);
>-                      }
>
>                       if (private_data_size > 0) {
>                               /* copy in the private data */
>@@ -157,13 +146,6 @@ dapl_evd_connection_callback(IN
>dp_ib_cm_handle_t ib_cm_handle,
>       case DAT_CONNECTION_EVENT_PEER_REJECTED:
>               {
>                       /* peer reject may include private data */
>-                      if (prd_ptr != NULL)
>-                              private_data_size =
>-                                  dapls_ib_private_data_size(prd_ptr,
>-
DAPL_PDATA_CONN_REJ,
>-
>ep_ptr->header.
>-
>owner_ia->
>-                                                             hca_ptr);
>
>                       if (private_data_size > 0)
>
>dapl_os_memcpy(ep_ptr->private.private_data,
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
>b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
>index 2304435..e5a7c3f 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_evd_util.h
>@@ -137,7 +137,8 @@ dapls_evd_post_connection_event_ext (
> extern void dapl_evd_connection_callback (
>     IN        dp_ib_cm_handle_t       ib_cm_handle,
>     IN        const ib_cm_events_t    ib_cm_events,
>-    IN        const void              *instant_data_p,
>+    IN        const void              *private_data_ptr,
>+    IN        const int               private_data_size,
>     IN        const void *            context );
>
> /* dto verb callback */
>diff --git a/trunk/ulp/dapl2/dapl/common/dapl_ia_query.c
>b/trunk/ulp/dapl2/dapl/common/dapl_ia_query.c
>index 6fcc4a2..d530d72 100644
>--- a/trunk/ulp/dapl2/dapl/common/dapl_ia_query.c
>+++ b/trunk/ulp/dapl2/dapl/common/dapl_ia_query.c
>@@ -150,8 +150,7 @@ dapl_ia_query(IN DAT_IA_HANDLE ia_handle,
>                *      to 0 unless IBHOSTS_NAMING is enabled.
>                */
>               provider_attr->max_private_data_size =
>-                  dapls_ib_private_data_size(NULL,
>DAPL_PDATA_CONN_REQ,
>-                                             ia_ptr->hca_ptr) -
>+                  dapls_ib_private_data_size(ia_ptr->hca_ptr) -
>                   (sizeof(DAPL_PRIVATE) - DAPL_MAX_PRIVATE_DATA_SIZE);
>               provider_attr->supports_multipath = DAT_FALSE;
>               provider_attr->ep_creator = DAT_PSP_CREATES_EP_NEVER;
>diff --git a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_cm.c
>b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_cm.c
>index 149bcbf..fac567a 100644
>--- a/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_cm.c
>+++ b/trunk/ulp/dapl2/dapl/ibal/dapl_ibal_cm.c
>@@ -216,6 +216,7 @@ dapli_ib_cm_dreq_cb (
>         dapls_cr_callback ( ep_ptr->cm_handle,
>                             IB_CME_DISCONNECTED,
>                             (void * __ptr64)
>p_cm_dreq_rec->p_dreq_pdata,
>+                          IB_DREQ_PDATA_SIZE,
>                             (void *) (((DAPL_CR *)
>ep_ptr->cr_ptr)->sp_ptr) );
>     }
>     else
>@@ -226,6 +227,7 @@ dapli_ib_cm_dreq_cb (
>                                   IB_CME_DISCONNECTED,
>                                   (void * __ptr64)
>                                   p_cm_dreq_rec->p_dreq_pdata,
>+                                IB_DREQ_PDATA_SIZE,
>                                   p_cm_dreq_rec->qp_context );
>     }
> }
>@@ -285,6 +287,7 @@ dapli_ib_cm_drep_cb (
>         dapls_cr_callback ( ep_ptr->cm_handle,
>                             IB_CME_DISCONNECTED,
>                            (void * __ptr64)
>p_cm_drep_rec->p_drep_pdata,
>+                         IB_DREP_PDATA_SIZE,
>                            (void *) (((DAPL_CR *)
>ep_ptr->cr_ptr)->sp_ptr) );
>     }
>     else
>@@ -294,6 +297,7 @@ dapli_ib_cm_drep_cb (
>                                    ep_ptr->cm_handle,
>                                    IB_CME_DISCONNECTED,
>                                    (void * __ptr64)
>p_cm_drep_rec->p_drep_pdata,
>+                                 IB_DREP_PDATA_SIZE,
>                                    p_cm_drep_rec->qp_context );
>     }
> }
>@@ -371,6 +375,7 @@ dapli_ib_cm_rep_cb (
>
>(dp_ib_cm_handle_t)&p_cm_rep_rec->h_cm_rep,
>                             cm_cb_op,
>                             (void *) prd_ptr,
>+                          IB_REP_PDATA_SIZE,
>                             (void * __ptr64)
>p_cm_rep_rec->qp_context);
> }
>
>@@ -454,6 +459,7 @@ dapli_ib_cm_rej_cb (
>         dapls_cr_callback ( ep_ptr->cm_handle,
>                             cm_event,
>                             (void * __ptr64)
>p_cm_rej_rec->p_rej_pdata,
>+                          IB_REJ_PDATA_SIZE,
>                             (void *) ((DAPL_CR *)
>ep_ptr->cr_ptr)->sp_ptr);
>     }
>     else
>@@ -462,6 +468,7 @@ dapli_ib_cm_rej_cb (
>                                    ep_ptr->cm_handle,
>                                    cm_event,
>                                    (void * __ptr64)
>p_cm_rej_rec->p_rej_pdata,
>+                                 IB_REJ_PDATA_SIZE,
>                                    (void * __ptr64)
>p_cm_rej_rec->qp_context );
>     }
>
>@@ -610,6 +617,7 @@ dapli_ib_cm_req_cb ( IN  ib_cm_req_rec_t
>*p_cm_req_rec )
>     dapls_cr_callback ( cm_handle,
>                         IB_CME_CONNECTION_REQUEST_PENDING,
>                         (void * __ptr64) p_cm_req_rec->p_req_pdata,
>+                      IB_REQ_PDATA_SIZE,
>                         (void * __ptr64) sp_ptr );
> }
>
>@@ -652,6 +660,7 @@ dapli_ib_cm_rtu_cb (
>         dapls_cr_callback ( ep_ptr->cm_handle,
>                             IB_CME_CONNECTED,
>                             (void * __ptr64)
>p_cm_rtu_rec->p_rtu_pdata,
>+                            IB_RTU_PDATA_SIZE,
>                             (void *) sp_ptr);
>
>     }
>@@ -661,6 +670,7 @@ dapli_ib_cm_rtu_cb (
>                             ep_ptr->cm_handle,
>                             IB_CME_CONNECTED,
>                             (void * __ptr64)
>p_cm_rtu_rec->p_rtu_pdata,
>+                          IB_RTU_PDATA_SIZE,
>                             (void *) ep_ptr);
>     }
> }
>@@ -1297,15 +1307,6 @@ dapls_ib_reject_connection ( IN
>dp_ib_cm_handle_t   ib_cm_handle,
>     cm_rej.p_ari        = (ib_ari_t *)&rej_table[reject_reason];
>     cm_rej.ari_length   = (uint8_t)strlen (rej_table[reject_reason]);
>
>-    if (private_data_size >
>-      dapls_ib_private_data_size(NULL,DAPL_PDATA_CONN_REJ,NULL))
>-    {
>-        dapl_dbg_log ( DAPL_DBG_TYPE_ERR,
>-                       "--> DsRjC: private_data size(%d) >
>Max(%d)\n",
>-                       private_data_size, IB_MAX_REJ_PDATA_SIZE );
>-      return DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
>-    }
>-
>     cm_rej.p_rej_pdata  = private_data;
>     cm_rej.rej_length   = private_data_size;
>
>@@ -1723,78 +1724,11 @@ dapls_ib_cr_handoff (
> }
> #endif
>
>-/*
>- * dapls_ib_private_data_size
>- *
>- * Return the size of private data given a connection op type
>- *
>- * Input:
>- *    prd_ptr         private data pointer
>- *    conn_op         connection operation type
>- *    hca_ptr         hca pointer, needed for transport type
>- *
>- * If prd_ptr is NULL, this is a query for the max size supported by
>- * the provider, otherwise it is the actual size of the private data
>- * contained in prd_ptr.
>- *
>- * Infiniband has fixed size private data, so prd_ptr is ignored.
>- *
>- * Output:
>- *    None
>- *
>- * Returns:
>- *    length of private data
>- *
>- */
> int
> dapls_ib_private_data_size (
>-      IN      DAPL_PRIVATE            *prd_ptr,
>-      IN      DAPL_PDATA_OP           conn_op,
>       IN      DAPL_HCA                *hca_ptr)
> {
>-    int  size;
>-
>-    UNUSED_PARAM( prd_ptr );
>-    UNUSED_PARAM( hca_ptr );
>-
>-    switch (conn_op)
>-    {
>-        case DAPL_PDATA_CONN_REQ:
>-      {
>-          size = IB_MAX_REQ_PDATA_SIZE;
>-          break;
>-      }
>-        case DAPL_PDATA_CONN_REP:
>-      {
>-          size = IB_MAX_REP_PDATA_SIZE;
>-          break;
>-      }
>-        case DAPL_PDATA_CONN_REJ:
>-      {
>-          size = IB_MAX_REJ_PDATA_SIZE;
>-          break;
>-      }
>-        case DAPL_PDATA_CONN_DREQ:
>-      {
>-          size = IB_MAX_DREQ_PDATA_SIZE;
>-          break;
>-      }
>-        case DAPL_PDATA_CONN_DREP:
>-      {
>-          size = IB_MAX_DREP_PDATA_SIZE;
>-          break;
>-      }
>-        default:
>-      {
>-          size = 0;
>-      }
>-    } /* end case */
>-
>-#if defined(DAPL_DBG) && 0
>-    dapl_dbg_log (DAPL_DBG_TYPE_CM, "%s: returns %d\n",
>__FUNCTION__, size );
>-#endif
>-
>-    return size;
>+    return IB_MAX_REQ_PDATA_SIZE;
> }
>
>
>diff --git a/trunk/ulp/dapl2/dapl/openib_cma/cm.c
>b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
>index c52e716..e0e034b 100644
>--- a/trunk/ulp/dapl2/dapl/openib_cma/cm.c
>+++ b/trunk/ulp/dapl2/dapl/openib_cma/cm.c
>@@ -95,7 +95,7 @@ static void dapli_addr_resolve(struct
>dapl_cm_id *conn)
>                        ret, strerror(errno));
>               dapl_evd_connection_callback(conn,
>                                            IB_CME_LOCAL_FAILURE,
>-                                           NULL, conn->ep);
>+                                           NULL, 0, conn->ep);
>       }
> }
>
>@@ -149,7 +149,7 @@ static void dapli_route_resolve(struct
>dapl_cm_id *conn)
>
>       bail:
>       dapl_evd_connection_callback(conn,
>-                                   IB_CME_LOCAL_FAILURE,
>NULL, conn->ep);
>+                                   IB_CME_LOCAL_FAILURE,
>NULL, 0, conn->ep);
> }
>
> dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep)
>@@ -416,7 +416,8 @@ static void dapli_cm_active_cb(struct
>dapl_cm_id *conn,
>
>       dapl_os_unlock(lock);
>       if (conn)
>-              dapl_evd_connection_callback(conn, ib_cm_event,
>pdata, conn->ep);
>+              dapl_evd_connection_callback(conn, ib_cm_event, pdata,
>+
>event->param.conn.private_data_len, conn->ep);
> }
>
> static void dapli_cm_passive_cb(struct dapl_cm_id *conn,
>@@ -496,7 +497,8 @@ static void dapli_cm_passive_cb(struct
>dapl_cm_id *conn,
>
>       dapl_os_unlock(&conn->lock);
>       if (conn_recv)
>-              dapls_cr_callback(conn_recv, ib_cm_event,
>pdata, conn_recv->sp);
>+              dapls_cr_callback(conn_recv, ib_cm_event, pdata,
>+
>event->param.conn.private_data_len, conn_recv->sp);
> }
>
> /************************ DAPL provider entry points
>**********************/
>@@ -922,11 +924,6 @@ dapls_ib_reject_connection(IN
>dp_ib_cm_handle_t cm_handle,
>               return DAT_ERROR(DAT_INVALID_HANDLE,
>DAT_INVALID_HANDLE_CR);
>       }
>
>-      if (private_data_size >
>-          dapls_ib_private_data_size(NULL, DAPL_PDATA_CONN_REJ,
>-                                     cm_handle->hca))
>-              return DAT_ERROR(DAT_INVALID_PARAMETER,
>DAT_INVALID_ARG3);
>-
>       /* setup pdata_hdr and users data, in CR pdata buffer */
>       dapl_os_memcpy(cm_handle->p_data, &pdata_hdr, offset);
>       if (private_data_size)
>@@ -998,60 +995,10 @@ dapls_ib_cm_remote_addr(IN DAT_HANDLE
>dat_handle, OUT DAT_SOCK_ADDR6 * raddr)
>       return DAT_SUCCESS;
> }
>
>-/*
>- * dapls_ib_private_data_size
>- *
>- * Return the size of private data given a connection op type
>- *
>- * Input:
>- *    prd_ptr         private data pointer
>- *    conn_op         connection operation type
>- *      hca_ptr         hca pointer, needed for transport type
>- *
>- * If prd_ptr is NULL, this is a query for the max size supported by
>- * the provider, otherwise it is the actual size of the private data
>- * contained in prd_ptr.
>- *
>- *
>- * Output:
>- *    None
>- *
>- * Returns:
>- *    length of private data
>- *
>- */
>-int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,
>-                             IN DAPL_PDATA_OP conn_op, IN
>DAPL_HCA * hca_ptr)
>+int dapls_ib_private_data_size(
>+      IN DAPL_HCA *hca_ptr)
> {
>-      int size;
>-
>-      if (hca_ptr->ib_hca_handle->device->transport_type
>-          == IBV_TRANSPORT_IWARP)
>-              return (IWARP_MAX_PDATA_SIZE - sizeof(struct
>dapl_pdata_hdr));
>-
>-      switch (conn_op) {
>-
>-      case DAPL_PDATA_CONN_REQ:
>-              size = IB_MAX_REQ_PDATA_SIZE;
>-              break;
>-      case DAPL_PDATA_CONN_REP:
>-              size = IB_MAX_REP_PDATA_SIZE;
>-              break;
>-      case DAPL_PDATA_CONN_REJ:
>-              size = IB_MAX_REJ_PDATA_SIZE - sizeof(struct
>dapl_pdata_hdr);
>-              break;
>-      case DAPL_PDATA_CONN_DREQ:
>-              size = IB_MAX_DREQ_PDATA_SIZE;
>-              break;
>-      case DAPL_PDATA_CONN_DREP:
>-              size = IB_MAX_DREP_PDATA_SIZE;
>-              break;
>-      default:
>-              size = 0;
>-
>-      }                       /* end case */
>-
>-      return size;
>+      return RDMA_MAX_PRIVATE_DATA;
> }
>
> /*
>@@ -1238,7 +1185,7 @@ void dapli_cma_event_cb(void)
>
>                       dapl_evd_connection_callback(conn,
>
IB_CME_DESTINATION_UNREACHABLE,
>-                                                   NULL, conn->ep);
>+                                                   NULL, 0, conn->ep);
>                       break;
>
>               case RDMA_CM_EVENT_ROUTE_ERROR:
>@@ -1267,14 +1214,14 @@ void dapli_cma_event_cb(void)
>
>                               dapl_evd_connection_callback(conn,
>
IB_CME_DESTINATION_UNREACHABLE,
>-
>NULL, conn->ep);
>+
>NULL, 0, conn->ep);
>                       }
>                       break;
>
>               case RDMA_CM_EVENT_DEVICE_REMOVAL:
>                       dapl_evd_connection_callback(conn,
>
IB_CME_LOCAL_FAILURE,
>-                                                   NULL, conn->ep);
>+                                                   NULL, 0, conn->ep);
>                       break;
>               case RDMA_CM_EVENT_CONNECT_REQUEST:
>               case RDMA_CM_EVENT_CONNECT_ERROR:
>diff --git a/trunk/ulp/dapl2/dapl/openib_scm/cm.c
>b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
>index 105351c..4ac54dc 100644
>--- a/trunk/ulp/dapl2/dapl/openib_scm/cm.c
>+++ b/trunk/ulp/dapl2/dapl/openib_scm/cm.c
>@@ -430,12 +430,12 @@ DAT_RETURN
>dapli_socket_disconnect(dp_ib_cm_handle_t cm_ptr)
>               if (ep_ptr->cr_ptr) {
>                       dapls_cr_callback(cm_ptr,
>                                         IB_CME_DISCONNECTED,
>-                                        NULL,
>+                                        NULL, 0,
>                                         ((DAPL_CR *)
>ep_ptr->cr_ptr)->sp_ptr);
>               } else {
>                       dapl_evd_connection_callback(ep_ptr->cm_handle,
>
IB_CME_DISCONNECTED,
>-                                                   NULL, ep_ptr);
>+                                                   NULL, 0, ep_ptr);
>               }
>       }
>
>@@ -506,7 +506,7 @@ static void
>dapli_socket_connected(dp_ib_cm_handle_t cm_ptr, int err)
> bail:
>       /* close socket, free cm structure and post error event */
>       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);
>-      dapl_evd_connection_callback(NULL,
>IB_CME_LOCAL_FAILURE, NULL, ep_ptr);
>+      dapl_evd_connection_callback(NULL,
>IB_CME_LOCAL_FAILURE, NULL, 0, ep_ptr);
> }
>
> /*
>@@ -833,7 +833,8 @@ ud_bail:
> #endif
>       {
>               ep_ptr->cm_handle = cm_ptr; /* only RC, multi
>CR's on UD */
>-              dapl_evd_connection_callback(cm_ptr, event,
>cm_ptr->msg.p_data, ep_ptr);
>+              dapl_evd_connection_callback(cm_ptr, event,
>cm_ptr->msg.p_data,
>+
>DCM_MAX_PDATA_SIZE, ep_ptr);
>       }
>       return;
>
>@@ -847,7 +848,8 @@ bail:
>       dapls_modify_qp_state(ep_ptr->qp_handle, IBV_QPS_ERR, 0, 0, 0);
>       closesocket(cm_ptr->socket);
>       cm_ptr->socket = DAPL_INVALID_SOCKET;
>-      dapl_evd_connection_callback(NULL, event,
>cm_ptr->msg.p_data, ep_ptr);
>+      dapl_evd_connection_callback(NULL, event, cm_ptr->msg.p_data,
>+                                   DCM_MAX_PDATA_SIZE, ep_ptr);
> }
>
> /*
>@@ -1044,7 +1046,7 @@ static void
>dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr)
>               /* trigger CR event and return SUCCESS */
>               dapls_cr_callback(acm_ptr,
>                                 IB_CME_CONNECTION_REQUEST_PENDING,
>-                                p_data, acm_ptr->sp);
>+                                p_data, exp, acm_ptr->sp);
>       return;
> bail:
>       /* close socket, free cm structure, active will see
>close as rej */
>@@ -1274,7 +1276,7 @@ ud_bail:
> #endif
>       {
>               cm_ptr->ep->cm_handle = cm_ptr; /* only RC,
>multi CR's on UD */
>-              dapls_cr_callback(cm_ptr, event, NULL, cm_ptr->sp);
>+              dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
>       }
>       return;
>
>@@ -1285,7 +1287,7 @@ bail:
> #endif
>       dapls_modify_qp_state(cm_ptr->ep->qp_handle,
>IBV_QPS_ERR, 0, 0, 0);
>       dapls_ib_cm_free(cm_ptr, cm_ptr->ep);
>-      dapls_cr_callback(cm_ptr, event, NULL, cm_ptr->sp);
>+      dapls_cr_callback(cm_ptr, event, NULL, 0, cm_ptr->sp);
> }
>
> /*
>@@ -1604,44 +1606,10 @@ dapls_ib_cm_remote_addr(IN DAT_HANDLE
>dat_handle,
>       return DAT_SUCCESS;
> }
>
>-/*
>- * dapls_ib_private_data_size
>- *
>- * Return the size of private data given a connection op type
>- *
>- * Input:
>- *    prd_ptr         private data pointer
>- *    conn_op         connection operation type
>- *
>- * If prd_ptr is NULL, this is a query for the max size supported by
>- * the provider, otherwise it is the actual size of the private data
>- * contained in prd_ptr.
>- *
>- *
>- * Output:
>- *    None
>- *
>- * Returns:
>- *    length of private data
>- *
>- */
>-int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,
>-                             IN DAPL_PDATA_OP conn_op, IN
>DAPL_HCA * hca_ptr)
>+int dapls_ib_private_data_size(
>+      IN DAPL_HCA *hca_ptr)
> {
>-      int size;
>-
>-      switch (conn_op) {
>-              case DAPL_PDATA_CONN_REQ:
>-              case DAPL_PDATA_CONN_REP:
>-              case DAPL_PDATA_CONN_REJ:
>-              case DAPL_PDATA_CONN_DREQ:
>-              case DAPL_PDATA_CONN_DREP:
>-                      size = DCM_MAX_PDATA_SIZE;
>-                      break;
>-              default:
>-                      size = 0;
>-      }
>-      return size;
>+      return DCM_MAX_PDATA_SIZE;
> }
>
> /*
>diff --git a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
>b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
>index b51556a..d05d112 100644
>--- a/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
>+++ b/trunk/ulp/dapl2/dapl/openib_ucm/cm.c
>@@ -798,9 +798,9 @@ static void
>ucm_disconnect_final(dp_ib_cm_handle_t cm)
>       dapl_os_unlock(&cm->lock);
>
>       if (cm->sp)
>-              dapls_cr_callback(cm, IB_CME_DISCONNECTED,
>NULL, cm->sp);
>+              dapls_cr_callback(cm, IB_CME_DISCONNECTED,
>NULL, 0, cm->sp);
>       else
>-              dapl_evd_connection_callback(cm,
>IB_CME_DISCONNECTED, NULL, cm->ep);
>+              dapl_evd_connection_callback(cm,
>IB_CME_DISCONNECTED, NULL, 0, cm->ep);
> }
>
> /*
>@@ -911,7 +911,7 @@ dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm)
> #endif
>               dapl_evd_connection_callback(cm,
>
IB_CME_DESTINATION_UNREACHABLE,
>-                                           NULL, ep);
>+                                           NULL, 0, ep);
>
>               return DAT_ERROR(DAT_INVALID_ADDRESS,
>                                DAT_INVALID_ADDRESS_UNREACHABLE);
>@@ -1126,14 +1126,14 @@ ud_bail:
>               cm->ep->cm_handle = cm; /* only RC, multi CR's on UD */
>               dapl_evd_connection_callback(cm,
>                                            IB_CME_CONNECTED,
>-                                           cm->msg.p_data, cm->ep);
>+                                           cm->msg.p_data,
>ntohs(cm->msg.p_size), cm->ep);
>       }
>       return;
> bail:
>       if (cm->msg.saddr.ib.qp_type != IBV_QPT_UD)
>               dapls_ib_reinit_ep(cm->ep); /* reset QP state */
>
>-      dapl_evd_connection_callback(NULL, event,
>cm->msg.p_data, cm->ep);
>+      dapl_evd_connection_callback(NULL, event,
>cm->msg.p_data, ntohs(cm->msg.p_size), cm->ep);
>       dapls_ib_cm_free(cm, NULL);
> }
>
>@@ -1204,7 +1204,7 @@ static void
>ucm_accept(ib_cm_srvc_handle_t cm, ib_cm_msg_t *msg)
>               /* trigger CR event and return SUCCESS */
>               dapls_cr_callback(acm,
>                                 IB_CME_CONNECTION_REQUEST_PENDING,
>-                                acm->msg.p_data, acm->sp);
>+                                acm->msg.p_data,
>ntohs(msg->p_size), acm->sp);
>       return;
>
> bail:
>@@ -1295,14 +1295,14 @@ static void
>ucm_accept_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
>       } else {
> #endif
>               cm->ep->cm_handle = cm; /* only RC, multi CR's on UD */
>-              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL, cm->sp);
>+              dapls_cr_callback(cm, IB_CME_CONNECTED, NULL,
>0, cm->sp);
>       }
>       return;
> bail:
>       if (cm->msg.saddr.ib.qp_type != IBV_QPT_UD)
>               dapls_ib_reinit_ep(cm->ep);     /* reset QP state */
>       dapls_ib_cm_free(cm, cm->ep);
>-      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, cm->sp);
>+      dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE, NULL, 0, cm->sp);
> }
>
> /*
>@@ -1354,7 +1354,7 @@ static int ucm_reply(dp_ib_cm_handle_t cm)
>               } else
> #endif
>                       dapls_cr_callback(cm, IB_CME_LOCAL_FAILURE,
>-                                        NULL, cm->sp);
>+                                        NULL, 0, cm->sp);
>               return -1;
>       }
>       dapl_os_get_time(&cm->timer); /* RTU expected */
>@@ -1842,44 +1842,10 @@ dapls_ib_cm_remote_addr(IN DAT_HANDLE
>dat_handle,
>       return DAT_SUCCESS;
> }
>
>-/*
>- * dapls_ib_private_data_size
>- *
>- * Return the size of private data given a connection op type
>- *
>- * Input:
>- *    prd_ptr         private data pointer
>- *    conn_op         connection operation type
>- *
>- * If prd_ptr is NULL, this is a query for the max size supported by
>- * the provider, otherwise it is the actual size of the private data
>- * contained in prd_ptr.
>- *
>- *
>- * Output:
>- *    None
>- *
>- * Returns:
>- *    length of private data
>- *
>- */
>-int dapls_ib_private_data_size(IN DAPL_PRIVATE * prd_ptr,
>-                             IN DAPL_PDATA_OP conn_op, IN
>DAPL_HCA * hca_ptr)
>+int dapls_ib_private_data_size(
>+      IN DAPL_HCA *hca_ptr)
> {
>-      int size;
>-
>-      switch (conn_op) {
>-      case DAPL_PDATA_CONN_REQ:
>-      case DAPL_PDATA_CONN_REP:
>-      case DAPL_PDATA_CONN_REJ:
>-      case DAPL_PDATA_CONN_DREQ:
>-      case DAPL_PDATA_CONN_DREP:
>-              size = DCM_MAX_PDATA_SIZE;
>-              break;
>-      default:
>-              size = 0;
>-      }
>-      return size;
>+      return DCM_MAX_PDATA_SIZE;
> }
>
> /*
>
>
>
>



More information about the ofw mailing list