[ofw] [PATCH 12/13] DAPL v2.0: common: extended CR event processing missing rejects on errors

Davis, Arlin R arlin.r.davis at intel.com
Fri Jan 13 15:55:53 PST 2012


When processing an inbound CR event callback a non-user reject should be
sent to client in the case of a non-listening SP, allocation error,
or EVD overrun. Changes made to dapls_evd_post_cr_event_ext callback.

Signed-off-by: Arlin Davis <arlin.r.davis at intel.com>
---
 dapl/common/dapl_evd_util.c |   35 ++++++++++++++++++++++++-----------
 1 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/dapl/common/dapl_evd_util.c b/dapl/common/dapl_evd_util.c
index a7b8c54..78d2a1f 100644
--- a/dapl/common/dapl_evd_util.c
+++ b/dapl/common/dapl_evd_util.c
@@ -937,16 +937,13 @@ dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
 {
 	DAPL_CR *cr_ptr;
 	DAPL_EP *ep_ptr;
+	int reason = DAT_CONNECTION_EVENT_BROKEN;
 
 	dapl_os_lock(&sp_ptr->header.lock);
 	if (sp_ptr->listening == DAT_FALSE) {
 		dapl_os_unlock(&sp_ptr->header.lock);
-		dapl_dbg_log(DAPL_DBG_TYPE_CM,
-			     "---> post_cr_event_ext: conn event on down SP\n");
-		(void)dapls_ib_reject_connection(ib_cm_handle,
-						 DAT_CONNECTION_EVENT_UNREACHABLE,
-						 0, NULL);
-		return DAT_CONN_QUAL_UNAVAILABLE;
+		reason = DAT_CONNECTION_EVENT_UNREACHABLE;
+		goto bail;
 	}
 
 	/*
@@ -961,7 +958,7 @@ dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
 	/* allocate new connect request */
 	cr_ptr = dapls_cr_alloc(sp_ptr->header.owner_ia);
 	if (cr_ptr == NULL)
-		return DAT_INSUFFICIENT_RESOURCES;
+		goto bail;
 
 	/* Set up the CR */
 	cr_ptr->sp_ptr = sp_ptr;	/* maintain sp_ptr in case of reject */
@@ -994,8 +991,7 @@ dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
 		ep_ptr = dapl_ep_alloc(ia_ptr, NULL);
 		if (ep_ptr == NULL) {
 			dapls_cr_free(cr_ptr);
-			/* Invoking function will call dapls_ib_cm_reject() */
-			return DAT_INSUFFICIENT_RESOURCES;
+			goto bail;
 		}
 		ep_ptr->param.ia_handle = ia_ptr;
 		ep_ptr->param.local_ia_address_ptr =
@@ -1025,8 +1021,25 @@ dapls_evd_post_cr_event_ext(IN DAPL_SP * sp_ptr,
 	/* link the CR onto the SP so we can pick it up later */
 	dapl_sp_link_cr(sp_ptr, cr_ptr);
 
-	return dapls_evd_do_post_cr_event_ext(sp_ptr->evd_handle, event_number,
-					      sp_ptr, cr_ptr, ext_data);
+	if (dapls_evd_do_post_cr_event_ext(sp_ptr->evd_handle,
+					   event_number,
+					   sp_ptr, cr_ptr,
+					   ext_data) == DAT_SUCCESS) {
+		return DAT_SUCCESS;
+	}
+
+	/* error: take CR off the list, we can't use it */
+	dapl_os_lock(&sp_ptr->header.lock);
+	dapl_sp_remove_cr(sp_ptr, cr_ptr);
+	dapl_os_unlock(&sp_ptr->header.lock);
+	dapls_cr_free(cr_ptr);
+bail:
+	dapl_log(DAPL_DBG_TYPE_WARN,
+		" cr_event_ext: ERROR reason = 0x%x\n", reason);
+
+	(void)dapls_ib_reject_connection(ib_cm_handle, reason, 0, NULL);
+
+	return DAT_INTERNAL_ERROR;
 }
 
 DAT_RETURN
-- 
1.7.3





More information about the ofw mailing list