Merge pull request #8389 from idryzhov/route-map-optimization-nb

lib: convert route-map optimization to NB
This commit is contained in:
Renato Westphal 2021-04-13 00:26:20 -03:00 committed by GitHub
commit b6241291ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 116 additions and 29 deletions

View file

@ -333,10 +333,10 @@ Route Map Exit Action Command
Route Map Optimization Command
==============================
.. clicmd:: route-map optimization
.. clicmd:: route-map ROUTE-MAP-NAME optimization
Enable route-map processing optimization. The optimization is
enabled by default.
Enable route-map processing optimization for `route-map-name`.
The optimization is enabled by default.
Instead of sequentially passing through all the route-map indexes
until a match is found, the search for the best-match index will be
based on a look-up in a prefix-tree. A per-route-map prefix-tree

View file

@ -2906,29 +2906,6 @@ void route_map_notify_dependencies(const char *affected_name,
}
/* VTY related functions. */
DEFUN(no_routemap_optimization, no_routemap_optimization_cmd,
"no route-map optimization",
NO_STR
"route-map\n"
"optimization\n")
{
VTY_DECLVAR_CONTEXT(route_map_index, index);
index->map->optimization_disabled = true;
return CMD_SUCCESS;
}
DEFUN(routemap_optimization, routemap_optimization_cmd,
"route-map optimization",
"route-map\n"
"optimization\n")
{
VTY_DECLVAR_CONTEXT(route_map_index, index);
index->map->optimization_disabled = false;
return CMD_SUCCESS;
}
static void clear_route_map_helper(struct route_map *map)
{
struct route_map_index *index;
@ -3241,8 +3218,5 @@ void route_map_init(void)
install_element(ENABLE_NODE, &debug_rmap_cmd);
install_element(ENABLE_NODE, &no_debug_rmap_cmd);
install_element(RMAP_NODE, &routemap_optimization_cmd);
install_element(RMAP_NODE, &no_routemap_optimization_cmd);
install_element(ENABLE_NODE, &show_route_map_pfx_tbl_cmd);
}

View file

@ -902,6 +902,9 @@ extern void route_map_call_show(struct vty *vty, struct lyd_node *dnode,
extern void route_map_description_show(struct vty *vty,
struct lyd_node *dnode,
bool show_defaults);
extern void route_map_optimization_disabled_show(struct vty *vty,
struct lyd_node *dnode,
bool show_defaults);
extern void route_map_cli_init(void);
#ifdef __cplusplus

View file

@ -1396,6 +1396,74 @@ void route_map_description_show(struct vty *vty, struct lyd_node *dnode,
vty_out(vty, " description %s\n", yang_dnode_get_string(dnode, NULL));
}
DEFPY_YANG(
route_map_optimization, route_map_optimization_cmd,
"[no] route-map WORD$name optimization",
NO_STR
ROUTE_MAP_CMD_STR
"Configure route-map optimization\n")
{
char xpath[XPATH_MAXLEN];
snprintf(xpath, sizeof(xpath),
"/frr-route-map:lib/route-map[name='%s']", name);
nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL);
snprintf(
xpath, sizeof(xpath),
"/frr-route-map:lib/route-map[name='%s']/optimization-disabled",
name);
nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, no ? "true" : "false");
return nb_cli_apply_changes(vty, NULL);
}
void route_map_optimization_disabled_show(struct vty *vty,
struct lyd_node *dnode,
bool show_defaults)
{
const char *name = yang_dnode_get_string(dnode, "../name");
const bool disabled = yang_dnode_get_bool(dnode, NULL);
vty_out(vty, "%sroute-map %s optimization\n", disabled ? "no " : "",
name);
}
#if CONFDATE > 20220409
CPP_NOTICE("Time to remove old route-map optimization command")
#endif
DEFPY_HIDDEN(
routemap_optimization, routemap_optimization_cmd,
"[no] route-map optimization",
NO_STR
"route-map\n"
"optimization\n")
{
const struct lyd_node *rmi_dnode;
const char *rm_name;
char xpath[XPATH_MAXLEN];
vty_out(vty,
"%% This command is deprecated. Please, use `route-map NAME optimization` from the config node.\n");
rmi_dnode =
yang_dnode_get(vty->candidate_config->dnode, VTY_CURR_XPATH);
if (!rmi_dnode) {
vty_out(vty, "%% Failed to get RMI dnode in candidate DB\n");
return CMD_WARNING_CONFIG_FAILED;
}
rm_name = yang_dnode_get_string(rmi_dnode, "../name");
snprintf(
xpath, sizeof(xpath),
"/frr-route-map:lib/route-map[name='%s']/optimization-disabled",
rm_name);
nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, no ? "true" : "false");
return nb_cli_apply_changes(vty, NULL);
}
static int route_map_config_write(struct vty *vty)
{
struct lyd_node *dnode;
@ -1447,6 +1515,7 @@ void route_map_cli_init(void)
install_element(CONFIG_NODE, &route_map_cmd);
install_element(CONFIG_NODE, &no_route_map_cmd);
install_element(CONFIG_NODE, &no_route_map_all_cmd);
install_element(CONFIG_NODE, &route_map_optimization_cmd);
/* Install the on-match stuff */
install_element(RMAP_NODE, &rmap_onmatch_next_cmd);
@ -1513,4 +1582,6 @@ void route_map_cli_init(void)
install_element(RMAP_NODE, &set_srte_color_cmd);
install_element(RMAP_NODE, &no_set_srte_color_cmd);
install_element(RMAP_NODE, &routemap_optimization_cmd);
}

View file

@ -140,6 +140,30 @@ static int lib_route_map_destroy(struct nb_cb_destroy_args *args)
return NB_OK;
}
/*
* XPath: /frr-route-map:lib/route-map/optimization-disabled
*/
static int
lib_route_map_optimization_disabled_modify(struct nb_cb_modify_args *args)
{
struct route_map *rm;
bool disabled = yang_dnode_get_bool(args->dnode, NULL);
switch (args->event) {
case NB_EV_VALIDATE:
case NB_EV_PREPARE:
case NB_EV_ABORT:
/* NOTHING */
break;
case NB_EV_APPLY:
rm = nb_running_get_entry(args->dnode, NULL, true);
rm->optimization_disabled = disabled;
break;
}
return NB_OK;
}
/*
* XPath: /frr-route-map:lib/route-map/entry
*/
@ -1197,6 +1221,13 @@ const struct frr_yang_module_info frr_route_map_info = {
.destroy = lib_route_map_destroy,
}
},
{
.xpath = "/frr-route-map:lib/route-map/optimization-disabled",
.cbs = {
.modify = lib_route_map_optimization_disabled_modify,
.cli_show = route_map_optimization_disabled_show,
}
},
{
.xpath = "/frr-route-map:lib/route-map/entry",
.cbs = {

View file

@ -342,6 +342,9 @@ void vtysh_config_parse_line(void *arg, const char *line)
config = config_get(OPENFABRIC_NODE, line);
else if (strncmp(line, "route-map", strlen("route-map")) == 0)
config = config_get(RMAP_NODE, line);
else if (strncmp(line, "no route-map", strlen("no route-map"))
== 0)
config = config_get(RMAP_NODE, line);
else if (strncmp(line, "pbr-map", strlen("pbr-map")) == 0)
config = config_get(PBRMAP_NODE, line);
else if (strncmp(line, "access-list", strlen("access-list"))

View file

@ -364,6 +364,11 @@ module frr-route-map {
description
"Route map instance name";
}
leaf optimization-disabled {
type boolean;
default false;
description "Disables or enables the optimization";
}
list entry {
key "sequence";