* [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes
@ 2025-11-11 7:24 Paolo Abeni
2025-11-11 7:24 ` [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present Paolo Abeni
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Paolo Abeni @ 2025-11-11 7:24 UTC (permalink / raw)
To: mptcp
The first patch addresses a recently filed issue, 2nd one is due to
code inspection while investigating the mentioned issue.
v1 -> v2:
- fix pktdrill failures due to missing rcv_wnd_sent initialization
Paolo Abeni (2):
mptcp: do not fallback when OoO is present
mptcp: do not drop partial packets.
net/mptcp/protocol.c | 30 ++++++++++++++++++++++--------
net/mptcp/subflow.c | 3 ++-
2 files changed, 24 insertions(+), 9 deletions(-)
--
2.51.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-11 7:24 [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes Paolo Abeni
@ 2025-11-11 7:24 ` Paolo Abeni
2025-11-11 17:50 ` Matthieu Baerts
2025-11-11 7:24 ` [PATCH v2 mptcp-net 2/2] mptcp: do not drop partial packets Paolo Abeni
2025-11-11 9:09 ` [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes MPTCP CI
2 siblings, 1 reply; 9+ messages in thread
From: Paolo Abeni @ 2025-11-11 7:24 UTC (permalink / raw)
To: mptcp
In case of DSS corruption, the MPTCP protocol tries to avoid the
subflow reset if fallback is possible. Such corruptions happen in
the receive path; to ensure fallback is possible the stack additionally
need to check for OoO data, otherwise the fallback will break the data
stream.
Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
Note: this does not avoid the WARN(), but fixes the inconsistend
read() behavior; the ingress data is OoO, we should not ack it
---
net/mptcp/protocol.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index d6b08e1de358..7b966f105f89 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
{
- if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
+ if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
+ !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONRESET);
mptcp_subflow_reset(ssk);
}
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 mptcp-net 2/2] mptcp: do not drop partial packets.
2025-11-11 7:24 [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes Paolo Abeni
2025-11-11 7:24 ` [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present Paolo Abeni
@ 2025-11-11 7:24 ` Paolo Abeni
2025-11-11 9:09 ` [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes MPTCP CI
2 siblings, 0 replies; 9+ messages in thread
From: Paolo Abeni @ 2025-11-11 7:24 UTC (permalink / raw)
To: mptcp
Currently MPTCP drops partial packets for no good reason at all.
Instead we should just skip the already acked bytes.
Also add a missing check for zero window, which in turn requires
properly initializing the rcv_wnd_sent at connection creation time.
Fixes: ab174ad8ef76 ("mptcp: move ooo skbs into msk out of order queue.")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
Notes:
- We should also add a MIB for zerowin drop, but that should be a follow-up
patch, I think.
- based on top of 'mptcp: autotune related improvement', but targeting net,
will have a conflict in __mptcp_move_skb().
---
net/mptcp/protocol.c | 27 ++++++++++++++++++++-------
net/mptcp/subflow.c | 3 ++-
2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 7b966f105f89..e3330141a6da 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -378,6 +378,10 @@ static bool __mptcp_move_skb(struct sock *sk, struct sk_buff *skb)
mptcp_borrow_fwdmem(sk, skb);
+ /* Check for zero window.*/
+ if (atomic64_read(&msk->rcv_wnd_sent) == msk->ack_seq)
+ goto drop;
+
if (MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq) {
/* in sequence */
msk->bytes_received += copy_len;
@@ -386,18 +390,27 @@ static bool __mptcp_move_skb(struct sock *sk, struct sk_buff *skb)
if (tail && mptcp_try_coalesce(sk, tail, skb))
return true;
- skb_set_owner_r(skb, sk);
- __skb_queue_tail(&sk->sk_receive_queue, skb);
- return true;
+ goto enqueue;
} else if (after64(MPTCP_SKB_CB(skb)->map_seq, msk->ack_seq)) {
mptcp_data_queue_ofo(msk, skb);
return false;
}
- /* old data, keep it simple and drop the whole pkt, sender
- * will retransmit as needed, if needed.
- */
- MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA);
+ /* Check for old data. */
+ if (!after64(MPTCP_SKB_CB(skb)->end_seq, msk->ack_seq)) {
+ MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_DUPDATA);
+ goto drop;
+ }
+
+ /* Partial packet, seq < rcv_next < end_seq. */
+ MPTCP_SKB_CB(skb)->offset += msk->ack_seq - MPTCP_SKB_CB(skb)->map_seq;
+
+enqueue:
+ skb_set_owner_r(skb, sk);
+ __skb_queue_tail(&sk->sk_receive_queue, skb);
+ return true;
+
+drop:
mptcp_drop(sk, skb);
return false;
}
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 39bf69e73975..0db832b5ddca 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -496,7 +496,8 @@ static void subflow_set_remote_key(struct mptcp_sock *msk,
WRITE_ONCE(msk->remote_key, subflow->remote_key);
WRITE_ONCE(msk->ack_seq, subflow->iasn);
WRITE_ONCE(msk->can_ack, true);
- atomic64_set(&msk->rcv_wnd_sent, subflow->iasn);
+ atomic64_set(&msk->rcv_wnd_sent, subflow->iasn +
+ tcp_receive_window(tcp_sk(subflow->tcp_sock)));
}
static void mptcp_propagate_state(struct sock *sk, struct sock *ssk,
--
2.51.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes
2025-11-11 7:24 [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes Paolo Abeni
2025-11-11 7:24 ` [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present Paolo Abeni
2025-11-11 7:24 ` [PATCH v2 mptcp-net 2/2] mptcp: do not drop partial packets Paolo Abeni
@ 2025-11-11 9:09 ` MPTCP CI
2 siblings, 0 replies; 9+ messages in thread
From: MPTCP CI @ 2025-11-11 9:09 UTC (permalink / raw)
To: Paolo Abeni; +Cc: mptcp
Hi Paolo,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal (except selftest_mptcp_join): Success! ✅
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Unstable: 2 failed test(s): selftest_mptcp_connect selftest_mptcp_connect_checksum 🔴
- KVM Validation: debug (only selftest_mptcp_join): Unstable: 1 failed test(s): selftest_mptcp_join 🔴
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Unstable: 2 failed test(s): bpftest_test_progs-cpuv4_mptcp bpftest_test_progs-no_alu32_mptcp 🔴
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/19258711974
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/fbba16487ba0
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1021913
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-normal
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-11 7:24 ` [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present Paolo Abeni
@ 2025-11-11 17:50 ` Matthieu Baerts
2025-11-13 0:02 ` Paolo Abeni
0 siblings, 1 reply; 9+ messages in thread
From: Matthieu Baerts @ 2025-11-11 17:50 UTC (permalink / raw)
To: Paolo Abeni, mptcp
Hi Paolo,
On 11/11/2025 08:24, Paolo Abeni wrote:
> In case of DSS corruption, the MPTCP protocol tries to avoid the
> subflow reset if fallback is possible. Such corruptions happen in
> the receive path; to ensure fallback is possible the stack additionally
> need to check for OoO data, otherwise the fallback will break the data
> stream.
Thank you for the fix!
> Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> Note: this does not avoid the WARN(), but fixes the inconsistend
> read() behavior; the ingress data is OoO, we should not ack it
> ---
> net/mptcp/protocol.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index d6b08e1de358..7b966f105f89 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
>
> static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
> {
> - if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
> + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
> + !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
Does it mean we should check the OoO queue each time mptcp_try_fallback
is called?
Should we not eventually set msk->allow_infinite_fallback to false in
mptcp_data_queue_ofo()?
> MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DSSCORRUPTIONRESET);
> mptcp_subflow_reset(ssk);
> }
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-11 17:50 ` Matthieu Baerts
@ 2025-11-13 0:02 ` Paolo Abeni
2025-11-13 9:08 ` Matthieu Baerts
0 siblings, 1 reply; 9+ messages in thread
From: Paolo Abeni @ 2025-11-13 0:02 UTC (permalink / raw)
To: Matthieu Baerts, mptcp
On 11/11/25 6:50 PM, Matthieu Baerts wrote:
> On 11/11/2025 08:24, Paolo Abeni wrote:
>> In case of DSS corruption, the MPTCP protocol tries to avoid the
>> subflow reset if fallback is possible. Such corruptions happen in
>> the receive path; to ensure fallback is possible the stack additionally
>> need to check for OoO data, otherwise the fallback will break the data
>> stream.
>
> Thank you for the fix!
>> Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
>> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
>> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
>> ---
>> Note: this does not avoid the WARN(), but fixes the inconsistend
>> read() behavior; the ingress data is OoO, we should not ack it
>> ---
>> net/mptcp/protocol.c | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
>> index d6b08e1de358..7b966f105f89 100644
>> --- a/net/mptcp/protocol.c
>> +++ b/net/mptcp/protocol.c
>> @@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
>>
>> static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
>> {
>> - if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>> + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
>> + !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>
> Does it mean we should check the OoO queue each time mptcp_try_fallback
> is called?
>
> Should we not eventually set msk->allow_infinite_fallback to false in
> mptcp_data_queue_ofo()?
Good question. According to the RFC here we should unconditionally reset
the subflow. "historically" we try hard to fallback - even because in
early releases fallback was a bit to easy to obtain.
Setting msk->allow_infinite_fallback = false in mptcp_data_queue_ofo()
could possibly hit performances. queue_ofo is basically fastpath with
multiple streams and we will likely need to acquire the fallback lock to
to the thing race free.
I'm tempted to just do a plain reset here. WDYT?
Thanks,
Paolo
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-13 0:02 ` Paolo Abeni
@ 2025-11-13 9:08 ` Matthieu Baerts
2025-11-13 17:32 ` Paolo Abeni
0 siblings, 1 reply; 9+ messages in thread
From: Matthieu Baerts @ 2025-11-13 9:08 UTC (permalink / raw)
To: Paolo Abeni, mptcp
Hi Paolo,
On 13/11/2025 01:02, Paolo Abeni wrote:
> On 11/11/25 6:50 PM, Matthieu Baerts wrote:
>> On 11/11/2025 08:24, Paolo Abeni wrote:
>>> In case of DSS corruption, the MPTCP protocol tries to avoid the
>>> subflow reset if fallback is possible. Such corruptions happen in
>>> the receive path; to ensure fallback is possible the stack additionally
>>> need to check for OoO data, otherwise the fallback will break the data
>>> stream.
>>
>> Thank you for the fix!
>>> Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
>>> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
>>> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
>>> ---
>>> Note: this does not avoid the WARN(), but fixes the inconsistend
>>> read() behavior; the ingress data is OoO, we should not ack it
>>> ---
>>> net/mptcp/protocol.c | 3 ++-
>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
>>> index d6b08e1de358..7b966f105f89 100644
>>> --- a/net/mptcp/protocol.c
>>> +++ b/net/mptcp/protocol.c
>>> @@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
>>>
>>> static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
>>> {
>>> - if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>> + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
>>> + !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>
>> Does it mean we should check the OoO queue each time mptcp_try_fallback
>> is called?
>>
>> Should we not eventually set msk->allow_infinite_fallback to false in
>> mptcp_data_queue_ofo()?
>
> Good question. According to the RFC here we should unconditionally reset
> the subflow. "historically" we try hard to fallback - even because in
> early releases fallback was a bit to easy to obtain.
>
> Setting msk->allow_infinite_fallback = false in mptcp_data_queue_ofo()
> could possibly hit performances. queue_ofo is basically fastpath with
> multiple streams and we will likely need to acquire the fallback lock to
> to the thing race free.
>
> I'm tempted to just do a plain reset here. WDYT?
Can mptcp_dss_corruption() not be called before being in fully
established mode? In this case, should we not fallback instead? e.g. if
a middlebox start to alter MPTCP options after the 3WHS?
Or maybe moving this RB_EMPTY_ROOT(&msk->out_of_order_queue) check to
mptcp_try_fallback()? (mmh, we don't have the msk)
Or maybe just a plain reset is OK here?
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-13 9:08 ` Matthieu Baerts
@ 2025-11-13 17:32 ` Paolo Abeni
2025-11-13 17:44 ` Matthieu Baerts
0 siblings, 1 reply; 9+ messages in thread
From: Paolo Abeni @ 2025-11-13 17:32 UTC (permalink / raw)
To: Matthieu Baerts, mptcp
On 11/13/25 10:08 AM, Matthieu Baerts wrote:
> On 13/11/2025 01:02, Paolo Abeni wrote:
>> On 11/11/25 6:50 PM, Matthieu Baerts wrote:
>>> On 11/11/2025 08:24, Paolo Abeni wrote:
>>>> In case of DSS corruption, the MPTCP protocol tries to avoid the
>>>> subflow reset if fallback is possible. Such corruptions happen in
>>>> the receive path; to ensure fallback is possible the stack additionally
>>>> need to check for OoO data, otherwise the fallback will break the data
>>>> stream.
>>>
>>> Thank you for the fix!
>>>> Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
>>>> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
>>>> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
>>>> ---
>>>> Note: this does not avoid the WARN(), but fixes the inconsistend
>>>> read() behavior; the ingress data is OoO, we should not ack it
>>>> ---
>>>> net/mptcp/protocol.c | 3 ++-
>>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
>>>> index d6b08e1de358..7b966f105f89 100644
>>>> --- a/net/mptcp/protocol.c
>>>> +++ b/net/mptcp/protocol.c
>>>> @@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
>>>>
>>>> static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
>>>> {
>>>> - if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>>> + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
>>>> + !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>>
>>> Does it mean we should check the OoO queue each time mptcp_try_fallback
>>> is called?
>>>
>>> Should we not eventually set msk->allow_infinite_fallback to false in
>>> mptcp_data_queue_ofo()?
>>
>> Good question. According to the RFC here we should unconditionally reset
>> the subflow. "historically" we try hard to fallback - even because in
>> early releases fallback was a bit to easy to obtain.
>>
>> Setting msk->allow_infinite_fallback = false in mptcp_data_queue_ofo()
>> could possibly hit performances. queue_ofo is basically fastpath with
>> multiple streams and we will likely need to acquire the fallback lock to
>> to the thing race free.
>>
>> I'm tempted to just do a plain reset here. WDYT?
>
> Can mptcp_dss_corruption() not be called before being in fully
> established mode? In this case, should we not fallback instead? e.g. if
> a middlebox start to alter MPTCP options after the 3WHS?
Even if we would be before reaching fully established status, the DSS
corruption caused by the pktdrill test causes MPTCP-level OoO with data
already acked at the TCP level. We can't drop it nor we can safely
fallback, we have do reset (if ofo queue) is not empty.
> Or maybe moving this RB_EMPTY_ROOT(&msk->out_of_order_queue) check to
> mptcp_try_fallback()? (mmh, we don't have the msk)
>
> Or maybe just a plain reset is OK here?
I think the main question is if constraining such resets to OoO cases
(in the attempt to do fallback in other scenarios) or always reset here.
I propose to keep it simple, minimize the difference from current status
and always check OoO.
/P
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present
2025-11-13 17:32 ` Paolo Abeni
@ 2025-11-13 17:44 ` Matthieu Baerts
0 siblings, 0 replies; 9+ messages in thread
From: Matthieu Baerts @ 2025-11-13 17:44 UTC (permalink / raw)
To: Paolo Abeni, mptcp
On 13/11/2025 18:32, Paolo Abeni wrote:
> On 11/13/25 10:08 AM, Matthieu Baerts wrote:
>> On 13/11/2025 01:02, Paolo Abeni wrote:
>>> On 11/11/25 6:50 PM, Matthieu Baerts wrote:
>>>> On 11/11/2025 08:24, Paolo Abeni wrote:
>>>>> In case of DSS corruption, the MPTCP protocol tries to avoid the
>>>>> subflow reset if fallback is possible. Such corruptions happen in
>>>>> the receive path; to ensure fallback is possible the stack additionally
>>>>> need to check for OoO data, otherwise the fallback will break the data
>>>>> stream.
>>>>
>>>> Thank you for the fix!
>>>>> Fixes: e32d262c89e2 ("mptcp: handle consistently DSS corruption")
>>>>> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/598
>>>>> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
>>>>> ---
>>>>> Note: this does not avoid the WARN(), but fixes the inconsistend
>>>>> read() behavior; the ingress data is OoO, we should not ack it
>>>>> ---
>>>>> net/mptcp/protocol.c | 3 ++-
>>>>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
>>>>> index d6b08e1de358..7b966f105f89 100644
>>>>> --- a/net/mptcp/protocol.c
>>>>> +++ b/net/mptcp/protocol.c
>>>>> @@ -646,7 +646,8 @@ static void mptcp_check_data_fin(struct sock *sk)
>>>>>
>>>>> static void mptcp_dss_corruption(struct mptcp_sock *msk, struct sock *ssk)
>>>>> {
>>>>> - if (!mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>>>> + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue) ||
>>>>> + !mptcp_try_fallback(ssk, MPTCP_MIB_DSSCORRUPTIONFALLBACK)) {
>>>>
>>>> Does it mean we should check the OoO queue each time mptcp_try_fallback
>>>> is called?
>>>>
>>>> Should we not eventually set msk->allow_infinite_fallback to false in
>>>> mptcp_data_queue_ofo()?
>>>
>>> Good question. According to the RFC here we should unconditionally reset
>>> the subflow. "historically" we try hard to fallback - even because in
>>> early releases fallback was a bit to easy to obtain.
>>>
>>> Setting msk->allow_infinite_fallback = false in mptcp_data_queue_ofo()
>>> could possibly hit performances. queue_ofo is basically fastpath with
>>> multiple streams and we will likely need to acquire the fallback lock to
>>> to the thing race free.
>>>
>>> I'm tempted to just do a plain reset here. WDYT?
>>
>> Can mptcp_dss_corruption() not be called before being in fully
>> established mode? In this case, should we not fallback instead? e.g. if
>> a middlebox start to alter MPTCP options after the 3WHS?
>
> Even if we would be before reaching fully established status, the DSS
> corruption caused by the pktdrill test causes MPTCP-level OoO with data
> already acked at the TCP level. We can't drop it nor we can safely
> fallback, we have do reset (if ofo queue) is not empty.
Yes, OK to reset in this case.
>> Or maybe moving this RB_EMPTY_ROOT(&msk->out_of_order_queue) check to
>> mptcp_try_fallback()? (mmh, we don't have the msk)
>>
>> Or maybe just a plain reset is OK here?
>
> I think the main question is if constraining such resets to OoO cases
> (in the attempt to do fallback in other scenarios) or always reset here.
>
> I propose to keep it simple, minimize the difference from current status
> and always check OoO.
Just to be sure I understand this correctly: your prefer keeping the
patch as it is, and there is no need to move the OoO check to the
__mptcp_try_fallback() help to check it in other cases?
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-11-13 17:44 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-11 7:24 [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes Paolo Abeni
2025-11-11 7:24 ` [PATCH v2 mptcp-net 1/2] mptcp: do not fallback when OoO is present Paolo Abeni
2025-11-11 17:50 ` Matthieu Baerts
2025-11-13 0:02 ` Paolo Abeni
2025-11-13 9:08 ` Matthieu Baerts
2025-11-13 17:32 ` Paolo Abeni
2025-11-13 17:44 ` Matthieu Baerts
2025-11-11 7:24 ` [PATCH v2 mptcp-net 2/2] mptcp: do not drop partial packets Paolo Abeni
2025-11-11 9:09 ` [PATCH v2 mptcp-net 0/2] mptcp: a couple of fixes MPTCP CI
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.