Skip to content

Commit

Permalink
isisd: added managed redistribution in ISIS
Browse files Browse the repository at this point in the history
added command "route_leanking ipv4/ipv6 level's route-map name" in cli
according to RFC5302

Signed-off-by: squirrelking57 <1248756005hfh@gmail.com>
  • Loading branch information
Sashhkaa committed Mar 26, 2024
1 parent 0b1af4c commit aebd626
Show file tree
Hide file tree
Showing 12 changed files with 1,128 additions and 244 deletions.
389 changes: 242 additions & 147 deletions isisd/isis_cli.c

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions isisd/isis_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@
#define ISIS_LEVEL1 1
#define ISIS_LEVEL2 2

/*
* implementation specific route-leanking values
*/

#define LEVEL2_TO_LEVEL1 4
#define LEVEL1_TO_LEVEL2 5
#define LVL_ISIS_LEANKING_1 0
#define LVL_ISIS_LEANKING_2 1
/*
* Default values
* ISO - 10589 Section 7.3.21 - Parameters
Expand Down
73 changes: 72 additions & 1 deletion isisd/isis_lsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,6 @@ static void lsp_build_internal_reach_ipv6(struct isis_lsp *lsp,
metric, false, pcfgs);
}


static void lsp_build_ext_reach_ipv4(struct isis_lsp *lsp,
struct isis_area *area)
{
Expand Down Expand Up @@ -1034,6 +1033,71 @@ static void lsp_build_ext_reach_ipv6(struct isis_lsp *lsp,
}
}

static void lsp_build_leanking_reach_ipv4(struct isis_lsp *lsp,
struct isis_area *area,
struct prefix_leanking *leanking)
{
struct prefix_ipv4 *ipv4 = (struct prefix_ipv4 *)leanking->prefix;

if (area->oldmetric)
isis_tlvs_add_oldstyle_ip_reach(lsp->tlvs, ipv4,
leanking->metric);
if (area->newmetric) {
struct sr_prefix_cfg *pcfgs[SR_ALGORITHM_COUNT] = { NULL };

if (area->srdb.enabled)
for (int i = 0; i < SR_ALGORITHM_COUNT; i++) {
#ifndef FABRICD
if (flex_algo_id_valid(i) &&
!isis_flex_algo_elected_supported(i, area))
continue;
#endif /* ifndef FABRICD */
pcfgs[i] = isis_sr_cfg_prefix_find(area, ipv4,
i);
}
isis_tlvs_add_extended_ip_reach(lsp->tlvs, ipv4,
leanking->metric, true, pcfgs);
}
}

static void lsp_build_leanking_reach_ipv6(struct isis_lsp *lsp,
struct isis_area *area,
struct prefix_leanking *leanking)
{
struct prefix_ipv6 *ipv6 = (struct prefix_ipv6 *)leanking->prefix;
struct sr_prefix_cfg *pcfgs[SR_ALGORITHM_COUNT] = { NULL };

if (area->srdb.enabled)
for (int i = 0; i < SR_ALGORITHM_COUNT; i++) {
#ifndef FABRICD
if (flex_algo_id_valid(i) &&
!isis_flex_algo_elected_supported(i, area))
continue;
#endif /* ifndef FABRICD */
pcfgs[i] = isis_sr_cfg_prefix_find(area, ipv6, i);
}
isis_tlvs_add_ipv6_reach(lsp->tlvs, isis_area_ipv6_topology(area), ipv6,
leanking->metric, true, pcfgs);
}

static void lsp_build_leanking_reach(struct isis_lsp *lsp,
struct isis_area *area)
{
struct listnode *node;
struct prefix_leanking *leanking;

for (ALL_LIST_ELEMENTS_RO(area->leanking_list[lsp->level - 1], node,
leanking)) {
if (leanking->prefix->family == AF_INET)
lsp_build_leanking_reach_ipv4(lsp, area, leanking);
if (leanking->prefix->family == AF_INET6)
lsp_build_leanking_reach_ipv6(lsp, area, leanking);
}

list_delete_all_node(area->leanking_list[LVL_ISIS_LEANKING_1]);
list_delete_all_node(area->leanking_list[LVL_ISIS_LEANKING_2]);
}

