diff options
| author | Donatas Abraitis <donatas.abraitis@gmail.com> | 2021-08-03 11:02:49 +0300 | 
|---|---|---|
| committer | Donatas Abraitis <donatas.abraitis@gmail.com> | 2021-08-03 14:38:53 +0300 | 
| commit | 71bdae66b2c105302f7af9fc0c1deb657e2418d9 (patch) | |
| tree | 82d433082f3a66e9c1a283c4289fb3af3a334802 | |
| parent | 04cfc0a3a8b10ad3f8c9faeb9f649515b7b42171 (diff) | |
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 <donatas.abraitis@gmail.com>
| -rw-r--r-- | bgpd/bgp_ecommunity.h | 6 | ||||
| -rw-r--r-- | bgpd/bgp_routemap_nb_config.c | 9 | ||||
| -rw-r--r-- | lib/routemap.h | 2 | ||||
| -rw-r--r-- | lib/routemap_cli.c | 29 | 
4 files changed, 39 insertions, 7 deletions
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 45f5c8f4bc..398e7323db 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, @@ -2592,12 +2593,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 @@ -2607,7 +2602,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 8af3b2c3c0..4445085001 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -354,6 +354,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 ec9033b3aa..77455d991a 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" @@ -1194,6 +1195,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(  | 
