From 9cbd06e0f8758930dd783d6f0e8a49984465fffa Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Fri, 24 Jul 2020 11:08:05 +0300 Subject: [PATCH] bgpd: Add a knob to force maximum-prefix even for filtered routes If _force_ is set, then ALL prefixes are counted for maximum instead of accepted only. This is useful for cases where an inbound filter is applied, but you want maximum-prefix to act on ALL (including filtered) prefixes. For instance, we have a configuration like: neighbor r1 maximum-prefix 10 neighbor r1 prefix-list custom in ! ip prefix-list custom seq 1 permit 10.0.0.0/24 ip prefix-list custom seq 2 permit 10.0.1.0/24 This will accept only 2 prefixes and discard all others instead of shutting down the session when 10 is reached. With this new knob (force), we will count all received prefixes and shutdown the session when 10 is reached. The bigger problem is when you have lots of peers with full feed and such a configuration like in an example. This is kinda re-ordering of how to treat filter vs. maximum-prefix. Signed-off-by: Donatas Abraitis --- bgpd/bgp_route.c | 51 ++++++++++++++----- bgpd/bgp_vty.c | 130 +++++++++++++++++++++++++++++++++-------------- bgpd/bgpd.c | 22 +++++++- bgpd/bgpd.h | 5 +- 4 files changed, 155 insertions(+), 53 deletions(-) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 90ae6af204..1bfebc54d6 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2974,16 +2974,43 @@ static int bgp_maximum_prefix_restart_timer(struct thread *thread) return 0; } +static uint32_t bgp_filtered_routes_count(struct peer *peer, afi_t afi, + safi_t safi) +{ + uint32_t count = 0; + struct bgp_dest *dest; + struct bgp_adj_in *ain; + struct bgp_table *table = peer->bgp->rib[afi][safi]; + + for (dest = bgp_table_top(table); dest; dest = bgp_route_next(dest)) { + for (ain = dest->adj_in; ain; ain = ain->next) { + const struct prefix *rn_p = bgp_dest_get_prefix(dest); + struct attr attr = {}; + + if (bgp_input_filter(peer, rn_p, &attr, afi, safi) + == FILTER_DENY) + count++; + } + } + + return count; +} + bool bgp_maximum_prefix_overflow(struct peer *peer, afi_t afi, safi_t safi, int always) { iana_afi_t pkt_afi; iana_safi_t pkt_safi; + uint32_t pcount = (CHECK_FLAG(peer->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_FORCE)) + ? bgp_filtered_routes_count(peer, afi, safi) + + peer->pcount[afi][safi] + : peer->pcount[afi][safi]; if (!CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) return false; - if (peer->pcount[afi][safi] > peer->pmax[afi][safi]) { + if (pcount > peer->pmax[afi][safi]) { if (CHECK_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT) && !always) @@ -2991,8 +3018,8 @@ bool bgp_maximum_prefix_overflow(struct peer *peer, afi_t afi, safi_t safi, zlog_info( "%%MAXPFXEXCEED: No. of %s prefix received from %s %u exceed, limit %u", - get_afi_safi_str(afi, safi, false), peer->host, - peer->pcount[afi][safi], peer->pmax[afi][safi]); + get_afi_safi_str(afi, safi, false), peer->host, pcount, + peer->pmax[afi][safi]); SET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT); if (CHECK_FLAG(peer->af_flags[afi][safi], @@ -3043,8 +3070,7 @@ bool bgp_maximum_prefix_overflow(struct peer *peer, afi_t afi, safi_t safi, UNSET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT); - if (peer->pcount[afi][safi] - > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100)) { + if (pcount > (pcount * peer->pmax_threshold[afi][safi] / 100)) { if (CHECK_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD) && !always) @@ -3052,8 +3078,8 @@ bool bgp_maximum_prefix_overflow(struct peer *peer, afi_t afi, safi_t safi, zlog_info( "%%MAXPFX: No. of %s prefix received from %s reaches %u, max %u", - get_afi_safi_str(afi, safi, false), peer->host, - peer->pcount[afi][safi], peer->pmax[afi][safi]); + get_afi_safi_str(afi, safi, false), peer->host, pcount, + peer->pmax[afi][safi]); SET_FLAG(peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD); } else @@ -3506,6 +3532,12 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, attr_new = bgp_attr_intern(&new_attr); + /* If maximum prefix count is configured and current prefix + * count exeed it. + */ + if (bgp_maximum_prefix_overflow(peer, afi, safi, 0)) + return -1; + /* If the update is implicit withdraw. */ if (pi) { pi->uptime = bgp_clock(); @@ -3981,11 +4013,6 @@ int bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, } #endif - /* If maximum prefix count is configured and current prefix - count exeed it. */ - if (bgp_maximum_prefix_overflow(peer, afi, safi, 0)) - return -1; - /* If this is an EVPN route, process for import. */ if (safi == SAFI_EVPN && CHECK_FLAG(new->flags, BGP_PATH_VALID)) bgp_evpn_import_route(bgp, afi, safi, p, new); diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index e07c990ab7..4102bfd463 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -6702,7 +6702,8 @@ static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str, afi_t afi, safi_t safi, const char *num_str, const char *threshold_str, int warning, - const char *restart_str) + const char *restart_str, + const char *force_str) { int ret; struct peer *peer; @@ -6726,7 +6727,7 @@ static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str, restart = 0; ret = peer_maximum_prefix_set(peer, afi, safi, max, threshold, warning, - restart); + restart, force_str ? true : false); return bgp_vty_return(vty, ret); } @@ -6797,172 +6798,220 @@ DEFUN(no_neighbor_maximum_prefix_out, return CMD_SUCCESS; } -/* Maximum number of prefix configuration. prefix count is different - for each peer configuration. So this configuration can be set for +/* Maximum number of prefix configuration. Prefix count is different + for each peer configuration. So this configuration can be set for each peer configuration. */ DEFUN (neighbor_maximum_prefix, neighbor_maximum_prefix_cmd, - "neighbor maximum-prefix (1-4294967295)", + "neighbor maximum-prefix (1-4294967295) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" - "maximum no. of prefix limit\n") + "maximum no. of prefix limit\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), - argv[idx_number]->arg, NULL, 0, NULL); + argv[idx_number]->arg, NULL, 0, NULL, force); } ALIAS_HIDDEN(neighbor_maximum_prefix, neighbor_maximum_prefix_hidden_cmd, - "neighbor maximum-prefix (1-4294967295)", + "neighbor maximum-prefix (1-4294967295) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" - "maximum no. of prefix limit\n") + "maximum no. of prefix limit\n" + "Force checking all received routes not only accepted\n") DEFUN (neighbor_maximum_prefix_threshold, neighbor_maximum_prefix_threshold_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100)", + "neighbor maximum-prefix (1-4294967295) (1-100) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" - "Threshold value (%) at which to generate a warning msg\n") + "Threshold value (%) at which to generate a warning msg\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; int idx_number_2 = 4; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), - argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL); + argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL, force); } ALIAS_HIDDEN( neighbor_maximum_prefix_threshold, neighbor_maximum_prefix_threshold_hidden_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100)", + "neighbor maximum-prefix (1-4294967295) (1-100) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" - "Threshold value (%) at which to generate a warning msg\n") + "Threshold value (%) at which to generate a warning msg\n" + "Force checking all received routes not only accepted\n") DEFUN (neighbor_maximum_prefix_warning, neighbor_maximum_prefix_warning_cmd, - "neighbor maximum-prefix (1-4294967295) warning-only", + "neighbor maximum-prefix (1-4294967295) warning-only [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), - argv[idx_number]->arg, NULL, 1, NULL); + argv[idx_number]->arg, NULL, 1, NULL, force); } ALIAS_HIDDEN( neighbor_maximum_prefix_warning, neighbor_maximum_prefix_warning_hidden_cmd, - "neighbor maximum-prefix (1-4294967295) warning-only", + "neighbor maximum-prefix (1-4294967295) warning-only [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") DEFUN (neighbor_maximum_prefix_threshold_warning, neighbor_maximum_prefix_threshold_warning_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100) warning-only", + "neighbor maximum-prefix (1-4294967295) (1-100) warning-only [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" "Threshold value (%) at which to generate a warning msg\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; int idx_number_2 = 4; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), - argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL); + argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL, force); } ALIAS_HIDDEN( neighbor_maximum_prefix_threshold_warning, neighbor_maximum_prefix_threshold_warning_hidden_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100) warning-only", + "neighbor maximum-prefix (1-4294967295) (1-100) warning-only [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" "Threshold value (%) at which to generate a warning msg\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") DEFUN (neighbor_maximum_prefix_restart, neighbor_maximum_prefix_restart_cmd, - "neighbor maximum-prefix (1-4294967295) restart (1-65535)", + "neighbor maximum-prefix (1-4294967295) restart (1-65535) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" "Restart bgp connection after limit is exceeded\n" - "Restart interval in minutes\n") + "Restart interval in minutes\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; int idx_number_2 = 5; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), - argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg); + argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg, force); } ALIAS_HIDDEN( neighbor_maximum_prefix_restart, neighbor_maximum_prefix_restart_hidden_cmd, - "neighbor maximum-prefix (1-4294967295) restart (1-65535)", + "neighbor maximum-prefix (1-4294967295) restart (1-65535) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefix accept from this peer\n" "maximum no. of prefix limit\n" "Restart bgp connection after limit is exceeded\n" - "Restart interval in minutes\n") + "Restart interval in minutes\n" + "Force checking all received routes not only accepted\n") DEFUN (neighbor_maximum_prefix_threshold_restart, neighbor_maximum_prefix_threshold_restart_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100) restart (1-65535)", + "neighbor maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefixes to accept from this peer\n" "maximum no. of prefix limit\n" "Threshold value (%) at which to generate a warning msg\n" "Restart bgp connection after limit is exceeded\n" - "Restart interval in minutes\n") + "Restart interval in minutes\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 1; int idx_number = 3; int idx_number_2 = 4; int idx_number_3 = 6; + int idx_force = 0; + char *force = NULL; + + if (argv_find(argv, argc, "force", &idx_force)) + force = argv[idx_force]->arg; + return peer_maximum_prefix_set_vty( vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty), argv[idx_number]->arg, argv[idx_number_2]->arg, 0, - argv[idx_number_3]->arg); + argv[idx_number_3]->arg, force); } ALIAS_HIDDEN( neighbor_maximum_prefix_threshold_restart, neighbor_maximum_prefix_threshold_restart_hidden_cmd, - "neighbor maximum-prefix (1-4294967295) (1-100) restart (1-65535)", + "neighbor maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]", NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefixes to accept from this peer\n" "maximum no. of prefix limit\n" "Threshold value (%) at which to generate a warning msg\n" "Restart bgp connection after limit is exceeded\n" - "Restart interval in minutes\n") + "Restart interval in minutes\n" + "Force checking all received routes not only accepted\n") DEFUN (no_neighbor_maximum_prefix, no_neighbor_maximum_prefix_cmd, - "no neighbor maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]", + "no neighbor maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]", NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2 @@ -6971,7 +7020,8 @@ DEFUN (no_neighbor_maximum_prefix, "Threshold value (%) at which to generate a warning msg\n" "Restart bgp connection after limit is exceeded\n" "Restart interval in minutes\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") { int idx_peer = 2; return peer_maximum_prefix_unset_vty(vty, argv[idx_peer]->arg, @@ -6981,14 +7031,15 @@ DEFUN (no_neighbor_maximum_prefix, ALIAS_HIDDEN( no_neighbor_maximum_prefix, no_neighbor_maximum_prefix_hidden_cmd, - "no neighbor maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]", + "no neighbor maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]", NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2 "Maximum number of prefixes to accept from this peer\n" "maximum no. of prefix limit\n" "Threshold value (%) at which to generate a warning msg\n" "Restart bgp connection after limit is exceeded\n" "Restart interval in minutes\n" - "Only give warning message when limit is exceeded\n") + "Only give warning message when limit is exceeded\n" + "Force checking all received routes not only accepted\n") /* "neighbor allowas-in" */ @@ -15053,6 +15104,9 @@ static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp, if (peer->pmax_restart[afi][safi]) vty_out(vty, " restart %u", peer->pmax_restart[afi][safi]); + if (peer_af_flag_check(peer, afi, safi, + PEER_FLAG_MAX_PREFIX_FORCE)) + vty_out(vty, " force"); vty_out(vty, "\n"); } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index e11ac459f2..b80aea7b9d 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -3905,6 +3905,7 @@ static const struct peer_flag_action peer_af_flag_action_list[] = { {PEER_FLAG_ORF_PREFIX_RM, 1, peer_change_reset}, {PEER_FLAG_MAX_PREFIX, 0, peer_change_none}, {PEER_FLAG_MAX_PREFIX_WARNING, 0, peer_change_none}, + {PEER_FLAG_MAX_PREFIX_FORCE, 0, peer_change_none}, {PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED, 0, peer_change_reset_out}, {PEER_FLAG_FORCE_NEXTHOP_SELF, 1, peer_change_reset_out}, {PEER_FLAG_REMOVE_PRIVATE_AS_ALL, 1, peer_change_reset_out}, @@ -6454,13 +6455,19 @@ int peer_unsuppress_map_unset(struct peer *peer, afi_t afi, safi_t safi) int peer_maximum_prefix_set(struct peer *peer, afi_t afi, safi_t safi, uint32_t max, uint8_t threshold, int warning, - uint16_t restart) + uint16_t restart, bool force) { struct peer *member; struct listnode *node, *nnode; /* Set flags and configuration on peer. */ peer_af_flag_set(peer, afi, safi, PEER_FLAG_MAX_PREFIX); + + if (force) + peer_af_flag_set(peer, afi, safi, PEER_FLAG_MAX_PREFIX_FORCE); + else + peer_af_flag_unset(peer, afi, safi, PEER_FLAG_MAX_PREFIX_FORCE); + if (warning) peer_af_flag_set(peer, afi, safi, PEER_FLAG_MAX_PREFIX_WARNING); else @@ -6495,6 +6502,14 @@ int peer_maximum_prefix_set(struct peer *peer, afi_t afi, safi_t safi, member->pmax[afi][safi] = max; member->pmax_threshold[afi][safi] = threshold; member->pmax_restart[afi][safi] = restart; + + if (force) + SET_FLAG(member->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_FORCE); + else + UNSET_FLAG(member->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_FORCE); + if (warning) SET_FLAG(member->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING); @@ -6515,6 +6530,8 @@ int peer_maximum_prefix_unset(struct peer *peer, afi_t afi, safi_t safi) /* Inherit configuration from peer-group if peer is member. */ if (peer_group_active(peer)) { peer_af_flag_inherit(peer, afi, safi, PEER_FLAG_MAX_PREFIX); + peer_af_flag_inherit(peer, afi, safi, + PEER_FLAG_MAX_PREFIX_FORCE); peer_af_flag_inherit(peer, afi, safi, PEER_FLAG_MAX_PREFIX_WARNING); PEER_ATTR_INHERIT(peer, peer->group, pmax[afi][safi]); @@ -6526,6 +6543,7 @@ int peer_maximum_prefix_unset(struct peer *peer, afi_t afi, safi_t safi) /* Remove flags and configuration from peer. */ peer_af_flag_unset(peer, afi, safi, PEER_FLAG_MAX_PREFIX); + peer_af_flag_unset(peer, afi, safi, PEER_FLAG_MAX_PREFIX_FORCE); peer_af_flag_unset(peer, afi, safi, PEER_FLAG_MAX_PREFIX_WARNING); peer->pmax[afi][safi] = 0; peer->pmax_threshold[afi][safi] = 0; @@ -6549,6 +6567,8 @@ int peer_maximum_prefix_unset(struct peer *peer, afi_t afi, safi_t safi) */ UNSET_FLAG(member->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX); + UNSET_FLAG(member->af_flags[afi][safi], + PEER_FLAG_MAX_PREFIX_FORCE); UNSET_FLAG(member->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING); member->pmax[afi][safi] = 0; diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 4efc068dea..e6eeffe794 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -1177,6 +1177,7 @@ struct peer { #define PEER_FLAG_ALLOWAS_IN_ORIGIN (1 << 25) /* allowas-in origin */ #define PEER_FLAG_SEND_LARGE_COMMUNITY (1 << 26) /* Send large Communities */ #define PEER_FLAG_MAX_PREFIX_OUT (1 << 27) /* outgoing maximum prefix */ +#define PEER_FLAG_MAX_PREFIX_FORCE (1 << 28) /* maximum-prefix force */ enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX]; @@ -1348,7 +1349,7 @@ struct peer { /* Track if we printed the attribute in debugs */ int rcvd_attr_printed; - /* Prefix count. */ + /* Accepted prefix count */ uint32_t pcount[AFI_MAX][SAFI_MAX]; /* Max prefix count. */ @@ -1920,7 +1921,7 @@ extern int peer_password_unset(struct peer *); extern int peer_unsuppress_map_unset(struct peer *, afi_t, safi_t); extern int peer_maximum_prefix_set(struct peer *, afi_t, safi_t, uint32_t, - uint8_t, int, uint16_t); + uint8_t, int, uint16_t, bool force); extern int peer_maximum_prefix_unset(struct peer *, afi_t, safi_t); extern int peer_clear(struct peer *, struct listnode **); -- 2.39.5