From c59f754dd4ca63364107c4de4763beb46f1f6a0a Mon Sep 17 00:00:00 2001 From: Wesley Coakley Date: Thu, 27 Aug 2020 10:04:52 -0400 Subject: [PATCH] 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);