Commit 16d2c25c authored by David S. Miller's avatar David S. Miller Committed by David S. Miller

[NET]: Convert neigh hashing over to jenkins.

Based upon work by Harald Welte <laforge@netfilter.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d09c9caa
...@@ -175,6 +175,7 @@ struct neigh_table ...@@ -175,6 +175,7 @@ struct neigh_table
struct neigh_statistics stats; struct neigh_statistics stats;
struct neighbour **hash_buckets; struct neighbour **hash_buckets;
unsigned int hash_mask; unsigned int hash_mask;
__u32 hash_rnd;
struct pneigh_entry **phash_buckets; struct pneigh_entry **phash_buckets;
}; };
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/jhash.h>
#include <net/route.h> /* for struct rtable and routing */ #include <net/route.h> /* for struct rtable and routing */
#include <net/icmp.h> /* icmp_send */ #include <net/icmp.h> /* icmp_send */
#include <asm/param.h> /* for HZ */ #include <asm/param.h> /* for HZ */
...@@ -328,15 +329,7 @@ static int clip_constructor(struct neighbour *neigh) ...@@ -328,15 +329,7 @@ static int clip_constructor(struct neighbour *neigh)
static u32 clip_hash(const void *pkey, const struct net_device *dev) static u32 clip_hash(const void *pkey, const struct net_device *dev)
{ {
u32 hash_val; return jhash_2words(*(u32 *)pkey, dev->ifindex, clip_tbl.hash_rnd);
hash_val = *(u32*)pkey;
hash_val ^= (hash_val>>16);
hash_val ^= hash_val>>8;
hash_val ^= hash_val>>3;
hash_val = (hash_val^dev->ifindex);
return hash_val;
} }
static struct neigh_table clip_tbl = { static struct neigh_table clip_tbl = {
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <net/dst.h> #include <net/dst.h>
#include <net/sock.h> #include <net/sock.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/random.h>
#define NEIGH_DEBUG 1 #define NEIGH_DEBUG 1
...@@ -1317,6 +1318,8 @@ void neigh_table_init(struct neigh_table *tbl) ...@@ -1317,6 +1318,8 @@ void neigh_table_init(struct neigh_table *tbl)
memset(tbl->phash_buckets, 0, phsize); memset(tbl->phash_buckets, 0, phsize);
get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));
tbl->lock = RW_LOCK_UNLOCKED; tbl->lock = RW_LOCK_UNLOCKED;
init_timer(&tbl->gc_timer); init_timer(&tbl->gc_timer);
tbl->gc_timer.data = (unsigned long)tbl; tbl->gc_timer.data = (unsigned long)tbl;
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/jhash.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <net/neighbour.h> #include <net/neighbour.h>
#include <net/dst.h> #include <net/dst.h>
...@@ -122,13 +123,7 @@ struct neigh_table dn_neigh_table = { ...@@ -122,13 +123,7 @@ struct neigh_table dn_neigh_table = {
static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev) static u32 dn_neigh_hash(const void *pkey, const struct net_device *dev)
{ {
u32 hash_val; return jhash_2words(*(dn_address *)pkey, 0, dn_neigh_table.hash_rnd);
hash_val = *(dn_address *)pkey;
hash_val ^= (hash_val >> 10);
hash_val ^= (hash_val >> 3);
return hash_val;
} }
static int dn_neigh_construct(struct neighbour *neigh) static int dn_neigh_construct(struct neighbour *neigh)
......
...@@ -71,6 +71,7 @@ ...@@ -71,6 +71,7 @@
* arp_xmit so intermediate drivers like * arp_xmit so intermediate drivers like
* bonding can change the skb before * bonding can change the skb before
* sending (e.g. insert 8021q tag). * sending (e.g. insert 8021q tag).
* Harald Welte : convert to make use of jenkins hash
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -97,6 +98,7 @@ ...@@ -97,6 +98,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/net.h> #include <linux/net.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/jhash.h>
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
#include <linux/sysctl.h> #include <linux/sysctl.h>
#endif #endif
...@@ -223,15 +225,7 @@ int arp_mc_map(u32 addr, u8 *haddr, struct net_device *dev, int dir) ...@@ -223,15 +225,7 @@ int arp_mc_map(u32 addr, u8 *haddr, struct net_device *dev, int dir)
static u32 arp_hash(const void *pkey, const struct net_device *dev) static u32 arp_hash(const void *pkey, const struct net_device *dev)
{ {
u32 hash_val; return jhash_2words(*(u32 *)pkey, dev->ifindex, arp_tbl.hash_rnd);
hash_val = *(u32*)pkey;
hash_val ^= (hash_val>>16);
hash_val ^= hash_val>>8;
hash_val ^= hash_val>>3;
hash_val = (hash_val^dev->ifindex);
return hash_val;
} }
static int arp_constructor(struct neighbour *neigh) static int arp_constructor(struct neighbour *neigh)
......
...@@ -66,6 +66,7 @@ ...@@ -66,6 +66,7 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/ipv6.h> #include <linux/ipv6.h>
#include <linux/icmpv6.h> #include <linux/icmpv6.h>
#include <linux/jhash.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/snmp.h> #include <net/snmp.h>
...@@ -270,15 +271,14 @@ int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int d ...@@ -270,15 +271,14 @@ int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int d
static u32 ndisc_hash(const void *pkey, const struct net_device *dev) static u32 ndisc_hash(const void *pkey, const struct net_device *dev)
{ {
u32 hash_val; const u32 *p32 = pkey;
u32 addr_hash, i;
hash_val = *(u32*)(pkey + sizeof(struct in6_addr) - 4); addr_hash = 0;
hash_val ^= (hash_val>>16); for (i = 0; i < (sizeof(struct in6_addr) / sizeof(u32)); i++)
hash_val ^= hash_val>>8; addr_hash ^= *p32++;
hash_val ^= hash_val>>3;
hash_val = (hash_val^dev->ifindex);
return hash_val; return jhash_2words(addr_hash, dev->ifindex, nd_tbl.hash_rnd);
} }
static int ndisc_constructor(struct neighbour *neigh) static int ndisc_constructor(struct neighbour *neigh)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment