[PATCH mptcp-next 02/11] selftests: mptcp: check no dup close events after error

Matthieu Baerts (NGI0) posted 11 patches 1 week, 6 days ago
[PATCH mptcp-next 02/11] selftests: mptcp: check no dup close events after error
Posted by Matthieu Baerts (NGI0) 1 week, 6 days ago
This validates the previous commit: subflow closed events are re-sent
with less info when the initial subflow is disconnected after an error
and each time a subflow is closed after that.

In this new test, the userspace PM is involved because that's how it was
discovered, but it is not specific to it. The initial subflow is
terminated with a RESET, and that will cause the subflow disconnect.
Then, a new subflow is initiated, but also got rejected, which cause a
second subflow closed event, but not a third one.

While at it, in case of failure to get the expected amount of events,
the events are printed.

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: d82809b6c5f2 ("mptcp: avoid duplicated SUB_CLOSED events")
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
 tools/testing/selftests/net/mptcp/mptcp_join.sh | 49 +++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
index b2e6e548f796..468ffb97293b 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
@@ -3872,11 +3872,32 @@ chk_evt_nr()
 	count=$(grep -cw "type:${evt}" "${evts}")
 	if [ "${count}" != "${exp}" ]; then
 		fail_test "got ${count} events, expected ${exp}"
+		cat "${evts}"
 	else
 		print_ok
 	fi
 }
 
+# $1: ns ; $2: event type ; $3: expected count
+wait_event()
+{
+	local ns="${1}"
+	local evt_name="${2}"
+	local exp="${3}"
+
+	local evt="${!evt_name}"
+	local evts="${evts_ns1}"
+	local count
+
+	[ "${ns}" == "ns2" ] && evts="${evts_ns2}"
+
+	for _ in $(seq 100); do
+		count=$(grep -cw "type:${evt}" "${evts}")
+		[ "${count}" -ge "${exp}" ] && break
+		sleep 0.1
+	done
+}
+
 userspace_tests()
 {
 	# userspace pm type prevents add_addr
@@ -4085,6 +4106,34 @@ userspace_tests()
 		kill_events_pids
 		mptcp_lib_kill_group_wait $tests_pid
 	fi
+
+	# userspace pm no duplicated spurious close events after an error
+	if reset_with_events "userspace pm no dup close events after error" &&
+	   continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
+		set_userspace_pm $ns2
+		pm_nl_set_limits $ns1 0 2
+		{ timeout_test=120 test_linkfail=128 speed=slow \
+			run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
+		local tests_pid=$!
+		wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
+		userspace_pm_add_sf $ns2 10.0.3.2 20
+		chk_mptcp_info subflows 1 subflows 1
+		chk_subflows_total 2 2
+
+		# force quick loss
+		ip netns exec $ns2 sysctl -q net.ipv4.tcp_syn_retries=1
+		if ip netns exec "${ns1}" ${iptables} -A INPUT -s "10.0.1.2" -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset &&
+		   ip netns exec "${ns2}" ${iptables} -A INPUT -d "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
+			wait_event ns1 MPTCP_LIB_EVENT_SUB_CLOSED 1
+			chk_subflows_total 1 1
+			userspace_pm_add_sf $ns2 10.0.1.2 0
+			wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
+			chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
+		fi
+		kill_events_pids
+		mptcp_lib_kill_group_wait $tests_pid
+	fi
 }
 
 endpoint_tests()

-- 
2.51.0
Re: [PATCH mptcp-next 02/11] selftests: mptcp: check no dup close events after error
Posted by Geliang Tang 4 days, 6 hours ago
Hi Matt,

On Fri, 2025-12-26 at 07:40 +0100, Matthieu Baerts (NGI0) wrote:
> This validates the previous commit: subflow closed events are re-sent
> with less info when the initial subflow is disconnected after an
> error
> and each time a subflow is closed after that.
> 
> In this new test, the userspace PM is involved because that's how it
> was
> discovered, but it is not specific to it. The initial subflow is
> terminated with a RESET, and that will cause the subflow disconnect.
> Then, a new subflow is initiated, but also got rejected, which cause
> a
> second subflow closed event, but not a third one.
> 
> While at it, in case of failure to get the expected amount of events,
> the events are printed.
> 
> 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: d82809b6c5f2 ("mptcp: avoid duplicated SUB_CLOSED events")
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> ---
>  tools/testing/selftests/net/mptcp/mptcp_join.sh | 49
> +++++++++++++++++++++++++
>  1 file changed, 49 insertions(+)
> 
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> index b2e6e548f796..468ffb97293b 100755
> --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
> +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
> @@ -3872,11 +3872,32 @@ chk_evt_nr()
>  	count=$(grep -cw "type:${evt}" "${evts}")
>  	if [ "${count}" != "${exp}" ]; then
>  		fail_test "got ${count} events, expected ${exp}"
> +		cat "${evts}"
>  	else
>  		print_ok
>  	fi
>  }
>  
> +# $1: ns ; $2: event type ; $3: expected count
> +wait_event()
> +{
> +	local ns="${1}"
> +	local evt_name="${2}"
> +	local exp="${3}"
> +
> +	local evt="${!evt_name}"
> +	local evts="${evts_ns1}"
> +	local count
> +
> +	[ "${ns}" == "ns2" ] && evts="${evts_ns2}"
> +
> +	for _ in $(seq 100); do
> +		count=$(grep -cw "type:${evt}" "${evts}")
> +		[ "${count}" -ge "${exp}" ] && break
> +		sleep 0.1
> +	done
> +}
> +
>  userspace_tests()
>  {
>  	# userspace pm type prevents add_addr
> @@ -4085,6 +4106,34 @@ userspace_tests()
>  		kill_events_pids
>  		mptcp_lib_kill_group_wait $tests_pid
>  	fi
> +
> +	# userspace pm no duplicated spurious close events after an
> error
> +	if reset_with_events "userspace pm no dup close events after
> error" &&
> +	   continue_if mptcp_lib_has_file
> '/proc/sys/net/mptcp/pm_type'; then
> +		set_userspace_pm $ns2
> +		pm_nl_set_limits $ns1 0 2
> +		{ timeout_test=120 test_linkfail=128 speed=slow \
> +			run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
> +		local tests_pid=$!
> +		wait_event ns2 MPTCP_LIB_EVENT_ESTABLISHED 1
> +		userspace_pm_add_sf $ns2 10.0.3.2 20
> +		chk_mptcp_info subflows 1 subflows 1
> +		chk_subflows_total 2 2
> +
> +		# force quick loss
> +		ip netns exec $ns2 sysctl -q
> net.ipv4.tcp_syn_retries=1
> +		if ip netns exec "${ns1}" ${iptables} -A INPUT -s
> "10.0.1.2" -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset
> &&
> +		   ip netns exec "${ns2}" ${iptables} -A INPUT -d
> "10.0.1.2" -p tcp --tcp-option 30 -j REJECT --reject-with tcp-reset;
> then

These two lines are too long and need to be wrapped.

Thanks,
-Geliang

> +			wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 1
> +			wait_event ns1 MPTCP_LIB_EVENT_SUB_CLOSED 1
> +			chk_subflows_total 1 1
> +			userspace_pm_add_sf $ns2 10.0.1.2 0
> +			wait_event ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
> +			chk_evt_nr ns2 MPTCP_LIB_EVENT_SUB_CLOSED 2
> +		fi
> +		kill_events_pids
> +		mptcp_lib_kill_group_wait $tests_pid
> +	fi
>  }
>  
>  endpoint_tests()