summaryrefslogtreecommitdiffstats
path: root/bgpd
diff options
context:
space:
mode:
authorRuss White <russ@riw.us>2023-01-24 16:45:03 +0100
committerGitHub <noreply@github.com>2023-01-24 16:45:03 +0100
commitb25695f630cfaa9b71a72f1da8577d6d835b6b51 (patch)
tree243f4993046192a378b689e871031aed829d5e63 /bgpd
parentMerge pull request #12634 from anlancs/fix/lib-seq-adjust-return-value (diff)
parentbgpd: Add missing `no` form for `neighbor path-attribute discard` cmd (diff)
downloadfrr-b25695f630cfaa9b71a72f1da8577d6d835b6b51.tar.xz
frr-b25695f630cfaa9b71a72f1da8577d6d835b6b51.zip
Merge pull request #12678 from opensourcerouting/fix/missing_no_form_for_path_attribute_discard
bgpd: Add missing `no` form for `neighbor path-attribute discard` cmd
Diffstat (limited to 'bgpd')
-rw-r--r--bgpd/bgp_attr.c21
-rw-r--r--bgpd/bgp_attr.h2
-rw-r--r--bgpd/bgp_vty.c30
3 files changed, 46 insertions, 7 deletions
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index e60c1bb8d..392b55880 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.
diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h
index cb0bf4a43..33283f4bf 100644
--- a/bgpd/bgp_attr.h
+++ b/bgpd/bgp_attr.h
@@ -415,7 +415,7 @@ extern void attr_show_all(struct vty *vty);
extern unsigned long int attr_count(void);
extern unsigned long int attr_unknown_count(void);
extern void bgp_path_attribute_discard_vty(struct vty *vty, struct peer *peer,
- const char *discard_attrs);
+ const char *discard_attrs, bool set);
/* Cluster list prototypes. */
extern bool cluster_loop_check(struct cluster_list *cluster,
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 5772900ce..5738d9ef6 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -8787,7 +8787,34 @@ DEFPY(neighbor_path_attribute_discard,
if (idx)
discard_attrs = argv_concat(argv, argc, idx);
- bgp_path_attribute_discard_vty(vty, peer, discard_attrs);
+ bgp_path_attribute_discard_vty(vty, peer, discard_attrs, true);
+
+ return CMD_SUCCESS;
+}
+
+DEFPY(no_neighbor_path_attribute_discard,
+ no_neighbor_path_attribute_discard_cmd,
+ "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor path-attribute discard [(1-255)]",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Manipulate path attributes from incoming UPDATE messages\n"
+ "Drop specified attributes from incoming UPDATE messages\n"
+ "Attribute number\n")
+{
+ struct peer *peer;
+ int idx = 0;
+ const char *discard_attrs = NULL;
+
+ peer = peer_and_group_lookup_vty(vty, neighbor);
+ if (!peer)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ argv_find(argv, argc, "(1-255)", &idx);
+ if (idx)
+ discard_attrs = argv[idx]->arg;
+
+ bgp_path_attribute_discard_vty(vty, peer, discard_attrs, false);
return CMD_SUCCESS;
}
@@ -19541,6 +19568,7 @@ void bgp_vty_init(void)
/* "neighbor path-attribute discard" commands. */
install_element(BGP_NODE, &neighbor_path_attribute_discard_cmd);
+ install_element(BGP_NODE, &no_neighbor_path_attribute_discard_cmd);
/* "neighbor passive" commands. */
install_element(BGP_NODE, &neighbor_passive_cmd);