This patch moves the udp[46]_portaddr_hash()
to net/ip[v6].h.  The function name is renamed to
ipv[46]_portaddr_hash().

It will be used by a later patch which adds a second listener
hashtable hashed by the address and port.

Signed-off-by: Martin KaFai Lau <ka...@fb.com>
---
 include/net/ip.h   |  9 +++++++++
 include/net/ipv6.h | 17 +++++++++++++++++
 net/ipv4/udp.c     | 22 ++++++++--------------
 net/ipv6/udp.c     | 32 ++++++++------------------------
 4 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/include/net/ip.h b/include/net/ip.h
index 9896f46cbbf1..fc9bf1b1fe2c 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -26,12 +26,14 @@
 #include <linux/ip.h>
 #include <linux/in.h>
 #include <linux/skbuff.h>
+#include <linux/jhash.h>
 
 #include <net/inet_sock.h>
 #include <net/route.h>
 #include <net/snmp.h>
 #include <net/flow.h>
 #include <net/flow_dissector.h>
+#include <net/netns/hash.h>
 
 #define IPV4_MAX_PMTU          65535U          /* RFC 2675, Section 5.1 */
 
@@ -521,6 +523,13 @@ static inline unsigned int ipv4_addr_hash(__be32 ip)
        return (__force unsigned int) ip;
 }
 
+static inline u32 ipv4_portaddr_hash(const struct net *net,
+                                    __be32 saddr,
+                                    unsigned int port)
+{
+       return jhash_1word((__force u32)saddr, net_hash_mix(net)) ^ port;
+}
+
 bool ip_call_ra_chain(struct sk_buff *skb);
 
 /*
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index ec14f0d5a3a1..e337ecb3284f 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -22,6 +22,7 @@
 #include <net/flow.h>
 #include <net/flow_dissector.h>
 #include <net/snmp.h>
+#include <net/netns/hash.h>
 
 #define SIN6_LEN_RFC2133       24
 
@@ -673,6 +674,22 @@ static inline bool ipv6_addr_v4mapped(const struct 
in6_addr *a)
                                        cpu_to_be32(0x0000ffff))) == 0UL;
 }
 
+static inline u32 ipv6_portaddr_hash(const struct net *net,
+                                    const struct in6_addr *addr6,
+                                    unsigned int port)
+{
+       unsigned int hash, mix = net_hash_mix(net);
+
+       if (ipv6_addr_any(addr6))
+               hash = jhash_1word(0, mix);
+       else if (ipv6_addr_v4mapped(addr6))
+               hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
+       else
+               hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
+
+       return hash ^ port;
+}
+
 /*
  * Check for a RFC 4843 ORCHID address
  * (Overlay Routable Cryptographic Hash Identifiers)
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index e4ff25c947c5..057392a47c92 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -357,18 +357,12 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
 }
 EXPORT_SYMBOL(udp_lib_get_port);
 
-static u32 udp4_portaddr_hash(const struct net *net, __be32 saddr,
-                             unsigned int port)
-{
-       return jhash_1word((__force u32)saddr, net_hash_mix(net)) ^ port;
-}
-
 int udp_v4_get_port(struct sock *sk, unsigned short snum)
 {
        unsigned int hash2_nulladdr =
-               udp4_portaddr_hash(sock_net(sk), htonl(INADDR_ANY), snum);
+               ipv4_portaddr_hash(sock_net(sk), htonl(INADDR_ANY), snum);
        unsigned int hash2_partial =
-               udp4_portaddr_hash(sock_net(sk), inet_sk(sk)->inet_rcv_saddr, 
0);
+               ipv4_portaddr_hash(sock_net(sk), inet_sk(sk)->inet_rcv_saddr, 
0);
 
        /* precompute partial secondary hash */
        udp_sk(sk)->udp_portaddr_hash = hash2_partial;
