]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/net/inet6_hashtables.h
epoll cleanups: epoll remove static pre-declarations and akpm-ize the code
[linux-2.6-omap-h63xx.git] / include / net / inet6_hashtables.h
index 59f0c83d55a243913eec31fefe22433213a8d48b..668056b4bb0b9982b249b96bf8c33ceb5435c912 100644 (file)
 #ifndef _INET6_HASHTABLES_H
 #define _INET6_HASHTABLES_H
 
-#include <linux/config.h>
 
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
 #include <linux/in6.h>
 #include <linux/ipv6.h>
 #include <linux/types.h>
+#include <linux/jhash.h>
+
+#include <net/inet_sock.h>
 
 #include <net/ipv6.h>
 
@@ -27,14 +29,13 @@ struct inet_hashinfo;
 
 /* I have no idea if this is a good hash for v6 or not. -DaveM */
 static inline unsigned int inet6_ehashfn(const struct in6_addr *laddr, const u16 lport,
-                               const struct in6_addr *faddr, const u16 fport)
+                               const struct in6_addr *faddr, const __be16 fport)
 {
-       unsigned int hashent = (lport ^ fport);
+       u32 ports = (lport ^ (__force u16)fport);
 
-       hashent ^= (laddr->s6_addr32[3] ^ faddr->s6_addr32[3]);
-       hashent ^= hashent >> 16;
-       hashent ^= hashent >> 8;
-       return hashent;
+       return jhash_3words((__force u32)laddr->s6_addr32[3],
+                           (__force u32)faddr->s6_addr32[3],
+                           ports, inet_ehash_secret);
 }
 
 static inline int inet6_sk_ehashfn(const struct sock *sk)
@@ -44,7 +45,7 @@ static inline int inet6_sk_ehashfn(const struct sock *sk)
        const struct in6_addr *laddr = &np->rcv_saddr;
        const struct in6_addr *faddr = &np->daddr;
        const __u16 lport = inet->num;
-       const __u16 fport = inet->dport;
+       const __be16 fport = inet->dport;
        return inet6_ehashfn(laddr, lport, faddr, fport);
 }
 
@@ -58,7 +59,7 @@ extern void __inet6_hash(struct inet_hashinfo *hashinfo, struct sock *sk);
  */
 extern struct sock *__inet6_lookup_established(struct inet_hashinfo *hashinfo,
                                           const struct in6_addr *saddr,
-                                          const u16 sport,
+                                          const __be16 sport,
                                           const struct in6_addr *daddr,
                                           const u16 hnum,
                                           const int dif);
@@ -70,7 +71,7 @@ extern struct sock *inet6_lookup_listener(struct inet_hashinfo *hashinfo,
 
 static inline struct sock *__inet6_lookup(struct inet_hashinfo *hashinfo,
                                          const struct in6_addr *saddr,
-                                         const u16 sport,
+                                         const __be16 sport,
                                          const struct in6_addr *daddr,
                                          const u16 hnum,
                                          const int dif)
@@ -84,8 +85,8 @@ static inline struct sock *__inet6_lookup(struct inet_hashinfo *hashinfo,
 }
 
 extern struct sock *inet6_lookup(struct inet_hashinfo *hashinfo,
-                                const struct in6_addr *saddr, const u16 sport,
-                                const struct in6_addr *daddr, const u16 dport,
+                                const struct in6_addr *saddr, const __be16 sport,
+                                const struct in6_addr *daddr, const __be16 dport,
                                 const int dif);
 #endif /* defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) */
 #endif /* _INET6_HASHTABLES_H */