* [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp
@ 2026-10-23 11:03 Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 1/2] mptcp: pm: in-kernel: fullmesh: skip closed subflows Abdul Wasey
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Abdul Wasey @ 2026-10-23 11:03 UTC (permalink / raw)
To: mptcp
Cc: Matthieu Baerts, Mat Martineau, Geliang Tang, Paolo Abeni, stable,
Abdul Wasey
With fullmesh endpoints, removing and re-adding the endpoint used by the
initial subflow never creates a new subflow from it: the closed initial
subflow stays in the conn_list, and makes the PM think the remote ID 0
is already used, or picks its reset remote address. If the initial
subflow was the only one, no address is left for the remote ID 0 at all.
Patch 1 fixes that, patch 2 adds tests for it.
Found with a router flapping one of its links: the link carrying the
initial subflow never rejoined the existing connections. Tested on top
of export-net: the new tests fail without patch 1, except the one adding
another endpoint, which already worked and guards against breaking it.
The whole mptcp_join.sh passes with patch 1.
Patch 2 uses iptables like the other tests in export-net. On net-next,
mptcp_join.sh now uses nftables (be3b69f3cedf), and ${iptables} is
empty there: this is why the CI failed on v6, it applies the series on
top of net-next. When merging with net-next, the "after reset" test
needs the same conversion as the others. Tested on top of export, with
the endpoint tests passing:
init_nftables
if ip netns exec "${ns1}" nft add rule ip filter INPUT \
ip saddr "10.0.1.2" meta l4proto tcp \
tcp option mptcp exists reject with tcp reset; then
wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
ip netns exec "${ns1}" nft flush chain ip filter INPUT
Changes in v7, after the review of v6 by Sashiko on netdev:
- Patch 2: in the two tests with the initial subflow alone, wait until
the PM worker has accounted the initial subflow endpoint before
removing it: a join on a third endpoint is created in the same worker
run, then that endpoint is removed. v6 only detected the race.
- Patch 2: wait a bit before counting the subflows after the removal,
as the other tests do: the closed subflow can still be listed.
- v6: https://lore.kernel.org/mptcp/20261022085041.211318-1-w453y.me@gmail.com/
Changes in v6, after the review of v5 by Sashiko on netdev:
- Patch 1: in the commit message, the closed initial subflow keeps its
remote address: only the destination port is zeroed, not the address.
- Patch 2: skip the "after reset" test if the iptables rule cannot be
added, instead of passing, and check that the reset closed the
subflow.
- Patch 2: in the two tests with the initial subflow alone, check it is
gone after the removal of its endpoint: the ESTABLISHED event comes
before the PM worker accounts that endpoint, so a removal right after
it can miss the subflow.
- v5: https://lore.kernel.org/mptcp/20261021070324.50533-1-w453y.me@gmail.com/
Changes in v5:
- Patch 1: when no subflow is left to take the remote ID 0 address from,
use the remote address of the MPTCP socket, as fill_remote_addr()
does. Without it, v4 also broke adding another endpoint after the
removal of the initial one, when it was the only subflow (Sashiko on
netdev).
- Patch 2: add two tests for the initial subflow alone: re-adding its
endpoint, and adding another endpoint.
- v4: https://lore.kernel.org/mptcp/20261019190558.465270-1-w453y.me@gmail.com/
Changes in v4:
- Patch 2: only check the joins when the iptables rule has been added
(Sashiko).
- v3: https://lore.kernel.org/mptcp/20261019185512.458313-1-w453y.me@gmail.com/
Changes in v3:
- Patch 2: use iptables instead of init_nftables(), which is only in
net-next (Sashiko).
- v2: https://lore.kernel.org/mptcp/20261019180306.382039-1-w453y.me@gmail.com/
Changes in v2:
- Patch 1: also skip the subflows in TCP_CLOSE: the initial subflow can
be disconnected and its context reset, clearing the 'closing' flag and
zeroing its remote address (Sashiko).
- Patch 2: validate this case too, by resetting the initial subflow
before removing its endpoint.
- v1: https://lore.kernel.org/mptcp/20261019170751.200446-1-w453y.me@gmail.com/
Abdul Wasey (2):
mptcp: pm: in-kernel: fullmesh: skip closed subflows
selftests: mptcp: join: re-add the initial subflow endp with fullmesh
net/mptcp/pm_kernel.c | 33 ++++-
.../testing/selftests/net/mptcp/mptcp_join.sh | 129 ++++++++++++++++++
2 files changed, 161 insertions(+), 1 deletion(-)
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH mptcp-net v7 1/2] mptcp: pm: in-kernel: fullmesh: skip closed subflows
2026-10-23 11:03 [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp Abdul Wasey
@ 2026-10-23 11:03 ` Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh Abdul Wasey
2026-10-23 12:34 ` [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp MPTCP CI
2 siblings, 0 replies; 6+ messages in thread
From: Abdul Wasey @ 2026-10-23 11:03 UTC (permalink / raw)
To: mptcp
Cc: Matthieu Baerts, Mat Martineau, Geliang Tang, Paolo Abeni, stable,
Abdul Wasey
With fullmesh endpoints, if the endpoint used by the initial subflow is
removed and then added back, no new subflow is created from it: the
connection never uses this local address again.
The initial subflow is kept in the conn_list once closed. If it was
still established when closed, it keeps the local ID 0, which is also
the ID used by the re-added endpoint, and
fill_remote_addresses_fullmesh() then marks its remote ID as
unavailable. If it was already in TCP_CLOSE, e.g. after a reset, it is
disconnected and its context is reset: the 'closing' flag and the remote
ID are cleared, and its destination port is zeroed. It is then picked as
a remote address, with the port 0 and the ID 0, which also marks the
remote ID 0 as unavailable. In both cases, when the peer has a single
address, all subflows use the remote ID 0, and no valid remote address
is left.
Skip the subflows being closed or in TCP_CLOSE state, both when looking
for the remote IDs already in use and when picking the remote addresses.
__mptcp_subflow_active() cannot be used here: subflows still being
established have to keep their remote ID marked as in use, to avoid
creating duplicated subflows.
When no subflow is left to take the remote ID 0 address from, e.g. when
the initial subflow was the only one, use the remote address of the MPTCP
socket, as fill_remote_addr() does for non-fullmesh endpoints. Before,
re-adding the initial endpoint created no subflow in this case either,
and another endpoint only worked by picking the closed initial subflow.
Without the fullmesh flag, the remote address is taken from the MPTCP
socket, so this issue is specific to fullmesh endpoints.
Fixes: 045e9d812868 ("mptcp: fix duplicate subflow creation")
Cc: stable@vger.kernel.org
Signed-off-by: Abdul Wasey <w453y.me@gmail.com>
---
net/mptcp/pm_kernel.c | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 1a7750813..c240c1056 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -199,6 +199,16 @@ fill_remote_addr(struct mptcp_sock *msk, struct mptcp_addr_info *local,
return 1;
}
+/* Closed subflows can stay in the conn_list, e.g. the initial one: their
+ * addresses and IDs are not reliable, possibly even reset.
+ */
+static bool mptcp_subflow_is_closed(struct mptcp_subflow_context *subflow)
+{
+ struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
+
+ return subflow->closing || inet_sk_state_load(ssk) == TCP_CLOSE;
+}
+
static unsigned int
fill_remote_addresses_fullmesh(struct mptcp_sock *msk,
struct mptcp_addr_info *local,
@@ -216,11 +226,18 @@ fill_remote_addresses_fullmesh(struct mptcp_sock *msk,
* already created by incoming ADD_ADDR
*/
bitmap_zero(unavail_id, MPTCP_PM_MAX_ADDR_ID + 1);
- mptcp_for_each_subflow(msk, subflow)
+ mptcp_for_each_subflow(msk, subflow) {
+ if (mptcp_subflow_is_closed(subflow))
+ continue;
+
if (READ_ONCE(subflow->local_id) == local->id)
__set_bit(subflow->remote_id, unavail_id);
+ }
mptcp_for_each_subflow(msk, subflow) {
+ if (mptcp_subflow_is_closed(subflow))
+ continue;
+
ssk = mptcp_subflow_tcp_sock(subflow);
mptcp_remote_address((struct sock_common *)ssk, &addrs[i]);
addrs[i].id = READ_ONCE(subflow->remote_id);
@@ -243,6 +260,20 @@ fill_remote_addresses_fullmesh(struct mptcp_sock *msk,
break;
}
+ /* The initial subflow can be closed: like fill_remote_addr(), use the
+ * remote address of the MPTCP socket for the remote ID 0.
+ */
+ if (!deny_id0 && !test_bit(0, unavail_id) && i < addrs_size &&
+ msk->pm.extra_subflows < limit_extra_subflows) {
+ struct mptcp_addr_info remote = { 0 };
+
+ mptcp_remote_address((struct sock_common *)sk, &remote);
+ if (mptcp_pm_addr_families_match(sk, local, &remote)) {
+ addrs[i++] = remote;
+ msk->pm.extra_subflows++;
+ }
+ }
+
return i;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh
2026-10-23 11:03 [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 1/2] mptcp: pm: in-kernel: fullmesh: skip closed subflows Abdul Wasey
@ 2026-10-23 11:03 ` Abdul Wasey
2026-10-23 11:14 ` sashiko-bot
2026-10-25 0:01 ` netdev-bot+sashiko
2026-10-23 12:34 ` [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp MPTCP CI
2 siblings, 2 replies; 6+ messages in thread
From: Abdul Wasey @ 2026-10-23 11:03 UTC (permalink / raw)
To: mptcp
Cc: Matthieu Baerts, Mat Martineau, Geliang Tang, Paolo Abeni, stable,
Abdul Wasey
The "delete and re-add" test validates the removal and the re-addition
of the endpoint used by the initial subflow, but without the fullmesh
flag.
Do the same with the fullmesh flag: with a second subflow, after a reset
of the initial subflow, and with the initial subflow only, then re-adding
its endpoint or adding another one. Without the previous patch, no new
subflow is created, except when adding another endpoint.
The 'Fixes' tag here below is the same as the one from the previous
commit: this patch here is not fixing anything wrong in the selftests,
but it validates the previous fix for an issue introduced by this commit
ID.
Fixes: 045e9d812868 ("mptcp: fix duplicate subflow creation")
Cc: stable@vger.kernel.org
Signed-off-by: Abdul Wasey <w453y.me@gmail.com>
---
.../testing/selftests/net/mptcp/mptcp_join.sh | 129 ++++++++++++++++++
1 file changed, 129 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index 18ce7136a..4cb3a546b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -4445,6 +4445,135 @@ endpoint_tests()
chk_rm_nr 4 4
fi
+ # remove and re-add the endpoint of the initial subflow, with fullmesh
+ if reset_with_events "delete and re-add, fullmesh" &&
+ continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
+ pm_nl_set_limits $ns1 0 2
+ pm_nl_set_limits $ns2 0 2
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow,fullmesh
+ { timeout_test=120 test_linkfail=128 speed=5 \
+ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
+ local tests_pid=$!
+
+ wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+ wait_mpj 1
+ chk_subflow_nr "before delete id 0" 2
+
+ pm_nl_del_endpoint $ns2 1 10.0.1.2
+ sleep 0.5
+ chk_subflow_nr "after delete id 0" 1
+
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ wait_mpj 2
+ chk_subflow_nr "after re-add id 0" 2
+
+ mptcp_lib_kill_group_wait $tests_pid
+ kill_events_pids
+
+ chk_join_nr 2 2 2
+ chk_rm_nr 1 1
+ fi
+
+ # same, but the initial subflow is reset before removing its endpoint
+ if reset_with_events "delete and re-add, fullmesh, after reset" &&
+ continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
+ pm_nl_set_limits $ns1 0 2
+ pm_nl_set_limits $ns2 0 2
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow,fullmesh
+ { timeout_test=120 test_linkfail=128 speed=5 \
+ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
+ local tests_pid=$!
+
+ wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+ wait_mpj 1
+ chk_subflow_nr "before reset" 2
+
+ if ip netns exec "${ns1}" ${iptables} -A INPUT -s "10.0.1.2" \
+ -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset; then
+ wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
+ ip netns exec "${ns1}" ${iptables} -F INPUT
+ chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1 error 1
+
+ pm_nl_del_endpoint $ns2 1 10.0.1.2
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ wait_mpj 2
+ chk_mptcp_info subflows 2 subflows 2
+ chk_join_nr 2 2 2
+ else
+ mark_as_skipped "unable to set the filter rules"
+ fi
+
+ mptcp_lib_kill_group_wait $tests_pid
+ kill_events_pids
+ fi
+
+ # only the initial subflow: once its endpoint is removed, no live subflow
+ # is left to take the remote address from
+ if reset_with_events "delete and re-add, fullmesh, single subflow" &&
+ continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
+ pm_nl_set_limits $ns1 0 2
+ pm_nl_set_limits $ns2 0 2
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ { timeout_test=120 test_linkfail=128 speed=5 \
+ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
+ local tests_pid=$!
+
+ wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+ # the PM worker accounts the initial subflow endpoint after the
+ # ESTABLISHED event, in the same run where it creates the subflows:
+ # a join on another endpoint shows it is done, then remove it
+ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 dev ns2eth3 flags subflow
+ wait_mpj 1
+ pm_nl_del_endpoint $ns2 3 10.0.3.2
+ wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
+ pm_nl_del_endpoint $ns2 1 10.0.1.2
+ wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
+ sleep 0.5
+ chk_subflow_nr "after delete" 0
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ wait_mpj 2
+ chk_mptcp_info subflows 1 subflows 1
+
+ mptcp_lib_kill_group_wait $tests_pid
+ kill_events_pids
+
+ chk_join_nr 2 2 2
+ fi
+
+ # same, but another endpoint is added after the removal
+ if reset_with_events "delete and add another, fullmesh, single subflow" &&
+ continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
+ pm_nl_set_limits $ns1 0 2
+ pm_nl_set_limits $ns2 0 2
+ pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
+ { timeout_test=120 test_linkfail=128 speed=5 \
+ run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
+ local tests_pid=$!
+
+ wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+ # the PM worker accounts the initial subflow endpoint after the
+ # ESTABLISHED event, in the same run where it creates the subflows:
+ # a join on another endpoint shows it is done, then remove it
+ pm_nl_add_endpoint $ns2 10.0.3.2 id 3 dev ns2eth3 flags subflow
+ wait_mpj 1
+ pm_nl_del_endpoint $ns2 3 10.0.3.2
+ wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
+ pm_nl_del_endpoint $ns2 1 10.0.1.2
+ wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
+ sleep 0.5
+ chk_subflow_nr "after delete" 0
+ pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow,fullmesh
+ wait_mpj 2
+ chk_mptcp_info subflows 1 subflows 1
+
+ mptcp_lib_kill_group_wait $tests_pid
+ kill_events_pids
+
+ chk_join_nr 2 2 2
+ fi
+
# remove and re-add
if reset_with_events "delete re-add signal" &&
continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh
2026-10-23 11:03 ` [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh Abdul Wasey
@ 2026-10-23 11:14 ` sashiko-bot
2026-10-25 0:01 ` netdev-bot+sashiko
1 sibling, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-10-23 11:14 UTC (permalink / raw)
To: Abdul Wasey, mptcp
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] selftests: mptcp: unset iptables variable in endpoint_tests() breaks test
--
commit 5d801b552c8fda4d06f17bc60e0d917102aa1d3c
Author: Abdul Wasey <w453y.me@gmail.com>
selftests: mptcp: join: re-add the initial subflow endp with fullmesh
This commit adds four subtests to endpoint_tests() in mptcp_join.sh to
validate removing and re-adding the initial subflow endpoint when using the
fullmesh flag.
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> index f4d8afaeda4f3..98dc8de81cf01 100755
> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> @@ -4424,6 +4424,135 @@ endpoint_tests()
[ ... ]
> + # same, but the initial subflow is reset before removing its endpoint
> + if reset_with_events "delete and re-add, fullmesh, after reset" &&
> + continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
> + pm_nl_set_limits $ns1 0 2
> + pm_nl_set_limits $ns2 0 2
> + pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
> + pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow,fullmesh
> + { timeout_test=120 test_linkfail=128 speed=5 \
> + run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
> + local tests_pid=$!
> +
> + wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
> + wait_mpj 1
> + chk_subflow_nr "before reset" 2
> +
> + if ip netns exec "${ns1}" ${iptables} -A INPUT -s "10.0.1.2" \
> + -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset; then
> + wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
> + ip netns exec "${ns1}" ${iptables} -F INPUT
> + chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1 error 1
> +
> + pm_nl_del_endpoint $ns2 1 10.0.1.2
> + pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
> + wait_mpj 2
> + chk_mptcp_info subflows 2 subflows 2
> + chk_join_nr 2 2 2
> + else
> + mark_as_skipped "unable to set the filter rules"
> + fi
[Severity: Medium]
Will this filter setup in endpoint_tests() always fail?
Commit be3b69f3cedfaf ("selftests: mptcp: convert iptables to nftables for
mptcp_join.sh") converted mptcp_join.sh to nftables and removed the
definition of the iptables variable.
Because ${iptables} is unset and unquoted here, the command expands to:
ip netns exec "${ns1}" -A INPUT -s "10.0.1.2" ...
which fails immediately, causing this subtest to always fall into the else
branch calling mark_as_skipped (or exit with KSFT_FAIL before killing
$tests_pid and the event listeners when
SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES=1 is set).
Should this subtest call init_nftables and use nft to add and flush the rule,
matching userspace_tests() in mptcp_join.sh:
init_nftables
...
if ip netns exec "${ns1}" nft add rule ip filter INPUT \
ip saddr "10.0.1.2" meta l4proto tcp \
tcp option mptcp exists reject with tcp reset; then
wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
ip netns exec "${ns1}" nft flush chain ip filter INPUT
...
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261023110321.403874-1-w453y.me@gmail.com?part=2
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp
2026-10-23 11:03 [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 1/2] mptcp: pm: in-kernel: fullmesh: skip closed subflows Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh Abdul Wasey
@ 2026-10-23 12:34 ` MPTCP CI
2 siblings, 0 replies; 6+ messages in thread
From: MPTCP CI @ 2026-10-23 12:34 UTC (permalink / raw)
To: Abdul Wasey; +Cc: mptcp
Hi Abdul,
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): Unstable: 1 failed test(s): selftest_mptcp_join ⚠️
- KVM Validation: debug (except selftest_mptcp_join): Success! ✅
- 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): Success! ✅
- Perf: Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/39945885343
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/8237af68cd2b
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1192064
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 v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh
2026-10-23 11:03 ` [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh Abdul Wasey
2026-10-23 11:14 ` sashiko-bot
@ 2026-10-25 0:01 ` netdev-bot+sashiko
1 sibling, 0 replies; 6+ messages in thread
From: netdev-bot+sashiko @ 2026-10-25 0:01 UTC (permalink / raw)
To: w453y.me; +Cc: mptcp, matttbe, martineau, geliang, pabeni, stable, kuba
Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider.
Critical: 0 · High: 1 · Medium: 0 · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [High] The new subtest "delete and re-add, fullmesh, after reset" in
endpoint_tests() (tools/testing/selftests/net/mptcp/mptcp_join.sh)…
--
selftests: mptcp: join: re-add the initial subflow endp with fullmesh
This patch adds four subtests to endpoint_tests() in mptcp_join.sh. Each
one removes and re-adds the endpoint of the initial subflow with the
fullmesh flag set: with a second subflow, after a reset of the initial
subflow, and with only the initial subflow. The goal is to validate the
previous in-kernel fullmesh fix.
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> index f4d8afaeda4f3..98dc8de81cf01 100755
> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> @@ -4424,6 +4424,135 @@ endpoint_tests()
[ ... ]
> + # same, but the initial subflow is reset before removing its endpoint
> + if reset_with_events "delete and re-add, fullmesh, after reset" &&
> + continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then
> + pm_nl_set_limits $ns1 0 2
> + pm_nl_set_limits $ns2 0 2
> + pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
> + pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow,fullmesh
> + { timeout_test=120 test_linkfail=128 speed=5 \
> + run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
> + local tests_pid=$!
> +
> + wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
> + wait_mpj 1
> + chk_subflow_nr "before reset" 2
> +
> + if ip netns exec "${ns1}" ${iptables} -A INPUT -s "10.0.1.2" \
> + -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset; then
> + wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
> + ip netns exec "${ns1}" ${iptables} -F INPUT
[Severity: High]
Where does ${iptables} get set? I can't find it assigned anywhere under
tools/testing/selftests/net/mptcp/. These two lines seem to be its only
uses.
mptcp_join.sh only uses nftables. init() checks only for these tools:
mptcp_lib_check_tools ip tc ss nft
When the variable is empty, the command expands to:
ip netns exec <ns1> -A INPUT -s 10.0.1.2 ...
That always fails, so the if condition is always false. The checks that
would exercise the fix never run: the SUB_CLOSED wait, chk_evt_nr, the
endpoint delete/re-add, wait_mpj 2, chk_mptcp_info and chk_join_nr.
> + chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1 error 1
> +
> + pm_nl_del_endpoint $ns2 1 10.0.1.2
> + pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow,fullmesh
> + wait_mpj 2
> + chk_mptcp_info subflows 2 subflows 2
> + chk_join_nr 2 2 2
> + else
> + mark_as_skipped "unable to set the filter rules"
> + fi
Since the if is always false, this else branch always runs.
mark_as_skipped() calls mptcp_lib_fail_if_expected_feature(). With
SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES=1, that helper does:
echo "ERROR: missing feature: ${*}"
exit ${KSFT_FAIL}
The test groups run in the main shell, so in that mode the whole
mptcp_join.sh run would stop here and report a failure. None of the
later tests would run, and the background run_tests would still be
running when the script exits.
In the default mode, this subtest is always reported as skipped. It would
still pass if the previous fix were reverted, so the "after a reset of the
initial subflow" case from the commit message is never actually tested.
Should this use nftables, like the existing reset test in
userspace_tests() ("userspace pm no dup close events after error")?
init_nftables
...
ip netns exec "${ns1}" nft add rule ip filter INPUT \
ip saddr "10.0.1.2" meta l4proto tcp \
tcp option mptcp exists reject with tcp reset
Unlike reset_with_tcp_filter(), reset_with_events() does not call
init_nftables. The test would need an explicit init_nftables call, and
something like "nft flush chain ip filter INPUT" for the cleanup.
> +
> + mptcp_lib_kill_group_wait $tests_pid
> + kill_events_pids
> + fi
[ ... ]
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261023110321.403874-1-w453y.me%40gmail.com
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-25 0:01 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-23 11:03 [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 1/2] mptcp: pm: in-kernel: fullmesh: skip closed subflows Abdul Wasey
2026-10-23 11:03 ` [PATCH mptcp-net v7 2/2] selftests: mptcp: join: re-add the initial subflow endp with fullmesh Abdul Wasey
2026-10-23 11:14 ` sashiko-bot
2026-10-25 0:01 ` netdev-bot+sashiko
2026-10-23 12:34 ` [PATCH mptcp-net v7 0/2] mptcp: pm: in-kernel: fullmesh: re-add of the initial subflow endp 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.