PEER rejects can include private data. The common code didn't support delivery
via the connect event data structure. Add the necessary hooks in
dapl_evd_connection_callback function and include checks in openib_cma
provider to check and deliver properly. Also, fix the private data size
check in dapls_ib_reject_connection function.

Signed-off by: Arlin Davis [EMAIL PROTECTED]
---
 dapl/common/dapl_evd_connection_callb.c |   22 ++++++++++++++++++++--
 dapl/openib_cma/dapl_ib_cm.c            |   16 ++++++++++------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/dapl/common/dapl_evd_connection_callb.c 
b/dapl/common/dapl_evd_connection_callb.c
index d3a39a6..7f994b0 100644
--- a/dapl/common/dapl_evd_connection_callb.c
+++ b/dapl/common/dapl_evd_connection_callb.c
@@ -164,8 +164,26 @@ dapl_evd_connection_callback (
 
            break;
        }
-       case DAT_CONNECTION_EVENT_DISCONNECTED:
        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,
+                               prd_ptr->private_data,
+                               DAPL_MIN (private_data_size, 
+                                 DAPL_MAX_PRIVATE_DATA_SIZE));
+
+            dapl_dbg_log(DAPL_DBG_TYPE_CM | DAPL_DBG_TYPE_CALLBACK,
+                        "dapl_evd_connection_callback PEER REJ pd=%p sz=%d\n",
+                        prd_ptr, private_data_size);
+       }
+       case DAT_CONNECTION_EVENT_DISCONNECTED:
        case DAT_CONNECTION_EVENT_UNREACHABLE:
        case DAT_CONNECTION_EVENT_NON_PEER_REJECTED:
        {
@@ -205,7 +223,7 @@ dapl_evd_connection_callback (
                        evd_ptr,
                        dat_event_num,
                        (DAT_HANDLE) ep_ptr,
-                       private_data_size, /* 0 except for CONNECTED */
+                       private_data_size, /* CONNECTED or REJECT */
                        ep_ptr->private.private_data );
 
        if (dat_status != DAT_SUCCESS && 
diff --git a/dapl/openib_cma/dapl_ib_cm.c b/dapl/openib_cma/dapl_ib_cm.c
index 9b2062b..d3835b3 100755
--- a/dapl/openib_cma/dapl_ib_cm.c
+++ b/dapl/openib_cma/dapl_ib_cm.c
@@ -336,6 +336,7 @@ static void dapli_cm_active_cb(struct dapl_cm_id *conn,
        case RDMA_CM_EVENT_REJECTED:
        {
                ib_cm_events_t cm_event;
+               unsigned char  *pdata = NULL;
 
                dapl_dbg_log(
                        DAPL_DBG_TYPE_CM,
@@ -344,9 +345,11 @@ static void dapli_cm_active_cb(struct dapl_cm_id *conn,
 
                /* valid REJ from consumer will always contain private data */
                if (event->status == 28 &&
-                       event->param.conn.private_data_len) 
+                   event->param.conn.private_data_len) {
                        cm_event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-               else {
+                       pdata = (unsigned char*)event->param.conn.private_data
+                               + sizeof(struct dapl_pdata_hdr);
+               } else {
                        cm_event = IB_CME_DESTINATION_REJECT;
                        dapl_log(DAPL_DBG_TYPE_WARN, 
                                "dapl_cma_active: non-consumer REJ,"
@@ -357,7 +360,7 @@ static void dapli_cm_active_cb(struct dapl_cm_id *conn,
                                ntohs(((struct sockaddr_in *)
                                &conn->cm_id->route.addr.dst_addr)->sin_port));
                }               
-               dapl_evd_connection_callback(conn, cm_event, NULL, conn->ep);
+               dapl_evd_connection_callback(conn, cm_event, pdata, conn->ep);
                break;
        }
        case RDMA_CM_EVENT_ESTABLISHED:
@@ -910,8 +913,9 @@ dapls_ib_reject_connection(
        };
 
        dapl_dbg_log(DAPL_DBG_TYPE_CM,
-                " reject: cm_handle %p reason %x, ver=0x%x \n",
-                 cm_handle, reason, ntohl(pdata_hdr.version));
+                    " reject: handle %p reason %x, ver=%x, data %p, sz=%d\n",
+                    cm_handle, reason, ntohl(pdata_hdr.version),
+                    private_data, private_data_size);
 
        if (cm_handle == IB_INVALID_HANDLE) {
                dapl_dbg_log(DAPL_DBG_TYPE_ERR,
@@ -922,7 +926,7 @@ dapls_ib_reject_connection(
     
         if (private_data_size > 
                dapls_ib_private_data_size(
-                       NULL, IB_MAX_REJ_PDATA_SIZE, cm_handle->hca))
+                       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 */
-- 
1.5.2.5



_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to