From 4c4966d62e59e047b9b90f37c61c38838a6c9dd9 Mon Sep 17 00:00:00 2001 From: ftillier Date: Fri, 4 Aug 2006 07:19:55 +0000 Subject: [PATCH] [SRP] Fix REP processing to reject the connection in case of errors. git-svn-id: svn://openib.tc.cornell.edu/gen1@438 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/srp/kernel/srp_connection.c | 56 +++++++++++++++------------ 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/trunk/ulp/srp/kernel/srp_connection.c b/trunk/ulp/srp/kernel/srp_connection.c index f8f2c11d..8f86b367 100644 --- a/trunk/ulp/srp/kernel/srp_connection.c +++ b/trunk/ulp/srp/kernel/srp_connection.c @@ -409,13 +409,18 @@ void __srp_cm_reply_cb( IN ib_cm_rep_rec_t *p_cm_reply) { - srp_session_t *p_srp_session = (srp_session_t* __ptr64)p_cm_reply->qp_context; - srp_connection_t *p_connection; - srp_login_rsp_t *p_srp_login_rsp = (srp_login_rsp_t* __ptr64)p_cm_reply->p_rep_pdata; - ib_api_status_t status; - ib_cm_mra_t cm_mra; - ib_cm_rtu_t cm_rtu; - cl_status_t cl_status; + srp_session_t *p_srp_session = (srp_session_t* __ptr64)p_cm_reply->qp_context; + srp_connection_t *p_connection; + srp_login_rsp_t *p_srp_login_rsp = (srp_login_rsp_t* __ptr64)p_cm_reply->p_rep_pdata; + ib_api_status_t status; + union + { + ib_cm_mra_t cm_mra; + ib_cm_rtu_t cm_rtu; + ib_cm_rej_t cm_rej; + + } u; + cl_status_t cl_status; ib_al_ifc_t *p_ifc; SRP_ENTER( SRP_DBG_PNP ); @@ -448,8 +453,7 @@ __srp_cm_reply_cb( else /* not reported any descriptor format */ { SRP_TRACE( SRP_DBG_DEBUG,(" Target does not support valid descriptor formats\n") ); - p_connection->state = SRP_CONNECT_FAILURE; - goto exit; + goto rej; } SRP_TRACE( SRP_DBG_DEBUG, ("Request Limit = %d, SendQ Depth = %d, RecvQDepth = %d, ItoT size = %d, TtoI size = %d, Max S/G = %d\n", @@ -460,17 +464,16 @@ __srp_cm_reply_cb( p_connection->targ_to_init_iu_sz, p_connection->max_scatter_gather_entries) ); - cm_mra.svc_timeout = 0x08; - cm_mra.p_mra_pdata = NULL; - cm_mra.mra_length = 0; + u.cm_mra.svc_timeout = 0x08; + u.cm_mra.p_mra_pdata = NULL; + u.cm_mra.mra_length = 0; - status = p_ifc->cm_mra( p_cm_reply->h_cm_rep, &cm_mra ); + status = p_ifc->cm_mra( p_cm_reply->h_cm_rep, &u.cm_mra ); if ( status != IB_SUCCESS ) { SRP_TRACE( SRP_DBG_ERROR, ("Cannot Send MRA. Status = %d\n", status) ); - p_connection->state = SRP_CONNECT_FAILURE; - goto exit; + goto rej; } status = p_ifc->modify_cq( p_connection->h_send_cq, &p_connection->send_queue_depth ); @@ -490,8 +493,7 @@ __srp_cm_reply_cb( cl_status = __srp_create_wc_free_list( p_connection, (p_connection->request_limit * 2) );/* Send/Recv */ if ( cl_status != CL_SUCCESS ) { - p_connection->state = SRP_CONNECT_FAILURE; - goto exit; + goto rej; } status = srp_init_descriptors( &p_srp_session->descriptors, @@ -505,22 +507,26 @@ __srp_cm_reply_cb( cl_free( p_connection->p_wc_array ); p_connection->p_wc_array = NULL; p_connection->p_wc_free_list = NULL; +rej: p_connection->state = SRP_CONNECT_FAILURE; + cl_memclr( &u.cm_rej, sizeof(u.cm_rej) ); + u.cm_rej.rej_status = IB_REJ_INSUF_RESOURCES; + p_ifc->cm_rej( p_cm_reply->h_cm_rep, &u.cm_rej ); goto exit; } - cm_rtu.access_ctrl = IB_AC_LOCAL_WRITE | IB_AC_RDMA_READ | IB_AC_RDMA_WRITE; + u.cm_rtu.access_ctrl = IB_AC_LOCAL_WRITE | IB_AC_RDMA_READ | IB_AC_RDMA_WRITE; /* Have to set to 0 to indicate not to modify because Tavor doesn't support this */ - cm_rtu.sq_depth = 0 /*p_connection->request_limit*/; - cm_rtu.rq_depth = 0 /*p_connection->request_limit*/; + u.cm_rtu.sq_depth = 0 /*p_connection->request_limit*/; + u.cm_rtu.rq_depth = 0 /*p_connection->request_limit*/; - cm_rtu.p_rtu_pdata = NULL; - cm_rtu.rtu_length = 0; - cm_rtu.pfn_cm_apr_cb = __srp_cm_apr_cb; - cm_rtu.pfn_cm_dreq_cb = __srp_cm_dreq_cb; + u.cm_rtu.p_rtu_pdata = NULL; + u.cm_rtu.rtu_length = 0; + u.cm_rtu.pfn_cm_apr_cb = __srp_cm_apr_cb; + u.cm_rtu.pfn_cm_dreq_cb = __srp_cm_dreq_cb; - status = p_ifc->cm_rtu( p_cm_reply->h_cm_rep, &cm_rtu ); + status = p_ifc->cm_rtu( p_cm_reply->h_cm_rep, &u.cm_rtu ); if ( status != IB_SUCCESS ) { SRP_TRACE( SRP_DBG_ERROR, -- 2.41.0