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: Robert Walsh <robert.walsh@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
e8e7ad7115
commit
b506e1dc59
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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 @@ again:
|
|||||||
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 @@ again:
|
|||||||
|
|
||||||
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 @@ again:
|
|||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user