mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 23:22:31 +02:00
Merge branch 'selftests-mptcp-avoid-spurious-errors-on-tcp-disconnect'
Matthieu Baerts says:
====================
selftests: mptcp: avoid spurious errors on TCP disconnect
This series should fix the recent instabilities seen by MPTCP and NIPA
CIs where the 'mptcp_connect.sh' tests fail regularly when running the
'disconnect' subtests with "plain" TCP sockets, e.g.
# INFO: disconnect
# 63 ns1 MPTCP -> ns1 (10.0.1.1:20001 ) MPTCP (duration 996ms) [ OK ]
# 64 ns1 MPTCP -> ns1 (10.0.1.1:20002 ) TCP (duration 851ms) [ OK ]
# 65 ns1 TCP -> ns1 (10.0.1.1:20003 ) MPTCP Unexpected revents: POLLERR/POLLNVAL(19)
# (duration 896ms) [FAIL] file received by server does not match (in, out):
# -rw-r--r-- 1 root root 11112852 Aug 19 09:16 /tmp/tmp.hlJe5DoMoq.disconnect
# Trailing bytes are:
# /{ga 6@=#.8:-rw------- 1 root root 10085368 Aug 19 09:16 /tmp/tmp.blClunilxx
# Trailing bytes are:
# /{ga 6@=#.8:66 ns1 MPTCP -> ns1 (dead:beef:1::1:20004) MPTCP (duration 987ms) [ OK ]
# 67 ns1 MPTCP -> ns1 (dead:beef:1::1:20005) TCP (duration 911ms) [ OK ]
# 68 ns1 TCP -> ns1 (dead:beef:1::1:20006) MPTCP (duration 980ms) [ OK ]
# [FAIL] Tests of the full disconnection have failed
These issues started to be visible after some behavioural changes in
TCP, where too quick re-connections after a shutdown() can now be more
easily rejected. Patch 3 modifies the selftests to wait, but this
resolution revealed an issue in MPTCP which is fixed by patch 1 (a fix
for v5.9 kernel).
Patches 2 and 4 improve some errors reported by the selftests, and patch
5 helps with the debugging of such issues.
====================
Link: https://patch.msgid.link/20250912-net-mptcp-fix-sft-connect-v1-0-d40e77cbbf02@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
33a09c64c2
|
|
@ -371,6 +371,20 @@ static void mptcp_close_wake_up(struct sock *sk)
|
|||
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
|
||||
}
|
||||
|
||||
static void mptcp_shutdown_subflows(struct mptcp_sock *msk)
|
||||
{
|
||||
struct mptcp_subflow_context *subflow;
|
||||
|
||||
mptcp_for_each_subflow(msk, subflow) {
|
||||
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
|
||||
bool slow;
|
||||
|
||||
slow = lock_sock_fast(ssk);
|
||||
tcp_shutdown(ssk, SEND_SHUTDOWN);
|
||||
unlock_sock_fast(ssk, slow);
|
||||
}
|
||||
}
|
||||
|
||||
/* called under the msk socket lock */
|
||||
static bool mptcp_pending_data_fin_ack(struct sock *sk)
|
||||
{
|
||||
|
|
@ -395,6 +409,7 @@ static void mptcp_check_data_fin_ack(struct sock *sk)
|
|||
break;
|
||||
case TCP_CLOSING:
|
||||
case TCP_LAST_ACK:
|
||||
mptcp_shutdown_subflows(msk);
|
||||
mptcp_set_state(sk, TCP_CLOSE);
|
||||
break;
|
||||
}
|
||||
|
|
@ -563,6 +578,7 @@ static bool mptcp_check_data_fin(struct sock *sk)
|
|||
mptcp_set_state(sk, TCP_CLOSING);
|
||||
break;
|
||||
case TCP_FIN_WAIT2:
|
||||
mptcp_shutdown_subflows(msk);
|
||||
mptcp_set_state(sk, TCP_CLOSE);
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -1093,6 +1093,7 @@ int main_loop_s(int listensock)
|
|||
struct pollfd polls;
|
||||
socklen_t salen;
|
||||
int remotesock;
|
||||
int err = 0;
|
||||
int fd = 0;
|
||||
|
||||
again:
|
||||
|
|
@ -1125,7 +1126,7 @@ int main_loop_s(int listensock)
|
|||
SOCK_TEST_TCPULP(remotesock, 0);
|
||||
|
||||
memset(&winfo, 0, sizeof(winfo));
|
||||
copyfd_io(fd, remotesock, 1, true, &winfo);
|
||||
err = copyfd_io(fd, remotesock, 1, true, &winfo);
|
||||
} else {
|
||||
perror("accept");
|
||||
return 1;
|
||||
|
|
@ -1134,10 +1135,10 @@ int main_loop_s(int listensock)
|
|||
if (cfg_input)
|
||||
close(fd);
|
||||
|
||||
if (--cfg_repeat > 0)
|
||||
if (!err && --cfg_repeat > 0)
|
||||
goto again;
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void init_rng(void)
|
||||
|
|
@ -1247,7 +1248,7 @@ void xdisconnect(int fd)
|
|||
else
|
||||
xerror("bad family");
|
||||
|
||||
strcpy(cmd, "ss -M | grep -q ");
|
||||
strcpy(cmd, "ss -Mnt | grep -q ");
|
||||
cmdlen = strlen(cmd);
|
||||
if (!inet_ntop(addr.ss_family, raw_addr, &cmd[cmdlen],
|
||||
sizeof(cmd) - cmdlen))
|
||||
|
|
@ -1257,7 +1258,7 @@ void xdisconnect(int fd)
|
|||
|
||||
/*
|
||||
* wait until the pending data is completely flushed and all
|
||||
* the MPTCP sockets reached the closed status.
|
||||
* the sockets reached the closed status.
|
||||
* disconnect will bypass/ignore/drop any pending data.
|
||||
*/
|
||||
for (i = 0; ; i += msec_sleep) {
|
||||
|
|
|
|||
|
|
@ -211,6 +211,11 @@ if $checksum; then
|
|||
done
|
||||
fi
|
||||
|
||||
if $capture; then
|
||||
rndh="${ns1:4}"
|
||||
mptcp_lib_pr_info "Packet capture files will have this prefix: ${rndh}-"
|
||||
fi
|
||||
|
||||
set_ethtool_flags() {
|
||||
local ns="$1"
|
||||
local dev="$2"
|
||||
|
|
@ -361,7 +366,6 @@ do_transfer()
|
|||
|
||||
if $capture; then
|
||||
local capuser
|
||||
local rndh="${connector_ns:4}"
|
||||
if [ -z $SUDO_USER ] ; then
|
||||
capuser=""
|
||||
else
|
||||
|
|
|
|||
|
|
@ -384,7 +384,7 @@ mptcp_lib_make_file() {
|
|||
mptcp_lib_print_file_err() {
|
||||
ls -l "${1}" 1>&2
|
||||
echo "Trailing bytes are: "
|
||||
tail -c 27 "${1}"
|
||||
tail -c 32 "${1}" | od -x | head -n2
|
||||
}
|
||||
|
||||
# $1: input file ; $2: output file ; $3: what kind of file
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user