[PATCH mptcp-next v5 06/11] mptcp: report v4-mapped subflow addrs as IPv4
Geliang Tang <[email protected]>
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <933ec45a29ec3764446ef462cef3813d5cdf2689.1786159812.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> mptcp_get_sub_addrs() currently fills sin6_* for any AF_INET6 subflow. Detect v4-mapped destinations (guarded by CONFIG_IPV6) and reuse the IPv4 branch so MPTCP_SUBFLOW_ADDRS reports match userspace's view. Signed-off-by: Geliang Tang <[email protected]> --- net/mptcp/sockopt.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 71a4a2aaa838..43a8d1c37137 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -1256,10 +1256,15 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock *msk, char __user *optval, static void mptcp_get_sub_addrs(const struct sock *sk, struct mptcp_subflow_addrs *a) { const struct inet_sock *inet = inet_sk(sk); + bool is_v4 = sk->sk_family == AF_INET; memset(a, 0, sizeof(*a)); - if (sk->sk_family == AF_INET) { +#if IS_ENABLED(CONFIG_IPV6) + if (!is_v4 && sk->sk_family == AF_INET6) + is_v4 = ipv6_addr_v4mapped(&sk->sk_v6_daddr); +#endif + if (is_v4) { a->sin_local.sin_family = AF_INET; a->sin_local.sin_port = inet->inet_sport; a->sin_local.sin_addr.s_addr = inet->inet_rcv_saddr; -- 2.53.0