mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 16:04:49 +00:00
lib: Add nexthop quick hash api
Add a nexthop hashing api for only hashing on word-sized attributes. Calling the jhash/jhash2 function is quite slow in scaled envrionments but sometimes you do need a more granular hash. The tradeoff here is that hashtable buckets using this hash might be more full. Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
This commit is contained in:
parent
62991a1167
commit
73a381871e
@ -387,29 +387,14 @@ 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)
|
||||
/* Only hash word-sized things, let cmp do the rest. */
|
||||
uint32_t nexthop_hash_quick(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);
|
||||
|
||||
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;
|
||||
int i = 0;
|
||||
@ -442,6 +427,31 @@ uint32_t nexthop_hash(const struct nexthop *nexthop)
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
#define GATE_SIZE 4 /* Number of uint32_t words in struct g_addr */
|
||||
|
||||
/* For a more granular hash */
|
||||
uint32_t nexthop_hash(const struct nexthop *nexthop)
|
||||
{
|
||||
uint32_t gate_src_rmap_raw[GATE_SIZE * 3] = {};
|
||||
/* Get all the quick stuff */
|
||||
uint32_t key = nexthop_hash_quick(nexthop);
|
||||
|
||||
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);
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
void nexthop_copy(struct nexthop *copy, const struct nexthop *nexthop,
|
||||
struct nexthop *rparent)
|
||||
{
|
||||
|
@ -137,6 +137,14 @@ void nexthop_del_labels(struct nexthop *);
|
||||
* 32-bit hash of nexthop
|
||||
*/
|
||||
uint32_t nexthop_hash(const struct nexthop *nexthop);
|
||||
/*
|
||||
* Hash a nexthop only on word-sized attributes:
|
||||
* - vrf_id
|
||||
* - ifindex
|
||||
* - type
|
||||
* - (some) flags
|
||||
*/
|
||||
uint32_t nexthop_hash_quick(const struct nexthop *nexthop);
|
||||
|
||||
extern bool nexthop_same(const struct nexthop *nh1, const struct nexthop *nh2);
|
||||
extern bool nexthop_same_no_labels(const struct nexthop *nh1,
|
||||
|
Loading…
Reference in New Issue
Block a user