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

Reply via email to