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;
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);
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);
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;
}
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);
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;
}
}
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);
*
* ***********************************************************************/
-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)
/*
* 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);
/*
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);
+}
/* 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 */
#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"
isis_redist_init();
isis_route_map_init();
isis_mpls_te_init();
+ lsp_init();
/* create the global 'isis' instance */
isis_new(1);