mptcp: avoid code duplication in __mptcp_move_skb()

Alike TCP, MPTCP handles in-sequence packets and partially overlapping
ones in a very similar way: we can use the same path to handle both,
avoiding some code duplication.

This will also make the next patch simpler.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260807-net-next-mptcp-oooq-pruning-v3-6-dbc1eb853cc3@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Paolo Abeni
2026-08-07 15:49:06 +02:00
committed by Jakub Kicinski
parent b1224c4b40
commit 996643574c

View File

@@ -399,6 +399,7 @@ static bool __mptcp_move_skb(struct sock *sk, struct sk_buff *skb)
if (MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq) {
/* in sequence */
insert:
msk->bytes_received += copy_len;
WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len);
tail = skb_peek_tail(&sk->sk_receive_queue);
@@ -413,26 +414,20 @@ static bool __mptcp_move_skb(struct sock *sk, struct sk_buff *skb)
return false;
}
/* Completely old data? */
if (!after64(MPTCP_SKB_CB(skb)->end_seq, msk->ack_seq)) {
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA);
mptcp_drop(sk, skb);
return false;
/* Partial packet */
if (after64(MPTCP_SKB_CB(skb)->end_seq, msk->ack_seq)) {
copy_len = MPTCP_SKB_CB(skb)->end_seq - msk->ack_seq;
MPTCP_SKB_CB(skb)->offset += msk->ack_seq -
MPTCP_SKB_CB(skb)->map_seq;
MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq -
MPTCP_SKB_CB(skb)->map_seq;
goto insert;
}
/* Partial packet: map_seq < ack_seq < end_seq.
* Skip the already-acked bytes and enqueue the new data.
*/
copy_len = MPTCP_SKB_CB(skb)->end_seq - msk->ack_seq;
MPTCP_SKB_CB(skb)->offset += msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq;
MPTCP_SKB_CB(skb)->map_seq += msk->ack_seq -
MPTCP_SKB_CB(skb)->map_seq;
msk->bytes_received += copy_len;
WRITE_ONCE(msk->ack_seq, msk->ack_seq + copy_len);
skb_set_owner_r(skb, sk);
__skb_queue_tail(&sk->sk_receive_queue, skb);
return true;
/* Completely old data */
MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA);
mptcp_drop(sk, skb);
return false;
}
static void mptcp_stop_rtx_timer(struct sock *sk)