@@ -492,7 +486,7 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 
saddr,
        u32 hash = 0;
 
        if (hslot->count > 10) {
-               hash2 = udp4_portaddr_hash(net, daddr, hnum);
+               hash2 = ipv4_portaddr_hash(net, daddr, hnum);
                slot2 = hash2 & udptable->mask;
                hslot2 = &udptable->hash2[slot2];
                if (hslot->count < hslot2->count)
@@ -503,7 +497,7 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 
saddr,
                                          exact_dif, hslot2, skb);
                if (!result) {
                        unsigned int old_slot2 = slot2;
-                       hash2 = udp4_portaddr_hash(net, htonl(INADDR_ANY), 
hnum);
+                       hash2 = ipv4_portaddr_hash(net, htonl(INADDR_ANY), 
hnum);
                        slot2 = hash2 & udptable->mask;
                        /* avoid searching the same slot again. */
                        if (unlikely(slot2 == old_slot2))
@@ -1775,7 +1769,7 @@ EXPORT_SYMBOL(udp_lib_rehash);
 
 static void udp_v4_rehash(struct sock *sk)
 {
-       u16 new_hash = udp4_portaddr_hash(sock_net(sk),
+       u16 new_hash = ipv4_portaddr_hash(sock_net(sk),
                                          inet_sk(sk)->inet_rcv_saddr,
                                          inet_sk(sk)->inet_num);
        udp_lib_rehash(sk, new_hash);
@@ -1966,9 +1960,9 @@ static int __udp4_lib_mcast_deliver(struct net *net, 
struct sk_buff *skb,
        struct sk_buff *nskb;
 
        if (use_hash2) {
-               hash2_any = udp4_portaddr_hash(net, htonl(INADDR_ANY), hnum) &
+               hash2_any = ipv4_portaddr_hash(net, htonl(INADDR_ANY), hnum) &
                            udptable->mask;
-               hash2 = udp4_portaddr_hash(net, daddr, hnum) & udptable->mask;
+               hash2 = ipv4_portaddr_hash(net, daddr, hnum) & udptable->mask;
 start_lookup:
                hslot = &udptable->hash2[hash2];
                offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node);
@@ -2200,7 +2194,7 @@ static struct sock *__udp4_lib_demux_lookup(struct net 
*net,
                                            int dif, int sdif)
 {
        unsigned short hnum = ntohs(loc_port);
-       unsigned int hash2 = udp4_portaddr_hash(net, loc_addr, hnum);
+       unsigned int hash2 = ipv4_portaddr_hash(net, loc_addr, hnum);
        unsigned int slot2 = hash2 & udp_table.mask;
        struct udp_hslot *hslot2 = &udp_table.hash2[slot2];
        INET_ADDR_COOKIE(acookie, rmt_addr, loc_addr);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 3f30fa313bf2..8cca3fcf3213 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -89,28 +89,12 @@ static u32 udp6_ehashfn(const struct net *net,
                               udp_ipv6_hash_secret + net_hash_mix(net));
 }
 
-static u32 udp6_portaddr_hash(const struct net *net,
-                             const struct in6_addr *addr6,
-                             unsigned int port)
-{
-       unsigned int hash, mix = net_hash_mix(net);
-
-       if (ipv6_addr_any(addr6))
-               hash = jhash_1word(0, mix);
-       else if (ipv6_addr_v4mapped(addr6))
-               hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
-       else
-               hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
-
-       return hash ^ port;
-}
-
 int udp_v6_get_port(struct sock *sk, unsigned short snum)
 {
        unsigned int hash2_nulladdr =
-               udp6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
+               ipv6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
        unsigned int hash2_partial =
-               udp6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0);
+               ipv6_portaddr_hash(sock_net(sk), &sk->sk_v6_rcv_saddr, 0);
 
        /* precompute partial secondary hash */
        udp_sk(sk)->udp_portaddr_hash = hash2_partial;
@@ -119,7 +103,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
 
 static void udp_v6_rehash(struct sock *sk)
 {
-       u16 new_hash = udp6_portaddr_hash(sock_net(sk),
+       u16 new_hash = ipv6_portaddr_hash(sock_net(sk),
                                          &sk->sk_v6_rcv_saddr,
                                          inet_sk(sk)->inet_num);
 
@@ -232,7 +216,7 @@ struct sock *__udp6_lib_lookup(struct net *net,
        u32 hash = 0;
 
        if (hslot->count > 10) {
-               hash2 = udp6_portaddr_hash(net, daddr, hnum);
+               hash2 = ipv6_portaddr_hash(net, daddr, hnum);
                slot2 = hash2 & udptable->mask;
                hslot2 = &udptable->hash2[slot2];
                if (hslot->count < hslot2->count)
@@ -243,7 +227,7 @@ struct sock *__udp6_lib_lookup(struct net *net,
                                          hslot2, skb);
                if (!result) {
                        unsigned int old_slot2 = slot2;
-                       hash2 = udp6_portaddr_hash(net, &in6addr_any, hnum);
+                       hash2 = ipv6_portaddr_hash(net, &in6addr_any, hnum);
                        slot2 = hash2 & udptable->mask;
                        /* avoid searching the same slot again. */
                        if (unlikely(slot2 == old_slot2))
@@ -719,9 +703,9 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct 
sk_buff *skb,
        struct sk_buff *nskb;
 
        if (use_hash2) {
-               hash2_any = udp6_portaddr_hash(net, &in6addr_any, hnum) &
+               hash2_any = ipv6_portaddr_hash(net, &in6addr_any, hnum) &
                            udptable->mask;
-               hash2 = udp6_portaddr_hash(net, daddr, hnum) & udptable->mask;
+               hash2 = ipv6_portaddr_hash(net, daddr, hnum) & udptable->mask;
 start_lookup:
                hslot = &udptable->hash2[hash2];
                offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node);
@@ -909,7 +893,7 @@ static struct sock *__udp6_lib_demux_lookup(struct net *net,
                        int dif, int sdif)
 {
        unsigned short hnum = ntohs(loc_port);
-       unsigned int hash2 = udp6_portaddr_hash(net, loc_addr, hnum);
+       unsigned int hash2 = ipv6_portaddr_hash(net, loc_addr, hnum);
        unsigned int slot2 = hash2 & udp_table.mask;
        struct udp_hslot *hslot2 = &udp_table.hash2[slot2];
        const __portpair ports = INET_COMBINED_PORTS(rmt_port, hnum);
-- 
2.9.5

Reply via email to