tcp: add ipv6_addr_v4mapped_loopback() helper
authorEric Dumazet <edumazet@google.com>
Tue, 1 Oct 2019 17:49:06 +0000 (10:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Oct 2019 20:07:53 +0000 (13:07 -0700)
tcp_twsk_unique() has a hard coded assumption about ipv4 loopback
being 127/8

Lets instead use the standard ipv4_is_loopback() method,
in a new ipv6_addr_v4mapped_loopback() helper.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ipv6.h
net/ipv4/tcp_ipv4.c

index 009605c56f209040d10f4878353aafa66c1a845f..d04b7abe2a4c3975edce9f4f0d91e6091ca4d401 100644 (file)
@@ -696,6 +696,11 @@ static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
                                        cpu_to_be32(0x0000ffff))) == 0UL;
 }
 
+static inline bool ipv6_addr_v4mapped_loopback(const struct in6_addr *a)
+{
+       return ipv6_addr_v4mapped(a) && ipv4_is_loopback(a->s6_addr32[3]);
+}
+
 static inline u32 ipv6_portaddr_hash(const struct net *net,
                                     const struct in6_addr *addr6,
                                     unsigned int port)
index 2ee45e3755e92e60b5e1810e2f68205221b8308d..27dc3c1e909494f54da18ea05bb0102de8ef5e5b 100644 (file)
@@ -121,11 +121,9 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
 #if IS_ENABLED(CONFIG_IPV6)
                if (tw->tw_family == AF_INET6) {
                        if (ipv6_addr_loopback(&tw->tw_v6_daddr) ||
-                           (ipv6_addr_v4mapped(&tw->tw_v6_daddr) &&
-                            (tw->tw_v6_daddr.s6_addr[12] == 127)) ||
+                           ipv6_addr_v4mapped_loopback(&tw->tw_v6_daddr) ||
                            ipv6_addr_loopback(&tw->tw_v6_rcv_saddr) ||
-                           (ipv6_addr_v4mapped(&tw->tw_v6_rcv_saddr) &&
-                            (tw->tw_v6_rcv_saddr.s6_addr[12] == 127)))
+                           ipv6_addr_v4mapped_loopback(&tw->tw_v6_rcv_saddr))
                                loopback = true;
                } else
 #endif