Commit b506e1dc authored by Robert Walsh's avatar Robert Walsh Committed by Roland Dreier

IB/ipath: Send ACK invalid where appropriate

The IB specification ch. 9.9.3 table 58 says that a QP which isn't set
up for the operation should return a NAK invalid request.
Signed-off-by: default avatarRobert Walsh <robert.walsh@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent e8e7ad71
...@@ -1711,6 +1711,9 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, ...@@ -1711,6 +1711,9 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
case OP(RDMA_WRITE_FIRST): case OP(RDMA_WRITE_FIRST):
case OP(RDMA_WRITE_ONLY): case OP(RDMA_WRITE_ONLY):
case OP(RDMA_WRITE_ONLY_WITH_IMMEDIATE): case OP(RDMA_WRITE_ONLY_WITH_IMMEDIATE):
if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_WRITE)))
goto nack_inv;
/* consume RWQE */ /* consume RWQE */
/* RETH comes after BTH */ /* RETH comes after BTH */
if (!header_in_data) if (!header_in_data)
...@@ -1740,9 +1743,6 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, ...@@ -1740,9 +1743,6 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
qp->r_sge.sge.length = 0; qp->r_sge.sge.length = 0;
qp->r_sge.sge.sge_length = 0; qp->r_sge.sge.sge_length = 0;
} }
if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_WRITE)))
goto nack_acc;
if (opcode == OP(RDMA_WRITE_FIRST)) if (opcode == OP(RDMA_WRITE_FIRST))
goto send_middle; goto send_middle;
else if (opcode == OP(RDMA_WRITE_ONLY)) else if (opcode == OP(RDMA_WRITE_ONLY))
...@@ -1756,8 +1756,9 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, ...@@ -1756,8 +1756,9 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
u32 len; u32 len;
u8 next; u8 next;
if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_READ))) if (unlikely(!(qp->qp_access_flags &
goto nack_acc; IB_ACCESS_REMOTE_READ)))
goto nack_inv;
next = qp->r_head_ack_queue + 1; next = qp->r_head_ack_queue + 1;
if (next > IPATH_MAX_RDMA_ATOMIC) if (next > IPATH_MAX_RDMA_ATOMIC)
next = 0; next = 0;
...@@ -1832,7 +1833,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, ...@@ -1832,7 +1833,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
if (unlikely(!(qp->qp_access_flags & if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_ATOMIC))) IB_ACCESS_REMOTE_ATOMIC)))
goto nack_acc; goto nack_inv;
next = qp->r_head_ack_queue + 1; next = qp->r_head_ack_queue + 1;
if (next > IPATH_MAX_RDMA_ATOMIC) if (next > IPATH_MAX_RDMA_ATOMIC)
next = 0; next = 0;
......
...@@ -319,12 +319,22 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) ...@@ -319,12 +319,22 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp)
break; break;
case IB_WR_RDMA_WRITE_WITH_IMM: case IB_WR_RDMA_WRITE_WITH_IMM:
if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_WRITE))) {
wc.status = IB_WC_REM_INV_REQ_ERR;
goto err;
}
wc.wc_flags = IB_WC_WITH_IMM; wc.wc_flags = IB_WC_WITH_IMM;
wc.imm_data = wqe->wr.imm_data; wc.imm_data = wqe->wr.imm_data;
if (!ipath_get_rwqe(qp, 1)) if (!ipath_get_rwqe(qp, 1))
goto rnr_nak; goto rnr_nak;
/* FALLTHROUGH */ /* FALLTHROUGH */
case IB_WR_RDMA_WRITE: case IB_WR_RDMA_WRITE:
if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_WRITE))) {
wc.status = IB_WC_REM_INV_REQ_ERR;
goto err;
}
if (wqe->length == 0) if (wqe->length == 0)
break; break;
if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length, if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length,
...@@ -354,8 +364,10 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) ...@@ -354,8 +364,10 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp)
case IB_WR_RDMA_READ: case IB_WR_RDMA_READ:
if (unlikely(!(qp->qp_access_flags & if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_READ))) IB_ACCESS_REMOTE_READ))) {
goto acc_err; wc.status = IB_WC_REM_INV_REQ_ERR;
goto err;
}
if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length, if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length,
wqe->wr.wr.rdma.remote_addr, wqe->wr.wr.rdma.remote_addr,
wqe->wr.wr.rdma.rkey, wqe->wr.wr.rdma.rkey,
...@@ -369,8 +381,10 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) ...@@ -369,8 +381,10 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp)
case IB_WR_ATOMIC_CMP_AND_SWP: case IB_WR_ATOMIC_CMP_AND_SWP:
case IB_WR_ATOMIC_FETCH_AND_ADD: case IB_WR_ATOMIC_FETCH_AND_ADD:
if (unlikely(!(qp->qp_access_flags & if (unlikely(!(qp->qp_access_flags &
IB_ACCESS_REMOTE_ATOMIC))) IB_ACCESS_REMOTE_ATOMIC))) {
goto acc_err; wc.status = IB_WC_REM_INV_REQ_ERR;
goto err;
}
if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64), if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64),
wqe->wr.wr.atomic.remote_addr, wqe->wr.wr.atomic.remote_addr,
wqe->wr.wr.atomic.rkey, wqe->wr.wr.atomic.rkey,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment