summaryrefslogtreecommitdiff
path: root/bgpd/bgp_attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_attr.c')
-rw-r--r--bgpd/bgp_attr.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index e60c1bb8dc..392b558805 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -5097,18 +5097,29 @@ void bgp_dump_routes_attr(struct stream *s, struct bgp_path_info *bpi,
}
void bgp_path_attribute_discard_vty(struct vty *vty, struct peer *peer,
- const char *discard_attrs)
+ const char *discard_attrs, bool set)
{
int i, num_attributes;
char **attributes;
afi_t afi;
safi_t safi;
- if (discard_attrs) {
- frrstr_split(discard_attrs, " ", &attributes, &num_attributes);
+ /* If `no` command specified without arbitrary attributes,
+ * then flush all.
+ */
+ if (!discard_attrs) {
for (i = 0; i < BGP_ATTR_MAX; i++)
peer->discard_attrs[i] = false;
+ goto discard_soft_clear;
+ }
+
+ if (discard_attrs) {
+ frrstr_split(discard_attrs, " ", &attributes, &num_attributes);
+
+ if (set)
+ for (i = 0; i < BGP_ATTR_MAX; i++)
+ peer->discard_attrs[i] = false;
for (i = 0; i < num_attributes; i++) {
uint8_t attr_num = strtoul(attributes[i], NULL, 10);
@@ -5142,10 +5153,10 @@ void bgp_path_attribute_discard_vty(struct vty *vty, struct peer *peer,
continue;
}
- peer->discard_attrs[attr_num] = true;
+ peer->discard_attrs[attr_num] = set;
}
XFREE(MTYPE_TMP, attributes);
-
+ discard_soft_clear:
/* Configuring path attributes to be discarded will trigger
* an inbound Route Refresh to ensure that the routing table
* is up to date.