static void lsp_build_ext_reach(struct isis_lsp *lsp, struct isis_area *area)
{
lsp_build_ext_reach_ipv4(lsp, area);
Expand Down Expand Up @@ -1437,7 +1501,14 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
}
}

struct listnode *node_redist;
struct isis_leanking *redist;

for (ALL_LIST_ELEMENTS_RO(area->leanking_settings, node_redist, redist))
iteration_in_spftree(area, redist);

lsp_build_ext_reach(lsp, area);
lsp_build_leanking_reach(lsp, area);

struct isis_tlvs *tlvs = lsp->tlvs;
lsp->tlvs = NULL;
Expand Down
90 changes: 90 additions & 0 deletions isisd/isis_nb.c
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,96 @@ const struct frr_yang_module_info frr_isisd_info = {
.modify = isis_instance_redistribute_ipv4_metric_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4",
.cbs = {
.apply_finish = leanking_ipv4_apply_finish,
.cli_show = cli_show_isis_leanking_ipv4,
.create = isis_instance_leanking_ipv4_create,
.destroy = isis_instance_leanking_ipv4_destroy,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4/route-map",
.cbs = {
.destroy = isis_instance_route_leanking_ipv4_route_map_destroy,
.modify = isis_instance_route_leanking_ipv4_route_map_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4/metric",
.cbs = {
.destroy = isis_instance_route_leanking_ipv4_metric_destroy,
.modify = isis_instance_route_leanking_ipv4_metric_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4/table",
.cbs = {
.cli_show = cli_show_isis_route_leanking_ipv4_table,
.cli_cmp = cli_cmp_isis_route_leanking_table,
.create = isis_instance_route_leanking_ipv4_table_create,
.destroy = isis_instance_route_leanking_ipv4_table_destroy,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4/table/route-map",
.cbs = {
.destroy = isis_instance_route_leanking_ipv4_route_map_destroy,
.modify = isis_instance_route_leanking_ipv4_route_map_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv4/table/metric",
.cbs = {
.modify = isis_instance_route_leanking_ipv4_metric_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv6",
.cbs = {
.apply_finish = leanking_ipv6_apply_finish,
.cli_show = cli_show_isis_leanking_ipv6,
.create = isis_instance_leanking_ipv6_create,
.destroy = isis_instance_leanking_ipv6_destroy,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv6/route-map",
.cbs = {
.destroy = isis_instance_route_leanking_ipv6_route_map_destroy,
.modify = isis_instance_route_leanking_ipv6_route_map_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/route_leanking/ipv6/metric",
.cbs = {
.destroy = isis_instance_route_leanking_ipv6_metric_destroy,
.modify = isis_instance_route_leanking_ipv6_metric_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6/table",
.cbs = {
.cli_show = cli_show_isis_route_leanking_ipv6_table,
.cli_cmp = cli_cmp_isis_route_leanking_table,
.create = isis_instance_route_leanking_ipv6_table_create,
.destroy = isis_instance_route_leanking_ipv6_table_destroy,
},
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6/table/route-map",
.cbs = {
.destroy = isis_instance_route_leanking_ipv6_route_map_destroy,
.modify = isis_instance_route_leanking_ipv6_route_map_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6/table/metric",
.cbs = {
.modify = isis_instance_route_leanking_ipv6_metric_modify,
},
},
{
.xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
.cbs = {
Expand Down
51 changes: 47 additions & 4 deletions isisd/isis_nb.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,12 @@ int isis_instance_default_information_originate_ipv6_route_map_destroy(
int isis_instance_default_information_originate_ipv6_metric_modify(
struct nb_cb_modify_args *args);
int isis_instance_redistribute_ipv4_create(struct nb_cb_create_args *args);
int isis_instance_redistribute_ipv6_create(struct nb_cb_create_args *args);
int isis_instance_redistribute_ipv4_destroy(struct nb_cb_destroy_args *args);
int isis_instance_redistribute_ipv6_destroy(struct nb_cb_destroy_args *args);
int isis_instance_leanking_ipv4_create(struct nb_cb_create_args *args);
int isis_instance_leanking_ipv4_destroy(struct nb_cb_destroy_args *args);
int isis_instance_leanking_ipv4_create(struct nb_cb_create_args *args);
int isis_instance_redistribute_ipv4_route_map_modify(
struct nb_cb_modify_args *args);
int isis_instance_redistribute_ipv4_route_map_destroy(
Expand All @@ -126,8 +131,9 @@ int isis_instance_redistribute_ipv4_metric_destroy(
int isis_instance_redistribute_ipv4_table_create(struct nb_cb_create_args *args);
int isis_instance_redistribute_ipv4_table_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_redistribute_ipv6_create(struct nb_cb_create_args *args);
int isis_instance_redistribute_ipv6_destroy(struct nb_cb_destroy_args *args);
int isis_instance_leanking_ipv6_create(struct nb_cb_create_args *args);
int isis_instance_leanking_ipv6_destroy(struct nb_cb_destroy_args *args);
int isis_instance_leanking_ipv6_metric_modify(struct nb_cb_modify_args *args);
int isis_instance_redistribute_ipv6_route_map_modify(
struct nb_cb_modify_args *args);
int isis_instance_redistribute_ipv6_route_map_destroy(
Expand Down Expand Up @@ -528,13 +534,39 @@ void default_info_origin_ipv6_apply_finish(
void redistribute_apply_finish(const struct lyd_node *dnode, int family);
void redistribute_ipv4_apply_finish(struct nb_cb_apply_finish_args *args);
void redistribute_ipv6_apply_finish(struct nb_cb_apply_finish_args *args);
void leanking_ipv4_apply_finish(struct nb_cb_apply_finish_args *args);
void leanking_ipv6_apply_finish(struct nb_cb_apply_finish_args *args);
void leanking_apply_finish(const struct lyd_node *dnode, int family);
void isis_instance_segment_routing_srgb_apply_finish(
struct nb_cb_apply_finish_args *args);
void isis_instance_segment_routing_srlb_apply_finish(
struct nb_cb_apply_finish_args *args);
void isis_instance_segment_routing_prefix_sid_map_prefix_sid_apply_finish(
struct nb_cb_apply_finish_args *args);

int isis_instance_route_leanking_ipv4_route_map_modify(
struct nb_cb_modify_args *args);
int isis_instance_route_leanking_ipv4_route_map_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv4_metric_modify(
struct nb_cb_modify_args *args);
int isis_instance_route_leanking_ipv4_metric_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv4_table_create(
struct nb_cb_create_args *args);
int isis_instance_route_leanking_ipv4_table_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv6_table_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv6_table_create(
struct nb_cb_create_args *args);
int isis_instance_route_leanking_ipv6_metric_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv6_metric_modify(
struct nb_cb_modify_args *args);
int isis_instance_route_leanking_ipv6_route_map_destroy(
struct nb_cb_destroy_args *args);
int isis_instance_route_leanking_ipv6_route_map_modify(
struct nb_cb_modify_args *args);
/* Optional 'cli_show' callbacks. */
void cli_show_router_isis(struct vty *vty, const struct lyd_node *dnode,
bool show_defaults);
Expand Down Expand Up @@ -618,6 +650,10 @@ void cli_show_isis_redistribute_ipv4(struct vty *vty,
void cli_show_isis_redistribute_ipv6(struct vty *vty,
const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_leanking_ipv4(struct vty *vty, const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_leanking_ipv6(struct vty *vty, const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv4_multicast(struct vty *vty,
const struct lyd_node *dnode,
bool show_defaults);
Expand All @@ -627,6 +663,12 @@ void cli_show_isis_redistribute_ipv4_table(struct vty *vty,
void cli_show_isis_redistribute_ipv6_table(struct vty *vty,
const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_route_leanking_ipv4_table(struct vty *vty,
const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_route_leanking_ipv6_table(struct vty *vty,
const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv4_mgmt(struct vty *vty, const struct lyd_node *dnode,
bool show_defaults);
void cli_show_isis_mt_ipv6_unicast(struct vty *vty,
Expand Down Expand Up @@ -785,7 +827,8 @@ void isis_notif_own_lsp_purge(const struct isis_circuit *circuit,
/* cmp */
int cli_cmp_isis_redistribute_table(const struct lyd_node *dnode1,
const struct lyd_node *dnode2);

int cli_cmp_isis_route_leanking_table(const struct lyd_node *dnode1,
const struct lyd_node *dnode2);
/* We also declare hook for every notification */

DECLARE_HOOK(isis_hook_db_overload, (const struct isis_area *area), (area));
Expand Down
Loading

0 comments on commit aebd626

Please sign in to comment.