]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospf6d: Have ospf6d cleanup when it terminates normally
authorTom Goff <thomas.goff@boeing.com>
Wed, 10 Nov 2010 21:01:41 +0000 (13:01 -0800)
committerPaul Jakma <paul@quagga.net>
Mon, 21 Mar 2011 13:31:16 +0000 (13:31 +0000)
A clean exit makes it easier to use memory debuggers.

* ospf6_asbr.c: (ospf6_asbr_terminate) Add a function to do route map
  cleanup.
* ospf6_lsa.c: (ospf6_lsa_terminate) Add a function to cleanup the lsa
  handler vector.
* ospf6_main.c: (ospf6_exit) Add an function that causes ospf6d to
  gracefully exit.
* ospf6_message.c: (ospf6_message_terminate) Add a function that frees
  the send and receive buffers.
* ospf6_top.c: (ospf6_delete) Enable the ospf6_delete() function.
  Disable ospf6 before freeing everything.

ospf6d/ospf6_asbr.c
ospf6d/ospf6_asbr.h
ospf6d/ospf6_lsa.c
ospf6d/ospf6_lsa.h
ospf6d/ospf6_main.c
ospf6d/ospf6_message.c
ospf6d/ospf6_message.h
ospf6d/ospf6_top.c
ospf6d/ospf6_top.h

index 685b147ccba013fb99c715ebf0c6a475158d6ba2..3efaab44a47fbb39c2c2ba0e0a351e206615b25e 100644 (file)
@@ -1219,6 +1219,11 @@ ospf6_asbr_init (void)
   install_element (OSPF6_NODE, &no_ospf6_redistribute_cmd);
 }
 
+void
+ospf6_asbr_terminate (void)
+{
+  route_map_finish ();
+}
 
 DEFUN (debug_ospf6_asbr,
        debug_ospf6_asbr_cmd,
index 7166aa3ed304b47a939ba190c76412bb60493324..6deb93ef87913b9098357044f005d623d63b3953 100644 (file)
@@ -79,6 +79,7 @@ extern void ospf6_asbr_redistribute_remove (int type, int ifindex,
 extern int ospf6_redistribute_config_write (struct vty *vty);
 
 extern void ospf6_asbr_init (void);
+extern void ospf6_asbr_terminate (void);
 
 extern int config_write_ospf6_debug_asbr (struct vty *vty);
 extern void install_element_ospf6_debug_asbr (void);
index c1db3741bab58c7206ef17d4ae0aeee2e0390ee8..588b94628441381b5caee6b5e0f42a1fe098b47a 100644 (file)
@@ -712,6 +712,11 @@ ospf6_lsa_init (void)
   ospf6_install_lsa_handler (&unknown_handler);
 }
 
+void
+ospf6_lsa_terminate (void)
+{
+  vector_free (ospf6_lsa_handler_vector);
+}
 \f
 static char *
 ospf6_lsa_handler_name (struct ospf6_lsa_handler *h)
index fb0f27cdae8872a7ffb30f17e6f0d4fddd21b7a3..c1093cab5722df0e2dd3dddf7768bb0ee1f09e84 100644 (file)
@@ -243,6 +243,7 @@ extern void ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler);
 extern struct ospf6_lsa_handler *ospf6_get_lsa_handler (u_int16_t type);
 
 extern void ospf6_lsa_init (void);
+extern void ospf6_lsa_terminate (void);
 extern void ospf6_lsa_cmd_init (void);
 
 extern int config_write_ospf6_debug_lsa (struct vty *vty);
index a7a96a1f0e08ba50b860da31996a49aa52a24552..800fae4b4ec5cf9e3876511dc9ad5cc91291a5c2 100644 (file)
@@ -124,6 +124,35 @@ Report bugs to zebra@zebra.org\n", progname);
   exit (status);
 }
 
