From: Emanuele Di Pascale Date: Wed, 14 Nov 2018 13:27:33 +0000 (+0100) Subject: isisd: retrofit the 'isis topology' command X-Git-Tag: frr-7.0.1~94^2~31 X-Git-Url: https://git.proxmox.com/?p=mirror_frr.git;a=commitdiff_plain;h=83d043f6c0d2cb3986d17777aad30f9ce5cefa07 isisd: retrofit the 'isis topology' command Signed-off-by: Emanuele Di Pascale --- diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index 37d6315a6..809e17d47 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1611,6 +1611,99 @@ void cli_show_ip_isis_psnp_interval(struct vty *vty, struct lyd_node *dnode, } } +/* + * XPath: /frr-interface:lib/interface/frr-isisd:isis/multi-topology + */ +DEFPY(circuit_topology, circuit_topology_cmd, + "[no] isis topology" + "$topology", + NO_STR + "IS-IS routing protocol\n" + "Configure interface IS-IS topologies\n" + "IPv4 unicast topology\n" + "IPv4 management topology\n" + "IPv6 unicast topology\n" + "IPv4 multicast topology\n" + "IPv6 multicast topology\n" + "IPv6 management topology\n" + "IPv6 dst-src topology\n") +{ + nb_cli_enqueue_change(vty, ".", NB_OP_MODIFY, no ? "false" : "true"); + + if (strmatch(topology, "ipv4-mgmt")) + return nb_cli_apply_changes( + vty, "./frr-isisd:isis/multi-topology/ipv4-management"); + else if (strmatch(topology, "ipv6-mgmt")) + return nb_cli_apply_changes( + vty, "./frr-isisd:isis/multi-topology/ipv6-management"); + else + return nb_cli_apply_changes( + vty, "./frr-isisd:isis/multi-topology/%s", topology); +} + +void cli_show_ip_isis_mt_ipv4_unicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv4-unicast\n"); +} + +void cli_show_ip_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv4-multicast\n"); +} + +void cli_show_ip_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv4-mgmt\n"); +} + +void cli_show_ip_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv6-unicast\n"); +} + +void cli_show_ip_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv6-multicast\n"); +} + +void cli_show_ip_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv6-mgmt\n"); +} + +void cli_show_ip_isis_mt_ipv6_dstsrc(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + vty_out(vty, " isis topology ipv6-dstsrc\n"); +} + void isis_cli_init(void) { install_element(CONFIG_NODE, &router_isis_cmd); @@ -1686,6 +1779,8 @@ void isis_cli_init(void) install_element(INTERFACE_NODE, &psnp_interval_cmd); install_element(INTERFACE_NODE, &no_psnp_interval_cmd); + + install_element(INTERFACE_NODE, &circuit_topology_cmd); } #endif /* ifndef FABRICD */ diff --git a/isisd/isis_cli.h b/isisd/isis_cli.h index cc28b871d..6b529e71c 100644 --- a/isisd/isis_cli.h +++ b/isisd/isis_cli.h @@ -99,5 +99,19 @@ void cli_show_ip_isis_csnp_interval(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_ip_isis_psnp_interval(struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_ip_isis_mt_ipv4_unicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv4_multicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv4_mgmt(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv6_unicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv6_multicast(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv6_mgmt(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_ip_isis_mt_ipv6_dstsrc(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 8467cd6ae..150b5755a 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -2273,12 +2273,41 @@ static int lib_interface_isis_disable_three_way_handshake_delete( * XPath: * /frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast */ +static int lib_interface_isis_multi_topology_common( + enum nb_event event, const struct lyd_node *dnode, uint16_t mtid) +{ + struct isis_circuit *circuit; + bool value; + + switch (event) { + case NB_EV_VALIDATE: + circuit = yang_dnode_get_entry(dnode, false); + if (circuit && circuit->area && circuit->area->oldmetric) { + flog_warn( + EC_LIB_NB_CB_CONFIG_VALIDATE, + "Multi topology IS-IS can only be used with wide metrics"); + return NB_ERR_VALIDATION; + } + break; + case NB_EV_PREPARE: + case NB_EV_ABORT: + break; + case NB_EV_APPLY: + circuit = yang_dnode_get_entry(dnode, true); + value = yang_dnode_get_bool(dnode, NULL); + isis_circuit_mt_enabled_set(circuit, mtid, value); + break; + } + + return NB_OK; +} + static int lib_interface_isis_multi_topology_ipv4_unicast_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV4_UNICAST); } /* @@ -2289,8 +2318,8 @@ static int lib_interface_isis_multi_topology_ipv4_multicast_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV4_MULTICAST); } /* @@ -2301,8 +2330,8 @@ static int lib_interface_isis_multi_topology_ipv4_management_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV4_MGMT); } /* @@ -2313,8 +2342,8 @@ static int lib_interface_isis_multi_topology_ipv6_unicast_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV6_UNICAST); } /* @@ -2325,8 +2354,8 @@ static int lib_interface_isis_multi_topology_ipv6_multicast_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV6_MULTICAST); } /* @@ -2337,8 +2366,8 @@ static int lib_interface_isis_multi_topology_ipv6_management_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV6_MGMT); } /* @@ -2348,8 +2377,8 @@ static int lib_interface_isis_multi_topology_ipv6_dstsrc_modify( enum nb_event event, const struct lyd_node *dnode, union nb_resource *resource) { - /* TODO: implement me. */ - return NB_OK; + return lib_interface_isis_multi_topology_common(event, dnode, + ISIS_MT_IPV6_DSTSRC); } /* clang-format off */ @@ -2813,30 +2842,37 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-unicast", .cbs.modify = lib_interface_isis_multi_topology_ipv4_unicast_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv4_unicast, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-multicast", .cbs.modify = lib_interface_isis_multi_topology_ipv4_multicast_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv4_multicast, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv4-management", .cbs.modify = lib_interface_isis_multi_topology_ipv4_management_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv4_mgmt, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-unicast", .cbs.modify = lib_interface_isis_multi_topology_ipv6_unicast_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv6_unicast, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-multicast", .cbs.modify = lib_interface_isis_multi_topology_ipv6_multicast_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv6_multicast, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-management", .cbs.modify = lib_interface_isis_multi_topology_ipv6_management_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv6_mgmt, }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/multi-topology/ipv6-dstsrc", .cbs.modify = lib_interface_isis_multi_topology_ipv6_dstsrc_modify, + .cbs.cli_show = cli_show_ip_isis_mt_ipv6_dstsrc, }, { .xpath = NULL, diff --git a/isisd/isis_vty_common.c b/isisd/isis_vty_common.c index c1d4f83b4..911713d65 100644 --- a/isisd/isis_vty_common.c +++ b/isisd/isis_vty_common.c @@ -32,7 +32,6 @@ #include "isis_circuit.h" #include "isis_csm.h" #include "isis_misc.h" -#include "isis_mt.h" #include "isisd.h" #include "isis_bfd.h" #include "isis_vty_common.h" @@ -56,61 +55,6 @@ struct isis_circuit *isis_circuit_lookup(struct vty *vty) return circuit; } -DEFUN (circuit_topology, - circuit_topology_cmd, - PROTO_NAME " topology " ISIS_MT_NAMES, - PROTO_HELP - "Configure interface IS-IS topologies\n" - ISIS_MT_DESCRIPTIONS) -{ - struct isis_circuit *circuit = isis_circuit_lookup(vty); - if (!circuit) - return CMD_ERR_NO_MATCH; - const char *arg = argv[2]->arg; - uint16_t mtid = isis_str2mtid(arg); - - if (circuit->area && circuit->area->oldmetric) { - vty_out(vty, - "Multi topology IS-IS can only be used with wide metrics\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - if (mtid == (uint16_t)-1) { - vty_out(vty, "Don't know topology '%s'\n", arg); - return CMD_WARNING_CONFIG_FAILED; - } - - return isis_circuit_mt_enabled_set(circuit, mtid, true); -} - -DEFUN (no_circuit_topology, - no_circuit_topology_cmd, - "no " PROTO_NAME " topology " ISIS_MT_NAMES, - NO_STR - PROTO_HELP - "Configure interface IS-IS topologies\n" - ISIS_MT_DESCRIPTIONS) -{ - struct isis_circuit *circuit = isis_circuit_lookup(vty); - if (!circuit) - return CMD_ERR_NO_MATCH; - const char *arg = argv[3]->arg; - uint16_t mtid = isis_str2mtid(arg); - - if (circuit->area && circuit->area->oldmetric) { - vty_out(vty, - "Multi topology IS-IS can only be used with wide metrics\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - if (mtid == (uint16_t)-1) { - vty_out(vty, "Don't know topology '%s'\n", arg); - return CMD_WARNING_CONFIG_FAILED; - } - - return isis_circuit_mt_enabled_set(circuit, mtid, false); -} - DEFUN (isis_bfd, isis_bfd_cmd, PROTO_NAME " bfd", @@ -156,9 +100,6 @@ DEFUN (no_isis_bfd, void isis_vty_init(void) { - install_element(INTERFACE_NODE, &circuit_topology_cmd); - install_element(INTERFACE_NODE, &no_circuit_topology_cmd); - install_element(INTERFACE_NODE, &isis_bfd_cmd); install_element(INTERFACE_NODE, &no_isis_bfd_cmd); diff --git a/isisd/isis_vty_fabricd.c b/isisd/isis_vty_fabricd.c index f2d15c04b..b2c0440de 100644 --- a/isisd/isis_vty_fabricd.c +++ b/isisd/isis_vty_fabricd.c @@ -32,6 +32,7 @@ #include "isisd/isis_csm.h" #include "isisd/isis_circuit.h" #include "lib/spf_backoff.h" +#include "isisd/isis_mt.h" DEFUN (fabric_tier, fabric_tier_cmd, @@ -977,6 +978,61 @@ DEFUN (no_psnp_interval, return CMD_SUCCESS; } +DEFUN (circuit_topology, + circuit_topology_cmd, + PROTO_NAME " topology " ISIS_MT_NAMES, + PROTO_HELP + "Configure interface IS-IS topologies\n" + ISIS_MT_DESCRIPTIONS) +{ + struct isis_circuit *circuit = isis_circuit_lookup(vty); + if (!circuit) + return CMD_ERR_NO_MATCH; + const char *arg = argv[2]->arg; + uint16_t mtid = isis_str2mtid(arg); + + if (circuit->area && circuit->area->oldmetric) { + vty_out(vty, + "Multi topology IS-IS can only be used with wide metrics\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + if (mtid == (uint16_t)-1) { + vty_out(vty, "Don't know topology '%s'\n", arg); + return CMD_WARNING_CONFIG_FAILED; + } + + return isis_circuit_mt_enabled_set(circuit, mtid, true); +} + +DEFUN (no_circuit_topology, + no_circuit_topology_cmd, + "no " PROTO_NAME " topology " ISIS_MT_NAMES, + NO_STR + PROTO_HELP + "Configure interface IS-IS topologies\n" + ISIS_MT_DESCRIPTIONS) +{ + struct isis_circuit *circuit = isis_circuit_lookup(vty); + if (!circuit) + return CMD_ERR_NO_MATCH; + const char *arg = argv[3]->arg; + uint16_t mtid = isis_str2mtid(arg); + + if (circuit->area && circuit->area->oldmetric) { + vty_out(vty, + "Multi topology IS-IS can only be used with wide metrics\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + if (mtid == (uint16_t)-1) { + vty_out(vty, "Don't know topology '%s'\n", arg); + return CMD_WARNING_CONFIG_FAILED; + } + + return isis_circuit_mt_enabled_set(circuit, mtid, false); +} + void isis_vty_daemon_init(void) { install_element(ROUTER_NODE, &fabric_tier_cmd); @@ -1036,4 +1092,7 @@ void isis_vty_daemon_init(void) install_element(INTERFACE_NODE, &psnp_interval_cmd); install_element(INTERFACE_NODE, &no_psnp_interval_cmd); + + install_element(INTERFACE_NODE, &circuit_topology_cmd); + install_element(INTERFACE_NODE, &no_circuit_topology_cmd); }