From: Renato Westphal Date: Fri, 6 Nov 2020 02:55:35 +0000 (-0300) Subject: yang, isisd: add LFA nodes, NB skeleton callbacks and CLI commands X-Git-Tag: base_7.6~170^2~5 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=d20b14bcd71ad911b40a33ab0c637f20fb82f1e5;p=matthieu%2Ffrr.git yang, isisd: add LFA nodes, NB skeleton callbacks and CLI commands Signed-off-by: Renato Westphal --- diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index 203fa8eb8d..d8bb1490aa 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1127,6 +1127,54 @@ void cli_show_isis_spf_ietf_backoff(struct vty *vty, struct lyd_node *dnode, yang_dnode_get_string(dnode, "./time-to-learn")); } +/* + * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name + */ +DEFPY_YANG(spf_prefix_priority, spf_prefix_priority_cmd, + "spf prefix-priority $priority WORD$acl_name", + "SPF configuration\n" + "Configure a prefix priority list\n" + "Specify critical priority prefixes\n" + "Specify high priority prefixes\n" + "Specify medium priority prefixes\n" + "Access-list name\n") +{ + char xpath[XPATH_MAXLEN]; + + snprintf(xpath, XPATH_MAXLEN, + "./spf/prefix-priorities/%s/access-list-name", priority); + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, acl_name); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG(no_spf_prefix_priority, no_spf_prefix_priority_cmd, + "no spf prefix-priority $priority [WORD]", + NO_STR + "SPF configuration\n" + "Configure a prefix priority list\n" + "Specify critical priority prefixes\n" + "Specify high priority prefixes\n" + "Specify medium priority prefixes\n" + "Access-list name\n") +{ + char xpath[XPATH_MAXLEN]; + + snprintf(xpath, XPATH_MAXLEN, + "./spf/prefix-priorities/%s/access-list-name", priority); + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_spf_prefix_priority(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " spf prefix-priority %s %s\n", + dnode->parent->schema->name, + yang_dnode_get_string(dnode, NULL)); +} + /* * XPath: /frr-isisd:isis/instance/purge-originator */ @@ -1720,6 +1768,176 @@ void cli_show_isis_prefix_sid(struct vty *vty, struct lyd_node *dnode, vty_out(vty, "\n"); } + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/priority-limit + */ +DEFPY_YANG (isis_frr_lfa_priority_limit, + isis_frr_lfa_priority_limit_cmd, + "[no] fast-reroute priority-limit $priority [$level]", + NO_STR + "Configure Fast ReRoute\n" + "Limit backup computation up to the prefix priority\n" + "Compute for critical priority prefixes only\n" + "Compute for critical & high priority prefixes\n" + "Compute for critical, high & medium priority prefixes\n" + "Set priority-limit for level-1 only\n" + "Set priority-limit for level-2 only\n") +{ + if (!level || strmatch(level, "level-1")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./fast-reroute/level-1/lfa/priority-limit", + NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change( + vty, + "./fast-reroute/level-1/lfa/priority-limit", + NB_OP_CREATE, priority); + } + } + if (!level || strmatch(level, "level-2")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./fast-reroute/level-2/lfa/priority-limit", + NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change( + vty, + "./fast-reroute/level-2/lfa/priority-limit", + NB_OP_CREATE, priority); + } + } + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_frr_lfa_priority_limit(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " fast-reroute priority-limit %s %s\n", + yang_dnode_get_string(dnode, NULL), + dnode->parent->parent->schema->name); +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/tiebreaker + */ +DEFPY_YANG (isis_frr_lfa_tiebreaker, + isis_frr_lfa_tiebreaker_cmd, + "[no] fast-reroute lfa\ + tiebreaker $type\ + index (1-255)$index\ + [$level]", + NO_STR + "Configure Fast ReRoute\n" + "LFA configuration\n" + "Configure tiebreaker for multiple backups\n" + "Prefer backup path via downstream node\n" + "Prefer backup path with lowest total metric\n" + "Prefer node protecting backup path\n" + "Set preference order among tiebreakers\n" + "Index\n" + "Configure tiebreaker for level-1 only\n" + "Configure tiebreaker for level-2 only\n") +{ + char xpath[XPATH_MAXLEN]; + + if (!level || strmatch(level, "level-1")) { + if (no) { + snprintf( + xpath, XPATH_MAXLEN, + "./fast-reroute/level-1/lfa/tiebreaker[index='%s']", + index_str); + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + } else { + snprintf( + xpath, XPATH_MAXLEN, + "./fast-reroute/level-1/lfa/tiebreaker[index='%s']/type", + index_str); + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, type); + } + } + if (!level || strmatch(level, "level-2")) { + if (no) { + snprintf( + xpath, XPATH_MAXLEN, + "./fast-reroute/level-2/lfa/tiebreaker[index='%s']", + index_str); + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + } else { + snprintf( + xpath, XPATH_MAXLEN, + "./fast-reroute/level-2/lfa/tiebreaker[index='%s']/type", + index_str); + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, type); + } + } + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_frr_lfa_tiebreaker(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " fast-reroute lfa tiebreaker %s index %s %s\n", + yang_dnode_get_string(dnode, "./type"), + yang_dnode_get_string(dnode, "./index"), + dnode->parent->parent->schema->name); +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-{1,2}/lfa/load-sharing + */ +DEFPY_YANG (isis_frr_lfa_load_sharing, + isis_frr_lfa_load_sharing_cmd, + "[no] fast-reroute load-sharing disable [$level]", + NO_STR + "Configure Fast ReRoute\n" + "Load share prefixes across multiple backups\n" + "Disable load sharing\n" + "Disable load sharing for level-1 only\n" + "Disable load sharing for level-2 only\n") +{ + if (!level || strmatch(level, "level-1")) { + if (no) { + nb_cli_enqueue_change( + vty, "./fast-reroute/level-1/lfa/load-sharing", + NB_OP_DESTROY, "true"); + } else { + nb_cli_enqueue_change( + vty, "./fast-reroute/level-1/lfa/load-sharing", + NB_OP_CREATE, "false"); + } + } + if (!level || strmatch(level, "level-2")) { + if (no) { + nb_cli_enqueue_change( + vty, "./fast-reroute/level-2/lfa/load-sharing", + NB_OP_DESTROY, "true"); + } else { + nb_cli_enqueue_change( + vty, "./fast-reroute/level-2/lfa/load-sharing", + NB_OP_CREATE, "false"); + } + } + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_isis_frr_lfa_load_sharing(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + if (!yang_dnode_get_bool(dnode, NULL)) + vty_out(vty, " no"); + + vty_out(vty, " fast-reroute load-sharing disable %s\n", + dnode->parent->parent->schema->name); +} + /* * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive */ @@ -2377,7 +2595,164 @@ void cli_show_ip_isis_priority(struct vty *vty, struct lyd_node *dnode, } /* - * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/ti-lfa/enable + * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute + */ +void cli_show_ip_isis_frr(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + bool l1_enabled, l2_enabled; + bool l1_node_protection, l2_node_protection; + + /* Classic LFA */ + l1_enabled = yang_dnode_get_bool(dnode, "./level-1/lfa/enable"); + l2_enabled = yang_dnode_get_bool(dnode, "./level-2/lfa/enable"); + + if (l1_enabled || l2_enabled) { + if (l1_enabled == l2_enabled) { + vty_out(vty, " isis fast-reroute lfa\n"); + vty_out(vty, "\n"); + } else { + if (l1_enabled) + vty_out(vty, + " isis fast-reroute lfa level-1\n"); + if (l2_enabled) + vty_out(vty, + " isis fast-reroute lfa level-2\n"); + } + } + + /* TI-LFA */ + l1_enabled = yang_dnode_get_bool(dnode, "./level-1/ti-lfa/enable"); + l2_enabled = yang_dnode_get_bool(dnode, "./level-2/ti-lfa/enable"); + l1_node_protection = + yang_dnode_get_bool(dnode, "./level-1/ti-lfa/node-protection"); + l2_node_protection = + yang_dnode_get_bool(dnode, "./level-2/ti-lfa/node-protection"); + + if (l1_enabled || l2_enabled) { + if (l1_enabled == l2_enabled + && l1_node_protection == l2_node_protection) { + vty_out(vty, " isis fast-reroute ti-lfa"); + if (l1_node_protection) + vty_out(vty, " node-protection"); + vty_out(vty, "\n"); + } else { + if (l1_enabled) { + vty_out(vty, + " isis fast-reroute ti-lfa level-1"); + if (l1_node_protection) + vty_out(vty, " node-protection"); + vty_out(vty, "\n"); + } + if (l2_enabled) { + vty_out(vty, + " isis fast-reroute ti-lfa level-2"); + if (l2_node_protection) + vty_out(vty, " node-protection"); + vty_out(vty, "\n"); + } + } + } +} + +/* + * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/lfa/enable + */ +DEFPY(isis_lfa, isis_lfa_cmd, + "[no] isis fast-reroute lfa [level-1|level-2]$level", + NO_STR + "IS-IS routing protocol\n" + "Interface IP Fast-reroute configuration\n" + "Enable LFA computation\n" + "Enable LFA computation for Level 1 only\n" + "Enable LFA computation for Level 2 only\n") +{ + if (!level || strmatch(level, "level-1")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-1/lfa/enable", + NB_OP_MODIFY, "false"); + } else { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-1/lfa/enable", + NB_OP_MODIFY, "true"); + } + } + if (!level || strmatch(level, "level-2")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-2/lfa/enable", + NB_OP_MODIFY, "false"); + } else { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-2/lfa/enable", + NB_OP_MODIFY, "true"); + } + } + + return nb_cli_apply_changes(vty, NULL); +} + +/* + * XPath: + * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/lfa/exclude-interface + */ +DEFPY(isis_lfa_exclude_interface, isis_lfa_exclude_interface_cmd, + "[no] isis fast-reroute lfa [level-1|level-2]$level exclude interface IFNAME$ifname", + NO_STR + "IS-IS routing protocol\n" + "Interface IP Fast-reroute configuration\n" + "Enable LFA computation\n" + "Enable LFA computation for Level 1 only\n" + "Enable LFA computation for Level 2 only\n" + "FRR exclusion information\n" + "Exclude an interface from computation\n" + "Interface name\n") +{ + if (!level || strmatch(level, "level-1")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface", + NB_OP_DESTROY, ifname); + } else { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface", + NB_OP_CREATE, ifname); + } + } + if (!level || strmatch(level, "level-2")) { + if (no) { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface", + NB_OP_DESTROY, ifname); + } else { + nb_cli_enqueue_change( + vty, + "./frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface", + NB_OP_CREATE, ifname); + } + } + + return nb_cli_apply_changes(vty, NULL); +} + +void cli_show_frr_lfa_exclude_interface(struct vty *vty, struct lyd_node *dnode, + bool show_defaults) +{ + vty_out(vty, " isis fast-reroute lfa %s exclude interface %s\n", + dnode->parent->parent->schema->name, + yang_dnode_get_string(dnode, NULL)); +} + +/* + * XPath: /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-{1,2}/ti-lfa/enable */ DEFPY(isis_ti_lfa, isis_ti_lfa_cmd, "[no] isis fast-reroute ti-lfa [level-1|level-2]$level [node-protection$node_protection]", @@ -2437,41 +2812,6 @@ DEFPY(isis_ti_lfa, isis_ti_lfa_cmd, return nb_cli_apply_changes(vty, NULL); } -void cli_show_ip_isis_ti_lfa(struct vty *vty, struct lyd_node *dnode, - bool show_defaults) -{ - bool l1_enabled, l2_enabled; - bool l1_node_protection, l2_node_protection; - - l1_enabled = yang_dnode_get_bool(dnode, "./level-1/ti-lfa/enable"); - l2_enabled = yang_dnode_get_bool(dnode, "./level-2/ti-lfa/enable"); - l1_node_protection = - yang_dnode_get_bool(dnode, "./level-1/ti-lfa/node-protection"); - l2_node_protection = - yang_dnode_get_bool(dnode, "./level-2/ti-lfa/node-protection"); - - if (l1_enabled == l2_enabled - && l1_node_protection == l2_node_protection) { - vty_out(vty, " isis fast-reroute ti-lfa"); - if (l1_node_protection) - vty_out(vty, " node-protection"); - vty_out(vty, "\n"); - } else { - if (l1_enabled) { - vty_out(vty, " isis fast-reroute ti-lfa level-1"); - if (l1_node_protection) - vty_out(vty, " node-protection"); - vty_out(vty, "\n"); - } - if (l2_enabled) { - vty_out(vty, " isis fast-reroute ti-lfa level-2"); - if (l2_node_protection) - vty_out(vty, " node-protection"); - vty_out(vty, "\n"); - } - } -} - /* * XPath: /frr-isisd:isis/instance/log-adjacency-changes */ @@ -2705,6 +3045,8 @@ void isis_cli_init(void) install_element(ISIS_NODE, &spf_interval_cmd); install_element(ISIS_NODE, &no_spf_interval_cmd); + install_element(ISIS_NODE, &spf_prefix_priority_cmd); + install_element(ISIS_NODE, &no_spf_prefix_priority_cmd); install_element(ISIS_NODE, &spf_delay_ietf_cmd); install_element(ISIS_NODE, &no_spf_delay_ietf_cmd); @@ -2731,6 +3073,9 @@ void isis_cli_init(void) install_element(ISIS_NODE, &no_isis_sr_node_msd_cmd); install_element(ISIS_NODE, &isis_sr_prefix_sid_cmd); install_element(ISIS_NODE, &no_isis_sr_prefix_sid_cmd); + install_element(ISIS_NODE, &isis_frr_lfa_priority_limit_cmd); + install_element(ISIS_NODE, &isis_frr_lfa_tiebreaker_cmd); + install_element(ISIS_NODE, &isis_frr_lfa_load_sharing_cmd); install_element(INTERFACE_NODE, &isis_passive_cmd); @@ -2766,6 +3111,8 @@ void isis_cli_init(void) install_element(INTERFACE_NODE, &isis_priority_cmd); install_element(INTERFACE_NODE, &no_isis_priority_cmd); + install_element(INTERFACE_NODE, &isis_lfa_cmd); + install_element(INTERFACE_NODE, &isis_lfa_exclude_interface_cmd); install_element(INTERFACE_NODE, &isis_ti_lfa_cmd); install_element(ISIS_NODE, &log_adj_changes_cmd); diff --git a/isisd/isis_nb.c b/isisd/isis_nb.c index 2d3c7e1e38..c3d2f238dd 100644 --- a/isisd/isis_nb.c +++ b/isisd/isis_nb.c @@ -193,6 +193,30 @@ const struct frr_yang_module_info frr_isisd_info = { .modify = isis_instance_spf_minimum_interval_level_2_modify, }, }, + { + .xpath = "/frr-isisd:isis/instance/spf/prefix-priorities/critical/access-list-name", + .cbs = { + .cli_show = cli_show_isis_spf_prefix_priority, + .modify = isis_instance_spf_prefix_priorities_critical_access_list_name_modify, + .destroy = isis_instance_spf_prefix_priorities_critical_access_list_name_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/spf/prefix-priorities/high/access-list-name", + .cbs = { + .cli_show = cli_show_isis_spf_prefix_priority, + .modify = isis_instance_spf_prefix_priorities_high_access_list_name_modify, + .destroy = isis_instance_spf_prefix_priorities_high_access_list_name_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name", + .cbs = { + .cli_show = cli_show_isis_spf_prefix_priority, + .modify = isis_instance_spf_prefix_priorities_medium_access_list_name_modify, + .destroy = isis_instance_spf_prefix_priorities_medium_access_list_name_destroy, + } + }, { .xpath = "/frr-isisd:isis/instance/area-password", .cbs = { @@ -431,6 +455,64 @@ const struct frr_yang_module_info frr_isisd_info = { .modify = isis_instance_multi_topology_ipv6_dstsrc_overload_modify, }, }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-1/lfa/load-sharing", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_load_sharing, + .modify = isis_instance_fast_reroute_level_1_lfa_load_sharing_modify, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-1/lfa/priority-limit", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_priority_limit, + .modify = isis_instance_fast_reroute_level_1_lfa_priority_limit_modify, + .destroy = isis_instance_fast_reroute_level_1_lfa_priority_limit_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_tiebreaker, + .create = isis_instance_fast_reroute_level_1_lfa_tiebreaker_create, + .destroy = isis_instance_fast_reroute_level_1_lfa_tiebreaker_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker/type", + .cbs = { + .modify = isis_instance_fast_reroute_level_1_lfa_tiebreaker_type_modify, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-2/lfa/load-sharing", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_load_sharing, + .modify = isis_instance_fast_reroute_level_2_lfa_load_sharing_modify, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-2/lfa/priority-limit", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_priority_limit, + .modify = isis_instance_fast_reroute_level_2_lfa_priority_limit_modify, + .destroy = isis_instance_fast_reroute_level_2_lfa_priority_limit_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker", + .cbs = { + .cli_show = cli_show_isis_frr_lfa_tiebreaker, + .create = isis_instance_fast_reroute_level_2_lfa_tiebreaker_create, + .destroy = isis_instance_fast_reroute_level_2_lfa_tiebreaker_destroy, + } + }, + { + .xpath = "/frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker/type", + .cbs = { + .modify = isis_instance_fast_reroute_level_2_lfa_tiebreaker_type_modify, + } + }, { .xpath = "/frr-isisd:isis/instance/log-adjacency-changes", .cbs = { @@ -827,7 +909,21 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute", .cbs = { - .cli_show = cli_show_ip_isis_ti_lfa, + .cli_show = cli_show_ip_isis_frr, + } + }, + { + .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/enable", + .cbs = { + .modify = lib_interface_isis_fast_reroute_level_1_lfa_enable_modify, + } + }, + { + .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface", + .cbs = { + .cli_show = cli_show_frr_lfa_exclude_interface, + .create = lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_create, + .destroy = lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_destroy, } }, { @@ -842,6 +938,20 @@ const struct frr_yang_module_info frr_isisd_info = { .modify = lib_interface_isis_fast_reroute_level_1_ti_lfa_node_protection_modify, } }, + { + .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/enable", + .cbs = { + .modify = lib_interface_isis_fast_reroute_level_2_lfa_enable_modify, + } + }, + { + .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface", + .cbs = { + .cli_show = cli_show_frr_lfa_exclude_interface, + .create = lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_create, + .destroy = lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_destroy, + } + }, { .xpath = "/frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable", .cbs = { diff --git a/isisd/isis_nb.h b/isisd/isis_nb.h index fb843131d9..f529f20861 100644 --- a/isisd/isis_nb.h +++ b/isisd/isis_nb.h @@ -68,6 +68,18 @@ int isis_instance_spf_minimum_interval_level_1_modify( struct nb_cb_modify_args *args); int isis_instance_spf_minimum_interval_level_2_modify( struct nb_cb_modify_args *args); +int isis_instance_spf_prefix_priorities_critical_access_list_name_modify( + struct nb_cb_modify_args *args); +int isis_instance_spf_prefix_priorities_critical_access_list_name_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_spf_prefix_priorities_high_access_list_name_modify( + struct nb_cb_modify_args *args); +int isis_instance_spf_prefix_priorities_high_access_list_name_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_spf_prefix_priorities_medium_access_list_name_modify( + struct nb_cb_modify_args *args); +int isis_instance_spf_prefix_priorities_medium_access_list_name_destroy( + struct nb_cb_destroy_args *args); int isis_instance_area_password_create(struct nb_cb_create_args *args); int isis_instance_area_password_destroy(struct nb_cb_destroy_args *args); int isis_instance_area_password_password_modify(struct nb_cb_modify_args *args); @@ -159,6 +171,30 @@ int isis_instance_multi_topology_ipv6_dstsrc_destroy( struct nb_cb_destroy_args *args); int isis_instance_multi_topology_ipv6_dstsrc_overload_modify( struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_1_lfa_load_sharing_modify( + struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_1_lfa_priority_limit_modify( + struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_1_lfa_priority_limit_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_create( + struct nb_cb_create_args *args); +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_type_modify( + struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_2_lfa_load_sharing_modify( + struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_2_lfa_priority_limit_modify( + struct nb_cb_modify_args *args); +int isis_instance_fast_reroute_level_2_lfa_priority_limit_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_create( + struct nb_cb_create_args *args); +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_destroy( + struct nb_cb_destroy_args *args); +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_type_modify( + struct nb_cb_modify_args *args); int isis_instance_log_adjacency_changes_modify(struct nb_cb_modify_args *args); int isis_instance_mpls_te_create(struct nb_cb_create_args *args); int isis_instance_mpls_te_destroy(struct nb_cb_destroy_args *args); @@ -258,10 +294,22 @@ int lib_interface_isis_multi_topology_ipv6_dstsrc_modify( int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args *args); int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args *args); int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args *args); +int lib_interface_isis_fast_reroute_level_1_lfa_enable_modify( + struct nb_cb_modify_args *args); +int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_create( + struct nb_cb_create_args *args); +int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_destroy( + struct nb_cb_destroy_args *args); int lib_interface_isis_fast_reroute_level_1_ti_lfa_enable_modify( struct nb_cb_modify_args *args); int lib_interface_isis_fast_reroute_level_1_ti_lfa_node_protection_modify( struct nb_cb_modify_args *args); +int lib_interface_isis_fast_reroute_level_2_lfa_enable_modify( + struct nb_cb_modify_args *args); +int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_create( + struct nb_cb_create_args *args); +int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_destroy( + struct nb_cb_destroy_args *args); int lib_interface_isis_fast_reroute_level_2_ti_lfa_enable_modify( struct nb_cb_modify_args *args); int lib_interface_isis_fast_reroute_level_2_ti_lfa_node_protection_modify( @@ -374,6 +422,8 @@ void cli_show_isis_spf_min_interval(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_isis_spf_ietf_backoff(struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_isis_spf_prefix_priority(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); void cli_show_isis_purge_origin(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_isis_mpls_te(struct vty *vty, struct lyd_node *dnode, @@ -410,6 +460,13 @@ void cli_show_isis_node_msd(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_isis_prefix_sid(struct vty *vty, struct lyd_node *dnode, bool show_defaults); +void cli_show_isis_frr_lfa_priority_limit(struct vty *vty, + struct lyd_node *dnode, + bool show_defaults); +void cli_show_isis_frr_lfa_tiebreaker(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_isis_frr_lfa_load_sharing(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); 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, @@ -442,8 +499,10 @@ 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); -void cli_show_ip_isis_ti_lfa(struct vty *vty, struct lyd_node *dnode, - bool show_defaults); +void cli_show_ip_isis_frr(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); +void cli_show_frr_lfa_exclude_interface(struct vty *vty, struct lyd_node *dnode, + bool show_defaults); void cli_show_ip_isis_circ_type(struct vty *vty, struct lyd_node *dnode, bool show_defaults); void cli_show_ip_isis_network_type(struct vty *vty, struct lyd_node *dnode, diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index 45089410e9..595053fd22 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -625,6 +625,106 @@ int isis_instance_spf_minimum_interval_level_2_modify( return NB_OK; } +/* + * XPath: + * /frr-isisd:isis/instance/spf/prefix-priorities/critical/access-list-name + */ +int isis_instance_spf_prefix_priorities_critical_access_list_name_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_spf_prefix_priorities_critical_access_list_name_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/high/access-list-name + */ +int isis_instance_spf_prefix_priorities_high_access_list_name_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_spf_prefix_priorities_high_access_list_name_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/spf/prefix-priorities/medium/access-list-name + */ +int isis_instance_spf_prefix_priorities_medium_access_list_name_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_spf_prefix_priorities_medium_access_list_name_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + /* * XPath: /frr-isisd:isis/instance/area-password */ @@ -1289,6 +1389,210 @@ int isis_instance_multi_topology_ipv6_dstsrc_overload_modify( "ipv6-dstsrc"); } +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/load-sharing + */ +int isis_instance_fast_reroute_level_1_lfa_load_sharing_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/priority-limit + */ +int isis_instance_fast_reroute_level_1_lfa_priority_limit_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_fast_reroute_level_1_lfa_priority_limit_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker + */ +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_create( + struct nb_cb_create_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-1/lfa/tiebreaker/type + */ +int isis_instance_fast_reroute_level_1_lfa_tiebreaker_type_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/load-sharing + */ +int isis_instance_fast_reroute_level_2_lfa_load_sharing_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/priority-limit + */ +int isis_instance_fast_reroute_level_2_lfa_priority_limit_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_fast_reroute_level_2_lfa_priority_limit_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker + */ +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_create( + struct nb_cb_create_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: /frr-isisd:isis/instance/fast-reroute/level-2/lfa/tiebreaker/type + */ +int isis_instance_fast_reroute_level_2_lfa_tiebreaker_type_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + /* * XPath: /frr-isisd:isis/instance/log-adjacency-changes */ @@ -3003,6 +3307,59 @@ int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args *args) return NB_OK; } +/* + * XPath: + * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/enable + */ +int lib_interface_isis_fast_reroute_level_1_lfa_enable_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/lfa/exclude-interface + */ +int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_create( + struct nb_cb_create_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int lib_interface_isis_fast_reroute_level_1_lfa_exclude_interface_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + /* * XPath: * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-1/ti-lfa/enable @@ -3054,6 +3411,59 @@ int lib_interface_isis_fast_reroute_level_1_ti_lfa_node_protection_modify( return NB_OK; } +/* + * XPath: + * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/enable + */ +int lib_interface_isis_fast_reroute_level_2_lfa_enable_modify( + struct nb_cb_modify_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +/* + * XPath: + * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/lfa/exclude-interface + */ +int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_create( + struct nb_cb_create_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + +int lib_interface_isis_fast_reroute_level_2_lfa_exclude_interface_destroy( + struct nb_cb_destroy_args *args) +{ + switch (args->event) { + case NB_EV_VALIDATE: + case NB_EV_PREPARE: + case NB_EV_ABORT: + case NB_EV_APPLY: + /* TODO: implement me. */ + break; + } + + return NB_OK; +} + /* * XPath: * /frr-interface:lib/interface/frr-isisd:isis/fast-reroute/level-2/ti-lfa/enable diff --git a/yang/frr-isisd.yang b/yang/frr-isisd.yang index c3b39e3750..d751a19f07 100644 --- a/yang/frr-isisd.yang +++ b/yang/frr-isisd.yang @@ -244,6 +244,10 @@ module frr-isisd { } } + typedef access-list-ref { + type string; + } + grouping redistribute-attributes { description "Common optional attributes of any redistribute entry."; @@ -336,6 +340,94 @@ module frr-isisd { } } + grouping global-config-lfa { + container lfa { + description + "LFA configuration."; + + leaf load-sharing { + type boolean; + default "true"; + description + "Load share prefixes across multiple backups."; + } + leaf priority-limit { + type enumeration { + enum "critical" { + value 0; + description + "Compute for critical priority prefixes only."; + } + enum "high" { + value 1; + description + "Compute for critical & high priority prefixes."; + } + enum "medium" { + value 2; + description + "Compute for critical, high & medium priority prefixes."; + } + } + description + "Limit backup computation up to the prefix priority."; + } + list tiebreaker { + key "index"; + unique "type"; + description + "Configure tiebreaker for multiple backups."; + leaf index { + type uint8 { + range "1..255"; + } + description + "Preference order among tiebreakers."; + } + leaf type { + type enumeration { + enum "downstream" { + value 0; + description + "Prefer backup path via downstream node."; + } + enum "lowest-backup-metric" { + value 1; + description + "Prefer backup path with lowest total metric."; + } + enum "node-protecting" { + value 2; + description + "Prefer node protecting backup path."; + } + } + mandatory true; + description + "Tiebreaker type."; + } + } + } + } + + grouping interface-config-lfa { + container lfa { + description + "LFA configuration."; + leaf enable { + type boolean; + default false; + description + "Enables LFA computation."; + } + leaf-list exclude-interface { + type frr-interface:interface-ref; + description + "Exclude an interface from computation."; + } + } + } + grouping interface-config-ti-lfa { container ti-lfa { description @@ -664,11 +756,21 @@ module frr-isisd { container level-1 { description "Level-1 IP Fast-reroute configuration."; + must "./lfa/enable = 'false' or ./ti-lfa/enable = 'false'" { + error-message + "Can't enable both classic LFA and TI-LFA in the same interface."; + } + uses interface-config-lfa; uses interface-config-ti-lfa; } container level-2 { description "Level-2 IP Fast-reroute configuration."; + must "./lfa/enable = 'false' or ./ti-lfa/enable = 'false'" { + error-message + "Can't enable both classic LFA and TI-LFA in the same interface."; + } + uses interface-config-lfa; uses interface-config-ti-lfa; } } @@ -1095,6 +1197,42 @@ module frr-isisd { "Minimum time between consecutive level-2 SPFs."; } } + + container prefix-priorities { + description + "SPF Prefix Priority configuration"; + + container critical { + description + "Critical prefix priority"; + leaf access-list-name { + type access-list-ref; + description + "Access List to determine prefixes for + this priority"; + } + } + container high { + description + "High prefix priority"; + leaf access-list-name { + type access-list-ref; + description + "Access List to determine prefixes for + this priority"; + } + } + container medium { + description + "Medium prefix priority"; + leaf access-list-name { + type access-list-ref; + description + "Access List to determine prefixes for + this priority"; + } + } + } } container area-password { @@ -1249,6 +1387,21 @@ module frr-isisd { } } + container fast-reroute { + description + "IP Fast-reroute configuration."; + container level-1 { + description + "Level-1 IP Fast-reroute configuration."; + uses global-config-lfa; + } + container level-2 { + description + "Level-2 IP Fast-reroute configuration."; + uses global-config-lfa; + } + } + leaf log-adjacency-changes { type boolean; default "false";