summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_adjacency.c4
-rw-r--r--isisd/isis_main.c2
-rw-r--r--isisd/isis_spf.c15
-rw-r--r--isisd/isis_spf.h3
4 files changed, 15 insertions, 9 deletions
diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c
index af5258846a..f7cdd58f72 100644
--- a/isisd/isis_adjacency.c
+++ b/isisd/isis_adjacency.c
@@ -43,7 +43,6 @@
#include "isisd/isis_dynhn.h"
#include "isisd/isis_pdu.h"
#include "isisd/isis_lsp.h"
-#include "isisd/isis_spf.h"
#include "isisd/isis_events.h"
#include "isisd/isis_mt.h"
#include "isisd/isis_tlvs.h"
@@ -152,9 +151,6 @@ void isis_delete_adj(void *arg)
if (adj->adj_state != ISIS_ADJ_DOWN)
adj->adj_state = ISIS_ADJ_DOWN;
- /* remove from SPF trees */
- spftree_area_adj_del(adj->circuit->area, adj);
-
hook_call(isis_adj_state_change_hook, adj);
XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->area_addresses);
diff --git a/isisd/isis_main.c b/isisd/isis_main.c
index ed4b206851..6352303c23 100644
--- a/isisd/isis_main.c
+++ b/isisd/isis_main.c
@@ -252,7 +252,7 @@ int main(int argc, char **argv, char **envp)
#ifndef FABRICD
isis_cli_init();
#endif /* ifdef FABRICD */
- isis_spf_cmds_init();
+ isis_spf_init();
isis_redist_init();
isis_route_map_init();
isis_mpls_te_init();
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index 6f3c125e95..174f4dfe85 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -275,8 +275,14 @@ void spftree_area_del(struct isis_area *area)
}
}
-void spftree_area_adj_del(struct isis_area *area, struct isis_adjacency *adj)
+static int spf_adj_state_change(struct isis_adjacency *adj)
{
+ struct isis_area *area = adj->circuit->area;
+
+ if (adj->adj_state == ISIS_ADJ_UP)
+ return 0;
+
+ /* Remove adjacency from all SPF trees. */
for (int tree = SPFTREE_IPV4; tree < SPFTREE_COUNT; tree++) {
for (int level = ISIS_LEVEL1; level <= ISIS_LEVEL2; level++) {
if (!(area->is_type & level))
@@ -290,6 +296,8 @@ void spftree_area_adj_del(struct isis_area *area, struct isis_adjacency *adj)
if (fabricd_spftree(area) != NULL)
isis_spftree_adj_del(fabricd_spftree(area), adj);
+
+ return 0;
}
/*
@@ -1513,9 +1521,12 @@ DEFUN(show_isis_topology, show_isis_topology_cmd,
return CMD_SUCCESS;
}
-void isis_spf_cmds_init(void)
+void isis_spf_init(void)
{
install_element(VIEW_NODE, &show_isis_topology_cmd);
+
+ /* Register hook(s). */
+ hook_register(isis_adj_state_change_hook, spf_adj_state_change);
}
void isis_spf_print(struct isis_spftree *spftree, struct vty *vty)
diff --git a/isisd/isis_spf.h b/isisd/isis_spf.h
index 8bf9c9978a..a85e596bb0 100644
--- a/isisd/isis_spf.h
+++ b/isisd/isis_spf.h
@@ -33,13 +33,12 @@ void isis_spf_verify_routes(struct isis_area *area,
void isis_spftree_del(struct isis_spftree *spftree);
void spftree_area_init(struct isis_area *area);
void spftree_area_del(struct isis_area *area);
-void spftree_area_adj_del(struct isis_area *area, struct isis_adjacency *adj);
#define isis_spf_schedule(area, level) \
_isis_spf_schedule((area), (level), __func__, \
__FILE__, __LINE__)
int _isis_spf_schedule(struct isis_area *area, int level,
const char *func, const char *file, int line);
-void isis_spf_cmds_init(void);
+void isis_spf_init(void);
void isis_spf_print(struct isis_spftree *spftree, struct vty *vty);
struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area,
uint8_t *sysid,