summaryrefslogtreecommitdiff
path: root/isisd/isis_lfa.c
diff options
context:
space:
mode:
authorLouis Scalbert <louis.scalbert@6wind.com>2022-12-12 17:22:56 +0100
committerLouis Scalbert <louis.scalbert@6wind.com>2023-04-18 11:33:15 +0200
commit6f9598d1406246bd0b966e041f1caeccef138c6d (patch)
tree783cf66c36d1beffda071ea461d390e0eaaf92c6 /isisd/isis_lfa.c
parent224eadd955b37d6eee501cecf85498eac3ad8d5b (diff)
isisd: add support of (ti-)lfa to flex-algo
Add support of (ti-)lfa to flex-algo Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'isisd/isis_lfa.c')
-rw-r--r--isisd/isis_lfa.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/isisd/isis_lfa.c b/isisd/isis_lfa.c
index baec1ff872..6f21f4cea2 100644
--- a/isisd/isis_lfa.c
+++ b/isisd/isis_lfa.c
@@ -355,6 +355,7 @@ bool isis_lfa_excise_node_check(const struct isis_spftree *spftree,
struct tilfa_find_pnode_prefix_sid_args {
uint32_t sid_index;
+ int algorithm;
};
static int tilfa_find_pnode_prefix_sid_cb(const struct prefix *prefix,
@@ -368,15 +369,17 @@ static int tilfa_find_pnode_prefix_sid_cb(const struct prefix *prefix,
if (!subtlvs || subtlvs->prefix_sids.count == 0)
return LSP_ITER_CONTINUE;
- psid = (struct isis_prefix_sid *)subtlvs->prefix_sids.head;
-
- /* Require the node flag to be set. */
- if (!CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_NODE))
- return LSP_ITER_CONTINUE;
-
- args->sid_index = psid->value;
-
- return LSP_ITER_STOP;
+ for (psid = (struct isis_prefix_sid *)subtlvs->prefix_sids.head; psid;
+ psid = psid->next) {
+ /* Require the node flag to be set. */
+ if (!CHECK_FLAG(psid->flags, ISIS_PREFIX_SID_NODE))
+ continue;
+ if (psid->algorithm != args->algorithm)
+ continue;
+ args->sid_index = psid->value;
+ return LSP_ITER_STOP;
+ }
+ return LSP_ITER_CONTINUE;
}
/* Find Prefix-SID associated to a System ID. */
@@ -390,6 +393,8 @@ static uint32_t tilfa_find_pnode_prefix_sid(struct isis_spftree *spftree,
if (!lsp)
return UINT32_MAX;
+ args.algorithm = spftree->algorithm;
+
args.sid_index = UINT32_MAX;
isis_lsp_iterate_ip_reach(lsp, spftree->family, spftree->mtid,
tilfa_find_pnode_prefix_sid_cb, &args);
@@ -1099,7 +1104,7 @@ struct isis_spftree *isis_spf_reverse_run(const struct isis_spftree *spftree)
spftree->area, spftree->lspdb, spftree->sysid, spftree->level,
spftree->tree_id, SPF_TYPE_REVERSE,
F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES,
- SR_ALGORITHM_SPF);
+ spftree->algorithm);
isis_run_spf(spftree_reverse);
return spftree_reverse;
@@ -1196,7 +1201,7 @@ struct isis_spftree *isis_tilfa_compute(struct isis_area *area,
spftree_pc = isis_spftree_new(area, spftree->lspdb, spftree->sysid,
spftree->level, spftree->tree_id,
SPF_TYPE_TI_LFA, spftree->flags,
- SR_ALGORITHM_SPF);
+ spftree->algorithm);
spftree_pc->lfa.old.spftree = spftree;
spftree_pc->lfa.old.spftree_reverse = spftree_reverse;
spftree_pc->lfa.protected_resource = *resource;
@@ -1245,7 +1250,7 @@ int isis_spf_run_neighbors(struct isis_spftree *spftree)
spftree->area, spftree->lspdb, adj_node->sysid,
spftree->level, spftree->tree_id, SPF_TYPE_FORWARD,
F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES,
- SR_ALGORITHM_SPF);
+ spftree->algorithm);
isis_run_spf(adj_node->lfa.spftree);
}
@@ -1726,7 +1731,7 @@ struct isis_spftree *isis_rlfa_compute(struct isis_area *area,
spftree_pc = isis_spftree_new(area, spftree->lspdb, spftree->sysid,
spftree->level, spftree->tree_id,
SPF_TYPE_RLFA, spftree->flags,
- SR_ALGORITHM_SPF);
+ spftree->algorithm);
spftree_pc->lfa.old.spftree = spftree;
spftree_pc->lfa.old.spftree_reverse = spftree_reverse;
spftree_pc->lfa.remote.max_metric = max_metric;