[PATCH mptcp-next 5/6] mptcp: add TCP_SYNCNT setsockopt/getsockopt
Geliang Tang <[email protected]> Sat, 25 Jul 2026 21:13:42 +0800
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <7b893aca2bfc58dfd9992ed3eb3de61ce7b20a9f.1784985085.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> Surface TCP_SYNCNT to userspace on the MPTCP master socket. setsockopt(TCP_SYNCNT) validates the value via __mptcp_setsockopt_set_val() and stores it in inet_csk(sk)->icsk_syn_retries on the msk. getsockopt() reads the same field back. 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 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index e40a5a23d1c9..50dcb53effe2 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -897,6 +897,17 @@ 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: { + int syncnt = inet_csk(sk)->icsk_syn_retries; + + ret = __mptcp_setsockopt_set_val(msk, MAX_TCP_SYNCNT, + &tcp_sock_set_syncnt, + &syncnt, + val); + if (ret == 0) + inet_csk(sk)->icsk_syn_retries = syncnt; + break; + } default: ret = -ENOPROTOOPT; } @@ -1449,6 +1460,9 @@ 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, + inet_csk(sk)->icsk_syn_retries); } return -EOPNOTSUPP; } @@ -1603,6 +1617,8 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_port_range)); ssk->sk_reuse = sk->sk_reuse; + if (inet_csk(sk)->icsk_syn_retries > 0) + tcp_sock_set_syncnt(ssk, inet_csk(sk)->icsk_syn_retries); } void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) -- 2.53.0