]> git.proxmox.com Git - mirror_frr.git/blobdiff - ospf6d/ospf6_main.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / ospf6d / ospf6_main.c
index f69c1e1bca4c2f1c26ea639963c9223bd6fc7b75..046badc8248504b40847bd17787d236275fcf61a 100644 (file)
 #define OSPF6_VTY_PORT             2606
 
 /* ospf6d privileges */
-zebra_capabilities_t _caps_p [] =
-{
-  ZCAP_NET_RAW,
-  ZCAP_BIND
-};
+zebra_capabilities_t _caps_p[] = {ZCAP_NET_RAW, ZCAP_BIND};
 
-struct zebra_privs_t ospf6d_privs =
-{
+struct zebra_privs_t ospf6d_privs = {
 #if defined(FRR_USER)
-  .user = FRR_USER,
+       .user = FRR_USER,
 #endif
 #if defined FRR_GROUP
-  .group = FRR_GROUP,
+       .group = FRR_GROUP,
 #endif
 #ifdef VTY_GROUP
-  .vty_group = VTY_GROUP,
+       .vty_group = VTY_GROUP,
 #endif
-  .caps_p = _caps_p,
-  .cap_num_p = 2,
-  .cap_num_i = 0
-};
+       .caps_p = _caps_p,
+       .cap_num_p = 2,
+       .cap_num_i = 0};
 
 /* ospf6d options, we use GNU getopt library. */
-struct option longopts[] = 
-{
-  { 0 }
-};
+struct option longopts[] = {{0}};
 
 /* Master of threads. */
 struct thread_master *master;
 
-static void __attribute__ ((noreturn))
-ospf6_exit (int status)
+static void __attribute__((noreturn)) ospf6_exit(int status)
 {
-  struct listnode *node;
-  struct interface *ifp;
+       struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
+       struct interface *ifp;
 
-  if (ospf6)
-    ospf6_delete (ospf6);
+       frr_early_fini();
 
-  bfd_gbl_exit();
+       if (ospf6)
+               ospf6_delete(ospf6);
 
-  for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp))
-    if (ifp->info != NULL)
-      ospf6_interface_delete(ifp->info);
+       bfd_gbl_exit();
 
-  ospf6_message_terminate ();
-  ospf6_asbr_terminate ();
-  ospf6_lsa_terminate ();
+       FOR_ALL_INTERFACES (vrf, ifp)
+               if (ifp->info != NULL)
+                       ospf6_interface_delete(ifp->info);
 
-  vrf_terminate ();
-  vty_terminate ();
-  cmd_terminate ();
+       ospf6_message_terminate();
+       ospf6_asbr_terminate();
+       ospf6_lsa_terminate();
 
-  if (zclient)
-    zclient_free (zclient);
+       /* reverse access_list_init */
+       access_list_reset();
 
-  if (master)
-    thread_master_free (master);
+       /* reverse prefix_list_init */
+       prefix_list_add_hook(NULL);
+       prefix_list_delete_hook(NULL);
+       prefix_list_reset();
 
-  closezlog ();
+       vrf_terminate();
 
-  exit (status);
+       if (zclient) {
+               zclient_stop(zclient);
+               zclient_free(zclient);
+       }
+
+       frr_fini();
+       exit(status);
 }
 
 /* SIGHUP handler. */
-static void 
-sighup (void)
+static void sighup(void)
 {
-  zlog_info ("SIGHUP received");
+       zlog_info("SIGHUP received");
 }
 
 /* SIGINT handler. */
-static void
-sigint (void)
+static void sigint(void)
 {
-  zlog_notice ("Terminating on signal SIGINT");
-  ospf6_exit (0);
+       zlog_notice("Terminating on signal SIGINT");
+       ospf6_exit(0);
 }
 
 /* SIGTERM handler. */
-static void
-sigterm (void)
+static void sigterm(void)
 {
-  zlog_notice ("Terminating on signal SIGTERM");
-  ospf6_clean();
-  ospf6_exit (0);
+       zlog_notice("Terminating on signal SIGTERM");
+       ospf6_exit(0);
 }
 
 /* SIGUSR1 handler. */
