Commit 776d6b2c authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

Merge remote-tracking branch 'origin/int-new' into int-new

parents af678af0 54ac0bec
Loading
Loading
Loading
Loading
+27 −7
Original line number Diff line number Diff line
@@ -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;
  const char *pp = p;
  uint i;
  for (i=0; i<s; i++)
    value = value*multiplier + pp[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);
}
+17 −2
Original line number Diff line number Diff line
@@ -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