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: Matthieu Baerts <matthieu.baerts@tessares.net>
This commit is contained in:
commit
c451410ca7
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -423,6 +423,7 @@ test_remove()
|
|||
stdbuf -o0 -e0 printf "[OK]\n"
|
||||
else
|
||||
stdbuf -o0 -e0 printf "[FAIL]\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# RM_ADDR using an invalid addr id should result in no action
|
||||
|
@ -437,6 +438,7 @@ test_remove()
|
|||
stdbuf -o0 -e0 printf "[OK]\n"
|
||||
else
|
||||
stdbuf -o0 -e0 printf "[FAIL]\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# RM_ADDR from the client to server machine
|
||||
|
@ -848,7 +850,7 @@ test_prio()
|
|||
local count
|
||||
|
||||
# Send MP_PRIO signal from client to server machine
|
||||
ip netns exec "$ns2" ./pm_nl_ctl set 10.0.1.2 port "$client4_port" flags backup token "$client4_token" rip 10.0.1.1 rport "$server4_port"
|
||||
ip netns exec "$ns2" ./pm_nl_ctl set 10.0.1.2 port "$client4_port" flags backup token "$client4_token" rip 10.0.1.1 rport "$app4_port"
|
||||
sleep 0.5
|
||||
|
||||
# Check TX
|
||||
|
|
Loading…
Reference in New Issue