From: Donatas Abraitis Date: Tue, 3 Aug 2021 08:02:49 +0000 (+0300) Subject: bgpd: Keep extcommunity bandwidth commands persistent in route-maps X-Git-Tag: frr-8.0.1~15^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=71ff89ae2f50713c630187249e4ffa3db345b58c;p=matthieu%2Ffrr.git bgpd: Keep extcommunity bandwidth commands persistent in route-maps ~/frr# vtysh -c 'conf' -c 'route-map testas permit 10' -c 'set extcommunity bandwidth 321' ~/frr# vtysh -c 'show route-map testas' | grep 321 extcommunity bandwidth 321 non-transitive ~/frr# vtysh -c 'sh run' | grep 321 ~/frr# Signed-off-by: Donatas Abraitis (cherry picked from commit 71bdae66b2c105302f7af9fc0c1deb657e2418d9) --- diff --git a/bgpd/bgp_ecommunity.h b/bgpd/bgp_ecommunity.h index 03b23fcd37..a9dc2aeaa1 100644 --- a/bgpd/bgp_ecommunity.h +++ b/bgpd/bgp_ecommunity.h @@ -151,6 +151,12 @@ struct ecommunity_val_ipv6 { char val[IPV6_ECOMMUNITY_SIZE]; }; +enum ecommunity_lb_type { + EXPLICIT_BANDWIDTH, + CUMULATIVE_BANDWIDTH, + COMPUTED_BANDWIDTH +}; + #define ecom_length_size(X, Y) ((X)->size * (Y)) /* diff --git a/bgpd/bgp_routemap_nb_config.c b/bgpd/bgp_routemap_nb_config.c index ff08c16a82..1b58dcb534 100644 --- a/bgpd/bgp_routemap_nb_config.c +++ b/bgpd/bgp_routemap_nb_config.c @@ -25,6 +25,7 @@ #include "lib/routemap.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_routemap_nb.h" +#include "bgpd/bgp_ecommunity.h" /* Add bgp route map rule. */ static int bgp_route_match_add(struct route_map_index *index, @@ -2536,12 +2537,6 @@ lib_route_map_entry_set_action_rmap_set_action_comm_list_name_destroy( return NB_OK; } -enum e_community_lb_type { - EXPLICIT_BANDWIDTH, - CUMULATIVE_BANDWIDTH, - COMPUTED_BANDWIDTH -}; - /* * XPath: * /frr-route-map:lib/route-map/entry/set-action/rmap-set-action/frr-bgp-route-map:extcommunity-lb @@ -2551,7 +2546,7 @@ lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_finish( struct nb_cb_apply_finish_args *args) { struct routemap_hook_context *rhc; - int lb_type; + enum ecommunity_lb_type lb_type; char str[VTY_BUFSIZ]; uint16_t bandwidth; diff --git a/lib/routemap.h b/lib/routemap.h index 5b6b64eaeb..97a62c8ace 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -348,6 +348,8 @@ DECLARE_QOBJ_TYPE(route_map); (strmatch(A, "frr-bgp-route-map:set-extcommunity-rt")) #define IS_SET_EXTCOMMUNITY_SOO(A) \ (strmatch(A, "frr-bgp-route-map:set-extcommunity-soo")) +#define IS_SET_EXTCOMMUNITY_LB(A) \ + (strmatch(A, "frr-bgp-route-map:set-extcommunity-lb")) #define IS_SET_AGGREGATOR(A) \ (strmatch(A, "frr-bgp-route-map:aggregator")) #define IS_SET_AS_PREPEND(A) \ diff --git a/lib/routemap_cli.c b/lib/routemap_cli.c index e11b9eea74..7c788a4e79 100644 --- a/lib/routemap_cli.c +++ b/lib/routemap_cli.c @@ -25,6 +25,7 @@ #include "lib/command.h" #include "lib/northbound_cli.h" #include "lib/routemap.h" +#include "bgpd/bgp_ecommunity.h" #ifndef VTYSH_EXTRACT_PL #include "lib/routemap_cli_clippy.c" @@ -1189,6 +1190,34 @@ void route_map_action_show(struct vty *vty, struct lyd_node *dnode, yang_dnode_get_string( dnode, "./rmap-set-action/frr-bgp-route-map:extcommunity-soo")); + } else if (IS_SET_EXTCOMMUNITY_LB(action)) { + enum ecommunity_lb_type lb_type; + char str[VTY_BUFSIZ]; + uint16_t bandwidth; + + lb_type = yang_dnode_get_enum( + dnode, + "./rmap-set-action/frr-bgp-route-map:extcommunity-lb/lb-type"); + switch (lb_type) { + case EXPLICIT_BANDWIDTH: + bandwidth = yang_dnode_get_uint16( + dnode, + "./rmap-set-action/frr-bgp-route-map:extcommunity-lb/bandwidth"); + snprintf(str, sizeof(str), "%d", bandwidth); + break; + case CUMULATIVE_BANDWIDTH: + snprintf(str, sizeof(str), "%s", "cumulative"); + break; + case COMPUTED_BANDWIDTH: + snprintf(str, sizeof(str), "%s", "num-multipaths"); + } + + if (yang_dnode_get_bool( + dnode, + "./rmap-set-action/frr-bgp-route-map:extcommunity-lb/two-octet-as-specific")) + strlcat(str, " non-transitive", sizeof(str)); + + vty_out(vty, " set extcommunity bandwidth %s\n", str); } else if (IS_SET_AGGREGATOR(action)) { vty_out(vty, " set aggregator as %s %s\n", yang_dnode_get_string(