From 62fa17df26348ba62b175ec80841ea9f9e6bb444 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Mon, 17 Dec 2007 22:45:13 -0800 Subject: [PATCH] --- yaml --- r: 78555 b: refs/heads/master c: e2f82ac3fcffffca59751b65124544d11ed8be4a h: refs/heads/master i: 78553: 21917712e4d0f15c79e9a8bc527358480c92da5d 78551: fd5c3ff058958c9e4f568e08bc36aa4d413d1c0e v: v3 --- [refs] | 2 +- trunk/net/netfilter/xt_hashlimit.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 52066965494e..ee34a3f29376 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 22c2d8bca212a655c120fd6617328ffa3480afad +refs/heads/master: e2f82ac3fcffffca59751b65124544d11ed8be4a diff --git a/trunk/net/netfilter/xt_hashlimit.c b/trunk/net/netfilter/xt_hashlimit.c index 951d4c829674..651c1d26564a 100644 --- a/trunk/net/netfilter/xt_hashlimit.c +++ b/trunk/net/netfilter/xt_hashlimit.c @@ -105,7 +105,16 @@ static inline bool dst_cmp(const struct dsthash_ent *ent, static u_int32_t hash_dst(const struct xt_hashlimit_htable *ht, const struct dsthash_dst *dst) { - return jhash(dst, sizeof(*dst), ht->rnd) % ht->cfg.size; + u_int32_t hash = jhash2((const u32 *)dst, + sizeof(*dst)/sizeof(u32), + ht->rnd); + /* + * Instead of returning hash % ht->cfg.size (implying a divide) + * we return the high 32 bits of the (hash * ht->cfg.size) that will + * give results between [0 and cfg.size-1] and same hash distribution, + * but using a multiply, less expensive than a divide + */ + return ((u64)hash * ht->cfg.size) >> 32; } static struct dsthash_ent *