]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
common: extended CR event processing missing rejects on errors
authorArlin Davis <arlin.r.davis@intel.com>
Thu, 12 Jan 2012 17:54:59 +0000 (09:54 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Thu, 12 Jan 2012 17:54:59 +0000 (09:54 -0800)
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@intel.com>
dapl/common/dapl_evd_util.c

index a7b8c547b139363509ff1d6a4276973f94bb332a..78d2a1f9e4e8a7ad7f1a54866dfd258c8552e1cf 100644 (file)
@@ -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