diff options
| -rw-r--r-- | isisd/isis_adjacency.c | 4 | ||||
| -rw-r--r-- | isisd/isis_main.c | 2 | ||||
| -rw-r--r-- | isisd/isis_spf.c | 15 | ||||
| -rw-r--r-- | isisd/isis_spf.h | 3 |
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, |
