[PATCH mptcp-next v5 03/11] mptcp: inherit sk_reuse/sk_reuseport and fix dev bind override
Geliang Tang <[email protected]>
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <445023840741fb5afb83eeb97fee4f3a9afc935d.1786159812.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> Propagate sk_reuse and sk_reuseport from master socket to subflows, and bump setsockopt_seq so later subflows pick up the changes. This patch also fixes unconditional sk_bound_dev_if override in __mptcp_subflow_connect(): only set it when local->ifindex is non-zero, otherwise preserve the value inherited from the master socket via sync_socket_options(). Signed-off-by: Geliang Tang <[email protected]> --- net/mptcp/sockopt.c | 5 +++++ net/mptcp/subflow.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 5de371e29721..d79139eb5b8a 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -335,6 +335,8 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, sk->sk_bound_dev_if = ssk->sk_bound_dev_if; else if (optname == SO_BINDTOIFINDEX) sk->sk_bound_dev_if = ssk->sk_bound_dev_if; + + sockopt_seq_inc(msk); } release_sock(sk); return ret; @@ -1704,6 +1706,9 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk) assign_bit(b, &inet_sk(ssk)->inet_flags, src & BIT(b)); WRITE_ONCE(inet_sk(ssk)->local_port_range, READ_ONCE(inet_sk(sk)->local_port_range)); + + ssk->sk_reuse = sk->sk_reuse; + ssk->sk_reuseport = sk->sk_reuseport; } void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index af81ad5e699d..47ff736c4d66 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1672,7 +1672,9 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local, if (addr.ss_family == AF_INET6) addrlen = sizeof(struct sockaddr_in6); #endif - ssk->sk_bound_dev_if = local->ifindex; + /* Only override the bound device if the path manager picked one. */ + if (local->ifindex) + ssk->sk_bound_dev_if = local->ifindex; err = kernel_bind(sf, (struct sockaddr_unsized *)&addr, addrlen); if (err) { MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_JOINSYNTXBINDERR); -- 2.53.0