]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: retrofit the 'isis topology' command
authorEmanuele Di Pascale <emanuele@voltanet.io>
Wed, 14 Nov 2018 13:27:33 +0000 (14:27 +0100)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Tue, 18 Dec 2018 14:24:46 +0000 (15:24 +0100)
Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
isisd/isis_cli.c
isisd/isis_cli.h
isisd/isis_northbound.c
isisd/isis_vty_common.c
isisd/isis_vty_fabricd.c

index 37d6315a6c2d0f79d7edbf022a3aed83ad78c9eb..809e17d477af3f4ba68c486282c883451ff22cf3 100644 (file)
@@ -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"
+      "<ipv4-unicast"
+      "|ipv4-mgmt"
+      "|ipv6-unicast"
+      "|ipv4-multicast"
+      "|ipv6-multicast"
+      "|ipv6-mgmt"
+      "|ipv6-dstsrc"
+      ">$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 */
index cc28b871d2400c03c46d0a888f3f43264f6b5927..6b529e71cb23da082d3736bd8cb4b810747334d9 100644 (file)
@@ -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_ */
index 8467cd6ae2de321459760749ee2dc98c8c8f9ba4..150b5755a5740cba0798d96e2c286fdf64f35fc5 100644 (file)
@@ -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,
index c1d4f83b45f9abf6335d68b2122c2535ffdd366a..911713d657f25a816bdfe658d522447f78f41427 100644 (file)
@@ -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);
 
index f2d15c04b8fe3de6da2d55be07c5331dfe049fba..b2c0440de6ce8f1a453dab35f49742233de17adf 100644 (file)
@@ -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);
 }