[PATCH mptcp-next v4 04/10] mptcp: add TCP_SYNCNT setsockopt/getsockopt
Geliang Tang <[email protected]> Thu, 30 Jul 2026 10:53:57 +0800
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <9cb37d4c246b79fd35f439c5bf9b60c5e18280c9.1785378180.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> This patch adds TCP_SYNCNT support on the MPTCP socket. The setsockopt() path stores the value in inet_csk(sk)->icsk_syn_retries on the msk and all subflow sockets. The getsockopt() path reads the same field back from the master socket. A newly created subflow picks up the master socket's syn_retries through sync_socket_options(), so the setting takes effect for outgoing SYNs without further plumbing. Signed-off-by: Geliang Tang <[email protected]> --- net/mptcp/sockopt.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 34f6cd9c7967..3dbf8d27005c 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -898,6 +898,13 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname, ret = mptcp_setsockopt_all_sf(msk, SOL_TCP, optname, optval, optlen); break; + case TCP_SYNCNT: + ret = __mptcp_setsockopt_set_val(msk, MAX_TCP_SYNCNT, + &tcp_sock_set_syncnt, + &val, val); + if (ret == 0) + ret = tcp_sock_set_syncnt(sk, val); + break; default: ret = -ENOPROTOOPT; } @@ -1450,6 +1457,10 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname, return mptcp_put_int_option(msk, optval, optlen, msk->notsent_lowat); case TCP_IS_MPTCP: return mptcp_put_int_option(msk, optval, optlen, 1); + case TCP_SYNCNT: + return mptcp_put_int_option(msk, optval, optlen, + READ_ONCE(inet_csk(sk)->icsk_syn_retries) ? : + READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_syn_retries)); } return -EOPNOTSUPP; } @@ -1552,6 +1563,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK; struct sock *sk = (struct sock *)msk; bool keep_open; + int syncnt; keep_open = sock_flag(sk, SOCK_KEEPOPEN); if (ssk->sk_prot->keepalive) @@ -1604,6 +1616,9 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) ssk->sk_reuse = sk->sk_reuse; ssk->sk_reuseport = sk->sk_reuseport; + syncnt = READ_ONCE(inet_csk(sk)->icsk_syn_retries); + if (syncnt > 0 && tcp_sock_set_syncnt(ssk, syncnt)) + pr_warn("Failed to sync TCP_SYNCNT=%u to subflow\n", syncnt); } void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) -- 2.53.0