]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Call nexthop g_addr hashes together
authorStephen Worley <sworley@cumulusnetworks.com>
Tue, 6 Aug 2019 21:30:16 +0000 (17:30 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Fri, 25 Oct 2019 15:13:42 +0000 (11:13 -0400)
When hashing a nexthop, shove all the nexthop g_addr data together
and pass it as one call to jhash2() to optimize a bit better.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
lib/nexthop.c

index e68e605a6f897b5bf8be9d3c0459b2f88ae43611..da7c934efa910d1c66989ca21e5a1b4f09dcb80f 100644 (file)
@@ -374,16 +374,28 @@ unsigned int nexthop_level(struct nexthop *nexthop)
        return rv;
 }
 
+#define GATE_SIZE 4 /* Number of uint32_t words in struct g_addr */
+
 uint32_t nexthop_hash(const struct nexthop *nexthop)
 {
+
        uint32_t key = 0x45afe398;
+       uint32_t gate_src_rmap_raw[GATE_SIZE * 3] = {};
 
        key = jhash_3words(nexthop->type, nexthop->vrf_id,
                           nexthop->nh_label_type, key);
-       /* gate and blackhole are together in a union */
-       key = jhash(&nexthop->gate, sizeof(nexthop->gate), key);
-       key = jhash(&nexthop->src, sizeof(nexthop->src), key);
-       key = jhash(&nexthop->rmap_src, sizeof(nexthop->rmap_src), key);
+
+       assert(((sizeof(nexthop->gate) + sizeof(nexthop->src)
+                + sizeof(nexthop->rmap_src))
+               / 3)
+              == (GATE_SIZE * sizeof(uint32_t)));
+
+       memcpy(gate_src_rmap_raw, &nexthop->gate, GATE_SIZE);
+       memcpy(gate_src_rmap_raw + GATE_SIZE, &nexthop->src, GATE_SIZE);
+       memcpy(gate_src_rmap_raw + (2 * GATE_SIZE), &nexthop->rmap_src,
+              GATE_SIZE);
+
+       key = jhash2(gate_src_rmap_raw, (GATE_SIZE * 3), key);
 
        if (nexthop->nh_label) {
                int labels = nexthop->nh_label->num_labels;