Merge pull request #7010 from wesleycoakley/pbrd-more-selective

pbrd: be more selective about route updates
This commit is contained in:
Mark Stapp 2020-09-01 14:54:18 -04:00 committed by GitHub
commit ceb987a877
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 12 deletions

View File

@ -708,14 +708,14 @@ struct pbr_nht_individual {
struct pbr_nexthop_cache *pnhc; struct pbr_nexthop_cache *pnhc;
vrf_id_t old_vrf_id; vrf_id_t old_vrf_id;
uint32_t valid; bool valid;
bool nhr_matched; bool nhr_matched;
}; };
static bool static bool
pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc, 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; bool is_valid = pnhc->valid;
@ -736,6 +736,7 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
break; break;
} }
pnhi->nhr_matched = true;
if (!pnhi->nhr->nexthop_num) { if (!pnhi->nhr->nexthop_num) {
is_valid = false; is_valid = false;
goto done; goto done;
@ -767,8 +768,9 @@ done:
return pnhc->valid; return pnhc->valid;
} }
static bool pbr_nht_individual_nexthop_interface_update( static bool
struct pbr_nexthop_cache *pnhc, const struct pbr_nht_individual *pnhi) pbr_nht_individual_nexthop_interface_update(struct pbr_nexthop_cache *pnhc,
struct pbr_nht_individual *pnhi)
{ {
bool is_valid = pnhc->valid; bool is_valid = pnhc->valid;
@ -779,6 +781,7 @@ static bool pbr_nht_individual_nexthop_interface_update(
!= pnhi->ifp->ifindex) /* Un-related interface */ != pnhi->ifp->ifindex) /* Un-related interface */
goto done; goto done;
pnhi->nhr_matched = true;
is_valid = !!if_is_up(pnhi->ifp); is_valid = !!if_is_up(pnhi->ifp);
done: done:
@ -793,9 +796,8 @@ done:
* If the update is un-related, the subroutines shoud just return their cached * If the update is un-related, the subroutines shoud just return their cached
* valid state. * valid state.
*/ */
static void static void pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc,
pbr_nht_individual_nexthop_update(struct pbr_nexthop_cache *pnhc, struct pbr_nht_individual *pnhi)
const struct pbr_nht_individual *pnhi)
{ {
assert(pnhi->nhr || pnhi->ifp); /* Either nexthop or interface update */ assert(pnhi->nhr || pnhi->ifp); /* Either nexthop or interface update */
@ -837,7 +839,7 @@ static void pbr_nht_individual_nexthop_update_lookup(struct hash_bucket *b,
pnhc->valid); pnhc->valid);
if (pnhc->valid) if (pnhc->valid)
pnhi->valid += 1; pnhi->valid = true;
} }
static void pbr_nexthop_group_cache_iterate_to_group(struct hash_bucket *b, static void pbr_nexthop_group_cache_iterate_to_group(struct hash_bucket *b,
@ -869,10 +871,14 @@ static void pbr_nht_nexthop_update_lookup(struct hash_bucket *b, void *data)
old_valid = pnhgc->valid; old_valid = pnhgc->valid;
pnhi.nhr = (struct zapi_route *)data; 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, hash_iterate(pnhgc->nhh, pbr_nht_individual_nexthop_update_lookup,
&pnhi); &pnhi);
if (!pnhi.nhr_matched)
return;
/* /*
* If any of the specified nexthops are valid we are valid * If any of the specified nexthops are valid we are valid
*/ */
@ -1085,7 +1091,7 @@ pbr_nht_individual_nexthop_interface_update_lookup(struct hash_bucket *b,
old_valid, pnhc->valid); old_valid, pnhc->valid);
if (pnhc->valid) if (pnhc->valid)
pnhi->valid += 1; pnhi->valid = true;
} }
static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b, static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b,
@ -1098,14 +1104,14 @@ static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b,
old_valid = pnhgc->valid; old_valid = pnhgc->valid;
pnhi.ifp = data; pnhi.ifp = data;
pnhi.valid = 0; pnhi.valid = false;
hash_iterate(pnhgc->nhh, hash_iterate(pnhgc->nhh,
pbr_nht_individual_nexthop_interface_update_lookup, &pnhi); pbr_nht_individual_nexthop_interface_update_lookup, &pnhi);
/* /*
* If any of the specified nexthops are valid we are valid * If any of the specified nexthops are valid we are valid
*/ */
pnhgc->valid = !!pnhi.valid; pnhgc->valid = pnhi.valid;
if (old_valid != pnhgc->valid) if (old_valid != pnhgc->valid)
pbr_map_check_nh_group_change(pnhgc->name); pbr_map_check_nh_group_change(pnhgc->name);

View File

@ -55,6 +55,7 @@ struct pbr_nexthop_cache {
bool looked_at; bool looked_at;
bool valid; bool valid;
bool nhr_matched;
}; };
extern void pbr_nht_write_table_range(struct vty *vty); extern void pbr_nht_write_table_range(struct vty *vty);