forked from Mirror/frr
bgpd: Move stale Adj-RIB-Out paths removal to subgroup_process_announce_selected()
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
parent
4c79c560d1
commit
f47b2fb94a
|
@ -3406,13 +3406,14 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp,
|
||||||
safi_t safi, uint32_t addpath_tx_id)
|
safi_t safi, uint32_t addpath_tx_id)
|
||||||
{
|
{
|
||||||
const struct prefix *p;
|
const struct prefix *p;
|
||||||
struct peer *onlypeer;
|
struct peer *onlypeer, *peer;
|
||||||
struct attr attr = { 0 }, *pattr = &attr;
|
struct attr attr = { 0 }, *pattr = &attr;
|
||||||
struct bgp *bgp;
|
struct bgp *bgp;
|
||||||
bool advertise;
|
bool advertise;
|
||||||
|
|
||||||
p = bgp_dest_get_prefix(dest);
|
p = bgp_dest_get_prefix(dest);
|
||||||
bgp = SUBGRP_INST(subgrp);
|
bgp = SUBGRP_INST(subgrp);
|
||||||
|
peer = SUBGRP_PEER(subgrp);
|
||||||
onlypeer = ((SUBGRP_PCOUNT(subgrp) == 1) ? (SUBGRP_PFIRST(subgrp))->peer
|
onlypeer = ((SUBGRP_PCOUNT(subgrp) == 1) ? (SUBGRP_PFIRST(subgrp))->peer
|
||||||
: NULL);
|
: NULL);
|
||||||
|
|
||||||
|
@ -3447,6 +3448,26 @@ void subgroup_process_announce_selected(struct update_subgroup *subgrp,
|
||||||
pattr,
|
pattr,
|
||||||
selected))
|
selected))
|
||||||
bgp_attr_flush(pattr);
|
bgp_attr_flush(pattr);
|
||||||
|
|
||||||
|
/* Remove paths from Adj-RIB-Out if it's not a best (selected) path.
|
||||||
|
* Why should we keep Adj-RIB-Out with stale paths?
|
||||||
|
*/
|
||||||
|
if (!bgp_addpath_encode_tx(peer, afi, safi)) {
|
||||||
|
struct bgp_adj_out *adj, *adj_next;
|
||||||
|
|
||||||
|
RB_FOREACH_SAFE (adj, bgp_adj_out_rb,
|
||||||
|
&dest->adj_out, adj_next) {
|
||||||
|
if (adj->subgroup != subgrp)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!adj->adv &&
|
||||||
|
adj->addpath_tx_id != addpath_tx_id) {
|
||||||
|
bgp_adj_out_unset_subgroup(dest,
|
||||||
|
subgrp, 1,
|
||||||
|
adj->addpath_tx_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bgp_adj_out_unset_subgroup(
|
bgp_adj_out_unset_subgroup(
|
||||||
dest, subgrp, 1, addpath_tx_id);
|
dest, subgrp, 1, addpath_tx_id);
|
||||||
|
|
|
@ -216,7 +216,6 @@ static int group_announce_route_walkcb(struct update_group *updgrp, void *arg)
|
||||||
safi_t safi;
|
safi_t safi;
|
||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
struct bgp_adj_out *adj, *adj_next;
|
struct bgp_adj_out *adj, *adj_next;
|
||||||
struct bgp_path_info *bpi;
|
|
||||||
bool addpath_capable;
|
bool addpath_capable;
|
||||||
|
|
||||||
afi = UPDGRP_AFI(updgrp);
|
afi = UPDGRP_AFI(updgrp);
|
||||||
|
@ -276,34 +275,6 @@ static int group_announce_route_walkcb(struct update_group *updgrp, void *arg)
|
||||||
subgrp, ctx->pi, ctx->dest, afi, safi,
|
subgrp, ctx->pi, ctx->dest, afi, safi,
|
||||||
bgp_addpath_id_for_peer(peer, afi, safi,
|
bgp_addpath_id_for_peer(peer, afi, safi,
|
||||||
&ctx->pi->tx_addpath));
|
&ctx->pi->tx_addpath));
|
||||||
|
|
||||||
/* Remove paths from Adj-RIB-Out if it's not a best path.
|
|
||||||
* Why should we keep Adj-RIB-Out with stale paths?
|
|
||||||
*/
|
|
||||||
RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out,
|
|
||||||
adj_next) {
|
|
||||||
uint32_t best_tx_id = 0;
|
|
||||||
|
|
||||||
if (adj->subgroup != subgrp)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (bpi = bgp_dest_get_bgp_path_info(ctx->dest); bpi;
|
|
||||||
bpi = bpi->next) {
|
|
||||||
if (bgp_addpath_id_for_peer(peer, afi, safi,
|
|
||||||
&bpi->tx_addpath) ==
|
|
||||||
adj->addpath_tx_id &&
|
|
||||||
CHECK_FLAG(bpi->flags, BGP_PATH_SELECTED)) {
|
|
||||||
best_tx_id = adj->addpath_tx_id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adj->addpath_tx_id != best_tx_id)
|
|
||||||
subgroup_process_announce_selected(subgrp, NULL,
|
|
||||||
ctx->dest, afi,
|
|
||||||
safi,
|
|
||||||
adj->addpath_tx_id);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out,
|
RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out,
|
||||||
adj_next) {
|
adj_next) {
|
||||||
|
|
Loading…
Reference in a new issue