forked from Mirror/frr
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.
This commit is contained in:
parent
fd795eb89c
commit
ae2254aa7f
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
static char *
|
||||
ospf6_lsa_handler_name (struct ospf6_lsa_handler *h)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue