summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_conditional_adv.c
diff options
context:
space:
mode:
authorLouis Scalbert <louis.scalbert@6wind.com>2021-10-20 16:26:30 +0200
committerLouis Scalbert <louis.scalbert@6wind.com>2022-01-20 18:19:37 +0100
commitd0bf49ecd57e7376e9498a8f3e2e216ae7a59377 (patch)
tree6e392c24c6dfa1ebf1caceace7c66c6613398a56 /bgpd/bgp_conditional_adv.c
parentbgpd: fix calculation of update-group hash with maximum-prefix-out (diff)
downloadfrr-d0bf49ecd57e7376e9498a8f3e2e216ae7a59377.tar.xz
frr-d0bf49ecd57e7376e9498a8f3e2e216ae7a59377.zip
bgpd: apply maximum-prefix-out without clearing the neighbor
Abstract: - The command "neighbor PEER maximum-prefix-out NUMBER" cannot be applied without clearing the BGP neighbor. - Apply the maximum-prefix-out value as soon as it is modified without clearing the neighbor. subgroup_update_packet() and subgroup_withdraw_packet() respectively manages the announcement and withdrawal BGP message to the peer. subgrp->scount counter counts the number of sent prefixes. Before the patch, the maximum out prefix limitation was applied in subgroup_update_packet() in order that subgrp->scount never exceeds the limit. Setting a limit inferior to the effective number of sent prefix did not result in sending any withdrawal message to reduce the number of sent prefixes. Without clearing the BGP neighbor, the limitation only applied to the announcement of new prefixes when the limitation was over. With the patch, the limitation is checked in subgroup_announce_check(). The function is intended to say whether a prefix has to be announced in regards to the prefix-list, route-map... Now when a maximum-prefix-out value is changed/removed, the neighbor AFI/SAFI table is re-parsed in the same way as for the application of route-map, prefix-lists... Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'bgpd/bgp_conditional_adv.c')
-rw-r--r--bgpd/bgp_conditional_adv.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/bgpd/bgp_conditional_adv.c b/bgpd/bgp_conditional_adv.c
index 82eb8a815..8e2f6ff50 100644
--- a/bgpd/bgp_conditional_adv.c
+++ b/bgpd/bgp_conditional_adv.c
@@ -95,6 +95,9 @@ static void bgp_conditional_adv_routes(struct peer *peer, afi_t afi,
if (!subgrp)
return;
+ subgrp->pscount = 0;
+ SET_FLAG(subgrp->sflags, SUBGRP_STATUS_TABLE_REPARSING);
+
if (BGP_DEBUG(update, UPDATE_OUT))
zlog_debug("%s: %s routes to/from %s for %s", __func__,
update_type == ADVERTISE ? "Advertise" : "Withdraw",
@@ -162,6 +165,7 @@ static void bgp_conditional_adv_routes(struct peer *peer, afi_t afi,
}
}
}
+ UNSET_FLAG(subgrp->sflags, SUBGRP_STATUS_TABLE_REPARSING);
}
/* Handler of conditional advertisement timer event.