]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_adjacency.c
Merge pull request #5280 from qlyoung/doc-clean-topotest-json
[mirror_frr.git] / isisd / isis_adjacency.c
index 9013c7c19b10e5df649f9b01ee59c32f34a7246c..1d70521e6812da2bb91157c5d59a51179a9fb542 100644 (file)
@@ -32,7 +32,6 @@
 #include "if.h"
 #include "stream.h"
 
-#include "isisd/dict.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -49,6 +48,7 @@
 #include "isisd/isis_mt.h"
 #include "isisd/isis_tlvs.h"
 #include "isisd/fabricd.h"
+#include "isisd/isis_nb.h"
 
 extern struct isis *isis;
 
@@ -140,12 +140,9 @@ void isis_delete_adj(void *arg)
        /* remove from SPF trees */
        spftree_area_adj_del(adj->circuit->area, adj);
 
-       if (adj->area_addresses)
-               XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->area_addresses);
-       if (adj->ipv4_addresses)
-               XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv4_addresses);
-       if (adj->ipv6_addresses)
-               XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv6_addresses);
+       XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->area_addresses);
+       XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv4_addresses);
+       XFREE(MTYPE_ISIS_ADJACENCY_INFO, adj->ipv6_addresses);
 
        adj_mt_finish(adj);
 
@@ -215,21 +212,24 @@ void isis_adj_process_threeway(struct isis_adjacency *adj,
                }
        }
 
+       if (adj->threeway_state != next_tw_state) {
+               send_hello_sched(adj->circuit, 0, TRIGGERED_IIH_DELAY);
+       }
+
        adj->threeway_state = next_tw_state;
 }
 
 void isis_adj_state_change(struct isis_adjacency *adj,
                           enum isis_adj_state new_state, const char *reason)
 {
-       int old_state;
-       int level;
-       struct isis_circuit *circuit;
+       enum isis_adj_state old_state = adj->adj_state;
+       struct isis_circuit *circuit = adj->circuit;
        bool del;
 
-       old_state = adj->adj_state;
        adj->adj_state = new_state;
-
-       circuit = adj->circuit;
+       if (new_state != old_state) {
+               send_hello_sched(circuit, adj->level, TRIGGERED_IIH_DELAY);
+       }
 
        if (isis->debugs & DEBUG_ADJ_PACKETS) {
                zlog_debug("ISIS-Adj (%s): Adjacency state change %d->%d: %s",
@@ -255,9 +255,15 @@ void isis_adj_state_change(struct isis_adjacency *adj,
                        reason ? reason : "unspecified");
        }
 
+       circuit->adj_state_changes++;
+#ifndef FABRICD
+       /* send northbound notification */
+       isis_notif_adj_state_change(adj, new_state, reason);
+#endif /* ifndef FABRICD */
+
        if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
                del = false;
-               for (level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
+               for (int level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
                        if ((adj->level & level) == 0)
                                continue;
                        if (new_state == ISIS_ADJ_UP) {
@@ -298,16 +304,13 @@ void isis_adj_state_change(struct isis_adjacency *adj,
 
        } else if (circuit->circ_type == CIRCUIT_T_P2P) {
                del = false;
-               for (level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
+               for (int level = IS_LEVEL_1; level <= IS_LEVEL_2; level++) {
                        if ((adj->level & level) == 0)
                                continue;
                        if (new_state == ISIS_ADJ_UP) {
                                circuit->upadjcount[level - 1]++;
                                hook_call(isis_adj_state_change_hook, adj);
 
-                               if (adj->sys_type == ISIS_SYSTYPE_UNKNOWN)
-                                       send_hello(circuit, level);
-
                                /* update counter & timers for debugging
                                 * purposes */
                                adj->last_flap = time(NULL);
@@ -337,8 +340,6 @@ void isis_adj_state_change(struct isis_adjacency *adj,
                if (del)
                        isis_delete_adj(adj);
        }
-
-       return;
 }
 
 
@@ -375,6 +376,20 @@ void isis_adj_print(struct isis_adjacency *adj)
        return;
 }
 
+const char *isis_adj_yang_state(enum isis_adj_state state)
+{
+       switch (state) {
+       case ISIS_ADJ_DOWN:
+               return "down";
+       case ISIS_ADJ_UP:
+               return "up";
+       case ISIS_ADJ_INITIALIZING:
+               return "init";
+       default:
+               return "failed";
+       }
+}
+
 int isis_adj_expire(struct thread *thread)
 {
        struct isis_adjacency *adj;