diff options
| author | Matthieu Baerts (NGI0) <matttbe@kernel.org> | 2025-01-29 13:24:32 +0100 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-02-08 10:02:23 +0100 |
| commit | be2c5f7ff6b60946c8abf26893859a9be4f4377a (patch) | |
| tree | 8e80c861f86b4da5699a59850f8beaa059267f8b /net | |
| parent | 6ec806762318a4adde0ea63342d42d0feae95079 (diff) | |
| download | linux-be2c5f7ff6b60946c8abf26893859a9be4f4377a.tar.gz linux-be2c5f7ff6b60946c8abf26893859a9be4f4377a.tar.bz2 linux-be2c5f7ff6b60946c8abf26893859a9be4f4377a.zip | |
mptcp: blackhole only if 1st SYN retrans w/o MPC is accepted
commit e598d8981fd34470b78a1ae777dbf131b15d5bf2 upstream.
The Fixes commit mentioned this:
> An MPTCP firewall blackhole can be detected if the following SYN
> retransmission after a fallback to "plain" TCP is accepted.
But in fact, this blackhole was detected if any following SYN
retransmissions after a fallback to TCP was accepted.
That's because 'mptcp_subflow_early_fallback()' will set 'request_mptcp'
to 0, and 'mpc_drop' will never be reset to 0 after.
This is an issue, because some not so unusual situations might cause the
kernel to detect a false-positive blackhole, e.g. a client trying to
connect to a server while the network is not ready yet, causing a few
SYN retransmissions, before reaching the end server.
Fixes: 27069e7cb3d1 ("mptcp: disable active MPTCP in case of blackhole")
Cc: stable@vger.kernel.org
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
| -rw-r--r-- | net/mptcp/ctrl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index b0dd008e2114..dd595d9b5e50 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -405,9 +405,9 @@ void mptcp_active_detect_blackhole(struct sock *ssk, bool expired) MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPCAPABLEACTIVEDROP); subflow->mpc_drop = 1; mptcp_subflow_early_fallback(mptcp_sk(subflow->conn), subflow); - } else { - subflow->mpc_drop = 0; } + } else if (ssk->sk_state == TCP_SYN_SENT) { + subflow->mpc_drop = 0; } } |
