msg.hdr.flags = MIX_OP_RSP;
- if (msg.hdr.ver != DAT_MIX_VER || msg.hdr.op != MIX_IA_OPEN) {
+ if (msg.hdr.ver < MIX_MIN || msg.hdr.ver > MIX_MAX || msg.hdr.op != MIX_IA_OPEN) {
mlog(0, " ERR: MIC client incompatible with MPXYD (exp %d,rcvd %d) or OP (exp %d,rcvd %d)\n",
DAT_MIX_VER, msg.hdr.ver, msg.hdr.op, MIX_IA_OPEN);
msg.hdr.ver = DAT_MIX_VER;
return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len));
}
+typedef struct dat_mix_mr_v4
+{
+ dat_mix_hdr_t hdr;
+ uint32_t mr_id;
+ uint32_t len;
+ uint64_t off;
+ uint64_t ctx;
+
+} dat_mix_mr_v4_t;
+
/* MIX_MR_CREATE: new proxy mr, insert on mr_list */
static int mix_mr_create(mcm_scif_dev_t *smd, dat_mix_mr_t *pmsg)
{
struct mcm_mr *m_mr = NULL;
/* hdr already read, get operation data */
- len = sizeof(dat_mix_mr_t) - sizeof(dat_mix_hdr_t);
+
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_mr_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_mr_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(smd->scif_op_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
mlog(0, " ERR: ret %d, exp %d\n", ret, len);
resp:
/* send back response */
pmsg->hdr.flags = MIX_OP_RSP;
- len = sizeof(dat_mix_mr_t);
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_mr_compat_t);
+ else
+ len = sizeof(dat_mix_mr_t);
+
return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len));
}
int i;
/* send DTO events to MIC client */
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = m_cq->smd->md->mc->ver;
msg.hdr.op = MIX_DTO_EVENT;
msg.hdr.flags = MIX_OP_REQ;
msg.cq_id = m_cq->cq_id;
int len;
/* send event to MIC client */
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = m_cm->md->mc->ver;
msg.hdr.op = MIX_CM_EVENT;
msg.hdr.flags = MIX_OP_REQ;
msg.cm_id = m_cm->cm_id;
struct mcm_qp *m_qp = NULL;
struct mcm_cm *m_cm = NULL;
- /* hdr already read, get operation data */
- len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+ /* hdr already read, get operation data, support compat mode */
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
- mlog(0, " ERR: ret %d, exp %d\n", ret, len);
+ mlog(0, " ERR: ret %d, exp %d ver %d\n", ret, len, smd->md->mc->ver);
return ret;
}
/* send back response */
pmsg->hdr.flags = MIX_OP_RSP;
- len = sizeof(dat_mix_cm_t);
+ /* support compat mode */
+ if (m_cm->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t);
+ else
+ len = sizeof(dat_mix_cm_t);
+
return (scif_send_msg(smd->scif_op_ep, (void*)pmsg, len));
}
int len, ret;
struct mcm_cm *m_cm;
- /* hdr already read, get operation data */
- len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+ /* hdr already read, get operation data, support compat mode */
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
mlog(0, " ERR: ret %d, exp %d\n", ret, len);
int len, ret;
struct mcm_cm *m_cm;
- /* hdr already read, get operation data */
- len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+ /* hdr already read, get operation data, support compat mode */
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
mlog(0, " ERR: ret %d, exp %d\n", ret, len);
return -1;
}
- mlog(2," CONNECTED: QPt 0x%x QPr 0x%x -> dport 0x%x, dqpn 0x%x dlid 0x%x psize %d %Lx\n",
+ mlog(2," CONNECTED: QPt 0x%x QPr 0x%x -> dport 0x%x, dqpn 0x%x dlid 0x%x %Lx\n",
m_cm->m_qp?m_cm->m_qp->qp_attr2.qp_num:0,
m_cm->m_qp?m_cm->m_qp->qp_attr1.qp_num:0,
ntohs(m_cm->msg.dport), ntohl(m_cm->msg.dqpn),
- ntohs(m_cm->msg.daddr1.lid), ntohs(m_cm->msg.p_size),
- ntohll(m_cm->msg.sys_guid));
+ ntohs(m_cm->msg.daddr1.lid), ntohll(m_cm->msg.sys_guid));
/* send RTU on wire */
mcm_cm_rtu_out(m_cm);
MCNTR(m_cm->md, MCM_CM_REJ_IN);
msg.hdr.op = MIX_CM_REJECT;
}
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = m_cm->md->mc->ver;
msg.hdr.flags = MIX_OP_REQ;
msg.cm_id = m_cm->cm_id;
msg.cm_ctx = m_cm->cm_ctx;
/* clean up proxy QP, CQ resources here ??? */
- len = sizeof(dat_mix_cm_t);
+ /* support compat mode */
+ if (m_cm->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t);
+ else
+ len = sizeof(dat_mix_cm_t);
+
mpxy_lock(&m_cm->smd->evlock);
if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) {
mpxy_unlock(&m_cm->smd->evlock);
pkt_len, ntohs(pkt->p_size), ntohll(pkt->sys_guid));
/* Forward, as is, conn_reply message to MIC client, with remote QP info */
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = m_cm->md->mc->ver;
msg.hdr.flags = MIX_OP_REQ;
msg.hdr.op = MIX_CM_REP;
msg.cm_id = m_cm->cm_id;
memcpy(&m_cm->msg.daddr2, &pkt->saddr2, sizeof(dat_mcm_addr_t));
mcm_ntoh_wrc(&m_cm->m_qp->wrc_rem, (mcm_wrc_info_t *)m_cm->msg.p_proxy); /* peer RI WRC info */
- mlog(2, " WRC_rem: m_qp %p - addr 0x%Lx rkey 0x%x len %d, sz %d end %d\n",
- m_cm->m_qp, m_cm->m_qp->wrc_rem.wc_addr, m_cm->m_qp->wrc_rem.wc_rkey,
- m_cm->m_qp->wrc_rem.wc_len, m_cm->m_qp->wrc_rem.wc_sz,
- m_cm->m_qp->wrc_rem.wc_end);
+ mlog(2, " WRC: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d"
+ " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n",
+ m_cm->m_qp, m_cm->m_qp->wrc.wr_addr, m_cm->m_qp->wrc.wr_rkey,
+ m_cm->m_qp->wrc.wr_len, m_cm->m_qp->wrc.wr_sz,
+ m_cm->m_qp->wrc.wr_end, m_cm->m_qp->wrc.wc_addr,
+ m_cm->m_qp->wrc.wc_rkey, m_cm->m_qp->wrc.wc_len,
+ m_cm->m_qp->wrc.wc_sz, m_cm->m_qp->wrc.wc_end);
+
+ mlog(2, " WRC_rem: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d"
+ " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n",
+ m_cm->m_qp, m_cm->m_qp->wrc_rem.wr_addr, m_cm->m_qp->wrc_rem.wr_rkey,
+ m_cm->m_qp->wrc_rem.wr_len, m_cm->m_qp->wrc_rem.wr_sz,
+ m_cm->m_qp->wrc_rem.wr_end, m_cm->m_qp->wrc_rem.wc_addr,
+ m_cm->m_qp->wrc_rem.wc_rkey, m_cm->m_qp->wrc_rem.wc_len,
+ m_cm->m_qp->wrc_rem.wc_sz, m_cm->m_qp->wrc_rem.wc_end);
/* MXS <- MSS or HOST, fabric: TX: QP2->QP1 direct, RX: QP1<-QP2 proxy */
if ((MXS_EP(&m_cm->md->addr) && !MXS_EP(&m_cm->msg.daddr1)) &&
goto err;
}
- len = sizeof(dat_mix_cm_t);
+ /* support compat mode */
+ if (m_cm->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t);
+ else
+ len = sizeof(dat_mix_cm_t);
+
mpxy_lock(&m_cm->smd->evlock);
if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) {
mpxy_unlock(&m_cm->smd->evlock);
mcm_pr_addrs(2, pkt, acm->state, 1);
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = cm->md->mc->ver;
msg.hdr.flags = MIX_OP_REQ;
msg.hdr.op = MIX_CM_REQ;
msg.hdr.status = MIX_SUCCESS;
if (pkt->p_size)
memcpy(acm->msg.p_data, pkt->p_data, ntohs(pkt->p_size));
- /* forward reformated CM message info to MIX client */
- memcpy(&msg.msg, &acm->msg, sizeof(dat_mcm_msg_t));
+ /* forward reformated CM message info to MIX client, support compat mode */
+ if (cm->md->mc->ver == MIX_COMP) {
+ len = sizeof(dat_mix_cm_compat_t);
+ memcpy(&msg.msg, &acm->msg, sizeof(dat_mcm_msg_compat_t));
+ } else {
+ len = sizeof(dat_mix_cm_t);
+ memcpy(&msg.msg, &acm->msg, sizeof(dat_mcm_msg_t));
+ }
acm->state = MCM_ACCEPTING;
mcm_qconn(acm->smd, acm);
msg.cm_ctx = (uint64_t)acm;
msg.sp_ctx = cm->sp_ctx;
- len = sizeof(dat_mix_cm_t);
mpxy_lock(&acm->smd->evlock);
if (scif_send_msg(acm->smd->scif_ev_ep, (void*)&msg, len)) {
mpxy_unlock(&acm->smd->evlock);
}
/* Forward, as is, conn_reply message to MIC client, with remote QP info */
- msg.hdr.ver = DAT_MIX_VER;
+ msg.hdr.ver = m_cm->md->mc->ver;
msg.hdr.flags = MIX_OP_REQ;
msg.hdr.op = MIX_CM_RTU;
msg.cm_id = m_cm->cm_id;
msg.cm_ctx = m_cm->cm_ctx;
m_cm->msg.sys_guid = pkt->sys_guid; /* save remote quid */
- len = sizeof(dat_mix_cm_t);
+ /* support compat mode */
+ if (m_cm->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t);
+ else
+ len = sizeof(dat_mix_cm_t);
+
mpxy_lock(&m_cm->smd->evlock);
if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) {
mpxy_unlock(&m_cm->smd->evlock);
uint32_t dqpn = 0, dqpn2 = 0;
uint16_t dlid = 0, dlid2 = 0;
- /* hdr already read, get operation data */
- len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+ /* hdr already read, get operation data, support compat mode */
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
mlog(0, " ERR: ret %d, exp %d\n", ret, len);
m_cm->cm_ctx = pmsg->sp_ctx;
m_cm->p_size = ntohs(pmsg->msg.p_size);
memcpy(&m_cm->p_data, &pmsg->msg.p_data, m_cm->p_size);
- memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t));
+
+ if (smd->md->mc->ver == MIX_COMP)
+ memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_compat_t));
+ else
+ memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t));
/* Attach the QP for this CR */
m_cm->m_qp = mix_get_qp(smd, pmsg->qp_id);
m_cm->ref_cnt++; /* Passive: QP ref */
m_cm->m_qp->cm = m_cm;
mcm_ntoh_wrc(&m_cm->m_qp->wrc_rem, (mcm_wrc_info_t *)m_cm->msg.p_proxy); /* save peer PI WRC info */
- mlog(2, " WRC_rem: m_qp %p - addr 0x%Lx rkey 0x%x len %d, sz %d end %d\n",
- m_cm->m_qp, m_cm->m_qp->wrc_rem.wc_addr, m_cm->m_qp->wrc_rem.wc_rkey,
- m_cm->m_qp->wrc_rem.wc_len, m_cm->m_qp->wrc_rem.wc_sz,
- m_cm->m_qp->wrc_rem.wc_end);
- mlog(8, " loc_guid %Lx, rem_guid %Lx\n",
- ntohll(system_guid), ntohll(m_cm->msg.sys_guid));
+ mlog(2, " WRC: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d"
+ " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n",
+ m_cm->m_qp, m_cm->m_qp->wrc.wr_addr, m_cm->m_qp->wrc.wr_rkey,
+ m_cm->m_qp->wrc.wr_len, m_cm->m_qp->wrc.wr_sz,
+ m_cm->m_qp->wrc.wr_end, m_cm->m_qp->wrc.wc_addr,
+ m_cm->m_qp->wrc.wc_rkey, m_cm->m_qp->wrc.wc_len,
+ m_cm->m_qp->wrc.wc_sz, m_cm->m_qp->wrc.wc_end);
+
+ mlog(2, " WRC_rem: m_qp %p - WR 0x%Lx rkey 0x%x ln %d, sz %d end %d"
+ " WC 0x%Lx rkey 0x%x ln %d, sz %d end %d\n",
+ m_cm->m_qp, m_cm->m_qp->wrc_rem.wr_addr, m_cm->m_qp->wrc_rem.wr_rkey,
+ m_cm->m_qp->wrc_rem.wr_len, m_cm->m_qp->wrc_rem.wr_sz,
+ m_cm->m_qp->wrc_rem.wr_end, m_cm->m_qp->wrc_rem.wc_addr,
+ m_cm->m_qp->wrc_rem.wc_rkey, m_cm->m_qp->wrc_rem.wc_len,
+ m_cm->m_qp->wrc_rem.wc_sz, m_cm->m_qp->wrc_rem.wc_end);
/* MXS -> MSS or HOST, remote: need QPr1, saddr1 on mpxyd */
if ((MXS_EP(&m_cm->md->addr) && !MXS_EP(&m_cm->msg.daddr1)) &&
int len, ret;
struct mcm_cm *m_cm;
- /* hdr already read, get operation data */
- len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+ /* hdr already read, get operation data, support compat mode */
+ if (smd->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t) - sizeof(dat_mix_hdr_t);
+ else
+ len = sizeof(dat_mix_cm_t) - sizeof(dat_mix_hdr_t);
+
ret = scif_recv(scif_ep, ((char*)pmsg + sizeof(dat_mix_hdr_t)), len, SCIF_RECV_BLOCK);
if (ret != len) {
mlog(0, " ERR: ret %d, exp %d\n", ret, len);
smd->entry.tid, pmsg->cm_id, (void*)pmsg->cm_ctx, pmsg->qp_id, m_cm);
/* update CM message from MIX client, send back guid */
- memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t));
+ if (smd->md->mc->ver == MIX_COMP)
+ memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_compat_t));
+ else
+ memcpy(&m_cm->msg, &pmsg->msg, sizeof(dat_mcm_msg_t));
#ifdef MPXYD_LOCAL_SUPPORT
m_cm->msg.sys_guid = system_guid;
int len;
/* send disconnect to MIC client */
- msg.ver = DAT_MIX_VER;
+ msg.ver = m_cm->md->mc->ver;
msg.flags = MIX_OP_REQ;
msg.op = MIX_CM_DISC;
msg.req_id = m_cm->cm_id;
- len = sizeof(dat_mix_hdr_t);
+ /* support compat mode */
+ if (m_cm->md->mc->ver == MIX_COMP)
+ len = sizeof(dat_mix_cm_compat_t);
+ else
+ len = sizeof(dat_mix_cm_t);
+
mpxy_lock(&m_cm->smd->evlock);
if (scif_send_msg(m_cm->smd->scif_ev_ep, (void*)&msg, len)) {
return -1;
len = sizeof(*phdr);
phdr->ver = 0; phdr->op = 0;
ret = scif_recv(scif_ep, phdr, len, SCIF_RECV_BLOCK);
- if ((ret != len) || (phdr->ver != DAT_MIX_VER)) {
+ if ((ret != len) || (phdr->ver < MIX_MIN) || (phdr->ver > MIX_MAX)) {
mlog(0,
" ERR: smd %p ep %d ret %d exp %d ver %d op %s flgs %d\n",
smd, scif_ep, ret, len, phdr->ver, mix_op_str(phdr->op),