mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 07:56:29 +00:00
Merge pull request #7010 from wesleycoakley/pbrd-more-selective
pbrd: be more selective about route updates
This commit is contained in:
commit
ceb987a877
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user