]> Pileus Git - ~andy/linux/commitdiff
ipv6: split inet6_ehashfn to hash functions per compilation unit
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Sat, 19 Oct 2013 19:48:52 +0000 (21:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Oct 2013 23:45:34 +0000 (19:45 -0400)
This patch splits the inet6_ehashfn into separate ones in
ipv6/inet6_hashtables.o and ipv6/udp.o to ease the introduction of
seperate secrets keys later.

Cc: Eric Dumazet <edumazet@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet6_hashtables.h
include/net/ipv6.h
net/ipv6/inet6_hashtables.c
net/ipv6/udp.c

index a105d1a2fc0021ad413726be947ef51c89e1744a..ae061354430836687225be9ae1a8c1f09a35ed8a 100644 (file)
 
 struct inet_hashinfo;
 
-static inline unsigned int inet6_ehashfn(struct net *net,
-                               const struct in6_addr *laddr, const u16 lport,
-                               const struct in6_addr *faddr, const __be16 fport)
+static inline unsigned int __inet6_ehashfn(const u32 lhash,
+                                   const u16 lport,
+                                   const u32 fhash,
+                                   const __be16 fport,
+                                   const u32 initval)
 {
-       u32 ports = (((u32)lport) << 16) | (__force u32)fport;
-
-       return jhash_3words((__force u32)laddr->s6_addr32[3],
-                           ipv6_addr_jhash(faddr),
-                           ports,
-                           inet_ehash_secret + net_hash_mix(net));
-}
-
-static inline int inet6_sk_ehashfn(const struct sock *sk)
-{
-       const struct inet_sock *inet = inet_sk(sk);
-       const struct in6_addr *laddr = &sk->sk_v6_rcv_saddr;
-       const struct in6_addr *faddr = &sk->sk_v6_daddr;
-       const __u16 lport = inet->inet_num;
-       const __be16 fport = inet->inet_dport;
-       struct net *net = sock_net(sk);
-
-       return inet6_ehashfn(net, laddr, lport, faddr, fport);
+       const u32 ports = (((u32)lport) << 16) | (__force u32)fport;
+       return jhash_3words(lhash, fhash, ports, initval);
 }
 
 int __inet6_hash(struct sock *sk, struct inet_timewait_sock *twp);
index fe1c7f6c92177e6ef47165078cb0eb0909eb07eb..a35055f4f8da1b280cba2e893ec361399694a5f3 100644 (file)
@@ -539,14 +539,14 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a)
 }
 
 /* more secured version of ipv6_addr_hash() */
-static inline u32 ipv6_addr_jhash(const struct in6_addr *a)
+static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
 {
        u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
 
        return jhash_3words(v,
                            (__force u32)a->s6_addr32[2],
                            (__force u32)a->s6_addr32[3],
-                           ipv6_hash_secret);
+                           initval);
 }
 
 static inline bool ipv6_addr_loopback(const struct in6_addr *a)
index 842d833dfc186122a167d985763d8e637c11018e..fa7dd3856c555d0c6dcd4c04062c7983b1aeb61b 100644 (file)
 #include <net/secure_seq.h>
 #include <net/ip.h>
 
+static unsigned int inet6_ehashfn(struct net *net,
+                                 const struct in6_addr *laddr,
+                                 const u16 lport,
+                                 const struct in6_addr *faddr,
+                                 const __be16 fport)
+{
+       const u32 lhash = (__force u32)laddr->s6_addr32[3];
+       const u32 fhash = __ipv6_addr_jhash(faddr, ipv6_hash_secret);
+       return __inet6_ehashfn(lhash, lport, fhash, fport,
+                              inet_ehash_secret + net_hash_mix(net));
+}
+
+static int inet6_sk_ehashfn(const struct sock *sk)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       const struct in6_addr *laddr = &sk->sk_v6_rcv_saddr;
+       const struct in6_addr *faddr = &sk->sk_v6_daddr;
+       const __u16 lport = inet->inet_num;
+       const __be16 fport = inet->inet_dport;
+       struct net *net = sock_net(sk);
+
+       return inet6_ehashfn(net, laddr, lport, faddr, fport);
+}
+
 int __inet6_hash(struct sock *sk, struct inet_timewait_sock *tw)
 {
        struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo;
index b496de19a3419f4a1c178c28e40050d2e3de69c6..324bd36c23bce8601968710b142a08e905019ddf 100644 (file)
 #include <trace/events/skb.h>
 #include "udp_impl.h"
 
+static unsigned int udp6_ehashfn(struct net *net,
+                                 const struct in6_addr *laddr,
+                                 const u16 lport,
+                                 const struct in6_addr *faddr,
+                                 const __be16 fport)
+{
+       const u32 lhash = (__force u32)laddr->s6_addr32[3];
+       const u32 fhash = __ipv6_addr_jhash(faddr, ipv6_hash_secret);
+       return __inet6_ehashfn(lhash, lport, fhash, fport,
+                              inet_ehash_secret + net_hash_mix(net));
+}
+
 int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
 {
        const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
@@ -214,8 +226,8 @@ begin:
                        badness = score;
                        reuseport = sk->sk_reuseport;
                        if (reuseport) {
-                               hash = inet6_ehashfn(net, daddr, hnum,
-                                                    saddr, sport);
+                               hash = udp6_ehashfn(net, daddr, hnum,
+                                                   saddr, sport);
                                matches = 1;
                        } else if (score == SCORE2_MAX)
                                goto exact_match;
@@ -295,8 +307,8 @@ begin:
                        badness = score;
                        reuseport = sk->sk_reuseport;
                        if (reuseport) {
-                               hash = inet6_ehashfn(net, daddr, hnum,
-                                                    saddr, sport);
+                               hash = udp6_ehashfn(net, daddr, hnum,
+                                                   saddr, sport);
                                matches = 1;
                        }
                } else if (score == badness && reuseport) {