]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: retrofit the 'isis metric' command
authorEmanuele Di Pascale <emanuele@voltanet.io>
Wed, 14 Nov 2018 11:56:49 +0000 (12:56 +0100)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Tue, 18 Dec 2018 14:23:49 +0000 (15:23 +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
isisd/isis_vty_isisd.c

index 607408853f4c8a41b943c54f48690d93a1ce7179..e89f76a97fd0a47613eabc531f5467230310b320 100644 (file)
@@ -1279,6 +1279,60 @@ void cli_show_ip_isis_password(struct vty *vty, struct lyd_node *dnode,
                yang_dnode_get_string(dnode, "./password"));
 }
 
+/*
+ * XPath: /frr-interface:lib/interface/frr-isisd:isis/metric
+ */
+DEFPY(isis_metric, isis_metric_cmd,
+      "isis metric [level-1|level-2]$level (0-16777215)$met",
+      "IS-IS routing protocol\n"
+      "Set default metric for circuit\n"
+      "Specify metric for level-1 routing\n"
+      "Specify metric for level-2 routing\n"
+      "Default metric value\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-1",
+                                     NB_OP_MODIFY, met_str);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-2",
+                                     NB_OP_MODIFY, met_str);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY(no_isis_metric, no_isis_metric_cmd,
+      "no isis metric [level-1|level-2]$level [(0-16777215)]",
+      NO_STR
+      "IS-IS routing protocol\n"
+      "Set default metric for circuit\n"
+      "Specify metric for level-1 routing\n"
+      "Specify metric for level-2 routing\n"
+      "Default metric value\n")
+{
+       if (!level || strmatch(level, "level-1"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-1",
+                                     NB_OP_MODIFY, NULL);
+       if (!level || strmatch(level, "level-2"))
+               nb_cli_enqueue_change(vty, "./frr-isisd:isis/metric/level-2",
+                                     NB_OP_MODIFY, NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_ip_isis_metric(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 metric %s\n", l1);
+       else {
+               vty_out(vty, " isis metric %s level-1\n", l1);
+               vty_out(vty, " isis metric %s level-2\n", l2);
+       }
+}
+
 void isis_cli_init(void)
 {
        install_element(CONFIG_NODE, &router_isis_cmd);
@@ -1335,6 +1389,9 @@ void isis_cli_init(void)
 
        install_element(INTERFACE_NODE, &isis_passwd_cmd);
        install_element(INTERFACE_NODE, &no_isis_passwd_cmd);
+
+       install_element(INTERFACE_NODE, &isis_metric_cmd);
+       install_element(INTERFACE_NODE, &no_isis_metric_cmd);
 }
 
 #endif /* ifndef FABRICD */
index 8a95ead122cd88fc76ce22253b011b5eb865d9f6..70fa47f88d6c24007b5cf5102fd35a05d46af91e 100644 (file)
@@ -85,5 +85,7 @@ void cli_show_ip_isis_passive(struct vty *vty, struct lyd_node *dnode,
                              bool show_defaults);
 void cli_show_ip_isis_password(struct vty *vty, struct lyd_node *dnode,
                               bool show_defaults);
+void cli_show_ip_isis_metric(struct vty *vty, struct lyd_node *dnode,
+                            bool show_defaults);
 
 #endif /* ISISD_ISIS_CLI_H_ */
index e76e72c29c6b9cc380e09ab25668a3f1ecca3ff7..0f1305f6b2434c8ee8eb8ba6d12aebef471ef3f4 100644 (file)
@@ -1956,7 +1956,16 @@ lib_interface_isis_metric_level_1_modify(enum nb_event event,
                                         const struct lyd_node *dnode,
                                         union nb_resource *resource)
 {
-       /* TODO: implement me. */
+       struct isis_circuit *circuit;
+       unsigned int met;
+
+       if (event != NB_EV_APPLY)
+               return NB_OK;
+
+       circuit = yang_dnode_get_entry(dnode, true);
+       met = yang_dnode_get_uint32(dnode, NULL);
+       isis_circuit_metric_set(circuit, IS_LEVEL_1, met);
+
        return NB_OK;
 }
 
@@ -1968,7 +1977,16 @@ lib_interface_isis_metric_level_2_modify(enum nb_event event,
                                         const struct lyd_node *dnode,
                                         union nb_resource *resource)
 {
-       /* TODO: implement me. */
+       struct isis_circuit *circuit;
+       unsigned int met;
+
+       if (event != NB_EV_APPLY)
+               return NB_OK;
+
+       circuit = yang_dnode_get_entry(dnode, true);
+       met = yang_dnode_get_uint32(dnode, NULL);
+       isis_circuit_metric_set(circuit, IS_LEVEL_2, met);
+
        return NB_OK;
 }
 
@@ -2639,6 +2657,10 @@ const struct frr_yang_module_info frr_isisd_info = {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/hello/multiplier/level-2",
                        .cbs.modify = lib_interface_isis_hello_multiplier_level_2_modify,
                },
+               {
+                       .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric",
+                       .cbs.cli_show = cli_show_ip_isis_metric,
+               },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/metric/level-1",
                        .cbs.modify = lib_interface_isis_metric_level_1_modify,
index 8ee1bf2cc08d70ce2b64e80141721c83ae992024..4b21e909b5bca762297c8866c489e5c578152fde 100644 (file)
@@ -56,69 +56,6 @@ struct isis_circuit *isis_circuit_lookup(struct vty *vty)
        return circuit;
 }
 
-DEFUN (isis_metric,
-       isis_metric_cmd,
-       PROTO_NAME " metric (0-16777215)",
-       PROTO_HELP
-       "Set default metric for circuit\n"
-       "Default metric value\n")
-{
-       int idx_number = 2;
-       int met;
-       struct isis_circuit *circuit = isis_circuit_lookup(vty);
-       if (!circuit)
-               return CMD_ERR_NO_MATCH;
-
-       met = atoi(argv[idx_number]->arg);
-
-       /* RFC3787 section 5.1 */
-       if (circuit->area && circuit->area->oldmetric == 1
-           && met > MAX_NARROW_LINK_METRIC) {
-               vty_out(vty,
-                       "Invalid metric %d - should be <0-63> "
-                       "when narrow metric type enabled\n",
-                       met);
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       /* RFC4444 */
-       if (circuit->area && circuit->area->newmetric == 1
-           && met > MAX_WIDE_LINK_METRIC) {
-               vty_out(vty,
-                       "Invalid metric %d - should be <0-16777215> "
-                       "when wide metric type enabled\n",
-                       met);
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1, met),
-                       "Failed to set L1 metric: $ERR");
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2, met),
-                       "Failed to set L2 metric: $ERR");
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_isis_metric,
-       no_isis_metric_cmd,
-       "no " PROTO_NAME " metric [(0-16777215)]",
-       NO_STR
-       PROTO_HELP
-       "Set default metric for circuit\n"
-       "Default metric value\n")
-{
-       struct isis_circuit *circuit = isis_circuit_lookup(vty);
-       if (!circuit)
-               return CMD_ERR_NO_MATCH;
-
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1,
-                                               DEFAULT_CIRCUIT_METRIC),
-                       "Failed to set L1 metric: $ERR");
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2,
-                                               DEFAULT_CIRCUIT_METRIC),
-                       "Failed to set L2 metric: $ERR");
-       return CMD_SUCCESS;
-}
-
 DEFUN (isis_hello_interval,
        isis_hello_interval_cmd,
        PROTO_NAME " hello-interval (1-600)",
@@ -363,9 +300,6 @@ DEFUN (no_isis_bfd,
 
 void isis_vty_init(void)
 {
-       install_element(INTERFACE_NODE, &isis_metric_cmd);
-       install_element(INTERFACE_NODE, &no_isis_metric_cmd);
-
        install_element(INTERFACE_NODE, &isis_hello_interval_cmd);
        install_element(INTERFACE_NODE, &no_isis_hello_interval_cmd);
 
index 0dcf12aa051089bd39c27c914dff05f037310177..63dd646cb4a2ddc020b5b33c82300083a88f115b 100644 (file)
@@ -770,6 +770,69 @@ DEFUN (no_isis_passwd,
        return CMD_SUCCESS;
 }
 
+DEFUN (isis_metric,
+       isis_metric_cmd,
+       PROTO_NAME " metric (0-16777215)",
+       PROTO_HELP
+       "Set default metric for circuit\n"
+       "Default metric value\n")
+{
+       int idx_number = 2;
+       int met;
+       struct isis_circuit *circuit = isis_circuit_lookup(vty);
+       if (!circuit)
+               return CMD_ERR_NO_MATCH;
+
+       met = atoi(argv[idx_number]->arg);
+
+       /* RFC3787 section 5.1 */
+       if (circuit->area && circuit->area->oldmetric == 1
+           && met > MAX_NARROW_LINK_METRIC) {
+               vty_out(vty,
+                       "Invalid metric %d - should be <0-63> "
+                       "when narrow metric type enabled\n",
+                       met);
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
+       /* RFC4444 */
+       if (circuit->area && circuit->area->newmetric == 1
+           && met > MAX_WIDE_LINK_METRIC) {
+               vty_out(vty,
+                       "Invalid metric %d - should be <0-16777215> "
+                       "when wide metric type enabled\n",
+                       met);
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
+       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1, met),
+                       "Failed to set L1 metric: $ERR");
+       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2, met),
+                       "Failed to set L2 metric: $ERR");
+       return CMD_SUCCESS;
+}
+
+DEFUN (no_isis_metric,
+       no_isis_metric_cmd,
+       "no " PROTO_NAME " metric [(0-16777215)]",
+       NO_STR
+       PROTO_HELP
+       "Set default metric for circuit\n"
+       "Default metric value\n")
+{
+       struct isis_circuit *circuit = isis_circuit_lookup(vty);
+       if (!circuit)
+               return CMD_ERR_NO_MATCH;
+
+       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_1,
+                                               DEFAULT_CIRCUIT_METRIC),
+                       "Failed to set L1 metric: $ERR");
+       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, IS_LEVEL_2,
+                                               DEFAULT_CIRCUIT_METRIC),
+                       "Failed to set L2 metric: $ERR");
+       return CMD_SUCCESS;
+}
+
 void isis_vty_daemon_init(void)
 {
        install_element(ROUTER_NODE, &fabric_tier_cmd);
@@ -814,4 +877,7 @@ void isis_vty_daemon_init(void)
 
        install_element(INTERFACE_NODE, &isis_passwd_cmd);
        install_element(INTERFACE_NODE, &no_isis_passwd_cmd);
+
+       install_element(INTERFACE_NODE, &isis_metric_cmd);
+       install_element(INTERFACE_NODE, &no_isis_metric_cmd);
 }
