From a5b5e946ce1d20173f522345354a59b5025fe138 Mon Sep 17 00:00:00 2001 From: Christian Franke Date: Thu, 27 Sep 2018 14:23:06 +0200 Subject: [PATCH] isisd: Replace isis_event_adjacency_state_change with a hook Signed-off-by: Christian Franke --- isisd/isis_adjacency.c | 18 ++++++++++-------- isisd/isis_adjacency.h | 1 + isisd/isis_events.c | 19 ------------------- isisd/isis_events.h | 3 --- isisd/isis_lsp.c | 12 ++++++++++++ isisd/isis_lsp.h | 1 + isisd/isis_main.c | 2 ++ 7 files changed, 26 insertions(+), 30 deletions(-) diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index a41d6ff815..9013c7c19b 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -122,6 +122,8 @@ struct isis_adjacency *isis_adj_lookup_snpa(const uint8_t *ssnpa, return NULL; } +DEFINE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)) + void isis_delete_adj(void *arg) { struct isis_adjacency *adj = arg; @@ -130,6 +132,10 @@ void isis_delete_adj(void *arg) return; THREAD_TIMER_OFF(adj->t_expire); + if (adj->adj_state != ISIS_ADJ_DOWN) { + adj->adj_state = ISIS_ADJ_DOWN; + hook_call(isis_adj_state_change_hook, adj); + } /* remove from SPF trees */ spftree_area_adj_del(adj->circuit->area, adj); @@ -256,8 +262,7 @@ void isis_adj_state_change(struct isis_adjacency *adj, continue; if (new_state == ISIS_ADJ_UP) { circuit->upadjcount[level - 1]++; - isis_event_adjacency_state_change(adj, - new_state); + hook_call(isis_adj_state_change_hook, adj); /* update counter & timers for debugging * purposes */ adj->last_flap = time(NULL); @@ -270,8 +275,7 @@ void isis_adj_state_change(struct isis_adjacency *adj, if (circuit->upadjcount[level - 1] == 0) isis_tx_queue_clean(circuit->tx_queue); - isis_event_adjacency_state_change(adj, - new_state); + hook_call(isis_adj_state_change_hook, adj); del = true; } @@ -299,8 +303,7 @@ void isis_adj_state_change(struct isis_adjacency *adj, continue; if (new_state == ISIS_ADJ_UP) { circuit->upadjcount[level - 1]++; - isis_event_adjacency_state_change(adj, - new_state); + hook_call(isis_adj_state_change_hook, adj); if (adj->sys_type == ISIS_SYSTYPE_UNKNOWN) send_hello(circuit, level); @@ -326,8 +329,7 @@ void isis_adj_state_change(struct isis_adjacency *adj, if (circuit->upadjcount[level - 1] == 0) isis_tx_queue_clean(circuit->tx_queue); - isis_event_adjacency_state_change(adj, - new_state); + hook_call(isis_adj_state_change_hook, adj); del = true; } } diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index 2f39378c00..23b57ae1d9 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -114,6 +114,7 @@ void isis_delete_adj(void *adj); void isis_adj_process_threeway(struct isis_adjacency *adj, struct isis_threeway_adj *tw_adj, enum isis_adj_usage adj_usage); +DECLARE_HOOK(isis_adj_state_change_hook, (struct isis_adjacency *adj), (adj)) void isis_adj_state_change(struct isis_adjacency *adj, enum isis_adj_state state, const char *reason); void isis_adj_print(struct isis_adjacency *adj); diff --git a/isisd/isis_events.c b/isisd/isis_events.c index 5dcc0a1324..9f58c24b71 100644 --- a/isisd/isis_events.c +++ b/isisd/isis_events.c @@ -216,25 +216,6 @@ void isis_circuit_is_type_set(struct isis_circuit *circuit, int newtype) * * ***********************************************************************/ -void isis_event_adjacency_state_change(struct isis_adjacency *adj, int newstate) -{ - /* adjacency state change event. - * - the only proto-type was supported */ - - /* invalid arguments */ - if (!adj || !adj->circuit || !adj->circuit->area) - return; - - if (isis->debugs & DEBUG_EVENTS) - zlog_debug("ISIS-Evt (%s) Adjacency State change", - adj->circuit->area->area_tag); - - /* LSP generation again */ - lsp_regenerate_schedule(adj->circuit->area, IS_LEVEL_1 | IS_LEVEL_2, 0); - - return; -} - /* events supporting code */ int isis_event_dis_status_change(struct thread *thread) diff --git a/isisd/isis_events.h b/isisd/isis_events.h index c3d8cf046f..25643f4ede 100644 --- a/isisd/isis_events.h +++ b/isisd/isis_events.h @@ -31,9 +31,6 @@ void isis_event_circuit_type_change(struct isis_circuit *circuit, int newtype); /* * Events related to adjacencies */ -void isis_event_adjacency_state_change(struct isis_adjacency *adj, - int newstate); - int isis_event_dis_status_change(struct thread *thread); /* diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 1258bec064..61ba51ffb8 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1997,3 +1997,15 @@ void lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit) fabricd_lsp_flood(lsp); } } + +static int lsp_handle_adj_state_change(struct isis_adjacency *adj) +{ + lsp_regenerate_schedule(adj->circuit->area, IS_LEVEL_1 | IS_LEVEL_2, 0); + return 0; +} + +void lsp_init(void) +{ + hook_register(isis_adj_state_change_hook, + lsp_handle_adj_state_change); +} diff --git a/isisd/isis_lsp.h b/isisd/isis_lsp.h index 4e6379447c..4beee10081 100644 --- a/isisd/isis_lsp.h +++ b/isisd/isis_lsp.h @@ -101,5 +101,6 @@ int lsp_print_all(struct vty *vty, dict_t *lspdb, char detail, char dynhost); /* sets SRMflags for all active circuits of an lsp */ void lsp_set_all_srmflags(struct isis_lsp *lsp, bool set); void lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit); +void lsp_init(void); #endif /* ISIS_LSP */ diff --git a/isisd/isis_main.c b/isisd/isis_main.c index fcf07745b9..474184fbd3 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -56,6 +56,7 @@ #include "isisd/isis_errors.h" #include "isisd/isis_vty_common.h" #include "isisd/isis_bfd.h" +#include "isisd/isis_lsp.h" /* Default configuration file name */ #define ISISD_DEFAULT_CONFIG "isisd.conf" @@ -214,6 +215,7 @@ int main(int argc, char **argv, char **envp) isis_redist_init(); isis_route_map_init(); isis_mpls_te_init(); + lsp_init(); /* create the global 'isis' instance */ isis_new(1); -- 2.39.5