Commit c451410c authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'mptcp-fixes'



Matthieu Baerts says:

====================
mptcp: fixes for v6.5

Here is a first batch of fixes for v6.5 and older.

The fixes are not linked to each others.

Patch 1 ensures subflows are unhashed before cleaning the backlog to
avoid races. This fixes another recent fix from v6.4.

Patch 2 does not rely on implicit state check in mptcp_listen() to avoid
races when receiving an MP_FASTCLOSE. A regression from v5.17.

The rest fixes issues in the selftests.

Patch 3 makes sure errors when setting up the environment are no longer
ignored. For v5.17+.

Patch 4 uses 'iptables-legacy' if available to be able to run on older
kernels. A fix for v5.13 and newer.

Patch 5 catches errors when issues are detected with packet marks. Also
for v5.13+.

Patch 6 uses the correct variable instead of an undefined one. Even if
there was no visible impact, it can help to find regressions later. An
issue visible in v5.19+.

Patch 7 makes sure errors with some sub-tests are reported to have the
selftest marked as failed as expected. Also for v5.19+.

Patch 8 adds a kernel config that is required to execute MPTCP
selftests. It is valid for v5.9+.

Patch 9 fixes issues when validating the userspace path-manager with
32-bit arch, an issue affecting v5.19+.
====================

Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
parents 80de809b 61d96580
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -2909,10 +2909,10 @@ static void mptcp_check_listen_stop(struct sock *sk)
		return;

	lock_sock_nested(ssk, SINGLE_DEPTH_NESTING);
	tcp_set_state(ssk, TCP_CLOSE);
	mptcp_subflow_queue_clean(sk, ssk);
	inet_csk_listen_stop(ssk);
	mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED);
	tcp_set_state(ssk, TCP_CLOSE);
	release_sock(ssk);
}

@@ -3703,6 +3703,11 @@ static int mptcp_listen(struct socket *sock, int backlog)
	pr_debug("msk=%p", msk);

	lock_sock(sk);

	err = -EINVAL;
	if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM)
		goto unlock;

	ssock = __mptcp_nmpc_socket(msk);
	if (IS_ERR(ssock)) {
		err = PTR_ERR(ssock);
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ CONFIG_INET_DIAG=m
CONFIG_INET_MPTCP_DIAG=m
CONFIG_VETH=y
CONFIG_NET_SCH_NETEM=m
CONFIG_SYN_COOKIES=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NETFILTER_NETLINK=m
+3 −0
Original line number Diff line number Diff line
@@ -718,6 +718,7 @@ table inet mangle {
EOF
	if [ $? -ne 0 ]; then
		echo "SKIP: $msg, could not load nft ruleset"
		mptcp_lib_fail_if_expected_feature "nft rules"
		return
	fi

@@ -733,6 +734,7 @@ EOF
	if [ $? -ne 0 ]; then
		ip netns exec "$listener_ns" nft flush ruleset
		echo "SKIP: $msg, ip $r6flag rule failed"
		mptcp_lib_fail_if_expected_feature "ip rule"
		return
	fi

@@ -741,6 +743,7 @@ EOF
		ip netns exec "$listener_ns" nft flush ruleset
		ip -net "$listener_ns" $r6flag rule del fwmark 1 lookup 100
		echo "SKIP: $msg, ip route add local $local_addr failed"
		mptcp_lib_fail_if_expected_feature "ip route"
		return
	fi

+16 −13
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ ksft_skip=4
timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1))
mptcp_connect=""
iptables="iptables"
ip6tables="ip6tables"

sec=$(date +%s)
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
@@ -25,7 +27,7 @@ add_mark_rules()
	local m=$2

	local t
	for t in iptables ip6tables; do
	for t in ${iptables} ${ip6tables}; do
		# just to debug: check we have multiple subflows connection requests
		ip netns exec $ns $t -A OUTPUT -p tcp --syn -m mark --mark $m -j ACCEPT

@@ -95,14 +97,14 @@ if [ $? -ne 0 ];then
	exit $ksft_skip
fi

iptables -V > /dev/null 2>&1
if [ $? -ne 0 ];then
# Use the legacy version if available to support old kernel versions
if iptables-legacy -V &> /dev/null; then
	iptables="iptables-legacy"
	ip6tables="ip6tables-legacy"
elif ! iptables -V &> /dev/null; then
	echo "SKIP: Could not run all tests without iptables tool"
	exit $ksft_skip
fi

ip6tables -V > /dev/null 2>&1
if [ $? -ne 0 ];then
elif ! ip6tables -V &> /dev/null; then
	echo "SKIP: Could not run all tests without ip6tables tool"
	exit $ksft_skip
fi
@@ -112,10 +114,10 @@ check_mark()
	local ns=$1
	local af=$2

	local tables=iptables
	local tables=${iptables}

	if [ $af -eq 6 ];then
		tables=ip6tables
		tables=${ip6tables}
	fi

	local counters values
@@ -126,6 +128,7 @@ check_mark()
	for v in $values; do
		if [ $v -ne 0 ]; then
			echo "FAIL: got $tables $values in ns $ns , not 0 - not all expected packets marked" 1>&2
			ret=1
			return 1
		fi
	done
@@ -225,11 +228,11 @@ do_transfer()
	fi

	if [ $local_addr = "::" ];then
		check_mark $listener_ns 6
		check_mark $connector_ns 6
		check_mark $listener_ns 6 || retc=1
		check_mark $connector_ns 6 || retc=1
	else
		check_mark $listener_ns 4
		check_mark $connector_ns 4
		check_mark $listener_ns 4 || retc=1
		check_mark $connector_ns 4 || retc=1
	fi

	check_transfer $cin $sout "file received by server"
+5 −5
Original line number Diff line number Diff line
@@ -425,7 +425,7 @@ int dsf(int fd, int pm_family, int argc, char *argv[])
	}

	/* token */
	token = atoi(params[4]);
	token = strtoul(params[4], NULL, 10);
	rta = (void *)(data + off);
	rta->rta_type = MPTCP_PM_ATTR_TOKEN;
	rta->rta_len = RTA_LENGTH(4);
@@ -551,7 +551,7 @@ int csf(int fd, int pm_family, int argc, char *argv[])
	}

	/* token */
	token = atoi(params[4]);
	token = strtoul(params[4], NULL, 10);
	rta = (void *)(data + off);
	rta->rta_type = MPTCP_PM_ATTR_TOKEN;
	rta->rta_len = RTA_LENGTH(4);
@@ -598,7 +598,7 @@ int remove_addr(int fd, int pm_family, int argc, char *argv[])
			if (++arg >= argc)
				error(1, 0, " missing token value");

			token = atoi(argv[arg]);
			token = strtoul(argv[arg], NULL, 10);
			rta = (void *)(data + off);
			rta->rta_type = MPTCP_PM_ATTR_TOKEN;
			rta->rta_len = RTA_LENGTH(4);
@@ -710,7 +710,7 @@ int announce_addr(int fd, int pm_family, int argc, char *argv[])
			if (++arg >= argc)
				error(1, 0, " missing token value");

			token = atoi(argv[arg]);
			token = strtoul(argv[arg], NULL, 10);
		} else
			error(1, 0, "unknown keyword %s", argv[arg]);
	}
@@ -1347,7 +1347,7 @@ int set_flags(int fd, int pm_family, int argc, char *argv[])
				error(1, 0, " missing token value");

			/* token */
			token = atoi(argv[arg]);
			token = strtoul(argv[arg], NULL, 10);
		} else if (!strcmp(argv[arg], "flags")) {
			char *tok, *str;

Loading