From: Jan Moskyto Matejka Date: Thu, 12 May 2016 14:16:25 +0000 (+0200) Subject: Hash: fixed rta hashing wrt. structure padding X-Git-Tag: v2.0.0-pre0~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=54ac0beceedb9b36eb58dd8599ba903c668382f6;p=thirdparty%2Fbird.git Hash: fixed rta hashing wrt. structure padding --- diff --git a/lib/hash.h b/lib/hash.h index b06414661..b86a2eb13 100644 --- a/lib/hash.h +++ b/lib/hash.h @@ -178,16 +178,36 @@ #define HASH_WALK_FILTER_END } while (0) -static inline uint -mem_hash(void *p, int s) +typedef mem_hash_t u64; + +static inline void +mem_hash_init(mem_hash_t *h) +{ + *h = 0x001047d54778bcafULL; +} + +static inline void +mem_hash_mix(mem_hash_t *h, void *p, int s) { - const char *pp = p; const u64 multiplier = 0xb38bc09a61202731ULL; - u64 value = 0x001047d54778bcafULL; - int i; - for (i=0;i> 32) ^ (value & 0xffffffff)); } +static inline uint +mem_hash(void *p, int s) +{ + static mem_hash_t h; + mem_hash_init(&h); + mem_hash_mix(&h, p, s); + return mem_hash_value(&h); +} + diff --git a/nest/rt-attr.c b/nest/rt-attr.c index 7d9605c26..62340530a 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -946,8 +946,23 @@ rta_alloc_hash(void) static inline uint rta_hash(rta *a) { - return mem_hash(((void *)a) + offsetof(rta, src), sizeof(rta) - offsetof(rta, src)) ^ - mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs); + mem_hash_t h; + mem_hash_init(&h); +#define MIX(f) mem_hash_mix(&h, &(rta->f), sizeof(rta->f)); + MIX(src); + MIX(hostentry); + MIX(iface); + MIX(gw); + MIX(from); + MIX(igp_metric); + MIX(source); + MIX(scope); + MIX(cast); + MIX(dest); + MIX(flags); + MIX(aflags); + + return mem_hash_value(&h) ^ mpnh_hash(a->nexthops) ^ ea_hash(a->eattrs); } static inline int