[quagga-dev 8356] Re: [PATCH 3/7] ospf6d: Have ospf6d cleanup when it terminates normally

Balaji G balajig81 at gmail.com
Tue Nov 16 11:13:17 GMT 2010


Applied, Thanks but this requires review from the protocol perspective also
which i cannot comment on.


On Thu, Nov 11, 2010 at 2:31 AM, Tom Goff <thomas.goff at boeing.com> wrote:

> 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: Tom Goff <thomas.goff at boeing.com>
> ---
>  ospf6d/ospf6_asbr.c    |    5 +++++
>  ospf6d/ospf6_asbr.h    |    1 +
>  ospf6d/ospf6_lsa.c     |    5 +++++
>  ospf6d/ospf6_lsa.h     |    1 +
>  ospf6d/ospf6_main.c    |   35 ++++++++++++++++++++++++++++++++---
>  ospf6d/ospf6_message.c |   18 ++++++++++++++++++
>  ospf6d/ospf6_message.h |    1 +
>  ospf6d/ospf6_top.c     |    9 ++++++---
>  ospf6d/ospf6_top.h     |    1 +
>  9 files changed, 70 insertions(+), 6 deletions(-)
>
> diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
> index 685b147..3efaab4 100644
> --- a/ospf6d/ospf6_asbr.c
> +++ b/ospf6d/ospf6_asbr.c
> @@ -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,
> diff --git a/ospf6d/ospf6_asbr.h b/ospf6d/ospf6_asbr.h
> index 7166aa3..6deb93e 100644
> --- a/ospf6d/ospf6_asbr.h
> +++ b/ospf6d/ospf6_asbr.h
> @@ -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);
> diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
> index c1db374..588b946 100644
> --- a/ospf6d/ospf6_lsa.c
> +++ b/ospf6d/ospf6_lsa.c
> @@ -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)
> diff --git a/ospf6d/ospf6_lsa.h b/ospf6d/ospf6_lsa.h
> index fb0f27c..c1093ca 100644
> --- a/ospf6d/ospf6_lsa.h
> +++ b/ospf6d/ospf6_lsa.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);
> diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c
> index a7a96a1..800fae4 100644
> --- a/ospf6d/ospf6_main.c
> +++ b/ospf6d/ospf6_main.c
> @@ -124,6 +124,35 @@ Report bugs to zebra at 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);
>  }
>
>
> diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
> index 790fc0a..d06eba2 100644
> --- a/ospf6d/ospf6_message.c
> +++ b/ospf6d/ospf6_message.c
> @@ -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)
>  {
> diff --git a/ospf6d/ospf6_message.h b/ospf6d/ospf6_message.h
> index ebb6308..c72f0af 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 8237026..2b65be8 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 ba485f9..4b2d2c3 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);
>
> --
> 1.7.0.4
>
> _______________________________________________
> Quagga-dev mailing list
> Quagga-dev at lists.quagga.net
> http://lists.quagga.net/mailman/listinfo/quagga-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.quagga.net/pipermail/quagga-dev/attachments/20101116/80156a09/attachment-0001.html>


More information about the Quagga-dev mailing list