index cc2ffb3a33a97fee3be6f5660986830ccb9df8ed..d284fc44c8955e52188d3ca5424da629f77d342a 100644 (file)
@@ -219,48 +219,6 @@ DEFUN (no_isis_priority_level,
        return CMD_SUCCESS;
 }
 
-DEFUN (isis_metric_level,
-       isis_metric_level_cmd,
-       "isis metric (0-16777215) <level-1|level-2>",
-       "IS-IS routing protocol\n"
-       "Set default metric for circuit\n"
-       "Default metric value\n"
-       "Specify metric for level-1 routing\n"
-       "Specify metric for level-2 routing\n")
-{
-       uint32_t met = atoi(argv[2]->arg);
-       struct isis_circuit *circuit = isis_circuit_lookup(vty);
-       if (!circuit)
-               return CMD_ERR_NO_MATCH;
-
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit,
-                                               level_for_arg(argv[3]->text),
-                                               met),
-                       "Failed to set metric: $ERR");
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_isis_metric_level,
-       no_isis_metric_level_cmd,
-       "no isis metric [(0-16777215)] <level-1|level-2>",
-       NO_STR
-       "IS-IS routing protocol\n"
-       "Set default metric for circuit\n"
-       "Default metric value\n"
-       "Specify metric for level-1 routing\n"
-       "Specify metric for level-2 routing\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;
-
-       CMD_FERR_RETURN(isis_circuit_metric_set(circuit, level,
-                                               DEFAULT_CIRCUIT_METRIC),
-                       "Failed to set L1 metric: $ERR");
-       return CMD_SUCCESS;
-}
-
 DEFUN (isis_hello_interval_level,
        isis_hello_interval_level_cmd,
        "isis hello-interval (1-600) <level-1|level-2>",
@@ -478,9 +436,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_metric_level_cmd);
-       install_element(INTERFACE_NODE, &no_isis_metric_level_cmd);
-
        install_element(INTERFACE_NODE, &isis_hello_interval_level_cmd);
        install_element(INTERFACE_NODE, &no_isis_hello_interval_level_cmd);