[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.