]> git.proxmox.com Git - mirror_frr.git/commitdiff
fabricd: Update neighbor list on adjacency state change
authorChristian Franke <chris@opensourcerouting.org>
Fri, 23 Nov 2018 03:46:09 +0000 (04:46 +0100)
committerRodny Molina <rmolina@linkedin.com>
Fri, 7 Dec 2018 19:45:14 +0000 (19:45 +0000)
We should update our neighbors list immediately when an adjacency
changes state, not when we run SPF.

Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/fabricd.c
isisd/fabricd.h
isisd/isis_main.c

index e1d838429de25c9f2df08ae0f822aa4a6d9e956c..302b7e17e32693aacef510abf228f34dccfabc78 100644 (file)
@@ -161,9 +161,15 @@ static struct neighbor_entry *neighbor_entry_lookup_hash(struct hash *hash,
        return rv;
 }
 
        return rv;
 }
 
-static void neighbor_lists_update(struct fabricd *f)
+static int fabricd_handle_adj_state_change(struct isis_adjacency *arg)
 {
 {
-       neighbor_lists_clear(f);
+       struct fabricd *f = arg->circuit->area->fabricd;
+
+       if (!f)
+               return 0;
+
+       while (!skiplist_empty(f->neighbors))
+               skiplist_delete_first(f->neighbors);
 
        struct listnode *node;
        struct isis_circuit *circuit;
 
        struct listnode *node;
        struct isis_circuit *circuit;
@@ -182,6 +188,14 @@ static void neighbor_lists_update(struct fabricd *f)
                skiplist_insert(f->neighbors, n, n);
        }
 
                skiplist_insert(f->neighbors, n, n);
        }
 
+       return 0;
+}
+
+static void neighbors_neighbors_update(struct fabricd *f)
+{
+       hash_clean(f->neighbors_neighbors, neighbor_entry_del_void);
+
+       struct listnode *node;
        struct isis_vertex *v;
 
        for (ALL_QUEUE_ELEMENTS_RO(&f->spftree->paths, node, v)) {
        struct isis_vertex *v;
 
        for (ALL_QUEUE_ELEMENTS_RO(&f->spftree->paths, node, v)) {
@@ -463,7 +477,7 @@ void fabricd_run_spf(struct isis_area *area)
                return;
 
        isis_run_hopcount_spf(area, isis->sysid, f->spftree);
                return;
 
        isis_run_hopcount_spf(area, isis->sysid, f->spftree);
-       neighbor_lists_update(f);
+       neighbors_neighbors_update(f);
        fabricd_bump_tier_calculation_timer(f);
 }
 
        fabricd_bump_tier_calculation_timer(f);
 }
 
@@ -799,3 +813,9 @@ void fabricd_configure_triggered_csnp(struct isis_area *area, int delay,
        f->csnp_delay = delay;
        f->always_send_csnp = always_send_csnp;
 }
        f->csnp_delay = delay;
        f->always_send_csnp = always_send_csnp;
 }
+
+void fabricd_init(void)
+{
+       hook_register(isis_adj_state_change_hook,
+                     fabricd_handle_adj_state_change);
+}
index 8c850c628ff4a2535ca6e86a3640375a0e952968..315cfba3f08e8f54820f0b51a028ddc2f9e59ce6 100644 (file)
@@ -52,5 +52,5 @@ void fabricd_update_lsp_no_flood(struct isis_lsp *lsp,
                                 struct isis_circuit *circuit);
 void fabricd_configure_triggered_csnp(struct isis_area *area, int delay,
                                      bool always_send_csnp);
                                 struct isis_circuit *circuit);
 void fabricd_configure_triggered_csnp(struct isis_area *area, int delay,
                                      bool always_send_csnp);
-
+void fabricd_init(void);
 #endif
 #endif
index 2d540348e450fbfb689d569be48bf7060b04bb34..cda3b2b3c5708ce57a4a8beb64ef76270574ebc9 100644 (file)
@@ -58,6 +58,7 @@
 #include "isisd/isis_bfd.h"
 #include "isisd/isis_lsp.h"
 #include "isisd/isis_mt.h"
 #include "isisd/isis_bfd.h"
 #include "isisd/isis_lsp.h"
 #include "isisd/isis_mt.h"
+#include "isisd/fabricd.h"
 
 /* Default configuration file name */
 #define ISISD_DEFAULT_CONFIG "isisd.conf"
 
 /* Default configuration file name */
 #define ISISD_DEFAULT_CONFIG "isisd.conf"
@@ -228,6 +229,7 @@ int main(int argc, char **argv, char **envp)
 
        isis_zebra_init(master);
        isis_bfd_init();
 
        isis_zebra_init(master);
        isis_bfd_init();
+       fabricd_init();
 
        frr_config_fork();
        frr_run(master);
 
        frr_config_fork();
        frr_run(master);