- memcpy (&t1, eth->src_address, sizeof (eth->src_address));
- memcpy (&t2, eth->dst_address, sizeof (eth->dst_address));
- a = t1 ^ t2;
-
- b = (ip6->src_address.as_u64[0] ^ ip6->src_address.as_u64[1]);
- c = (ip6->dst_address.as_u64[0] ^ ip6->dst_address.as_u64[1]);
-
- hash_mix64 (a, b, c);
- return c % slave_count;
+ mac1 = (u32 *) & eth->dst_address[0];
+ mac2 = (u32 *) & eth->dst_address[4];
+ mac3 = (u32 *) & eth->src_address[2];
+
+ a = clib_mem_unaligned (mac1, u32) ^ clib_mem_unaligned (mac2, u32) ^
+ clib_mem_unaligned (mac3, u32);
+ c =
+ lb_hash_hash (clib_mem_unaligned
+ (&ip6->src_address.as_uword[0], uword),
+ clib_mem_unaligned (&ip6->src_address.as_uword[1],
+ uword),
+ clib_mem_unaligned (&ip6->dst_address.as_uword[0],
+ uword),
+ clib_mem_unaligned (&ip6->dst_address.as_uword[1],
+ uword), a);
+ if (BOND_MODULO_SHORTCUT (slave_count))
+ return (c & (slave_count - 1));
+ else
+ return c % slave_count;