safi_t safi, uint32_t addpath_tx_id)
{
const struct prefix *p;
- struct peer *onlypeer;
+ struct peer *onlypeer, *peer;
struct attr attr = { 0 }, *pattr = &attr;
struct bgp *bgp;
bool advertise;
p = bgp_dest_get_prefix(dest);
bgp = SUBGRP_INST(subgrp);
+ peer = SUBGRP_PEER(subgrp);
onlypeer = ((SUBGRP_PCOUNT(subgrp) == 1) ? (SUBGRP_PFIRST(subgrp))->peer
: NULL);
pattr,
selected))
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 {
bgp_adj_out_unset_subgroup(
dest, subgrp, 1, addpath_tx_id);
safi_t safi;
struct peer *peer;
struct bgp_adj_out *adj, *adj_next;
- struct bgp_path_info *bpi;
bool addpath_capable;
afi = UPDGRP_AFI(updgrp);
subgrp, ctx->pi, ctx->dest, afi, safi,
bgp_addpath_id_for_peer(peer, afi, safi,
&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 {
RB_FOREACH_SAFE (adj, bgp_adj_out_rb, &ctx->dest->adj_out,
adj_next) {