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>
This commit is contained in:
Donatas Abraitis 2021-08-03 11:02:49 +03:00
parent 04cfc0a3a8
commit 71bdae66b2
4 changed files with 39 additions and 7 deletions

View File

@ -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))
/*

View File

@ -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;

View File

@ -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) \

View File

@ -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(