mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-01 00:05:29 +00:00
isisd: add isis flex-algo configuration frontend
Add the frontend functions for the flex-algo configuration. Signed-off-by: Hiroki Shirokura <hiroki.shirokura@linecorp.com> Signed-off-by: Eric Kinzie <ekinzie@labn.net> Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
parent
893882ee20
commit
f46e34f838
197
isisd/isis_cli.c
197
isisd/isis_cli.c
@ -23,6 +23,7 @@
|
|||||||
#include "isisd/isis_misc.h"
|
#include "isisd/isis_misc.h"
|
||||||
#include "isisd/isis_circuit.h"
|
#include "isisd/isis_circuit.h"
|
||||||
#include "isisd/isis_csm.h"
|
#include "isisd/isis_csm.h"
|
||||||
|
#include "isisd/isis_flex_algo.h"
|
||||||
|
|
||||||
#include "isisd/isis_cli_clippy.c"
|
#include "isisd/isis_cli_clippy.c"
|
||||||
|
|
||||||
@ -1126,6 +1127,7 @@ void cli_show_isis_purge_origin(struct vty *vty, const struct lyd_node *dnode,
|
|||||||
vty_out(vty, " purge-originator\n");
|
vty_out(vty, " purge-originator\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-isisd:isis/instance/admin-group-send-zero
|
* XPath: /frr-isisd:isis/instance/admin-group-send-zero
|
||||||
*/
|
*/
|
||||||
@ -2720,6 +2722,24 @@ void cli_show_ip_isis_circ_type(struct vty *vty, const struct lyd_node *dnode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ag_change(struct vty *vty, int argc, struct cmd_token **argv,
|
||||||
|
const char *xpath, bool no, int start_idx)
|
||||||
|
{
|
||||||
|
for (int i = start_idx; i < argc; i++)
|
||||||
|
nb_cli_enqueue_change(vty, xpath,
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE,
|
||||||
|
argv[i]->arg);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ag_iter_cb(const struct lyd_node *dnode, void *arg)
|
||||||
|
{
|
||||||
|
struct vty *vty = (struct vty *)arg;
|
||||||
|
|
||||||
|
vty_out(vty, " %s", yang_dnode_get_string(dnode, "."));
|
||||||
|
return YANG_ITER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
|
* XPath: /frr-interface:lib/interface/frr-isisd:isis/network-type
|
||||||
*/
|
*/
|
||||||
@ -3348,7 +3368,21 @@ DEFPY_YANG_NOSH(flex_algo, flex_algo_cmd, "flex-algo (128-255)$algorithm",
|
|||||||
"Flexible Algorithm\n"
|
"Flexible Algorithm\n"
|
||||||
"Flexible Algorithm Number\n")
|
"Flexible Algorithm Number\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
int ret;
|
||||||
|
char xpath[XPATH_MAXLEN + 37];
|
||||||
|
|
||||||
|
snprintf(xpath, sizeof(xpath),
|
||||||
|
"%s/flex-algos/flex-algo[flex-algo='%ld']", VTY_CURR_XPATH,
|
||||||
|
algorithm);
|
||||||
|
|
||||||
|
nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL);
|
||||||
|
|
||||||
|
ret = nb_cli_apply_changes(
|
||||||
|
vty, "./flex-algos/flex-algo[flex-algo='%ld']", algorithm);
|
||||||
|
if (ret == CMD_SUCCESS)
|
||||||
|
VTY_PUSH_XPATH(ISIS_FLEX_ALGO_NODE, xpath);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(no_flex_algo, no_flex_algo_cmd, "no flex-algo (128-255)$algorithm",
|
DEFPY_YANG(no_flex_algo, no_flex_algo_cmd, "no flex-algo (128-255)$algorithm",
|
||||||
@ -3356,14 +3390,30 @@ DEFPY_YANG(no_flex_algo, no_flex_algo_cmd, "no flex-algo (128-255)$algorithm",
|
|||||||
"Flexible Algorithm\n"
|
"Flexible Algorithm\n"
|
||||||
"Flexible Algorithm Number\n")
|
"Flexible Algorithm Number\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
char xpath[XPATH_MAXLEN + 37];
|
||||||
|
|
||||||
|
snprintf(xpath, sizeof(xpath),
|
||||||
|
"%s/flex-algos/flex-algo[flex-algo='%ld']", VTY_CURR_XPATH,
|
||||||
|
algorithm);
|
||||||
|
|
||||||
|
if (!yang_dnode_exists(vty->candidate_config->dnode, xpath)) {
|
||||||
|
vty_out(vty, "ISIS flex-algo %ld isn't exist.\n", algorithm);
|
||||||
|
return CMD_ERR_NO_MATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);
|
||||||
|
return nb_cli_apply_changes_clear_pending(
|
||||||
|
vty, "./flex-algos/flex-algo[flex-algo='%ld']", algorithm);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(advertise_definition, advertise_definition_cmd,
|
DEFPY_YANG(advertise_definition, advertise_definition_cmd,
|
||||||
"[no] advertise-definition",
|
"[no] advertise-definition",
|
||||||
NO_STR "Advertise Local Flexible Algorithm\n")
|
NO_STR "Advertise Local Flexible Algorithm\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
nb_cli_enqueue_change(vty, "./advertise-definition",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE,
|
||||||
|
no ? NULL : "true");
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(affinity_include_any, affinity_include_any_cmd,
|
DEFPY_YANG(affinity_include_any, affinity_include_any_cmd,
|
||||||
@ -3373,7 +3423,9 @@ DEFPY_YANG(affinity_include_any, affinity_include_any_cmd,
|
|||||||
"Any Include with\n"
|
"Any Include with\n"
|
||||||
"Include NAME list\n")
|
"Include NAME list\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
const char *xpath = "./affinity-include-anies/affinity-include-any";
|
||||||
|
|
||||||
|
return ag_change(vty, argc, argv, xpath, no, no ? 3 : 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(affinity_include_all, affinity_include_all_cmd,
|
DEFPY_YANG(affinity_include_all, affinity_include_all_cmd,
|
||||||
@ -3383,7 +3435,9 @@ DEFPY_YANG(affinity_include_all, affinity_include_all_cmd,
|
|||||||
"All Include with\n"
|
"All Include with\n"
|
||||||
"Include NAME list\n")
|
"Include NAME list\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
const char *xpath = "./affinity-include-alls/affinity-include-all";
|
||||||
|
|
||||||
|
return ag_change(vty, argc, argv, xpath, no, no ? 3 : 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(affinity_exclude_any, affinity_exclude_any_cmd,
|
DEFPY_YANG(affinity_exclude_any, affinity_exclude_any_cmd,
|
||||||
@ -3393,13 +3447,48 @@ DEFPY_YANG(affinity_exclude_any, affinity_exclude_any_cmd,
|
|||||||
"Any Exclude with\n"
|
"Any Exclude with\n"
|
||||||
"Exclude NAME list\n")
|
"Exclude NAME list\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
const char *xpath = "./affinity-exclude-anies/affinity-exclude-any";
|
||||||
|
|
||||||
|
return ag_change(vty, argc, argv, xpath, no, no ? 3 : 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(prefix_metric, prefix_metric_cmd, "[no] prefix-metric",
|
DEFPY_YANG(prefix_metric, prefix_metric_cmd, "[no] prefix-metric",
|
||||||
NO_STR "Use Flex-Algo Prefix Metric\n")
|
NO_STR "Use Flex-Algo Prefix Metric\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
nb_cli_enqueue_change(vty, "./prefix-metric",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE, NULL);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPY_YANG(dplane_sr_mpls, dplane_sr_mpls_cmd, "[no] dataplane sr-mpls",
|
||||||
|
NO_STR
|
||||||
|
"Advertise and participate in the specified Data-Planes\n"
|
||||||
|
"Advertise and participate in SR-MPLS data-plane\n")
|
||||||
|
{
|
||||||
|
nb_cli_enqueue_change(vty, "./dplane-sr-mpls",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE, NULL);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPY_HIDDEN(dplane_srv6, dplane_srv6_cmd, "[no] dataplane srv6",
|
||||||
|
NO_STR
|
||||||
|
"Advertise and participate in the specified Data-Planes\n"
|
||||||
|
"Advertise and participate in SRv6 data-plane\n")
|
||||||
|
{
|
||||||
|
|
||||||
|
nb_cli_enqueue_change(vty, "./dplane-srv6",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE, NULL);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFPY_HIDDEN(dplane_ip, dplane_ip_cmd, "[no] dataplane ip",
|
||||||
|
NO_STR
|
||||||
|
"Advertise and participate in the specified Data-Planes\n"
|
||||||
|
"Advertise and participate in IP data-plane\n")
|
||||||
|
{
|
||||||
|
nb_cli_enqueue_change(vty, "./dplane-ip",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_CREATE, NULL);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(metric_type, metric_type_cmd,
|
DEFPY_YANG(metric_type, metric_type_cmd,
|
||||||
@ -3410,7 +3499,29 @@ DEFPY_YANG(metric_type, metric_type_cmd,
|
|||||||
"Use Delay as metric\n"
|
"Use Delay as metric\n"
|
||||||
"Use Traffic Engineering metric\n")
|
"Use Traffic Engineering metric\n")
|
||||||
{
|
{
|
||||||
|
const char *type = NULL;
|
||||||
|
|
||||||
|
if (igp) {
|
||||||
|
type = "igp";
|
||||||
|
} else if (te) {
|
||||||
|
type = "te-default";
|
||||||
|
} else if (delay) {
|
||||||
|
type = "min-uni-link-delay";
|
||||||
|
} else {
|
||||||
|
vty_out(vty, "Error: unknown metric type\n");
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!igp)
|
||||||
|
vty_out(vty,
|
||||||
|
"Warning: this version can advertise a Flex-Algorithm Definition (FAD) with the %s metric.\n"
|
||||||
|
"However, participation in a Flex-Algorithm with such a metric is not yet supported.\n",
|
||||||
|
type);
|
||||||
|
|
||||||
|
nb_cli_enqueue_change(vty, "./metric-type",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_MODIFY,
|
||||||
|
no ? NULL : type);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFPY_YANG(priority, priority_cmd, "[no] priority (0-255)$priority",
|
DEFPY_YANG(priority, priority_cmd, "[no] priority (0-255)$priority",
|
||||||
@ -3418,18 +3529,85 @@ DEFPY_YANG(priority, priority_cmd, "[no] priority (0-255)$priority",
|
|||||||
"Flex-Algo definition priority\n"
|
"Flex-Algo definition priority\n"
|
||||||
"Priority value\n")
|
"Priority value\n")
|
||||||
{
|
{
|
||||||
return CMD_SUCCESS;
|
nb_cli_enqueue_change(vty, "./priority",
|
||||||
|
no ? NB_OP_DESTROY : NB_OP_MODIFY,
|
||||||
|
no ? NULL : priority_str);
|
||||||
|
return nb_cli_apply_changes(vty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cli_show_isis_flex_algo(struct vty *vty, const struct lyd_node *dnode,
|
void cli_show_isis_flex_algo(struct vty *vty, const struct lyd_node *dnode,
|
||||||
bool show_defaults)
|
bool show_defaults)
|
||||||
{
|
{
|
||||||
|
uint32_t algorithm;
|
||||||
|
enum flex_algo_metric_type metric_type;
|
||||||
|
uint32_t priority;
|
||||||
|
char type_str[10];
|
||||||
|
|
||||||
|
algorithm = yang_dnode_get_uint32(dnode, "./flex-algo");
|
||||||
|
vty_out(vty, " flex-algo %u\n", algorithm);
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode, "./advertise-definition"))
|
||||||
|
vty_out(vty, " advertise-definition\n");
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode, "./dplane-sr-mpls"))
|
||||||
|
vty_out(vty, " dataplane sr-mpls\n");
|
||||||
|
if (yang_dnode_exists(dnode, "./dplane-srv6"))
|
||||||
|
vty_out(vty, " dataplane srv6\n");
|
||||||
|
if (yang_dnode_exists(dnode, "./dplane-ip"))
|
||||||
|
vty_out(vty, " dataplane ip\n");
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode, "./prefix-metric"))
|
||||||
|
vty_out(vty, " prefix-metric\n");
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode, "./metric-type")) {
|
||||||
|
metric_type = yang_dnode_get_enum(dnode, "./metric-type");
|
||||||
|
if (metric_type != MT_IGP) {
|
||||||
|
flex_algo_metric_type_print(type_str, sizeof(type_str),
|
||||||
|
metric_type);
|
||||||
|
vty_out(vty, " metric-type %s\n", type_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode, "./priority")) {
|
||||||
|
priority = yang_dnode_get_uint32(dnode, "./priority");
|
||||||
|
if (priority != FLEX_ALGO_PRIO_DEFAULT)
|
||||||
|
vty_out(vty, " priority %u\n", priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yang_dnode_exists(dnode,
|
||||||
|
"./affinity-include-alls/affinity-include-all")) {
|
||||||
|
vty_out(vty, " affinity include-all");
|
||||||
|
yang_dnode_iterate(
|
||||||
|
ag_iter_cb, vty, dnode,
|
||||||
|
"./affinity-include-alls/affinity-include-all");
|
||||||
|
vty_out(vty, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yang_dnode_exists(
|
||||||
|
dnode, "./affinity-include-anies/affinity-include-any")) {
|
||||||
|
vty_out(vty, " affinity include-any");
|
||||||
|
yang_dnode_iterate(
|
||||||
|
ag_iter_cb, vty, dnode,
|
||||||
|
"./affinity-include-anies/affinity-include-any");
|
||||||
|
vty_out(vty, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (yang_dnode_exists(
|
||||||
|
dnode, "./affinity-exclude-anies/affinity-exclude-any")) {
|
||||||
|
vty_out(vty, " affinity exclude-any");
|
||||||
|
yang_dnode_iterate(
|
||||||
|
ag_iter_cb, vty, dnode,
|
||||||
|
"./affinity-exclude-anies/affinity-exclude-any");
|
||||||
|
vty_out(vty, "\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cli_show_isis_flex_algo_end(struct vty *vty, const struct lyd_node *dnode)
|
void cli_show_isis_flex_algo_end(struct vty *vty, const struct lyd_node *dnode)
|
||||||
{
|
{
|
||||||
|
vty_out(vty, " !\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void isis_cli_init(void)
|
void isis_cli_init(void)
|
||||||
{
|
{
|
||||||
install_element(CONFIG_NODE, &router_isis_cmd);
|
install_element(CONFIG_NODE, &router_isis_cmd);
|
||||||
@ -3581,6 +3759,9 @@ void isis_cli_init(void)
|
|||||||
install_element(ISIS_FLEX_ALGO_NODE, &affinity_include_any_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &affinity_include_any_cmd);
|
||||||
install_element(ISIS_FLEX_ALGO_NODE, &affinity_include_all_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &affinity_include_all_cmd);
|
||||||
install_element(ISIS_FLEX_ALGO_NODE, &affinity_exclude_any_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &affinity_exclude_any_cmd);
|
||||||
|
install_element(ISIS_FLEX_ALGO_NODE, &dplane_sr_mpls_cmd);
|
||||||
|
install_element(ISIS_FLEX_ALGO_NODE, &dplane_srv6_cmd);
|
||||||
|
install_element(ISIS_FLEX_ALGO_NODE, &dplane_ip_cmd);
|
||||||
install_element(ISIS_FLEX_ALGO_NODE, &prefix_metric_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &prefix_metric_cmd);
|
||||||
install_element(ISIS_FLEX_ALGO_NODE, &metric_type_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &metric_type_cmd);
|
||||||
install_element(ISIS_FLEX_ALGO_NODE, &priority_cmd);
|
install_element(ISIS_FLEX_ALGO_NODE, &priority_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user