]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_circuit.c
Merge pull request #5625 from qlyoung/fix-zapi-ipset-name-nullterm
[mirror_frr.git] / isisd / isis_circuit.c
index 64ec047054300789b54709e7b1e385ae79c4cc85..8343f7d85fe59565b7d0ebee21286e18b64ba0cb 100644 (file)
 #include "isisd/isis_mt.h"
 #include "isisd/isis_errors.h"
 #include "isisd/isis_tx_queue.h"
+#include "isisd/isis_nb.h"
 
 DEFINE_QOBJ_TYPE(isis_circuit)
 
+DEFINE_HOOK(isis_if_new_hook, (struct interface *ifp), (ifp))
+
 /*
  * Prototypes.
  */
@@ -335,7 +338,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
 
                if (ip) {
                        listnode_delete(circuit->ip_addrs, ip);
-                       prefix_ipv4_free(ip);
+                       prefix_ipv4_free(&ip);
                        if (circuit->area)
                                lsp_regenerate_schedule(circuit->area,
                                                        circuit->is_type, 0);
@@ -355,7 +358,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        zlog_warn("End of addresses");
                }
 
-               prefix_ipv4_free(ipv4);
+               prefix_ipv4_free(&ipv4);
        }
        if (connected->address->family == AF_INET6) {
                ipv6 = prefix_ipv6_new();
@@ -371,7 +374,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        }
                        if (ip6) {
                                listnode_delete(circuit->ipv6_link, ip6);
-                               prefix_ipv6_free(ip6);
+                               prefix_ipv6_free(&ip6);
                                found = 1;
                        }
                } else {
@@ -383,7 +386,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        }
                        if (ip6) {
                                listnode_delete(circuit->ipv6_non_link, ip6);
-                               prefix_ipv6_free(ip6);
+                               prefix_ipv6_free(&ip6);
                                found = 1;
                        }
                }
@@ -414,7 +417,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
                        lsp_regenerate_schedule(circuit->area, circuit->is_type,
                                                0);
 
-               prefix_ipv6_free(ipv6);
+               prefix_ipv6_free(&ipv6);
        }
        return;
 }
@@ -1391,21 +1394,46 @@ int isis_if_delete_hook(struct interface *ifp)
 
 static int isis_ifp_create(struct interface *ifp)
 {
+       if (if_is_operative(ifp))
+               isis_csm_state_change(IF_UP_FROM_Z, circuit_scan_by_ifp(ifp),
+                                     ifp);
+
+       hook_call(isis_if_new_hook, ifp);
+
        return 0;
 }
 
 static int isis_ifp_up(struct interface *ifp)
 {
+       isis_csm_state_change(IF_UP_FROM_Z, circuit_scan_by_ifp(ifp), ifp);
+
        return 0;
 }
 
 static int isis_ifp_down(struct interface *ifp)
 {
+       struct isis_circuit *circuit;
+
+       circuit = isis_csm_state_change(IF_DOWN_FROM_Z,
+                                       circuit_scan_by_ifp(ifp), ifp);
+       if (circuit)
+               SET_FLAG(circuit->flags, ISIS_CIRCUIT_FLAPPED_AFTER_SPF);
+
        return 0;
 }
 
 static int isis_ifp_destroy(struct interface *ifp)
 {
+       if (if_is_operative(ifp))
+               zlog_warn("Zebra: got delete of %s, but interface is still up",
+                         ifp->name);
+
+       isis_csm_state_change(IF_DOWN_FROM_Z, circuit_scan_by_ifp(ifp), ifp);
+
+       /* Cannot call if_delete because we should retain the pseudo interface
+          in case there is configuration info attached to it. */
+       if_delete_retain(ifp);
+
        return 0;
 }