isisd: Add set-overload on-startup CLI/YANG support

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>
This commit is contained in:
Isabella de Leon 2022-09-15 11:50:27 -07:00
parent 6bae02045b
commit 01ea9b035e
7 changed files with 105 additions and 11 deletions

View 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);

View 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",

View 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,

View 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
*/

View 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)
{

View 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);

View 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 {