With the delay in cm object queuing there is potential for replies being dropped coming back with a NO MATCH. Start with INIT state and queue it up, move to state REP_PENDING when sending out on the wire to start request timer.
Signed-off-by: Arlin Davis <[email protected]> --- dapl/openib_ucm/cm.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dapl/openib_ucm/cm.c b/dapl/openib_ucm/cm.c index 69f7610..b2db32c 100644 --- a/dapl/openib_ucm/cm.c +++ b/dapl/openib_ucm/cm.c @@ -951,7 +951,7 @@ dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm) htons(cm->msg.dport)); dapl_os_lock(&cm->lock); - if (cm->state != DCM_REP_PENDING) { + if (cm->state != DCM_INIT && cm->state != DCM_REP_PENDING) { dapl_os_unlock(&cm->lock); return DAT_INVALID_STATE; } @@ -985,8 +985,9 @@ dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm) DAT_INVALID_ADDRESS_UNREACHABLE); } + cm->state = DCM_REP_PENDING; cm->msg.op = htons(DCM_REQ); - dapl_os_get_time(&cm->timer); /* reply expected */ + dapl_os_get_time(&cm->timer); /* reset reply timer */ if (ucm_send(&cm->hca->ib_trans, &cm->msg, &cm->msg.p_data, ntohs(cm->msg.p_size))) { dapl_os_unlock(&cm->lock); @@ -994,10 +995,6 @@ dapli_cm_connect(DAPL_EP *ep, dp_ib_cm_handle_t cm) } dapl_os_unlock(&cm->lock); - /* first time through, link EP and CM, put on work queue */ - if (!cm->retries) { - dapli_queue_conn(cm); - } return DAT_SUCCESS; bail: @@ -1658,7 +1655,10 @@ dapls_ib_connect(IN DAT_EP_HANDLE ep_handle, dapl_os_memcpy(&cm->msg.p_data, p_data, p_size); } - cm->state = DCM_REP_PENDING; + cm->state = DCM_INIT; + + /* link EP and CM, put on work queue */ + dapli_queue_conn(cm); /* build connect request, send to remote CM based on r_addr info */ return (dapli_cm_connect(ep, cm)); -- 1.7.3 _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
