]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: Add set-overload on-startup CLI/YANG support
authorIsabella de Leon <ideleon@microsoft.com>
Thu, 15 Sep 2022 18:50:27 +0000 (11:50 -0700)
committerIsabella de Leon <ideleon@microsoft.com>
Wed, 21 Sep 2022 22:41:38 +0000 (15:41 -0700)
Before:
r1# conf
r1(config)# router isis <area-tag>
r1(config-router)# set-overload-bit
  <cr>
r1(config-router)# end

After:
r1# conf
r1(config)# router isis <area-tag>
r1(config-router)# set-overload-bit
  <cr>
  on-startup  Set overload bit on startup
r1(config-router)# set-overload-bit on-startup
  (0-86400)  Set overload time in seconds
r1(config-router)# set-overload-bit on-startup 300
r1(config-router)# end

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 a673cb8c1ed4e4691feca3c2514f20a809b80055..9db867e2c073536e38c48140ac78f97f6446276e 100644 (file)
@@ -404,7 +404,7 @@ DEFPY_YANG(set_overload_bit, set_overload_bit_cmd, "[no] set-overload-bit",
       "Reset overload bit to accept transit traffic\n"
       "Set overload bit to avoid any transit traffic\n")
 {
-       nb_cli_enqueue_change(vty, "./overload", NB_OP_MODIFY,
+       nb_cli_enqueue_change(vty, "./overload/enabled", NB_OP_MODIFY,
                              no ? "false" : "true");
 
        return nb_cli_apply_changes(vty, NULL);
@@ -418,6 +418,42 @@ void cli_show_isis_overload(struct vty *vty, const struct lyd_node *dnode,
        vty_out(vty, " set-overload-bit\n");
 }
 
+/*
+ * XPath: /frr-isisd:isis/instance/overload/on-startup
+ */
+DEFPY_YANG(set_overload_bit_on_startup, set_overload_bit_on_startup_cmd,
+          "set-overload-bit on-startup (0-86400)$val",
+          "Set overload bit to avoid any transit traffic\n"
+          "Set overload bit on startup\n"
+          "Set overload time in seconds\n")
+{
+       nb_cli_enqueue_change(vty, "./overload/on-startup", NB_OP_MODIFY,
+                             val_str);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+DEFPY_YANG(no_set_overload_bit_on_startup, no_set_overload_bit_on_startup_cmd,
+          "no set-overload-bit on-startup [(0-86400)$val]",
+          NO_STR
+          "Reset overload bit to accept transit traffic\n"
+          "Set overload bit on startup\n"
+          "Set overload time in seconds\n")
+{
+       nb_cli_enqueue_change(vty, "./overload/on-startup", NB_OP_DESTROY,
+                             NULL);
+
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+void cli_show_isis_overload_on_startup(struct vty *vty,
+                                      const struct lyd_node *dnode,
+                                      bool show_defaults)
+{
+       vty_out(vty, " set-overload-bit on-startup %s\n",
+               yang_dnode_get_string(dnode, NULL));
+}
+
 /*
  * XPath: /frr-isisd:isis/instance/attach-send
  */
@@ -3107,6 +3143,9 @@ void isis_cli_init(void)
        install_element(ISIS_NODE, &dynamic_hostname_cmd);
 
        install_element(ISIS_NODE, &set_overload_bit_cmd);
+       install_element(ISIS_NODE, &set_overload_bit_on_startup_cmd);
+       install_element(ISIS_NODE, &no_set_overload_bit_on_startup_cmd);
+
        install_element(ISIS_NODE, &attached_bit_send_cmd);
        install_element(ISIS_NODE, &attached_bit_receive_ignore_cmd);
 
index a2ba33d0782ac1cba7c910371f7fa97f2e098f6b..4f4e6dc730c81905056579fd727f6cd77cf48118 100644 (file)
@@ -81,11 +81,18 @@ const struct frr_yang_module_info frr_isisd_info = {
                        },
                },
                {
-                       .xpath = "/frr-isisd:isis/instance/overload",
+                       .xpath = "/frr-isisd:isis/instance/overload/enabled",
                        .cbs = {
                                .cli_show = cli_show_isis_overload,
-                               .modify = isis_instance_overload_modify,
-                       },
+                               .modify = isis_instance_overload_enabled_modify,
+                       }
+               },
+               {
+                       .xpath = "/frr-isisd:isis/instance/overload/on-startup",
+                       .cbs = {
+                               .cli_show = cli_show_isis_overload_on_startup,
+                               .modify = isis_instance_overload_on_startup_modify,
+                       }
                },
                {
                        .xpath = "/frr-isisd:isis/instance/metric-style",
index 00ca8be3b0518bfe74561d2f0efc5b29f2b687a5..a9f2eaea95d5a204f67fcaaca0910d69774236a6 100644 (file)
@@ -37,7 +37,8 @@ int isis_instance_dynamic_hostname_modify(struct nb_cb_modify_args *args);
 int isis_instance_attached_send_modify(struct nb_cb_modify_args *args);
 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_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_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);
@@ -442,6 +443,9 @@ void cli_show_isis_attached_receive(struct vty *vty,
                                    bool show_defaults);
 void cli_show_isis_overload(struct vty *vty, const struct lyd_node *dnode,
                            bool show_defaults);
+void cli_show_isis_overload_on_startup(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 dbe4a017bc91d7d5ce9f894821d9a8b4ce93ad1c..14a66d25687c31e809b77356885383a5cb95397f 100644 (file)
@@ -338,9 +338,9 @@ int isis_instance_attached_modify(struct nb_cb_modify_args *args)
 }
 
 /*
- * XPath: /frr-isisd:isis/instance/overload
+ * XPath: /frr-isisd:isis/instance/overload/enabled
  */
-int isis_instance_overload_modify(struct nb_cb_modify_args *args)
+int isis_instance_overload_enabled_modify(struct nb_cb_modify_args *args)
 {
        struct isis_area *area;
        bool overload;
@@ -355,6 +355,24 @@ int isis_instance_overload_modify(struct nb_cb_modify_args *args)
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-isisd:isis/instance/overload/on-startup
+ */
+int isis_instance_overload_on_startup_modify(struct nb_cb_modify_args *args)
+{
+       struct isis_area *area;
+       uint32_t overload_time;
+
+       if (args->event != NB_EV_APPLY)
+               return NB_OK;
+
+       overload_time = yang_dnode_get_uint32(args->dnode, NULL);
+       area = nb_running_get_entry(args->dnode, NULL, true);
+       isis_area_overload_on_startup_set(area, overload_time);
+
+       return NB_OK;
+}
+
 /*
  * XPath: /frr-isisd:isis/instance/metric-style
  */
index bce3dbb77b4673e7612e767611c7c776d834fcbf..7a631128a73b6bb69f46b991dff1f6a2b7f17763 100644 (file)
@@ -3205,6 +3205,15 @@ void isis_area_overload_bit_set(struct isis_area *area, bool overload_bit)
 #endif /* ifndef FABRICD */
 }
 
+void isis_area_overload_on_startup_set(struct isis_area *area,
+                                      uint32_t startup_time)
+{
+       if (area->overload_on_startup_time != startup_time)
+               area->overload_on_startup_time = startup_time;
+
+       // TODO: Implement overload on startup functionality
+}
+
 void isis_area_attached_bit_send_set(struct isis_area *area, bool attached_bit)
 {
 
index c313fd9ef786a7eb18922ba0200dbcec3f158fc2..316f979e1e8326e473976d169fc2fa2f5b797f57 100644 (file)
@@ -181,6 +181,7 @@ struct isis_area {
        /* are we overloaded? */
        char overload_bit;
        uint32_t overload_counter;
+       uint32_t overload_on_startup_time;
        /* L1/L2 router identifier for inter-area traffic */
        char attached_bit_send;
        char attached_bit_rcv_ignore;
@@ -289,6 +290,8 @@ void isis_area_invalidate_routes(struct isis_area *area, int levels);
 void isis_area_verify_routes(struct isis_area *area);
 
 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_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 0812c86facf65da3b5ad313be8f8201cc0ac2592..380fce385990bb02f2358d1ac67a4702f78f1545 100644 (file)
@@ -1066,11 +1066,25 @@ module frr-isisd {
           "If true, identify as L1/L2 router for inter-area traffic.";
       }
 
-      leaf overload {
-        type boolean;
-        default "false";
+      container overload {
         description
-          "If true, avoid any transit traffic.";
+          "Overload bit configuration.";
+        leaf enabled {
+          type boolean;
+          default "false";
+          description
+            "If true, avoid any transit traffic.";
+        }
+
+        leaf on-startup {
+          type uint32 {
+            range "0..86400";
+          }
+          units "seconds";
+          default "0";
+          description
+            "The duration the overload bit should be set on startup.";
+        }
       }
 
       leaf metric-style {