summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/fabricd.c8
-rw-r--r--isisd/isis_lfa.c12
-rw-r--r--isisd/isis_spf.c26
-rw-r--r--isisd/isis_spf.h9
-rw-r--r--isisd/isis_spf_private.h1
-rw-r--r--tests/isisd/test_isis_spf.c18
6 files changed, 41 insertions, 33 deletions
diff --git a/isisd/fabricd.c b/isisd/fabricd.c
index 0be36e175a..b229aa6717 100644
--- a/isisd/fabricd.c
+++ b/isisd/fabricd.c
@@ -207,10 +207,10 @@ struct fabricd *fabricd_new(struct isis_area *area)
rv->area = area;
rv->initial_sync_state = FABRICD_SYNC_PENDING;
- rv->spftree =
- isis_spftree_new(area, &area->lspdb[IS_LEVEL_2 - 1],
- area->isis->sysid, ISIS_LEVEL2, SPFTREE_IPV4,
- SPF_TYPE_FORWARD, F_SPFTREE_HOPCOUNT_METRIC);
+ rv->spftree = isis_spftree_new(
+ area, &area->lspdb[IS_LEVEL_2 - 1], area->isis->sysid,
+ ISIS_LEVEL2, SPFTREE_IPV4, SPF_TYPE_FORWARD,
+ F_SPFTREE_HOPCOUNT_METRIC, SR_ALGORITHM_SPF);
rv->neighbors = skiplist_new(0, neighbor_entry_list_cmp,
neighbor_entry_del_void);
rv->neighbors_neighbors = hash_create(neighbor_entry_hash_key,
diff --git a/isisd/isis_lfa.c b/isisd/isis_lfa.c
index abb6168393..baec1ff872 100644
--- a/isisd/isis_lfa.c
+++ b/isisd/isis_lfa.c
@@ -1098,7 +1098,8 @@ struct isis_spftree *isis_spf_reverse_run(const struct isis_spftree *spftree)
spftree_reverse = isis_spftree_new(
spftree->area, spftree->lspdb, spftree->sysid, spftree->level,
spftree->tree_id, SPF_TYPE_REVERSE,
- F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES);
+ F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES,
+ SR_ALGORITHM_SPF);
isis_run_spf(spftree_reverse);
return spftree_reverse;
@@ -1194,7 +1195,8 @@ struct isis_spftree *isis_tilfa_compute(struct isis_area *area,
/* Create post-convergence SPF tree. */
spftree_pc = isis_spftree_new(area, spftree->lspdb, spftree->sysid,
spftree->level, spftree->tree_id,
- SPF_TYPE_TI_LFA, spftree->flags);
+ SPF_TYPE_TI_LFA, spftree->flags,
+ SR_ALGORITHM_SPF);
spftree_pc->lfa.old.spftree = spftree;
spftree_pc->lfa.old.spftree_reverse = spftree_reverse;
spftree_pc->lfa.protected_resource = *resource;
@@ -1242,7 +1244,8 @@ int isis_spf_run_neighbors(struct isis_spftree *spftree)
adj_node->lfa.spftree = isis_spftree_new(
spftree->area, spftree->lspdb, adj_node->sysid,
spftree->level, spftree->tree_id, SPF_TYPE_FORWARD,
- F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES);
+ F_SPFTREE_NO_ADJACENCIES | F_SPFTREE_NO_ROUTES,
+ SR_ALGORITHM_SPF);
isis_run_spf(adj_node->lfa.spftree);
}
@@ -1722,7 +1725,8 @@ struct isis_spftree *isis_rlfa_compute(struct isis_area *area,
/* Create post-convergence SPF tree. */
spftree_pc = isis_spftree_new(area, spftree->lspdb, spftree->sysid,
spftree->level, spftree->tree_id,
- SPF_TYPE_RLFA, spftree->flags);
+ SPF_TYPE_RLFA, spftree->flags,
+ SR_ALGORITHM_SPF);
spftree_pc->lfa.old.spftree = spftree;
spftree_pc->lfa.old.spftree_reverse = spftree_reverse;
spftree_pc->lfa.remote.max_metric = max_metric;
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index 8597049ac0..407a58b76e 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -322,11 +322,10 @@ static void isis_spf_adj_free(void *arg)
XFREE(MTYPE_ISIS_SPF_ADJ, sadj);
}
-struct isis_spftree *isis_spftree_new(struct isis_area *area,
- struct lspdb_head *lspdb,
- const uint8_t *sysid, int level,
- enum spf_tree_id tree_id,
- enum spf_type type, uint8_t flags)
+struct isis_spftree *
+isis_spftree_new(struct isis_area *area, struct lspdb_head *lspdb,
+ const uint8_t *sysid, int level, enum spf_tree_id tree_id,
+ enum spf_type type, uint8_t flags, uint8_t algorithm)
{
struct isis_spftree *tree;
@@ -361,6 +360,7 @@ struct isis_spftree *isis_spftree_new(struct isis_area *area,
isis_spf_node_list_init(&tree->lfa.p_space);
isis_spf_node_list_init(&tree->lfa.q_space);
}
+ tree->algorithm = algorithm;
return tree;
}
@@ -410,10 +410,10 @@ void spftree_area_init(struct isis_area *area)
if (area->spftree[tree][level - 1])
continue;
- area->spftree[tree][level - 1] =
- isis_spftree_new(area, &area->lspdb[level - 1],
- area->isis->sysid, level, tree,
- SPF_TYPE_FORWARD, 0);
+ area->spftree[tree][level - 1] = isis_spftree_new(
+ area, &area->lspdb[level - 1],
+ area->isis->sysid, level, tree,
+ SPF_TYPE_FORWARD, 0, SR_ALGORITHM_SPF);
}
}
}
@@ -1701,10 +1701,10 @@ struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area,
struct isis_spftree *spftree)
{
if (!spftree)
- spftree = isis_spftree_new(area, &area->lspdb[IS_LEVEL_2 - 1],
- sysid, ISIS_LEVEL2, SPFTREE_IPV4,
- SPF_TYPE_FORWARD,
- F_SPFTREE_HOPCOUNT_METRIC);
+ spftree = isis_spftree_new(
+ area, &area->lspdb[IS_LEVEL_2 - 1], sysid, ISIS_LEVEL2,
+ SPFTREE_IPV4, SPF_TYPE_FORWARD,
+ F_SPFTREE_HOPCOUNT_METRIC, SR_ALGORITHM_SPF);
init_spt(spftree, ISIS_MT_IPV4_UNICAST);
if (!memcmp(sysid, area->isis->sysid, ISIS_SYS_ID_LEN)) {
diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h
index 7f4ab707e7..bf79a084bb 100644
--- a/isisd/isis_spf.h
+++ b/isisd/isis_spf.h
@@ -37,11 +37,10 @@ struct isis_spf_adj {
#define F_ISIS_SPF_ADJ_METRIC_INFINITY 0x04
};
-struct isis_spftree *isis_spftree_new(struct isis_area *area,
- struct lspdb_head *lspdb,
- const uint8_t *sysid, int level,
- enum spf_tree_id tree_id,
- enum spf_type type, uint8_t flags);
+struct isis_spftree *
+isis_spftree_new(struct isis_area *area, struct lspdb_head *lspdb,
+ const uint8_t *sysid, int level, enum spf_tree_id tree_id,
+ enum spf_type type, uint8_t flags, uint8_t algorithm);
struct isis_vertex *isis_spf_prefix_sid_lookup(struct isis_spftree *spftree,
struct isis_prefix_sid *psid);
void isis_spf_invalidate_routes(struct isis_spftree *tree);
diff --git a/isisd/isis_spf_private.h b/isisd/isis_spf_private.h
index d829372702..5f926df70d 100644
--- a/isisd/isis_spf_private.h
+++ b/isisd/isis_spf_private.h
@@ -349,6 +349,7 @@ struct isis_spftree {
uint32_t total[SPF_PREFIX_PRIO_MAX];
} protection_counters;
} lfa;
+ uint8_t algorithm;
uint8_t flags;
};
#define F_SPFTREE_HOPCOUNT_METRIC 0x01
diff --git a/tests/isisd/test_isis_spf.c b/tests/isisd/test_isis_spf.c
index 85ddfea5b5..8319d7e813 100644
--- a/tests/isisd/test_isis_spf.c
+++ b/tests/isisd/test_isis_spf.c
@@ -49,7 +49,8 @@ static void test_run_spf(struct vty *vty, const struct isis_topology *topology,
/* Run SPF. */
spf_type = reverse ? SPF_TYPE_REVERSE : SPF_TYPE_FORWARD;
spftree = isis_spftree_new(area, lspdb, root->sysid, level, tree,
- spf_type, F_SPFTREE_NO_ADJACENCIES);
+ spf_type, F_SPFTREE_NO_ADJACENCIES,
+ SR_ALGORITHM_SPF);
isis_run_spf(spftree);
/* Print the SPT and the corresponding routing table. */
@@ -71,8 +72,9 @@ static void test_run_lfa(struct vty *vty, const struct isis_topology *topology,
/* Run forward SPF in the root node. */
flags = F_SPFTREE_NO_ADJACENCIES;
- spftree_self = isis_spftree_new(area, lspdb, root->sysid, level, tree,
- SPF_TYPE_FORWARD, flags);
+ spftree_self =
+ isis_spftree_new(area, lspdb, root->sysid, level, tree,
+ SPF_TYPE_FORWARD, flags, SR_ALGORITHM_SPF);
isis_run_spf(spftree_self);
/* Run forward SPF on all adjacent routers. */
@@ -107,8 +109,9 @@ static void test_run_rlfa(struct vty *vty, const struct isis_topology *topology,
/* Run forward SPF in the root node. */
flags = F_SPFTREE_NO_ADJACENCIES;
- spftree_self = isis_spftree_new(area, lspdb, root->sysid, level, tree,
- SPF_TYPE_FORWARD, flags);
+ spftree_self =
+ isis_spftree_new(area, lspdb, root->sysid, level, tree,
+ SPF_TYPE_FORWARD, flags, SR_ALGORITHM_SPF);
isis_run_spf(spftree_self);
/* Run reverse SPF in the root node. */
@@ -187,8 +190,9 @@ static void test_run_ti_lfa(struct vty *vty,
/* Run forward SPF in the root node. */
flags = F_SPFTREE_NO_ADJACENCIES;
- spftree_self = isis_spftree_new(area, lspdb, root->sysid, level, tree,
- SPF_TYPE_FORWARD, flags);
+ spftree_self =
+ isis_spftree_new(area, lspdb, root->sysid, level, tree,
+ SPF_TYPE_FORWARD, flags, SR_ALGORITHM_SPF);
isis_run_spf(spftree_self);
/* Run reverse SPF in the root node. */