]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrpd.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / eigrpd / eigrpd.c
index 99d88b2d006fec0bb6fae0b5ca205add48cb418a..9bbecdf9e39df04e4c38d338d6d1bc607d4a6c49 100644 (file)
@@ -42,6 +42,8 @@
 #include "plist.h"
 #include "sockopt.h"
 #include "keychain.h"
+#include "libfrr.h"
+#include "lib_errors.h"
 
 #include "eigrpd/eigrp_structs.h"
 #include "eigrpd/eigrpd.h"
@@ -60,9 +62,7 @@ static struct eigrp_master eigrp_master;
 
 struct eigrp_master *eigrp_om;
 
-static void eigrp_delete(struct eigrp *);
 static struct eigrp *eigrp_new(const char *);
-static void eigrp_add(struct eigrp *);
 
 extern struct zclient *zclient;
 extern struct in_addr router_id_zebra;
@@ -93,9 +93,9 @@ extern struct in_addr router_id_zebra;
  */
 void eigrp_router_id_update(struct eigrp *eigrp)
 {
+       struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
        struct interface *ifp;
-       struct listnode *node;
-       u_int32_t router_id, router_id_old;
+       uint32_t router_id, router_id_old;
 
        router_id_old = eigrp->router_id;
 
@@ -115,7 +115,7 @@ void eigrp_router_id_update(struct eigrp *eigrp)
                //        inet_ntoa(eigrp->router_id));
 
                /* update eigrp_interface's */
-               for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp))
+               FOR_ALL_INTERFACES (vrf, ifp)
                        eigrp_if_update(ifp);
        }
 }
@@ -157,30 +157,25 @@ static struct eigrp *eigrp_new(const char *AS)
        /* init internal data structures */
        eigrp->eiflist = list_new();
        eigrp->passive_interface_default = EIGRP_IF_ACTIVE;
-       eigrp->networks = route_table_init();
+       eigrp->networks = eigrp_topology_new();
 
        if ((eigrp_socket = eigrp_sock_init()) < 0) {
-               zlog_err(
-                       "eigrp_new: fatal error: eigrp_sock_init was unable to open "
-                       "a socket");
+               flog_err_sys(
+                       EC_LIB_SOCKET,
+                       "eigrp_new: fatal error: eigrp_sock_init was unable to open a socket");
                exit(1);
        }
 
        eigrp->fd = eigrp_socket;
        eigrp->maxsndbuflen = getsockopt_so_sendbuf(eigrp->fd);
 
-       if ((eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1)) == NULL) {
-               zlog_err(
-                       "eigrp_new: fatal error: stream_new (%u) failed allocating ibuf",
-                       EIGRP_PACKET_MAX_LEN + 1);
-               exit(1);
-       }
+       eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1);
 
        eigrp->t_read = NULL;
        thread_add_read(master, eigrp_read, eigrp, eigrp->fd, &eigrp->t_read);
        eigrp->oi_write_q = list_new();
 
-       eigrp->topology_table = eigrp_topology_new();
+       eigrp->topology_table = route_table_init();
 
        eigrp->neighbor_self = eigrp_nbr_new(NULL);
        eigrp->neighbor_self->src.s_addr = INADDR_ANY;
@@ -206,16 +201,6 @@ static struct eigrp *eigrp_new(const char *AS)
        return eigrp;
 }
 
-static void eigrp_add(struct eigrp *eigrp)
-{
-       listnode_add(eigrp_om->eigrp, eigrp);
-}
-
-static void eigrp_delete(struct eigrp *eigrp)
-{
-       listnode_delete(eigrp_om->eigrp, eigrp);
-}
-
 struct eigrp *eigrp_get(const char *AS)
 {
        struct eigrp *eigrp;
@@ -223,7 +208,7 @@ struct eigrp *eigrp_get(const char *AS)
        eigrp = eigrp_lookup();
        if (eigrp == NULL) {
                eigrp = eigrp_new(AS);
-               eigrp_add(eigrp);
+               listnode_add(eigrp_om->eigrp, eigrp);
        }
 
        return eigrp;
@@ -241,12 +226,10 @@ void eigrp_terminate(void)
 
        SET_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN);
 
-       /* exit immediately if EIGRP not actually running */
-       if (listcount(eigrp_om->eigrp) == 0)
-               exit(0);
-
        for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp))
                eigrp_finish(eigrp);
+
+       frr_fini();
 }
 
 void eigrp_finish(struct eigrp *eigrp)
@@ -283,18 +266,19 @@ void eigrp_finish_final(struct eigrp *eigrp)
        THREAD_OFF(eigrp->t_read);
        close(eigrp->fd);
 
-       list_delete(eigrp->eiflist);
-       list_delete(eigrp->oi_write_q);
-       list_delete(eigrp->topology_changes_externalIPV4);
-       list_delete(eigrp->topology_changes_internalIPV4);
+       list_delete(&eigrp->eiflist);
+       list_delete(&eigrp->oi_write_q);
 
-       eigrp_topology_cleanup(eigrp->topology_table);
        eigrp_topology_free(eigrp->topology_table);
 
        eigrp_nbr_delete(eigrp->neighbor_self);
 
-       eigrp_delete(eigrp);
+       list_delete(&eigrp->topology_changes_externalIPV4);
+       list_delete(&eigrp->topology_changes_internalIPV4);
+
+       listnode_delete(eigrp_om->eigrp, eigrp);
 
+       stream_free(eigrp->ibuf);
        XFREE(MTYPE_EIGRP_TOP, eigrp);
 }