]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Hash: fixed rta hashing wrt. structure padding
authorJan Moskyto Matejka <mq@ucw.cz>
Thu, 12 May 2016 14:16:25 +0000 (16:16 +0200)
committerJan Moskyto Matejka <mq@ucw.cz>
Thu, 12 May 2016 14:16:25 +0000 (16:16 +0200)
lib/hash.h
nest/rt-attr.c

index b064146616128293d2e4750174d675c6578a88df..b86a2eb13594e3e0dc699fac6180b58e56444bc0 100644 (file)
 
 #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<s;i++)
-    value = value*multiplier + pp[i];
+  const char *pp = p;
+  uint i;
+  for (i=0; i<s; i++)
+    *h = *h * multiplier + pp[i];
+}
 
+static inline uint
+mem_hash_value(mem_hash_t *h)
+{
   return ((value >> 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);
+}
+
index 7d9605c2632f9b206f00c8db3965a1597dd33c97..62340530ac8c18bfdb2a91184738680df3bb2d7d 100644 (file)
@@ -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