87 lines
2.8 KiB
Diff
87 lines
2.8 KiB
Diff
From dda31fb26f0ac5d06db5d59daade7e9ced49667a Mon Sep 17 00:00:00 2001
|
|
From: Geliang Tang <tanggeliang@kylinos.cn>
|
|
Date: Fri, 15 Aug 2025 19:28:23 +0200
|
|
Subject: mptcp: disable add_addr retransmission when timeout is 0
|
|
|
|
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>
|
|
---
|
|
Documentation/networking/mptcp-sysctl.rst | 2 ++
|
|
net/mptcp/pm.c | 13 ++++++++++---
|
|
2 files changed, 12 insertions(+), 3 deletions(-)
|
|
|
|
--- a/Documentation/networking/mptcp-sysctl.rst
|
|
+++ b/Documentation/networking/mptcp-sysctl.rst
|
|
@@ -12,6 +12,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.
|
|
|
|
--- a/net/mptcp/pm.c
|
|
+++ b/net/mptcp/pm.c
|
|
@@ -274,6 +274,7 @@ static void mptcp_pm_add_timer(struct ti
|
|
add_timer);
|
|
struct mptcp_sock *msk = entry->sock;
|
|
struct sock *sk = (struct sock *)msk;
|
|
+ unsigned int timeout;
|
|
|
|
pr_debug("msk=%p\n", msk);
|
|
|
|
@@ -291,6 +292,10 @@ static void mptcp_pm_add_timer(struct ti
|
|
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)) {
|
|
@@ -302,7 +307,7 @@ static void mptcp_pm_add_timer(struct ti
|
|
|
|
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);
|
|
|
|
@@ -344,6 +349,7 @@ bool mptcp_pm_alloc_anno_list(struct mpt
|
|
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);
|
|
|
|
@@ -368,8 +374,9 @@ bool mptcp_pm_alloc_anno_list(struct mpt
|
|
|
|
timer_setup(&add_entry->add_timer, mptcp_pm_add_timer, 0);
|
|
reset_timer:
|
|
- sk_reset_timer(sk, &add_entry->add_timer,
|
|
- jiffies + mptcp_get_add_addr_timeout(net));
|
|
+ timeout = mptcp_get_add_addr_timeout(net);
|
|
+ if (timeout)
|
|
+ sk_reset_timer(sk, &add_entry->add_timer, jiffies + timeout);
|
|
|
|
return true;
|
|
}
|