allow latest version to work with previous version. provide compatibility back to OFED 1.5, dapl-2.0.23. if rdma_atomic_in is not exchanged, default back to original settings set by consumer. maintain compatibility moving forward from v6.
Signed-off-by: Arlin Davis <[email protected]> --- dapl/openib_common/dapl_ib_common.h | 1 + dapl/openib_scm/cm.c | 16 ++++++++++------ dapl/openib_ucm/cm.c | 14 +++++++++----- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/dapl/openib_common/dapl_ib_common.h b/dapl/openib_common/dapl_ib_common.h index 8993a24..a0dd772 100644 --- a/dapl/openib_common/dapl_ib_common.h +++ b/dapl/openib_common/dapl_ib_common.h @@ -59,6 +59,7 @@ typedef ib_hca_handle_t dapl_ibal_ca_t; /* QP info to exchange, wire protocol version for these CM's */ #define DCM_VER 7 +#define DCM_VER_MIN 6 /* backward compatibility limit */ /* CM private data areas, same for all operations */ #define DCM_MAX_PDATA_SIZE 118 diff --git a/dapl/openib_scm/cm.c b/dapl/openib_scm/cm.c index 1145f17..305f85b 100644 --- a/dapl/openib_scm/cm.c +++ b/dapl/openib_scm/cm.c @@ -712,7 +712,7 @@ static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr) dapl_dbg_log(DAPL_DBG_TYPE_EP, " connect_rtu: recv peer QP data\n"); len = recv(cm_ptr->socket, (char *)&cm_ptr->msg, exp, 0); - if (len != exp || ntohs(cm_ptr->msg.ver) != DCM_VER) { + if (len != exp || ntohs(cm_ptr->msg.ver) < DCM_VER_MIN) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_WARN, " CONN_RTU read: sk %d ERR 0x%x, rcnt=%d, v=%d -> %s PORT L-%x R-%x PID L-%x R-%x\n", @@ -807,8 +807,10 @@ static void dapli_socket_connect_rtu(dp_ib_cm_handle_t cm_ptr) } /* rdma_out, initiator, cannot exceed remote rdma_in max */ - ep_ptr->param.ep_attr.max_rdma_read_out = - DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, cm_ptr->msg.rd_in); + if (ntohs(cm_ptr->msg.ver) >= 7) + ep_ptr->param.ep_attr.max_rdma_read_out = + DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, + cm_ptr->msg.rd_in); /* modify QP to RTR and then to RTS with remote info */ dapl_os_lock(&ep_ptr->header.lock); @@ -1089,7 +1091,7 @@ static void dapli_socket_accept_data(ib_cm_srvc_handle_t acm_ptr) /* read in DST QP info, IA address. check for private data */ len = recv(acm_ptr->socket, (char *)&acm_ptr->msg, exp, 0); - if (len != exp || ntohs(acm_ptr->msg.ver) != DCM_VER) { + if (len != exp || ntohs(acm_ptr->msg.ver) < DCM_VER_MIN) { int err = dapl_socket_errno(); dapl_log(DAPL_DBG_TYPE_ERR, " ACCEPT read: ERR 0x%x %s, rcnt=%d, ver=%d\n", @@ -1209,8 +1211,10 @@ dapli_socket_accept_usr(DAPL_EP * ep_ptr, } #endif /* rdma_out, initiator, cannot exceed remote rdma_in max */ - ep_ptr->param.ep_attr.max_rdma_read_out = - DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, cm_ptr->msg.rd_in); + if (ntohs(cm_ptr->msg.ver) >= 7) + ep_ptr->param.ep_attr.max_rdma_read_out = + DAPL_MIN(ep_ptr->param.ep_attr.max_rdma_read_out, + cm_ptr->msg.rd_in); /* modify QP to RTR and then to RTS with remote info already read */ dapl_os_lock(&ep_ptr->header.lock); diff --git a/dapl/openib_ucm/cm.c b/dapl/openib_ucm/cm.c index ec6a774..2d2063e 100644 --- a/dapl/openib_ucm/cm.c +++ b/dapl/openib_ucm/cm.c @@ -554,7 +554,7 @@ retry: (void*)wc[i].wr_id, wc[i].src_qp); /* validate CM message, version */ - if (ntohs(msg->ver) != DCM_VER) { + if (ntohs(msg->ver) < DCM_VER_MIN) { dapl_log(DAPL_DBG_TYPE_WARN, " ucm_recv: UNKNOWN msg %p, ver %d\n", msg, msg->ver); @@ -1092,8 +1092,10 @@ static void ucm_connect_rtu(dp_ib_cm_handle_t cm, ib_cm_msg_t *msg) dapl_os_unlock(&cm->lock); /* rdma_out, initiator, cannot exceed remote rdma_in max */ - cm->ep->param.ep_attr.max_rdma_read_out = - DAPL_MIN(cm->ep->param.ep_attr.max_rdma_read_out, cm->msg.rd_in); + if (ntohs(cm->msg.ver) >= 7) + cm->ep->param.ep_attr.max_rdma_read_out = + DAPL_MIN(cm->ep->param.ep_attr.max_rdma_read_out, + cm->msg.rd_in); /* modify QP to RTR and then to RTS with remote info */ dapl_os_lock(&cm->ep->header.lock); @@ -1526,8 +1528,10 @@ dapli_accept_usr(DAPL_EP *ep, DAPL_CR *cr, DAT_COUNT p_size, DAT_PVOID p_data) #endif /* rdma_out, initiator, cannot exceed remote rdma_in max */ - ep->param.ep_attr.max_rdma_read_out = - DAPL_MIN(ep->param.ep_attr.max_rdma_read_out, cm->msg.rd_in); + if (ntohs(cm->msg.ver) >= 7) + ep->param.ep_attr.max_rdma_read_out = + DAPL_MIN(ep->param.ep_attr.max_rdma_read_out, + cm->msg.rd_in); /* modify QP to RTR and then to RTS with remote info already read */ dapl_os_lock(&ep->header.lock); -- 1.7.3 _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
