From c59f754dd4ca63364107c4de4763beb46f1f6a0a Mon Sep 17 00:00:00 2001 From: Wesley Coakley Date: Thu, 27 Aug 2020 10:04:52 -0400 Subject: [PATCH 1/2] pbrd: be more selective about route updates Given a received nexthop update, only send down an update to the relevant nexthop group. Avoid sending down superfluous updates Signed-off-by: Wesley Coakley --- pbrd/pbr_nht.c | 18 ++++++++++++------ pbrd/pbr_nht.h | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/pbrd/pbr_nht.c b/pbrd/pbr_nht.c index e615818a10..d3636c9669 100644 --- a/pbrd/pbr_nht.c +++ b/pbrd/pbr_nht.c @@ -715,7 +715,7 @@ struct pbr_nht_individual { static bool pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc, - const struct pbr_nht_individual *pnhi) + struct pbr_nht_individual *pnhi) { bool is_valid = pnhc->valid; @@ -736,6 +736,7 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc, break; } + pnhi->nhr_matched = true; if (!pnhi->nhr->nexthop_num) { is_valid = false; goto done; @@ -767,8 +768,9 @@ done: return pnhc->valid; } -static bool pbr_nht_individual_nexthop_interface_update( - struct pbr_nexthop_cache *pnhc, const struct pbr_nht_individual *pnhi) +static bool +pbr_nht_individual_nexthop_interface_update(struct pbr_nexthop_cache *pnhc, + struct pbr_nht_individual *pnhi) { bool is_valid = pnhc->valid; @@ -779,6 +781,7 @@ static bool pbr_nht_individual_nexthop_interface_update( != pnhi->ifp->ifindex) /* Un-related interface */ goto done; + pnhi->nhr_matched = true; is_valid = !!if_is_up(pnhi->ifp); done: @@ -793,9 +796,8 @@ done: * If the update is un-related, the subroutines shoud just return their cached * valid state. */ -static void -pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc, - const struct pbr_nht_individual *pnhi) +static void pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc, + struct pbr_nht_individual *pnhi) { assert(pnhi->nhr || pnhi->ifp); /* Either nexthop or interface update */ @@ -870,9 +872,13 @@ static void pbr_nht_nexthop_update_lookup(struct hash_bucket *b, void *data) pnhi.nhr = (struct zapi_route *)data; pnhi.valid = 0; + pnhi.nhr_matched = false; hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_update_lookup, &pnhi); + if (!pnhi.nhr_matched) + return; + /* * If any of the specified nexthops are valid we are valid */ diff --git a/pbrd/pbr_nht.h b/pbrd/pbr_nht.h index bcd770c2cf..6346795215 100644 --- a/pbrd/pbr_nht.h +++ b/pbrd/pbr_nht.h @@ -55,6 +55,7 @@ struct pbr_nexthop_cache { bool looked_at; bool valid; + bool nhr_matched; }; extern void pbr_nht_write_table_range(struct vty *vty); From 4bf97ce1801835f5498852cd825d77c22d3b1e8b Mon Sep 17 00:00:00 2001 From: Wesley Coakley Date: Tue, 1 Sep 2020 12:34:48 -0400 Subject: [PATCH 2/2] pbrd: nh "valid" semantics in nexthop tracking Signed-off-by: Wesley Coakley --- pbrd/pbr_nht.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pbrd/pbr_nht.c b/pbrd/pbr_nht.c index d3636c9669..3fb3759049 100644 --- a/pbrd/pbr_nht.c +++ b/pbrd/pbr_nht.c @@ -708,7 +708,7 @@ struct pbr_nht_individual { struct pbr_nexthop_cache *pnhc; vrf_id_t old_vrf_id; - uint32_t valid; + bool valid; bool nhr_matched; }; @@ -839,7 +839,7 @@ static void pbr_nht_individual_nexthop_update_lookup(struct hash_bucket *b, pnhc->valid); if (pnhc->valid) - pnhi->valid += 1; + pnhi->valid = true; } static void pbr_nexthop_group_cache_iterate_to_group(struct hash_bucket *b, @@ -871,7 +871,7 @@ static void pbr_nht_nexthop_update_lookup(struct hash_bucket *b, void *data) old_valid = pnhgc->valid; pnhi.nhr = (struct zapi_route *)data; - pnhi.valid = 0; + pnhi.valid = false; pnhi.nhr_matched = false; hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_update_lookup, &pnhi); @@ -1091,7 +1091,7 @@ pbr_nht_individual_nexthop_interface_update_lookup(struct hash_bucket *b, old_valid, pnhc->valid); if (pnhc->valid) - pnhi->valid += 1; + pnhi->valid = true; } static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b, @@ -1104,14 +1104,14 @@ static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b, old_valid = pnhgc->valid; pnhi.ifp = data; - pnhi.valid = 0; + pnhi.valid = false; hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_interface_update_lookup, &pnhi); /* * If any of the specified nexthops are valid we are valid */ - pnhgc->valid = !!pnhi.valid; + pnhgc->valid = pnhi.valid; if (old_valid != pnhgc->valid) pbr_map_check_nh_group_change(pnhgc->name);