]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: Add advertise-high-metrics CLI/YANG support, modify show output
authorIsabella de Leon <ideleon@microsoft.com>
Fri, 6 Jan 2023 18:06:23 +0000 (10:06 -0800)
committerIsabella de Leon <ideleon@microsoft.com>
Tue, 28 Feb 2023 19:39:12 +0000 (11:39 -0800)
New config and show functionality:

r1# conf
r1(config)# router isis 1
r1(config-router)#
  advertise-high-metrics  Advertise high metric value on all interfaces
  area-password           Configure the authentication password for an area
  ...
r1(config-router)# advertise-high-metrics
r1(config-router)# end
r1# show isis summary
...
Area 1:
  Net: 49.0001.1720.1700.0002.00
  TX counters per PDU type:
     L2 IIH: 1
    P2P IIH: 36
   LSP RXMT: 0
  RX counters per PDU type:
  Advertise high metrics: Enabled
  Level-2:
   ...
r1# conf
r1(config)# router isis 1
r1(config-router)# no advertise-high-metrics
r1(config-router)# end
r1# show isis summary
...
Area 1:
  Net: 49.0001.1720.1700.0002.00
  TX counters per PDU type:
     L2 IIH: 1
    P2P IIH: 45
   LSP RXMT: 0
  RX counters per PDU type:
  Advertise high metrics: Disabled
  Level-2:
   ...
r1#

Signed-off-by: Isabella de Leon <ideleon@microsoft.com>
isisd/isis_cli.c
isisd/isis_nb.c
isisd/isis_nb.h
isisd/isis_nb_config.c
isisd/isisd.c
isisd/isisd.h
yang/frr-isisd.yang

index 5c7f6108814d8fdacfd326ac45357a64d3d6a0e1..4a598aa8c9edfe9ffc633edd0723d232ef3f8b2d 100644 (file)
@@ -439,6 +439,29 @@ void cli_show_isis_overload_on_startup(struct vty *vty,
                yang_dnode_get_string(dnode, NULL));
 }
 
+/*
+ * XPath: /frr-isisd:isis/instance/advertise-high-metrics
+ */
+DEFPY_YANG(advertise_high_metrics, advertise_high_metrics_cmd,
+          "[no] advertise-high-metrics",
+          NO_STR "Advertise high metric value on all interfaces\n")
+{
+       nb_cli_enqueue_change(vty, "./advertise-high-metrics", NB_OP_MODIFY,
+                             no ? "false" : "true");
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_advertise_high_metrics(struct vty *vty,
+                                    const struct lyd_node *dnode,
+                                    bool show_defaults)
+{
+       if (yang_dnode_get_bool(dnode, NULL))
+               vty_out(vty, " advertise-high-metrics\n");
+       else if (show_defaults)
+               vty_out(vty, " no advertise-high-metrics\n");
+}
+
 /*
  * XPath: /frr-isisd:isis/instance/attach-send
  */
@@ -3160,6 +3183,8 @@ void isis_cli_init(void)
        install_element(ISIS_NODE, &metric_style_cmd);
        install_element(ISIS_NODE, &no_metric_style_cmd);
 
+       install_element(ISIS_NODE, &advertise_high_metrics_cmd);
+
        install_element(ISIS_NODE, &area_passwd_cmd);
        install_element(ISIS_NODE, &domain_passwd_cmd);
        install_element(ISIS_NODE, &no_area_passwd_cmd);
index 5caa61a4d1675d28ae3a252769d08775cafad913..7dc3a0eb3da6025cc425e478b903a29a26653f0f 100644 (file)
@@ -81,6 +81,13 @@ const struct frr_yang_module_info frr_isisd_info = {
                                .modify = isis_instance_overload_on_startup_modify,
                        }
                },
