All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ
@ 2025-02-18 11:24 Matthieu Baerts (NGI0)
  2025-02-18 11:24 ` [PATCH mptcp-net v2 1/2] mptcp: reset when MPTCP opts are dropped after join Matthieu Baerts (NGI0)
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Matthieu Baerts (NGI0) @ 2025-02-18 11:24 UTC (permalink / raw)
  To: mptcp; +Cc: Paolo Abeni, Matthieu Baerts (NGI0), Chester A. Unal

- Patch 1: fix issue #544 where a middlebox drops MPTCP options after a
  3WHS on the additional subflow.

- Patch 2: a safety check is added when asking to do a fallback to do so
  only when allowed. If not, a new warning will be emitted.

Note that two new packetdrill tests have been added in a PR to cover
this case:

  https://github.com/multipath-tcp/packetdrill/pull/160

Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
Changes in v2:
- Squashed previous patches 1 and 2 (Paolo).
- Patch 1: no more special cases for csum (handled before) and inf map
  (Paolo).
- Link to v1: https://lore.kernel.org/r/20250217-mptcp-dss-drop-mpj-v1-0-d671d6b9a153@kernel.org

---
Matthieu Baerts (NGI0) (2):
      mptcp: reset when MPTCP opts are dropped after join
      mptcp: safety check before fallback

 net/mptcp/protocol.h |  2 ++
 net/mptcp/subflow.c  | 15 +--------------
 2 files changed, 3 insertions(+), 14 deletions(-)
---
base-commit: 3a7786db65e8f361a8fc8abcd3cfbe17411b8b7f
change-id: 20250205-mptcp-dss-drop-mpj-ec227f4ed942

Best regards,
-- 
Matthieu Baerts (NGI0) <matttbe@kernel.org>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH mptcp-net v2 1/2] mptcp: reset when MPTCP opts are dropped after join
  2025-02-18 11:24 [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ Matthieu Baerts (NGI0)
@ 2025-02-18 11:24 ` Matthieu Baerts (NGI0)
  2025-02-18 11:24 ` [PATCH mptcp-net v2 2/2] mptcp: safety check before fallback Matthieu Baerts (NGI0)
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Matthieu Baerts (NGI0) @ 2025-02-18 11:24 UTC (permalink / raw)
  To: mptcp; +Cc: Paolo Abeni, Matthieu Baerts (NGI0), Chester A. Unal

Before this patch, if the checksum was not used, the subflow was only
reset if map_data_len was != 0. If there were no MPTCP options or an
invalid mapping, map_data_len was not set to the data len, and then the
subflow was not reset as it should have been, leaving the MPTCP
connection in a wrong fallback mode.

This map_data_len condition has been introduced to handle the reception
of the infinite mapping. Instead, a new dedicated mapping error could
have been returned and treated as a special case. However, the commit
31bf11de146c ("mptcp: introduce MAPPING_BAD_CSUM") has been introduced
by Paolo Abeni soon after, and backported later on to stable. It better
handle the csum case, and it means the exception for valid_csum_seen in
subflow_can_fallback(), plus this one for the infinite mapping in
subflow_check_data_avail(), are no longer needed.

In other words, the code can be simplified there: a fallback should only
be done if msk->allow_infinite_fallback is set. This boolean is set to
false once MPTCP-specific operations acting on the whole MPTCP
connection vs the initial path have been done, e.g. a second path has
been created, or an MPTCP re-injection -- yes, possible even with a
single subflow. The subflow_can_fallback() helper can then be dropped,
and replaced by this single condition.

This also makes the code clearer: a fallback should only be done if it
is possible to do so.

While at it, no need to set map_data_len to 0 in get_mapping_status()
for the infinite mapping case: it will be set to skb->len just after, at
the end of subflow_check_data_avail(), and not read in between.

Fixes: f8d4bcacff3b ("mptcp: infinite mapping receiving")
Reported-by: Chester A. Unal <chester.a.unal@xpedite-tech.com>
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/544
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
Notes:
 - v2:
   - Squash previous patches 1 and 2, and drop csum case from
     subflow_can_fallback (Paolo).
   - v2 is quite different, Chester's Tested-by tag has not been added.
---
 net/mptcp/subflow.c | 15 +--------------
 1 file changed, 1 insertion(+), 14 deletions(-)

diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index d2caffa56bdd98f5fd9ef07fdcb3610ea186b848..5255e0cc409437ab1abb66fc8557d18aa4244af7 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1139,7 +1139,6 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
 	if (data_len == 0) {
 		pr_debug("infinite mapping received\n");
 		MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_INFINITEMAPRX);
-		subflow->map_data_len = 0;
 		return MAPPING_INVALID;
 	}
 
@@ -1298,18 +1297,6 @@ static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ss
 		mptcp_schedule_work(sk);
 }
 
-static bool subflow_can_fallback(struct mptcp_subflow_context *subflow)
-{
-	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
-
-	if (subflow->mp_join)
-		return false;
-	else if (READ_ONCE(msk->csum_enabled))
-		return !subflow->valid_csum_seen;
-	else
-		return READ_ONCE(msk->allow_infinite_fallback);
-}
-
 static void mptcp_subflow_fail(struct mptcp_sock *msk, struct sock *ssk)
 {
 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
@@ -1405,7 +1392,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
 			return true;
 		}
 
-		if (!subflow_can_fallback(subflow) && subflow->map_data_len) {
+		if (!READ_ONCE(msk->allow_infinite_fallback)) {
 			/* fatal protocol error, close the socket.
 			 * subflow_error_report() will introduce the appropriate barriers
 			 */

-- 
2.47.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH mptcp-net v2 2/2] mptcp: safety check before fallback
  2025-02-18 11:24 [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ Matthieu Baerts (NGI0)
  2025-02-18 11:24 ` [PATCH mptcp-net v2 1/2] mptcp: reset when MPTCP opts are dropped after join Matthieu Baerts (NGI0)
