]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: reset blackhole on success with non-loopback ifaces
authorMatthieu Baerts (NGI0) <matttbe@kernel.org>
Mon, 20 Oct 2025 15:44:09 +0000 (11:44 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Oct 2025 14:20:46 +0000 (16:20 +0200)
[ Upstream commit 833d4313bc1e9e194814917d23e8874d6b651649 ]

When a first MPTCP connection gets successfully established after a
blackhole period, 'active_disable_times' was supposed to be reset when
this connection was done via any non-loopback interfaces.

Unfortunately, the opposite condition was checked: only reset when the
connection was established via a loopback interface. Fixing this by
simply looking at the opposite.

This is similar to what is done with TCP FastOpen, see
tcp_fastopen_active_disable_ofo_check().

This patch is a follow-up of a previous discussion linked to commit
893c49a78d9f ("mptcp: Use __sk_dst_get() and dst_dev_rcu() in
mptcp_active_enable()."), see [1].

Fixes: 27069e7cb3d1 ("mptcp: disable active MPTCP in case of blackhole")
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/4209a283-8822-47bd-95b7-87e96d9b7ea3@kernel.org
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250918-net-next-mptcp-blackhole-reset-loopback-v1-1-bf5818326639@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mptcp/ctrl.c

index 9e1f61b02a66e6f55eab74d3ba961bdc8b7817ce..0d60556cfefabc85fe9e00382c1d946dffa0fb1a 100644 (file)
@@ -387,7 +387,7 @@ void mptcp_active_enable(struct sock *sk)
                rcu_read_lock();
                dst = __sk_dst_get(sk);
                dev = dst ? dst_dev_rcu(dst) : NULL;
-               if (dev && (dev->flags & IFF_LOOPBACK))
+               if (!(dev && (dev->flags & IFF_LOOPBACK)))
                        atomic_set(&pernet->active_disable_times, 0);
                rcu_read_unlock();
        }