]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: Replace isis_event_adjacency_state_change with a hook
authorChristian Franke <chris@opensourcerouting.org>
Thu, 27 Sep 2018 12:23:06 +0000 (14:23 +0200)
committerChristian Franke <chris@opensourcerouting.org>
Fri, 5 Oct 2018 12:05:28 +0000 (14:05 +0200)
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/isis_adjacency.c
isisd/isis_adjacency.h
isisd/isis_events.c
isisd/isis_events.h
isisd/isis_lsp.c
isisd/isis_lsp.h
isisd/isis_main.c

index a41d6ff8152267214bb99680de920d8654d6a8c8..9013c7c19b10e5df649f9b01ee59c32f34a7246c 100644 (file)
@@ -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;
                        }
                }
index 2f39378c003c4c551e01b1a59affdadaf023931f..23b57ae1d9854cc20bd82a5150727563841b170d 100644 (file)
@@ -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);
index 5dcc0a1324248abc3efe4a7daf8477ee02336726..9f58c24b71be856585f10f5c091f1ff485ab4093 100644 (file)
@@ -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)
index c3d8cf046fa6b40396fa3660e03596702c2b25e4..25643f4ededc57f2c8af1122b8eae56e14b14f77 100644 (file)
@@ -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);
 
 /*
index 1258bec064f2e16f18ab3fbd3b6ce3f69d9ed6f4..61ba51ffb84f9ee74b002b8e672cf1dbe4d055ab 100644 (file)
@@ -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);
+}
index 4e6379447cf5136de7f28ed31a6d95a34812f33d..4beee10081d2cfe5d82b118b62ad423a19228064 100644 (file)
@@ -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 */
index fcf07745b96fb40b2cc8511a33053b3cb18c05ce..474184fbd31290f1e8f0a0b91978dd3f3ad0bd1d 100644 (file)
@@ -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);