+               {
+                       .xpath = "/frr-isisd:isis/instance/advertise-high-metrics",
+                       .cbs = {
+                               .cli_show = cli_show_advertise_high_metrics,
+                               .modify = isis_instance_advertise_high_metrics_modify,
+                       }
+               },
                {
                        .xpath = "/frr-isisd:isis/instance/metric-style",
                        .cbs = {
index c90f6dca37074e7df77c0c1fac76fa51f923c08a..480b2ce04132927a660a08e543ce854b30408c43 100644 (file)
@@ -26,6 +26,7 @@ int isis_instance_attached_receive_modify(struct nb_cb_modify_args *args);
 int isis_instance_attached_modify(struct nb_cb_modify_args *args);
 int isis_instance_overload_enabled_modify(struct nb_cb_modify_args *args);
 int isis_instance_overload_on_startup_modify(struct nb_cb_modify_args *args);
+int isis_instance_advertise_high_metrics_modify(struct nb_cb_modify_args *args);
 int isis_instance_metric_style_modify(struct nb_cb_modify_args *args);
 int isis_instance_purge_originator_modify(struct nb_cb_modify_args *args);
 int isis_instance_lsp_mtu_modify(struct nb_cb_modify_args *args);
@@ -464,6 +465,9 @@ void cli_show_isis_overload(struct vty *vty, const struct lyd_node *dnode,
 void cli_show_isis_overload_on_startup(struct vty *vty,
                                       const struct lyd_node *dnode,
                                       bool show_defaults);
+void cli_show_advertise_high_metrics(struct vty *vty,
+                                    const struct lyd_node *dnode,
+                                    bool show_defaults);
 void cli_show_isis_metric_style(struct vty *vty, const struct lyd_node *dnode,
                                bool show_defaults);
 void cli_show_isis_area_pwd(struct vty *vty, const struct lyd_node *dnode,
index ea021a4ff53caf46173842b15e75d3eddc24196e..2b3355bc9ffef79378066ad64a1804326338c111 100644 (file)
@@ -360,6 +360,24 @@ int isis_instance_overload_on_startup_modify(struct nb_cb_modify_args *args)
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-isisd:isis/instance/advertise-high-metrics
+ */
+int isis_instance_advertise_high_metrics_modify(struct nb_cb_modify_args *args)
+{
+       struct isis_area *area;
+       bool advertise_high_metrics;
+
+       if (args->event != NB_EV_APPLY)
+               return NB_OK;
+
+       advertise_high_metrics = yang_dnode_get_bool(args->dnode, NULL);
+       area = nb_running_get_entry(args->dnode, NULL, true);
+       isis_area_advertise_high_metrics_set(area, advertise_high_metrics);
+
+       return NB_OK;
+}
+
 /*
  * XPath: /frr-isisd:isis/instance/metric-style
  */
index 852d7b88e89a42e9983e0f92847668ad551f9458..523333300f82ca90afb68daaefd8d4dee2382940 100644 (file)
@@ -2503,6 +2503,9 @@ static void common_isis_summary_vty(struct vty *vty, struct isis *isis)
                vty_out(vty, "  RX counters per PDU type:\n");
                pdu_counter_print(vty, "    ", area->pdu_rx_counters);
 
+               vty_out(vty, "  Advertise high metrics: %s\n",
+                       area->advertise_high_metrics ? "Enabled" : "Disabled");
+
                for (level = ISIS_LEVEL1; level <= ISIS_LEVELS; level++) {
                        if ((area->is_type & level) == 0)
                                continue;
@@ -3247,6 +3250,12 @@ void config_end_lsp_generate(struct isis_area *area)
        }
 }
 
+void isis_area_advertise_high_metrics_set(struct isis_area *area,
+                                         bool advertise_high_metrics)
+{
+       /* TODO */
+}
+
 /*
  * Returns the path of the file (non-volatile memory) that contains restart
  * information.
index 0f1161e574ae15db414d65b2fd7d12d25c9fc5d4..37a36fd37ac82780dff5aab4abf121d5e712020e 100644 (file)
@@ -175,6 +175,8 @@ struct isis_area {
        uint32_t overload_on_startup_time;
        /* advertise prefixes of passive interfaces only? */
        bool advertise_passive_only;
+       /* Are we advertising high metrics? */
+       bool advertise_high_metrics;
        /* L1/L2 router identifier for inter-area traffic */
        char attached_bit_send;
        char attached_bit_rcv_ignore;
@@ -289,6 +291,8 @@ void isis_area_switchover_routes(struct isis_area *area, int family,
 void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit);
 void isis_area_overload_on_startup_set(struct isis_area *area,
                                       uint32_t startup_time);
+void isis_area_advertise_high_metrics_set(struct isis_area *area,
+                                         bool advertise_high_metrics);
 void isis_area_attached_bit_send_set(struct isis_area *area, bool attached_bit);
 void isis_area_attached_bit_receive_set(struct isis_area *area,
                                        bool attached_bit);
index ff3ba5d12ba4494099615db5f92839d01be37724..0c2cf232fb7ba405b82bed2b28daeba651ceea2a 100644 (file)
@@ -1169,6 +1169,13 @@ module frr-isisd {
           "Define the style of TLVs metric supported.";
       }
 
+      leaf advertise-high-metrics {
+        type boolean;
+        default "false";
+        description
+          "Advertise high metric value on all interfaces.";
+      }
+
       leaf purge-originator {
         type boolean;
         default "false";