mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 14:33:24 -04:00
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:
committed by
Jakub Kicinski
parent
b1224c4b40
commit
996643574c
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user