-static void
-sigusr1 (void)
+static void sigusr1(void)
 {
-  zlog_info ("SIGUSR1 received");
-  zlog_rotate();
+       zlog_info("SIGUSR1 received");
+       zlog_rotate();
 }
 
-struct quagga_signal_t ospf6_signals[] =
-{
-  {
-    .signal = SIGHUP,
-    .handler = &sighup,
-  },
-  {
-    .signal = SIGINT,
-    .handler = &sigint,
-  },
-  {
-    .signal = SIGTERM,
-    .handler = &sigterm,
-  },
-  {
-    .signal = SIGUSR1,
-    .handler = &sigusr1,
-  },
+struct quagga_signal_t ospf6_signals[] = {
+       {
+               .signal = SIGHUP,
+               .handler = &sighup,
+       },
+       {
+               .signal = SIGINT,
+               .handler = &sigint,
+       },
+       {
+               .signal = SIGTERM,
+               .handler = &sigterm,
+       },
+       {
+               .signal = SIGUSR1,
+               .handler = &sigusr1,
+       },
 };
 
-FRR_DAEMON_INFO(ospf6d, OSPF6,
-       .vty_port = OSPF6_VTY_PORT,
+static const struct frr_yang_module_info *ospf6d_yang_modules[] = {
+       &frr_interface_info,
+};
 
-       .proghelp = "Implementation of the OSPFv3 routing protocol.",
+FRR_DAEMON_INFO(ospf6d, OSPF6, .vty_port = OSPF6_VTY_PORT,
 
-       .signals = ospf6_signals,
-       .n_signals = array_size(ospf6_signals),
+               .proghelp = "Implementation of the OSPFv3 routing protocol.",
 
-       .privs = &ospf6d_privs,
-)
+               .signals = ospf6_signals,
+               .n_signals = array_size(ospf6_signals),
+
+               .privs = &ospf6d_privs, .yang_modules = ospf6d_yang_modules,
+               .n_yang_modules = array_size(ospf6d_yang_modules), )
 
 /* Main routine of ospf6d. Treatment of argument and starting ospf finite
    state machine is handled here. */
-int
-main (int argc, char *argv[], char *envp[])
+int main(int argc, char *argv[], char *envp[])
 {
-  int opt;
-
-  frr_preinit (&ospf6d_di, argc, argv);
-  frr_opt_add ("", longopts, "");
-
-  /* Command line argument treatment. */
-  while (1) 
-    {
-      opt = frr_getopt (argc, argv, NULL);
-    
-      if (opt == EOF)
-        break;
-
-      switch (opt) 
-        {
-        case 0:
-          break;
-        default:
-          frr_help_exit (1);
-          break;
-        }
-    }
-
-  if (geteuid () != 0)
-    {
-      errno = EPERM;
-      perror (ospf6d_di.progname);
-      exit (1);
-    }
-
-  /* thread master */
-  master = frr_init ();
-
-  vrf_init (NULL, NULL, NULL, NULL);
-  access_list_init ();
-  prefix_list_init ();
-
-  /* initialize ospf6 */
-  ospf6_init ();
-
-  frr_config_fork ();
-  frr_run (master);
-
-  /* Not reached. */
-  ospf6_exit (0);
-}
+       int opt;
 
+       frr_preinit(&ospf6d_di, argc, argv);
+       frr_opt_add("", longopts, "");
 
+       /* Command line argument treatment. */
+       while (1) {
+               opt = frr_getopt(argc, argv, NULL);
+
+               if (opt == EOF)
+                       break;
+
+               switch (opt) {
+               case 0:
+                       break;
+               default:
+                       frr_help_exit(1);
+                       break;
+               }
+       }
+
+       if (geteuid() != 0) {
+               errno = EPERM;
+               perror(ospf6d_di.progname);
+               exit(1);
+       }
+
+       /* OSPF6 master init. */
+       ospf6_master_init();
+
+       /* thread master */
+       master = frr_init();
+
+       vrf_init(NULL, NULL, NULL, NULL, NULL);
+       access_list_init();
+       prefix_list_init();
+
+       /* initialize ospf6 */
+       ospf6_init();
+
+       frr_config_fork();
+       frr_run(master);
+
+       /* Not reached. */
+       ospf6_exit(0);
+}