| From f8c62cf32961acca7553bca98548fde02248721b Mon Sep 17 00:00:00 2001 |
| From: David Howells <dhowells@redhat.com> |
| Date: Mon, 8 Oct 2018 15:46:11 +0100 |
| Subject: rxrpc: Only take the rwind and mtu values from latest ACK |
| |
| [ Upstream commit 298bc15b2079c324e82d0a6fda39c3d762af7282 ] |
| |
| Move the out-of-order and duplicate ACK packet check to before the call to |
| rxrpc_input_ackinfo() so that the receive window size and MTU size are only |
| checked in the latest ACK packet and don't regress. |
| |
| Fixes: 248f219cb8bc ("rxrpc: Rewrite the data and ack handling code") |
| Signed-off-by: David Howells <dhowells@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/rxrpc/input.c | 19 ++++++++++--------- |
| 1 file changed, 10 insertions(+), 9 deletions(-) |
| |
| diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c |
| index 7bfde4737cb3..a4380e182e6c 100644 |
| --- a/net/rxrpc/input.c |
| +++ b/net/rxrpc/input.c |
| @@ -808,6 +808,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, |
| rxrpc_propose_ack_respond_to_ack); |
| } |
| |
| + /* Discard any out-of-order or duplicate ACKs. */ |
| + if (before_eq(sp->hdr.serial, call->acks_latest)) { |
| + _debug("discard ACK %d <= %d", |
| + sp->hdr.serial, call->acks_latest); |
| + return; |
| + } |
| + call->acks_latest_ts = skb->tstamp; |
| + call->acks_latest = sp->hdr.serial; |
| + |
| + /* Parse rwind and mtu sizes if provided. */ |
| ioffset = offset + nr_acks + 3; |
| if (skb->len >= ioffset + sizeof(buf.info)) { |
| if (skb_copy_bits(skb, ioffset, &buf.info, sizeof(buf.info)) < 0) |
| @@ -829,15 +839,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, |
| return; |
| } |
| |
| - /* Discard any out-of-order or duplicate ACKs. */ |
| - if (before_eq(sp->hdr.serial, call->acks_latest)) { |
| - _debug("discard ACK %d <= %d", |
| - sp->hdr.serial, call->acks_latest); |
| - return; |
| - } |
| - call->acks_latest_ts = skb->tstamp; |
| - call->acks_latest = sp->hdr.serial; |
| - |
| if (before(hard_ack, call->tx_hard_ack) || |
| after(hard_ack, call->tx_top)) |
| return rxrpc_proto_abort("AKW", call, 0); |
| -- |
| 2.17.1 |
| |