From: Mat Martineau <martineau@kernel.org>
To: Paolo Abeni <pabeni@redhat.com>
Cc: mptcp@lists.linux.dev
Subject: Re: [PATCH mptcp-net 2/2] mptcp: fix duplicate data handling
Date: Thu, 25 Jul 2024 17:42:13 -0700 (PDT) [thread overview]
Message-ID: <415224da-e982-2d69-d1de-f234abdc09fb@kernel.org> (raw)
In-Reply-To: <1ca08110195a81b95a38449f1a12b5593dfad864.1721921695.git.pabeni@redhat.com>
On Thu, 25 Jul 2024, Paolo Abeni wrote:
> When a subflow receives and discards duplicate data, the mptcp
> stack assumes that the consumed offset inside the current skb is
> zero.
>
> With multiple subflows receiving data simultaneously such assertion
> does not held true. As a result the subflow-level copied_seq will
> be incorrectly increased and later on the same subflow will observe
> a bad mapping, leading to subflow reset.
>
> Address the issue tacking in account the skb consumed offset in
Just one fix but Matthieu can adjust: "Address the issue taking into
account..."
Reviewed-by: Mat Martineau <martineau@kernel.org>
> mptcp_subflow_discard_data().
>
> Fixes: 04e4cd4f7ca4 ("mptcp: cleanup mptcp_subflow_discard_data()")
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> net/mptcp/subflow.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index 0e4b5bfbeaa1..a21c712350c3 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -1230,14 +1230,22 @@ static void mptcp_subflow_discard_data(struct sock *ssk, struct sk_buff *skb,
> {
> struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
> bool fin = TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN;
> - u32 incr;
> + struct tcp_sock *tp = tcp_sk(ssk);
> + u32 offset, incr, avail_len;
>
> - incr = limit >= skb->len ? skb->len + fin : limit;
> + offset = tp->copied_seq - TCP_SKB_CB(skb)->seq;
> + if (WARN_ON_ONCE(offset > skb->len))
> + goto out;
> +
> + avail_len = skb->len - offset;
> + incr = limit >= avail_len ? avail_len + fin : limit;
>
> - pr_debug("discarding=%d len=%d seq=%d", incr, skb->len,
> - subflow->map_subflow_seq);
> + pr_debug("discarding=%d len=%d offset=%d seq=%d", incr, skb->len,
> + offset, subflow->map_subflow_seq);
> MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DUPDATA);
> tcp_sk(ssk)->copied_seq += incr;
> +
> +out:
> if (!before(tcp_sk(ssk)->copied_seq, TCP_SKB_CB(skb)->end_seq))
> sk_eat_skb(ssk, skb);
> if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len)
> --
next prev parent reply other threads:[~2024-07-26 0:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-25 15:53 [PATCH mptcp-net 1/2] mptcp: fix bad RCVPRUNED mib accounting Paolo Abeni
2024-07-25 15:53 ` [PATCH mptcp-net 2/2] mptcp: fix duplicate data handling Paolo Abeni
2024-07-26 0:42 ` Mat Martineau [this message]
2024-07-26 10:33 ` Matthieu Baerts
2024-07-26 9:23 ` MPTCP CI
2024-07-26 0:39 ` [PATCH mptcp-net 1/2] mptcp: fix bad RCVPRUNED mib accounting Mat Martineau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=415224da-e982-2d69-d1de-f234abdc09fb@kernel.org \
--to=martineau@kernel.org \
--cc=mptcp@lists.linux.dev \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.