+static void
+ospf6_exit (int status)
+{
+  extern struct ospf6 *ospf6;
+  extern struct zclient *zclient;
+
+  if (ospf6)
+    ospf6_delete (ospf6);
+
+  ospf6_message_terminate ();
+  ospf6_asbr_terminate ();
+  ospf6_lsa_terminate ();
+
+  if_terminate ();
+  vty_terminate ();
+  cmd_terminate ();
+
+  if (zclient)
+    zclient_free (zclient);
+
+  if (master)
+    thread_master_free (master);
+
+  if (zlog_default)
+    closezlog (zlog_default);
+
+  exit (status);
+}
+
 /* SIGHUP handler. */
 static void 
 sighup (void)
@@ -136,7 +165,7 @@ static void
 sigint (void)
 {
   zlog_notice ("Terminating on signal SIGINT");
-  exit (0);
+  ospf6_exit (0);
 }
 
 /* SIGTERM handler. */
@@ -144,7 +173,7 @@ static void
 sigterm (void)
 {
   zlog_notice ("Terminating on signal SIGTERM");
-  exit (0);
+  ospf6_exit (0);
 }
 
 /* SIGUSR1 handler. */
@@ -308,7 +337,7 @@ main (int argc, char *argv[], char *envp[])
   zlog_warn ("Thread failed");
 
   /* Not reached. */
-  exit (0);
+  ospf6_exit (0);
 }
 
 
index 790fc0ae72bd4c0eb302318550cee670654827df..d06eba26b193e375052fc44bee9ea31645dbde49 100644 (file)
@@ -1168,6 +1168,24 @@ ospf6_iobuf_size (unsigned int size)
   return iobuflen;
 }
 
+void
+ospf6_message_terminate (void)
+{
+  if (recvbuf)
+    {
+      XFREE (MTYPE_OSPF6_MESSAGE, recvbuf);
+      recvbuf = NULL;
+    }
+
+  if (sendbuf)
+    {
+      XFREE (MTYPE_OSPF6_MESSAGE, sendbuf);
+      sendbuf = NULL;
+    }
+
+  iobuflen = 0;
+}
+
 int
 ospf6_receive (struct thread *thread)
 {
index ebb6308e59d39d7525b8ea4203bd7f93a504e95d..c72f0af45c2092ee83ee7ba9a5edb11f5950ad9b 100644 (file)
@@ -123,6 +123,7 @@ extern void ospf6_lsupdate_print (struct ospf6_header *);
 extern void ospf6_lsack_print (struct ospf6_header *);
 
 extern int ospf6_iobuf_size (unsigned int size);
+extern void ospf6_message_terminate (void);
 extern int ospf6_receive (struct thread *thread);
 
 extern int ospf6_hello_send (struct thread *thread);
index 823702689cc0328025cacebf1d60eadb6b9a27b2..2b65be825920bfc326e2818fa1921553a50b6561 100644 (file)
@@ -51,6 +51,8 @@
 /* global ospf6d variable */
 struct ospf6 *ospf6;
 
+static void ospf6_disable (struct ospf6 *o);
+
 static void
 ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
 {
@@ -143,15 +145,17 @@ ospf6_create (void)
   return o;
 }
 
-#if 0
-static void
+void
 ospf6_delete (struct ospf6 *o)
 {
   struct listnode *node, *nnode;
   struct ospf6_area *oa;
 
+  ospf6_disable (ospf6);
+
   for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
     ospf6_area_delete (oa);
+  list_delete (o->area_list);
 
   ospf6_lsdb_delete (o->lsdb);
   ospf6_lsdb_delete (o->lsdb_self);
@@ -164,7 +168,6 @@ ospf6_delete (struct ospf6 *o)
 
   XFREE (MTYPE_OSPF6_TOP, o);
 }
-#endif
 
 static void
 ospf6_enable (struct ospf6 *o)
index ba485f9ea461d0b439886efe3fe0031c316806bd..4b2d2c3efce4df2f479ecddbaebbb9f5f7034223 100644 (file)
@@ -69,6 +69,7 @@ extern struct ospf6 *ospf6;
 
 /* prototypes */
 extern void ospf6_top_init (void);
+extern void ospf6_delete (struct ospf6 *o);
 
 extern void ospf6_maxage_remove (struct ospf6 *o);