diff options
author | Russ White <russ@riw.us> | 2023-01-24 16:45:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-24 16:45:03 +0100 |
commit | b25695f630cfaa9b71a72f1da8577d6d835b6b51 (patch) | |
tree | 243f4993046192a378b689e871031aed829d5e63 /bgpd | |
parent | Merge pull request #12634 from anlancs/fix/lib-seq-adjust-return-value (diff) | |
parent | bgpd: Add missing `no` form for `neighbor path-attribute discard` cmd (diff) | |
download | frr-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.c | 21 | ||||
-rw-r--r-- | bgpd/bgp_attr.h | 2 | ||||
-rw-r--r-- | bgpd/bgp_vty.c | 30 |
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); |