]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: disable add_addr retransmission when timeout is 0
authorGeliang Tang <tanggeliang@kylinos.cn>
Sat, 23 Aug 2025 14:55:34 +0000 (10:55 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:26:16 +0000 (16:26 +0200)
[ Upstream commit f5ce0714623cffd00bf2a83e890d09c609b7f50a ]

When add_addr_timeout was set to 0, this caused the ADD_ADDR to be
retransmitted immediately, which looks like a buggy behaviour. Instead,
interpret 0 as "no retransmissions needed".

The documentation is updated to explicitly state that setting the timeout
to 0 disables retransmission.

Fixes: 93f323b9cccc ("mptcp: add a new sysctl add_addr_timeout")
Cc: stable@vger.kernel.org
Suggested-by: Matthieu Baerts <matttbe@kernel.org>
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20250815-net-mptcp-misc-fixes-6-17-rc2-v1-5-521fe9957892@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
[ Apply to net/mptcp/pm_netlink.c , structural changes in mptcp_pm_alloc_anno_list ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/networking/mptcp-sysctl.rst
net/mptcp/pm_netlink.c

index 213510698014eab523daba264ab68714ba69a09e..722b4395e91b26223ef048472cebf05e6ad2ea3b 100644 (file)
@@ -20,6 +20,8 @@ add_addr_timeout - INTEGER (seconds)
        resent to an MPTCP peer that has not acknowledged a previous
        ADD_ADDR message.
 
+       Do not retransmit if set to 0.
+
        The default value matches TCP_RTO_MAX. This is a per-namespace
        sysctl.
 
index bb1a02e3dc3f2594d06afc646e153b85256175b7..cf9244a3644f105b2e58e99a5563856158bc9628 100644 (file)
@@ -304,6 +304,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
        struct mptcp_pm_add_entry *entry = from_timer(entry, timer, add_timer);
        struct mptcp_sock *msk = entry->sock;
        struct sock *sk = (struct sock *)msk;
+       unsigned int timeout;
 
        pr_debug("msk=%p\n", msk);
 
@@ -321,6 +322,10 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
                goto out;
        }
 
+       timeout = mptcp_get_add_addr_timeout(sock_net(sk));
+       if (!timeout)
+               goto out;
+
        spin_lock_bh(&msk->pm.lock);
 
        if (!mptcp_pm_should_add_signal_addr(msk)) {
@@ -332,7 +337,7 @@ static void mptcp_pm_add_timer(struct timer_list *timer)
 
        if (entry->retrans_times < ADD_ADDR_RETRANS_MAX)
                sk_reset_timer(sk, timer,
-                              jiffies + mptcp_get_add_addr_timeout(sock_net(sk)));
+                              jiffies + timeout);
 
        spin_unlock_bh(&msk->pm.lock);
 
@@ -374,6 +379,7 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
        struct mptcp_pm_add_entry *add_entry = NULL;
        struct sock *sk = (struct sock *)msk;
        struct net *net = sock_net(sk);
+       unsigned int timeout;
 
        lockdep_assert_held(&msk->pm.lock);
 
@@ -383,9 +389,7 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
                if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk)))
                        return false;
 
-               sk_reset_timer(sk, &add_entry->add_timer,
-                              jiffies + mptcp_get_add_addr_timeout(net));
-               return true;
+               goto reset_timer;
        }
 
        add_entry = kmalloc(sizeof(*add_entry), GFP_ATOMIC);
@@ -399,8 +403,10 @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
        add_entry->retrans_times = 0;
 
        timer_setup(&add_entry->add_timer, mptcp_pm_add_timer, 0);
-       sk_reset_timer(sk, &add_entry->add_timer,
-                      jiffies + mptcp_get_add_addr_timeout(net));
+reset_timer:
+       timeout = mptcp_get_add_addr_timeout(net);
+       if (timeout)
+               sk_reset_timer(sk, &add_entry->add_timer, jiffies + timeout);
 
        return true;
 }