[PATCH mptcp-next 2/6] mptcp: don't reset dst when setting default 0 tos

Geliang Tang <[email protected]> Sat, 25 Jul 2026 21:13:39 +0800
Newsgroups dev.linux.lists.mptcp
Message-ID <80a22df256550b7bbed7a7e06b8d8c6a6019fee0.1784985085.git.tanggeliang@kylinos.cn>
From: Geliang Tang <[email protected]>

__ip_sock_set_tos() is called unconditionally during setsockopt and
on each sync_socket_options() pass, even when inet_sk(sk)->tos is 0
(the default). On SOCK_STREAM the helper masks out the ECN bits and
writes sk_tos2prio(), which leaves priority=0 alone but still calls
sk_dst_reset() unconditionally, forcing a route lookup on the next
packet. Guard both call sites with 'if (val > 0)' so the default-0
case is a no-op.

Signed-off-by: Geliang Tang <[email protected]>
---
 net/mptcp/sockopt.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index fcf6feb2a9eb..1b2487a5ae2f 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -762,7 +762,8 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
 		bool slow;
 
 		slow = lock_sock_fast(ssk);
-		__ip_sock_set_tos(ssk, val);
+		if (val > 0)
+			__ip_sock_set_tos(ssk, val);
 		unlock_sock_fast(ssk, slow);
 	}
 	release_sock(sk);
@@ -1562,7 +1563,8 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
 	ssk->sk_bound_dev_if = sk->sk_bound_dev_if;
 	ssk->sk_incoming_cpu = sk->sk_incoming_cpu;
 	ssk->sk_ipv6only = sk->sk_ipv6only;
-	__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
+	if (inet_sk(sk)->tos > 0)
+		__ip_sock_set_tos(ssk, inet_sk(sk)->tos);
 
 	if (sk->sk_userlocks & tx_rx_locks) {
 		ssk->sk_userlocks |= sk->sk_userlocks & tx_rx_locks;
-- 
2.53.0