Skip to content

Commit f67ac00

Browse files
Honggang-LIrleon
authored andcommitted
RDMA/rxe: Fix responder length checking for UD request packets
According to the IBA specification: If a UD request packet is detected with an invalid length, the request shall be an invalid request and it shall be silently dropped by the responder. The responder then waits for a new request packet. commit 689c542 ("RDMA/rxe: Fix incorrect responder length checking") defers responder length check for UD QPs in function `copy_data`. But it introduces a regression issue for UD QPs. When the packet size is too large to fit in the receive buffer. `copy_data` will return error code -EINVAL. Then `send_data_in` will return RESPST_ERR_MALFORMED_WQE. UD QP will transfer into ERROR state. Fixes: 689c542 ("RDMA/rxe: Fix incorrect responder length checking") Signed-off-by: Honggang LI <honggangli@163.com> Link: https://lore.kernel.org/r/20240523094617.141148-1-honggangli@163.com Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent 03fa18a commit f67ac00

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

drivers/infiniband/sw/rxe/rxe_resp.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,19 @@ static enum resp_states rxe_resp_check_length(struct rxe_qp *qp,
344344
* receive buffer later. For rmda operations additional
345345
* length checks are performed in check_rkey.
346346
*/
347+
if ((qp_type(qp) == IB_QPT_GSI) || (qp_type(qp) == IB_QPT_UD)) {
348+
unsigned int payload = payload_size(pkt);
349+
unsigned int recv_buffer_len = 0;
350+
int i;
351+
352+
for (i = 0; i < qp->resp.wqe->dma.num_sge; i++)
353+
recv_buffer_len += qp->resp.wqe->dma.sge[i].length;
354+
if (payload + 40 > recv_buffer_len) {
355+
rxe_dbg_qp(qp, "The receive buffer is too small for this UD packet.\n");
356+
return RESPST_ERR_LENGTH;
357+
}
358+
}
359+
347360
if (pkt->mask & RXE_PAYLOAD_MASK && ((qp_type(qp) == IB_QPT_RC) ||
348361
(qp_type(qp) == IB_QPT_UC))) {
349362
unsigned int mtu = qp->mtu;

0 commit comments

Comments
 (0)