back to topotato report
topotato coverage report
Current view: top level - ospfd - ospf_main.c (source / functions) Hit Total Coverage
Test: aggregated run ( view descriptions ) Lines: 34 55 61.8 %
Date: 2023-02-24 19:38:44 Functions: 3 5 60.0 %

          Line data    Source code
       1             : /*
       2             :  * OSPFd main routine.
       3             :  *   Copyright (C) 1998, 99 Kunihiro Ishiguro, Toshiaki Takada
       4             :  *
       5             :  * This file is part of GNU Zebra.
       6             :  *
       7             :  * GNU Zebra is free software; you can redistribute it and/or modify it
       8             :  * under the terms of the GNU General Public License as published by the
       9             :  * Free Software Foundation; either version 2, or (at your option) any
      10             :  * later version.
      11             :  *
      12             :  * GNU Zebra is distributed in the hope that it will be useful, but
      13             :  * WITHOUT ANY WARRANTY; without even the implied warranty of
      14             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15             :  * General Public License for more details.
      16             :  *
      17             :  * You should have received a copy of the GNU General Public License along
      18             :  * with this program; see the file COPYING; if not, write to the Free Software
      19             :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
      20             :  */
      21             : 
      22             : #include <zebra.h>
      23             : 
      24             : #include <lib/version.h>
      25             : #include "bfd.h"
      26             : #include "getopt.h"
      27             : #include "thread.h"
      28             : #include "prefix.h"
      29             : #include "linklist.h"
      30             : #include "if.h"
      31             : #include "vector.h"
      32             : #include "vty.h"
      33             : #include "command.h"
      34             : #include "filter.h"
      35             : #include "plist.h"
      36             : #include "stream.h"
      37             : #include "log.h"
      38             : #include "memory.h"
      39             : #include "privs.h"
      40             : #include "sigevent.h"
      41             : #include "zclient.h"
      42             : #include "vrf.h"
      43             : #include "libfrr.h"
      44             : #include "routemap.h"
      45             : 
      46             : #include "ospfd/ospfd.h"
      47             : #include "ospfd/ospf_interface.h"
      48             : #include "ospfd/ospf_asbr.h"
      49             : #include "ospfd/ospf_lsa.h"
      50             : #include "ospfd/ospf_lsdb.h"
      51             : #include "ospfd/ospf_neighbor.h"
      52             : #include "ospfd/ospf_dump.h"
      53             : #include "ospfd/ospf_route.h"
      54             : #include "ospfd/ospf_zebra.h"
      55             : #include "ospfd/ospf_vty.h"
      56             : #include "ospfd/ospf_bfd.h"
      57             : #include "ospfd/ospf_gr.h"
      58             : #include "ospfd/ospf_errors.h"
      59             : #include "ospfd/ospf_ldp_sync.h"
      60             : #include "ospfd/ospf_routemap_nb.h"
      61             : 
      62             : /* ospfd privileges */
      63             : zebra_capabilities_t _caps_p[] = {ZCAP_NET_RAW, ZCAP_BIND, ZCAP_NET_ADMIN,
      64             :                                   ZCAP_SYS_ADMIN};
      65             : 
      66             : struct zebra_privs_t ospfd_privs = {
      67             : #if defined(FRR_USER) && defined(FRR_GROUP)
      68             :         .user = FRR_USER,
      69             :         .group = FRR_GROUP,
      70             : #endif
      71             : #if defined(VTY_GROUP)
      72             :         .vty_group = VTY_GROUP,
      73             : #endif
      74             :         .caps_p = _caps_p,
      75             :         .cap_num_p = array_size(_caps_p),
      76             :         .cap_num_i = 0};
      77             : 
      78             : /* OSPFd options. */
      79             : const struct option longopts[] = {
      80             :         {"instance", required_argument, NULL, 'n'},
      81             :         {"apiserver", no_argument, NULL, 'a'},
      82             :         {0}
      83             : };
      84             : 
      85             : /* OSPFd program name */
      86             : 
      87             : /* Master of threads. */
      88             : struct thread_master *master;
      89             : 
      90             : #ifdef SUPPORT_OSPF_API
      91             : extern int ospf_apiserver_enable;
      92             : #endif /* SUPPORT_OSPF_API */
      93             : 
      94             : /* SIGHUP handler. */
      95           0 : static void sighup(void)
      96             : {
      97           0 :         zlog_info("SIGHUP received");
      98           0 : }
      99             : 
     100             : /* SIGINT / SIGTERM handler. */
     101           4 : static void sigint(void)
     102             : {
     103           4 :         zlog_notice("Terminating on signal");
     104           4 :         bfd_protocol_integration_set_shutdown(true);
     105           4 :         ospf_terminate();
     106           0 :         exit(0);
     107             : }
     108             : 
     109             : /* SIGUSR1 handler. */
     110           0 : static void sigusr1(void)
     111             : {
     112           0 :         zlog_rotate();
     113           0 : }
     114             : 
     115             : struct frr_signal_t ospf_signals[] = {
     116             :         {
     117             :                 .signal = SIGHUP,
     118             :                 .handler = &sighup,
     119             :         },
     120             :         {
     121             :                 .signal = SIGUSR1,
     122             :                 .handler = &sigusr1,
     123             :         },
     124             :         {
     125             :                 .signal = SIGINT,
     126             :                 .handler = &sigint,
     127             :         },
     128             :         {
     129             :                 .signal = SIGTERM,
     130             :                 .handler = &sigint,
     131             :         },
     132             : };
     133             : 
     134             : static const struct frr_yang_module_info *const ospfd_yang_modules[] = {
     135             :         &frr_filter_info,
     136             :         &frr_interface_info,
     137             :         &frr_route_map_info,
     138             :         &frr_vrf_info,
     139             :         &frr_ospf_route_map_info,
     140             : };
     141             : 
     142           4 : FRR_DAEMON_INFO(ospfd, OSPF, .vty_port = OSPF_VTY_PORT,
     143             : 
     144             :                 .proghelp = "Implementation of the OSPFv2 routing protocol.",
     145             : 
     146             :                 .signals = ospf_signals, .n_signals = array_size(ospf_signals),
     147             : 
     148             :                 .privs = &ospfd_privs, .yang_modules = ospfd_yang_modules,
     149             :                 .n_yang_modules = array_size(ospfd_yang_modules),
     150             : );
     151             : 
     152             : /* OSPFd main routine. */
     153           4 : int main(int argc, char **argv)
     154             : {
     155             : #ifdef SUPPORT_OSPF_API
     156             :         /* OSPF apiserver is disabled by default. */
     157           4 :         ospf_apiserver_enable = 0;
     158             : #endif /* SUPPORT_OSPF_API */
     159             : 
     160           4 :         frr_preinit(&ospfd_di, argc, argv);
     161           4 :         frr_opt_add("n:a", longopts,
     162             :                     "  -n, --instance     Set the instance id\n"
     163             :                     "  -a, --apiserver    Enable OSPF apiserver\n");
     164             : 
     165           4 :         while (1) {
     166           4 :                 int opt;
     167             : 
     168           4 :                 opt = frr_getopt(argc, argv, NULL);
     169             : 
     170           4 :                 if (opt == EOF)
     171             :                         break;
     172             : 
     173           0 :                 switch (opt) {
     174           0 :                 case 'n':
     175           0 :                         ospfd_di.instance = ospf_instance = atoi(optarg);
     176           0 :                         if (ospf_instance < 1)
     177           0 :                                 exit(0);
     178             :                         break;
     179             :                 case 0:
     180             :                         break;
     181             : #ifdef SUPPORT_OSPF_API
     182           0 :                 case 'a':
     183           0 :                         ospf_apiserver_enable = 1;
     184           0 :                         break;
     185             : #endif /* SUPPORT_OSPF_API */
     186           0 :                 default:
     187           0 :                         frr_help_exit(1);
     188             :                 }
     189             :         }
     190             : 
     191             :         /* Invoked by a priviledged user? -- endo. */
     192           4 :         if (geteuid() != 0) {
     193           0 :                 errno = EPERM;
     194           0 :                 perror(ospfd_di.progname);
     195           0 :                 exit(1);
     196             :         }
     197             : 
     198             :         /* OSPF master init. */
     199           4 :         ospf_master_init(frr_init());
     200             : 
     201             :         /* Initializations. */
     202           4 :         master = om->master;
     203             : 
     204             :         /* Library inits. */
     205           4 :         ospf_debug_init();
     206           4 :         ospf_vrf_init();
     207             : 
     208           4 :         access_list_init();
     209           4 :         prefix_list_init();
     210             : 
     211             :         /* OSPFd inits. */
     212           4 :         ospf_if_init();
     213           4 :         ospf_zebra_init(master, ospf_instance);
     214             : 
     215             :         /* OSPF vty inits. */
     216           4 :         ospf_vty_init();
     217           4 :         ospf_vty_show_init();
     218           4 :         ospf_vty_clear_init();
     219             : 
     220             :         /* OSPF BFD init */
     221           4 :         ospf_bfd_init(master);
     222             : 
     223             :         /* OSPF LDP IGP Sync init */
     224           4 :         ospf_ldp_sync_init();
     225             : 
     226           4 :         ospf_route_map_init();
     227           4 :         ospf_opaque_init();
     228           4 :         ospf_gr_init();
     229           4 :         ospf_gr_helper_init();
     230             : 
     231             :         /* OSPF errors init */
     232           4 :         ospf_error_init();
     233             : 
     234           4 :         frr_config_fork();
     235           4 :         frr_run(master);
     236             : 
     237             :         /* Not reached. */
     238           0 :         return 0;
     239             : }

Generated by: LCOV version v1.16-topotato