From 4e75a67d027153ec37c7cdf76d05421d4a01baea Mon Sep 17 00:00:00 2001 From: Emanuele Di Pascale Date: Wed, 14 Nov 2018 13:05:47 +0100 Subject: [PATCH] isisd: retrofit the 'isis hello-multiplier' command Signed-off-by: Emanuele Di Pascale --- isisd/isis_cli.c | 61 ++++++++++++++++++++++++++++++++++++++++ isisd/isis_cli.h | 2 ++ isisd/isis_northbound.c | 26 +++++++++++++++-- isisd/isis_vty_common.c | 39 ------------------------- isisd/isis_vty_fabricd.c | 39 +++++++++++++++++++++++++ isisd/isis_vty_isisd.c | 42 --------------------------- 6 files changed, 126 insertions(+), 83 deletions(-) diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index 9c25484980..f39a83e0ef 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1391,6 +1391,64 @@ void cli_show_ip_isis_hello_interval(struct vty *vty, struct lyd_node *dnode, } } +/* + * XPath: /frr-interface:lib/interface/frr-isisd:isis/hello/multiplier + */ +DEFPY(isis_hello_multiplier, isis_hello_multiplier_cmd, + "isis hello-multiplier [level-1|level-2]$level (2-100)$mult", + "IS-IS routing protocol\n" + "Set multiplier for Hello holding time\n" + "Specify hello multiplier for level-1 IIHs\n" + "Specify hello multiplier for level-2 IIHs\n" + "Hello multiplier value\n") +{ + if (!level || strmatch(level, "level-1")) + nb_cli_enqueue_change( + vty, "./frr-isisd:isis/hello/multiplier/level-1", + NB_OP_MODIFY, mult_str); + if (!level || strmatch(level, "level-2")) + nb_cli_enqueue_change( + vty, "./frr-isisd:isis/hello/multiplier/level-2", + NB_OP_MODIFY, mult_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY(no_isis_hello_multiplier, no_isis_hello_multiplier_cmd, + "no isis hello-multiplier [level-1|level-2]$level [(2-100)]", + NO_STR + "IS-IS routing protocol\n" + "Set multiplier for Hello holding time\n" + "Specify hello multiplier for level-1 IIHs\n" + "Specify hello multiplier for level-2 IIHs\n" + "Hello multiplier value\n") +{ + if (!level || strmatch(level, "level-1")) + nb_cli_enqueue_change( + vty, "./frr-isisd:isis/hello/multiplier/level-1", + NB_OP_MODIFY, NULL); + if (!level || strmatch(level, "level-2")) + nb_cli_enqueue_change( + vty, "./frr-isisd:isis/hello/multiplier/level-2", + NB_OP_MODIFY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_ip_isis_hello_multi(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + const char *l1 = yang_dnode_get_string(dnode, "./level-1"); + const char *l2 = yang_dnode_get_string(dnode, "./level-2"); + + if (strmatch(l1, l2)) + vty_out(vty, " isis hello-multiplier %s\n", l1); + else { + vty_out(vty, " isis hello-multiplier %s level-1\n", l1); + vty_out(vty, " isis hello-multiplier %s level-2\n", l2); + } +} + void isis_cli_init(void) { install_element(CONFIG_NODE, &router_isis_cmd); @@ -1453,6 +1511,9 @@ void isis_cli_init(void) install_element(INTERFACE_NODE, &isis_hello_interval_cmd); install_element(INTERFACE_NODE, &no_isis_hello_interval_cmd); + + install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd); + install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd); } #endif /* ifndef FABRICD */ diff --git a/isisd/isis_cli.h b/isisd/isis_cli.h index 056144cac0..987da20212 100644 --- a/isisd/isis_cli.h +++ b/isisd/isis_cli.h @@ -89,5 +89,7 @@ void cli_show_ip_isis_metric(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_ip_isis_hello_interval(struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_ip_isis_hello_multi(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); #endif /* ISISD_ISIS_CLI_H_ */ diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c index fc81fe39f6..6779501850 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -1950,7 +1950,16 @@ lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ + struct isis_circuit *circuit; + uint16_t multi; + + if (event != NB_EV_APPLY) + return NB_OK; + + circuit = yang_dnode_get_entry(dnode, true); + multi = yang_dnode_get_uint16(dnode, NULL); + circuit->hello_multiplier[0] = multi; + return NB_OK; } @@ -1962,7 +1971,16 @@ lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ + struct isis_circuit *circuit; + uint16_t multi; + + if (event != NB_EV_APPLY) + return NB_OK; + + circuit = yang_dnode_get_entry(dnode, true); + multi = yang_dnode_get_uint16(dnode, NULL); + circuit->hello_multiplier[1] = multi; + return NB_OK; } @@ -2671,6 +2689,10 @@ const struct frr_yang_module_info frr_isisd_info = { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/interval/level-2", .cbs.modify = lib_interface_isis_hello_interval_level_2_modify, }, + { + .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier", + .cbs.cli_show = cli_show_ip_isis_hello_multi, + }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-1", .cbs.modify = lib_interface_isis_hello_multiplier_level_1_modify, diff --git a/isisd/isis_vty_common.c b/isisd/isis_vty_common.c index 773c26f3b8..78e6f0eec0 100644 --- a/isisd/isis_vty_common.c +++ b/isisd/isis_vty_common.c @@ -56,42 +56,6 @@ struct isis_circuit *isis_circuit_lookup(struct vty *vty) return circuit; } -DEFUN (isis_hello_multiplier, - isis_hello_multiplier_cmd, - PROTO_NAME " hello-multiplier (2-100)", - PROTO_HELP - "Set multiplier for Hello holding time\n" - "Hello multiplier value\n") -{ - uint16_t mult = atoi(argv[2]->arg); - struct isis_circuit *circuit = isis_circuit_lookup(vty); - if (!circuit) - return CMD_ERR_NO_MATCH; - - circuit->hello_multiplier[0] = mult; - circuit->hello_multiplier[1] = mult; - - return CMD_SUCCESS; -} - -DEFUN (no_isis_hello_multiplier, - no_isis_hello_multiplier_cmd, - "no " PROTO_NAME " hello-multiplier [(2-100)]", - NO_STR - PROTO_HELP - "Set multiplier for Hello holding time\n" - "Hello multiplier value\n") -{ - struct isis_circuit *circuit = isis_circuit_lookup(vty); - if (!circuit) - return CMD_ERR_NO_MATCH; - - circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER; - circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER; - - return CMD_SUCCESS; -} - DEFUN (csnp_interval, csnp_interval_cmd, PROTO_NAME " csnp-interval (1-600)", @@ -264,9 +228,6 @@ DEFUN (no_isis_bfd, void isis_vty_init(void) { - install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd); - install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd); - install_element(INTERFACE_NODE, &csnp_interval_cmd); install_element(INTERFACE_NODE, &no_csnp_interval_cmd); diff --git a/isisd/isis_vty_fabricd.c b/isisd/isis_vty_fabricd.c index 2c86e91603..aad2ab95e3 100644 --- a/isisd/isis_vty_fabricd.c +++ b/isisd/isis_vty_fabricd.c @@ -869,6 +869,42 @@ DEFUN (no_isis_hello_interval, return CMD_SUCCESS; } +DEFUN (isis_hello_multiplier, + isis_hello_multiplier_cmd, + PROTO_NAME " hello-multiplier (2-100)", + PROTO_HELP + "Set multiplier for Hello holding time\n" + "Hello multiplier value\n") +{ + uint16_t mult = atoi(argv[2]->arg); + struct isis_circuit *circuit = isis_circuit_lookup(vty); + if (!circuit) + return CMD_ERR_NO_MATCH; + + circuit->hello_multiplier[0] = mult; + circuit->hello_multiplier[1] = mult; + + return CMD_SUCCESS; +} + +DEFUN (no_isis_hello_multiplier, + no_isis_hello_multiplier_cmd, + "no " PROTO_NAME " hello-multiplier [(2-100)]", + NO_STR + PROTO_HELP + "Set multiplier for Hello holding time\n" + "Hello multiplier value\n") +{ + struct isis_circuit *circuit = isis_circuit_lookup(vty); + if (!circuit) + return CMD_ERR_NO_MATCH; + + circuit->hello_multiplier[0] = DEFAULT_HELLO_MULTIPLIER; + circuit->hello_multiplier[1] = DEFAULT_HELLO_MULTIPLIER; + + return CMD_SUCCESS; +} + void isis_vty_daemon_init(void) { install_element(ROUTER_NODE, &fabric_tier_cmd); @@ -919,4 +955,7 @@ void isis_vty_daemon_init(void) install_element(INTERFACE_NODE, &isis_hello_interval_cmd); install_element(INTERFACE_NODE, &no_isis_hello_interval_cmd); + + install_element(INTERFACE_NODE, &isis_hello_multiplier_cmd); + install_element(INTERFACE_NODE, &no_isis_hello_multiplier_cmd); } diff --git a/isisd/isis_vty_isisd.c b/isisd/isis_vty_isisd.c index 2465154647..a011bf7a62 100644 --- a/isisd/isis_vty_isisd.c +++ b/isisd/isis_vty_isisd.c @@ -219,45 +219,6 @@ DEFUN (no_isis_priority_level, return CMD_SUCCESS; } -DEFUN (isis_hello_multiplier_level, - isis_hello_multiplier_level_cmd, - "isis hello-multiplier (2-100) ", - "IS-IS routing protocol\n" - "Set multiplier for Hello holding time\n" - "Hello multiplier value\n" - "Specify hello multiplier for level-1 IIHs\n" - "Specify hello multiplier for level-2 IIHs\n") -{ - uint16_t mult = atoi(argv[2]->arg); - struct isis_circuit *circuit = isis_circuit_lookup(vty); - if (!circuit) - return CMD_ERR_NO_MATCH; - - circuit->hello_multiplier[level_for_arg(argv[3]->text)] = mult; - - return CMD_SUCCESS; -} - -DEFUN (no_isis_hello_multiplier_level, - no_isis_hello_multiplier_level_cmd, - "no isis hello-multiplier [(2-100)] ", - NO_STR - "IS-IS routing protocol\n" - "Set multiplier for Hello holding time\n" - "Hello multiplier value\n" - "Specify hello multiplier for level-1 IIHs\n" - "Specify hello multiplier for level-2 IIHs\n") -{ - struct isis_circuit *circuit = isis_circuit_lookup(vty); - int level = level_for_arg(argv[argc - 1]->text); - if (!circuit) - return CMD_ERR_NO_MATCH; - - circuit->hello_multiplier[level] = DEFAULT_HELLO_MULTIPLIER; - - return CMD_SUCCESS; -} - DEFUN (isis_threeway_adj, isis_threeway_adj_cmd, "[no] isis three-way-handshake", @@ -397,9 +358,6 @@ void isis_vty_daemon_init(void) install_element(INTERFACE_NODE, &isis_priority_level_cmd); install_element(INTERFACE_NODE, &no_isis_priority_level_cmd); - install_element(INTERFACE_NODE, &isis_hello_multiplier_level_cmd); - install_element(INTERFACE_NODE, &no_isis_hello_multiplier_level_cmd); - install_element(INTERFACE_NODE, &isis_threeway_adj_cmd); install_element(INTERFACE_NODE, &isis_hello_padding_cmd);