]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_adjacency.c
Merge pull request #2992 from opensourcerouting/large_as_path_fix
[mirror_frr.git] / isisd / isis_adjacency.c
index 81495d0a797e86c4fba6afe08456f86b02dc67eb..a41d6ff8152267214bb99680de920d8654d6a8c8 100644 (file)
@@ -48,6 +48,7 @@
 #include "isisd/isis_events.h"
 #include "isisd/isis_mt.h"
 #include "isisd/isis_tlvs.h"
+#include "isisd/fabricd.h"
 
 extern struct isis *isis;
 
@@ -193,6 +194,9 @@ void isis_adj_process_threeway(struct isis_adjacency *adj,
                }
        }
 
+       if (next_tw_state != ISIS_THREEWAY_DOWN)
+               fabricd_initial_sync_hello(adj->circuit);
+
        if (next_tw_state == ISIS_THREEWAY_DOWN) {
                isis_adj_state_change(adj, ISIS_ADJ_DOWN, "Neighbor restarted");
                return;
@@ -264,7 +268,7 @@ void isis_adj_state_change(struct isis_adjacency *adj,
 
                                circuit->upadjcount[level - 1]--;
                                if (circuit->upadjcount[level - 1] == 0)
-                                       isis_circuit_lsp_queue_clean(circuit);
+                                       isis_tx_queue_clean(circuit->tx_queue);
 
                                isis_event_adjacency_state_change(adj,
                                                                  new_state);
@@ -288,7 +292,6 @@ void isis_adj_state_change(struct isis_adjacency *adj,
                if (del)
                        isis_delete_adj(adj);
 
-               adj = NULL;
        } else if (circuit->circ_type == CIRCUIT_T_P2P) {
                del = false;
                for (level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
@@ -307,16 +310,21 @@ void isis_adj_state_change(struct isis_adjacency *adj,
                                adj->last_flap = time(NULL);
                                adj->flaps++;
 
-                               /* 7.3.17 - going up on P2P -> send CSNP */
-                               /* FIXME: yup, I know its wrong... but i will do
-                                * it! (for now) */
-                               send_csnp(circuit, level);
+                               if (level == IS_LEVEL_1) {
+                                       thread_add_timer(master, send_l1_csnp,
+                                                        circuit, 0,
+                                                        &circuit->t_send_csnp[0]);
+                               } else {
+                                       thread_add_timer(master, send_l2_csnp,
+                                                        circuit, 0,
+                                                        &circuit->t_send_csnp[1]);
+                               }
                        } else if (new_state == ISIS_ADJ_DOWN) {
                                if (adj->circuit->u.p2p.neighbor == adj)
                                        adj->circuit->u.p2p.neighbor = NULL;
                                circuit->upadjcount[level - 1]--;
                                if (circuit->upadjcount[level - 1] == 0)
-                                       isis_circuit_lsp_queue_clean(circuit);
+                                       isis_tx_queue_clean(circuit->tx_queue);
 
                                isis_event_adjacency_state_change(adj,
                                                                  new_state);
@@ -326,8 +334,6 @@ void isis_adj_state_change(struct isis_adjacency *adj,
 
                if (del)
                        isis_delete_adj(adj);
-
-               adj = NULL;
        }
 
        return;