[ofw] [PATCH] DAPL v2.0: scm, ucm: fix compatibility issue and set minimum protocol support

Davis, Arlin R arlin.r.davis at intel.com
Sun Aug 28 19:25:33 PDT 2011


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 <arlin.r.davis at intel.com>
---
 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





More information about the ofw mailing list