]> 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 153e7ec26200fe37147cf9987728c0000490a028..8343f7d85fe59565b7d0ebee21286e18b64ba0cb 100644 (file)
@@ -58,6 +58,7 @@
 #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)
 
@@ -337,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);
@@ -357,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();
@@ -373,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 {
@@ -385,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;
                        }
                }
@@ -416,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;
 }
@@ -1423,6 +1424,16 @@ static int isis_ifp_down(struct interface *ifp)
 
 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;
 }