summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Goff <thomas.goff@boeing.com>2010-11-10 13:01:41 -0800
committerDenis Ovsienko <infrastation@yandex.ru>2012-01-02 19:50:41 +0400
commit36d3e8d828e18c5c4cd097f659e3984ff02532cb (patch)
treed7ec4c0bb657f303e39d8c784f1b3ac45a72d8a9
parenta809d1cc54a621f4b31397ee5b8b79151baa4bf2 (diff)
ospf6d: Have ospf6d cleanup when it terminates normally
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. Signed-off-by: Vyacheslav Trushkin <me@dogonthesun.net> Conflicts: ospf6d/ospf6_lsa.h
-rw-r--r--ospf6d/ospf6_asbr.c5
-rw-r--r--ospf6d/ospf6_asbr.h1
-rw-r--r--ospf6d/ospf6_lsa.c5
-rw-r--r--ospf6d/ospf6_lsa.h1
-rw-r--r--ospf6d/ospf6_main.c35
-rw-r--r--ospf6d/ospf6_message.c18
-rw-r--r--ospf6d/ospf6_message.h1
-rw-r--r--ospf6d/ospf6_top.c9
-rw-r--r--ospf6d/ospf6_top.h1
9 files changed, 70 insertions, 6 deletions
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index bc05dc27..ae0a286d 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/ospf6d/ospf6_asbr.c
@@ -1275,6 +1275,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,
diff --git a/ospf6d/ospf6_asbr.h b/ospf6d/ospf6_asbr.h
index 5f072cff..72e49143 100644
--- a/ospf6d/ospf6_asbr.h
+++ b/ospf6d/ospf6_asbr.h
@@ -89,6 +89,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);
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index a9545c33..e65752d8 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -722,6 +722,11 @@ ospf6_lsa_init (void)
ospf6_install_lsa_handler (&unknown_handler);
}
+void
+ospf6_lsa_terminate (void)
+{
+ vector_free (ospf6_lsa_handler_vector);
+}
static char *
ospf6_lsa_handler_name (struct ospf6_lsa_handler *h)
diff --git a/ospf6d/ospf6_lsa.h b/ospf6d/ospf6_lsa.h
index 13b89900..7d93f5cb 100644
--- a/ospf6d/ospf6_lsa.h
+++ b/ospf6d/ospf6_lsa.h
@@ -244,6 +244,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 int config_write_ospf6_debug_lsa (struct vty *vty);
extern void install_element_ospf6_debug_lsa (void);
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
index 8444d90f..65fcb597 100644
--- a/ospf6d/ospf6_main.c
+++ b/ospf6d/ospf6_main.c
@@ -131,6 +131,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)
@@ -143,7 +172,7 @@ static void
sigint (void)
{
zlog_notice ("Terminating on signal SIGINT");
- exit (0);
+ ospf6_exit (0);
}
/* SIGTERM handler. */
@@ -151,7 +180,7 @@ static void
sigterm (void)
{
zlog_notice ("Terminating on signal SIGTERM");
- exit (0);
+ ospf6_exit (0);
}
/* SIGUSR1 handler. */
@@ -325,7 +354,7 @@ main (int argc, char *argv[], char *envp[])
zlog_warn ("Thread failed");
/* Not reached. */
- exit (0);
+ ospf6_exit (0);
}
diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
index 8179fc14..aaee4d20 100644
--- a/ospf6d/ospf6_message.c
+++ b/ospf6d/ospf6_message.c
@@ -1504,6 +1504,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)
{
diff --git a/ospf6d/ospf6_message.h b/ospf6d/ospf6_message.h
index 87a7cfeb..b085a967 100644
--- a/ospf6d/ospf6_message.h
+++ b/ospf6d/ospf6_message.h
@@ -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);
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index 38f94d7b..df856b4c 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -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)
diff --git a/ospf6d/ospf6_top.h b/ospf6d/ospf6_top.h
index ba485f9e..4b2d2c3e 100644
--- a/ospf6d/ospf6_top.h
+++ b/ospf6d/ospf6_top.h
@@ -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);