@ 2025-02-18 11:24 ` Matthieu Baerts (NGI0)
  2025-02-18 12:32 ` [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ MPTCP CI
  2025-02-18 16:24 ` Paolo Abeni
  3 siblings, 0 replies; 6+ messages in thread
From: Matthieu Baerts (NGI0) @ 2025-02-18 11:24 UTC (permalink / raw)
  To: mptcp; +Cc: Paolo Abeni, Matthieu Baerts (NGI0)

Recently, some fallback have been initiated, while the connection was
not supposed to fallback.

Add a safety check with a warning to detect when an wrong attempt to
fallback is being done. This should help detecting any future issues
quicker.

Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
Notes:
 - I guess this patch could be sent to -net as well.
 - We could also squash this in one of the previous commit, but because
   the two are needed to avoid the warning, maybe better with a
   dedicated commit?
---
 net/mptcp/protocol.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index bac5c925a72f6637e33ada9869984c5902bd6a43..3d72ca1553227cb41ba8c205f42d1f01cc264a7e 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1198,6 +1198,8 @@ static inline void __mptcp_do_fallback(struct mptcp_sock *msk)
 		pr_debug("TCP fallback already done (msk=%p)\n", msk);
 		return;
 	}
+	if (WARN_ON_ONCE(!READ_ONCE(msk->allow_infinite_fallback)))
+		return;
 	set_bit(MPTCP_FALLBACK_DONE, &msk->flags);
 }
 

-- 
2.47.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ
  2025-02-18 11:24 [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ Matthieu Baerts (NGI0)
  2025-02-18 11:24 ` [PATCH mptcp-net v2 1/2] mptcp: reset when MPTCP opts are dropped after join Matthieu Baerts (NGI0)
  2025-02-18 11:24 ` [PATCH mptcp-net v2 2/2] mptcp: safety check before fallback Matthieu Baerts (NGI0)
@ 2025-02-18 12:32 ` MPTCP CI
  2025-02-18 16:24 ` Paolo Abeni
  3 siblings, 0 replies; 6+ messages in thread
From: MPTCP CI @ 2025-02-18 12:32 UTC (permalink / raw)
  To: Matthieu Baerts; +Cc: mptcp

Hi Matthieu,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/13389741751

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/031a27795787
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=935069


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] 6+ messages in thread

* Re: [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ
  2025-02-18 11:24 [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ Matthieu Baerts (NGI0)
                   ` (2 preceding siblings ...)
  2025-02-18 12:32 ` [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ MPTCP CI
@ 2025-02-18 16:24 ` Paolo Abeni
  2025-02-19 18:42   ` Matthieu Baerts
  3 siblings, 1 reply; 6+ messages in thread
From: Paolo Abeni @ 2025-02-18 16:24 UTC (permalink / raw)
  To: Matthieu Baerts (NGI0), mptcp; +Cc: Chester A. Unal

On 2/18/25 12:24 PM, Matthieu Baerts (NGI0) wrote:
> - Patch 1: fix issue #544 where a middlebox drops MPTCP options after a
>   3WHS on the additional subflow.
> 
> - Patch 2: a safety check is added when asking to do a fallback to do so
>   only when allowed. If not, a new warning will be emitted.
> 
> Note that two new packetdrill tests have been added in a PR to cover
> this case:
> 
>   https://github.com/multipath-tcp/packetdrill/pull/160
> 
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>

Acked-by: Paolo Abeni <pabeni@redhat.com>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ
  2025-02-18 16:24 ` Paolo Abeni
@ 2025-02-19 18:42   ` Matthieu Baerts
  0 siblings, 0 replies; 6+ messages in thread
From: Matthieu Baerts @ 2025-02-19 18:42 UTC (permalink / raw)
  To: Paolo Abeni, mptcp; +Cc: Chester A. Unal

Hi Paolo,

On 18/02/2025 17:24, Paolo Abeni wrote:
> On 2/18/25 12:24 PM, Matthieu Baerts (NGI0) wrote:
>> - Patch 1: fix issue #544 where a middlebox drops MPTCP options after a
>>   3WHS on the additional subflow.
>>
>> - Patch 2: a safety check is added when asking to do a fallback to do so
>>   only when allowed. If not, a new warning will be emitted.
>>
>> Note that two new packetdrill tests have been added in a PR to cover
>> this case:
>>
>>   https://github.com/multipath-tcp/packetdrill/pull/160
>>
>> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> 
> Acked-by: Paolo Abeni <pabeni@redhat.com>

Thank you for this review!

Now in our tree (fixes for -net):

New patches for t/upstream-net and t/upstream:
- 1babdda71364: mptcp: reset when MPTCP opts are dropped after join
- 1e4711c4b02c: mptcp: safety check before fallback
- Results: 54ac5bb2f077..aba580cd4fc8 (export-net)
- Results: 4ba9db964049..3ee8e45b1642 (export)

Tests are now in progress:

- export-net:
https://github.com/multipath-tcp/mptcp_net-next/commit/2ea4756918f65f22b82d3134485d4c2842e3400f/checks
- export:
https://github.com/multipath-tcp/mptcp_net-next/commit/4f345f49f9f36636d9f8408b4a30b70f602b50ae/checks

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-02-19 18:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-18 11:24 [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ Matthieu Baerts (NGI0)
2025-02-18 11:24 ` [PATCH mptcp-net v2 1/2] mptcp: reset when MPTCP opts are dropped after join Matthieu Baerts (NGI0)
2025-02-18 11:24 ` [PATCH mptcp-net v2 2/2] mptcp: safety check before fallback Matthieu Baerts (NGI0)
2025-02-18 12:32 ` [PATCH mptcp-net v2 0/2] mptcp: reset when MPTCP opts are dropped after MPJ MPTCP CI
2025-02-18 16:24 ` Paolo Abeni
2025-02-19 18:42   ` Matthieu Baerts

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.