Commit c912f935 authored by Matthieu Baerts (NGI0)'s avatar Matthieu Baerts (NGI0) Committed by Jakub Kicinski
Browse files

selftests: mptcp: join: validate new laminar endp



Here are a few sub-tests for mptcp_join.sh, validating the new 'laminar'
endpoint type.

In a setup where subflows created using the routing rules would be
rejected by the listener, and where the latter announces one IP address,
some cases are verified:

- Without any 'laminar' endpoints: no new subflows are created.

- With one 'laminar' endpoint: a second subflow is created.

- With multiple 'laminar' endpoints: 2 IPv4 subflows are created.

- With one 'laminar' endpoint, but the server announcing a second IP
  address, only one subflow is created.

- With one 'laminar' + 'subflow' endpoint, the same endpoint is only
  used once.

Reviewed-by: default avatarMat Martineau <martineau@kernel.org>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20250927-net-next-mptcp-rcv-path-imp-v1-8-5da266aa9c1a@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 59701b18
Loading
Loading
Loading
Loading
+69 −0
Original line number Diff line number Diff line
@@ -2320,6 +2320,74 @@ signal_address_tests()
	fi
}

laminar_endp_tests()
{
	# no laminar endpoints: routing rules are used
	if reset_with_tcp_filter "without a laminar endpoint" ns1 10.0.2.2 REJECT &&
	   mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; then
		pm_nl_set_limits $ns1 0 2
		pm_nl_set_limits $ns2 2 2
		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
		run_tests $ns1 $ns2 10.0.1.1
		join_syn_tx=1 \
			chk_join_nr 0 0 0
		chk_add_nr 1 1
	fi

	# laminar endpoints: this endpoint is used
	if reset_with_tcp_filter "with a laminar endpoint" ns1 10.0.2.2 REJECT &&
	   mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; then
		pm_nl_set_limits $ns1 0 2
		pm_nl_set_limits $ns2 2 2
		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
		pm_nl_add_endpoint $ns2 10.0.3.2 flags laminar
		run_tests $ns1 $ns2 10.0.1.1
		chk_join_nr 1 1 1
		chk_add_nr 1 1
	fi

	# laminar endpoints: these endpoints are used
	if reset_with_tcp_filter "with multiple laminar endpoints" ns1 10.0.2.2 REJECT &&
	   mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; then
		pm_nl_set_limits $ns1 0 2
		pm_nl_set_limits $ns2 2 2
		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
		pm_nl_add_endpoint $ns2 dead:beef:3::2 flags laminar
		pm_nl_add_endpoint $ns2 10.0.3.2 flags laminar
		pm_nl_add_endpoint $ns2 10.0.4.2 flags laminar
		run_tests $ns1 $ns2 10.0.1.1
		chk_join_nr 2 2 2
		chk_add_nr 2 2
	fi

	# laminar endpoints: only one endpoint is used
	if reset_with_tcp_filter "single laminar endpoint" ns1 10.0.2.2 REJECT &&
	   mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; then
		pm_nl_set_limits $ns1 0 2
		pm_nl_set_limits $ns2 2 2
		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
		pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
		pm_nl_add_endpoint $ns2 10.0.3.2 flags laminar
		run_tests $ns1 $ns2 10.0.1.1
		chk_join_nr 1 1 1
		chk_add_nr 2 2
	fi

	# laminar endpoints: subflow and laminar flags
	if reset_with_tcp_filter "sublow + laminar endpoints" ns1 10.0.2.2 REJECT &&
	   mptcp_lib_kallsyms_has "mptcp_pm_get_endp_laminar_max$"; then
		pm_nl_set_limits $ns1 0 4
		pm_nl_set_limits $ns2 2 4
		pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
		pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,laminar
		pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,laminar
		run_tests $ns1 $ns2 10.0.1.1
		chk_join_nr 1 1 1
		chk_add_nr 1 1
	fi
}

link_failure_tests()
{
	# accept and use add_addr with additional subflows and link loss
@@ -4109,6 +4177,7 @@ all_tests_sorted=(
	f@subflows_tests
	e@subflows_error_tests
	s@signal_address_tests
	L@laminar_endp_tests
	l@link_failure_tests
	t@add_addr_timeout_tests
	r@remove_tests
+9 −0
Original line number Diff line number Diff line
@@ -830,6 +830,8 @@ int add_addr(int fd, int pm_family, int argc, char *argv[])
					flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;
				else if (!strcmp(tok, "signal"))
					flags |= MPTCP_PM_ADDR_FLAG_SIGNAL;
				else if (!strcmp(tok, "laminar"))
					flags |= MPTCP_PM_ADDR_FLAG_LAMINAR;
				else if (!strcmp(tok, "backup"))
					flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
				else if (!strcmp(tok, "fullmesh"))
@@ -1018,6 +1020,13 @@ static void print_addr(struct rtattr *attrs, int len)
					printf(",");
			}

			if (flags & MPTCP_PM_ADDR_FLAG_LAMINAR) {
				printf("laminar");
				flags &= ~MPTCP_PM_ADDR_FLAG_LAMINAR;
				if (flags)
					printf(",");
			}

			if (flags & MPTCP_PM_ADDR_FLAG_BACKUP) {
				printf("backup");
				flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;