Commit 76cdf86deb for frr
commit 76cdf86debde9aa0233e036f5df3a23bbe3b6431
Merge: 2732c6bffc 83a7c9f901
Author: Russ White <russ@riw.us>
Date: Fri Nov 6 17:52:21 2026 -0500
Merge pull request #23840 from alxrxs/isisd-flex-algo-per-level
isisd: flex-algo in level-2 and level-1-2 routers
diff --cc isisd/isis_flex_algo.c
index 28873a7e11,b2bee33ecd..7a334ec83c
--- a/isisd/isis_flex_algo.c
+++ b/isisd/isis_flex_algo.c
@@@ -225,19 -223,12 +241,19 @@@ bool isis_flex_algo_state(const struct
}
struct isis_router_cap_fad *
- isis_flex_algo_elected_supported_local_fad(int algorithm, const struct isis_area *area,
+ isis_flex_algo_elected_supported_local_fad(int algorithm, const struct isis_area *area, int level,
struct isis_router_cap_fad **fad)
{
- return _isis_flex_algo_elected_supported(algorithm, area, fad);
+ return _isis_flex_algo_elected_supported(algorithm, area, level, fad);
}
+/* The SR-Algorithm sub-TLV is stored indexed by algorithm. */
+static bool sr_algorithm_advertised(const struct isis_lsp *lsp, uint8_t algorithm)
+{
+ return lsp->tlvs && lsp->tlvs->router_cap &&
+ lsp->tlvs->router_cap->algo[algorithm] == algorithm;
+}
+
/**
* Check LSP is participating specified SR Algorithm
*
diff --cc isisd/isis_flex_algo.h
index a7b82536c0,6334071d84..7990ff58c4
--- a/isisd/isis_flex_algo.h
+++ b/isisd/isis_flex_algo.h
@@@ -33,16 -35,15 +35,16 @@@ struct isis_flex_algo_alloc_arg
void *isis_flex_algo_data_alloc(void *arg);
void isis_flex_algo_data_free(void *data);
+void isis_flex_algos_spftrees_init(struct isis_area *area);
- struct isis_router_cap_fad *
- isis_flex_algo_elected(int algorithm, const struct isis_area *area);
+ struct isis_router_cap_fad *isis_flex_algo_elected(int algorithm, const struct isis_area *area,
+ int level);
bool isis_flex_algo_supported(struct flex_algo *fad);
+ bool isis_flex_algo_state(const struct isis_area *area, int algorithm, int level);
struct isis_router_cap_fad *
- isis_flex_algo_elected_supported(int algorithm, const struct isis_area *area);
+ isis_flex_algo_elected_supported(int algorithm, const struct isis_area *area, int level);
struct isis_router_cap_fad *
- isis_flex_algo_elected_supported_local_fad(int algorithm,
- const struct isis_area *area,
+ isis_flex_algo_elected_supported_local_fad(int algorithm, const struct isis_area *area, int level,
struct isis_router_cap_fad **fad);
struct isis_lsp;
bool sr_algorithm_participated(const struct isis_lsp *lsp, uint8_t algorithm);
diff --cc isisd/isis_spf.c
index a66cbc18a1,78455ffe11..7ce4ee2608
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@@ -1018,9 -971,10 +1019,10 @@@ lspfragloop
#ifndef FABRICD
if (flex_algo_id_valid(spftree->algorithm) &&
- (!sr_algorithm_participated(lsp, spftree->algorithm) ||
+ (!fa_participates ||
!isis_flex_algo_elected_supported(spftree->algorithm,
- spftree->area)))
+ spftree->area,
+ spftree->level)))
continue;
#endif /* ifndef FABRICD */
@@@ -1088,9 -1038,10 +1090,10 @@@
#ifndef FABRICD
if (flex_algo_id_valid(spftree->algorithm) &&
- (!sr_algorithm_participated(lsp, spftree->algorithm) ||
+ (!fa_participates ||
!isis_flex_algo_elected_supported(spftree->algorithm,
- spftree->area)))
+ spftree->area,
+ spftree->level)))
continue;
#endif /* ifndef FABRICD */