]> git.openfabrics.org - ~ardavis/dapl.git/commitdiff
ucm: incorrectly sends user reject during CR callback errors
authorArlin Davis <arlin.r.davis@intel.com>
Thu, 12 Jan 2012 17:39:46 +0000 (09:39 -0800)
committerArlin Davis <arlin.r.davis@intel.com>
Thu, 12 Jan 2012 17:39:46 +0000 (09:39 -0800)
Add reason checking on provider rejects and set appropriate op type
in reject message. Reject can be called from cr callback during
failures. User reject will be IB_CM_REJ_REASON_CONSUMER_REJ.
Add warning message on active side.

Signed-off-by: Arlin Davis <arlin.r.davis@intel.com>
dapl/openib_ucm/cm.c

index 762bd66fbfb2e4c2ece90ac608ad09025bb1575d..6efcad27fc651bbc3b210679f8662105a20c3de6 100644 (file)
@@ -402,11 +402,12 @@ static void ucm_process_recv(ib_hca_transport_t *tp,
                break;
        default:
                dapl_log(DAPL_DBG_TYPE_WARN,
-                               " ucm_recv: UNKNOWN state"
-                               " <- op %s, %s spsp %x sqpn %x\n", 
-                               dapl_cm_op_str(ntohs(msg->op)), 
-                               dapl_cm_state_str(cm->state), 
-                               ntohs(msg->sport), ntohl(msg->sqpn));
+                       " ucm_recv: Warning, UNKNOWN state"
+                       " <- op %s, %s spsp %x sqpn %x slid %x\n",
+                       dapl_cm_op_str(ntohs(msg->op)),
+                       dapl_cm_state_str(cm->state),
+                       ntohs(msg->sport), ntohl(msg->sqpn),
+                       ntohs(msg->saddr.ib.lid));
                dapl_os_unlock(&cm->lock);
                break;
        }
@@ -1065,9 +1066,19 @@ static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg)
                event = IB_CME_CONNECTED;
        else if (ntohs(msg->op) == DCM_REJ_USER) 
                event = IB_CME_DESTINATION_REJECT_PRIVATE_DATA;
-       else  
+       else  {
+               dapl_log(DAPL_DBG_TYPE_WARN,
+                        " Warning, non-user CR REJECT:"
+                        " cm %p op %s, st %s dlid %x iqp %x port %x <-"
+                        " slid %x iqp %x port %x\n", cm,
+                        dapl_cm_op_str(ntohs(msg->op)),
+                        dapl_cm_state_str(cm->state),
+                        ntohs(msg->daddr.ib.lid), ntohl(msg->daddr.ib.qpn),
+                        ntohs(msg->dport), ntohs(msg->saddr.ib.lid),
+                        ntohl(msg->saddr.ib.qpn), ntohs(msg->sport));
+
                event = IB_CME_DESTINATION_REJECT;
-       
+       }
        if (event != IB_CME_CONNECTED) {
                dapl_log(DAPL_DBG_TYPE_CM, 
                         " ACTIVE: CM_REQ REJECTED:"
@@ -1203,6 +1214,9 @@ ud_bail:
                                (DAT_COUNT)ntohs(cm->msg.p_size),
                                (DAT_PVOID *)cm->msg.p_data,
                                (DAT_PVOID *)&xevent);
+
+               if (event != DAT_IB_UD_CONNECTION_EVENT_ESTABLISHED)
+                       dapli_cm_free(cm);
        } else
 #endif
        {
@@ -1942,8 +1956,12 @@ dapls_ib_reject_connection(IN dp_ib_cm_handle_t cm,
        cm->msg.saddr.ib.qp_type = cm->msg.daddr.ib.qp_type;
        dapl_os_memcpy(&cm->msg.saddr.ib.gid[0],
                       &cm->hca->ib_trans.addr.ib.gid, 16); 
-       cm->msg.op = htons(DCM_REJ_USER);
        
+       if (reason == IB_CM_REJ_REASON_CONSUMER_REJ)
+               cm->msg.op = htons(DCM_REJ_USER);
+       else
+               cm->msg.op = htons(DCM_REJ_CM);
+
        if (ucm_send(&cm->hca->ib_trans, &cm->msg, pdata, psize)) {
                dapl_log(DAPL_DBG_TYPE_WARN,
                         " cm_reject: send ERR: %s\n", strerror(errno));