diff options
Diffstat (limited to 'zebra/main.c')
| -rw-r--r-- | zebra/main.c | 443 |
1 files changed, 215 insertions, 228 deletions
diff --git a/zebra/main.c b/zebra/main.c index 84d71c33b9..792eb20f6a 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -52,9 +52,8 @@ #define ZEBRA_PTM_SUPPORT /* Zebra instance */ -struct zebra_t zebrad = -{ - .rtm_table_default = 0, +struct zebra_t zebrad = { + .rtm_table_default = 0, }; /* process id. */ @@ -78,284 +77,272 @@ u_int32_t nl_rcvbufsize = 4194304; #endif /* HAVE_NETLINK */ /* Command line options. */ -struct option longopts[] = -{ - { "batch", no_argument, NULL, 'b'}, - { "allow_delete", no_argument, NULL, 'a'}, - { "keep_kernel", no_argument, NULL, 'k'}, - { "socket", required_argument, NULL, 'z'}, - { "ecmp", required_argument, NULL, 'e'}, - { "label_socket", no_argument, NULL, 'l'}, - { "retain", no_argument, NULL, 'r'}, +struct option longopts[] = {{"batch", no_argument, NULL, 'b'}, + {"allow_delete", no_argument, NULL, 'a'}, + {"keep_kernel", no_argument, NULL, 'k'}, + {"socket", required_argument, NULL, 'z'}, + {"ecmp", required_argument, NULL, 'e'}, + {"label_socket", no_argument, NULL, 'l'}, + {"retain", no_argument, NULL, 'r'}, #ifdef HAVE_NETLINK - { "nl-bufsize", required_argument, NULL, 's'}, + {"nl-bufsize", required_argument, NULL, 's'}, #endif /* HAVE_NETLINK */ - { 0 } -}; + {0}}; -zebra_capabilities_t _caps_p [] = -{ - ZCAP_NET_ADMIN, - ZCAP_SYS_ADMIN, - ZCAP_NET_RAW, +zebra_capabilities_t _caps_p[] = { + ZCAP_NET_ADMIN, ZCAP_SYS_ADMIN, ZCAP_NET_RAW, }; /* zebra privileges to run with */ -struct zebra_privs_t zserv_privs = -{ +struct zebra_privs_t zserv_privs = { #if defined(FRR_USER) && defined(FRR_GROUP) - .user = FRR_USER, - .group = FRR_GROUP, + .user = FRR_USER, + .group = FRR_GROUP, #endif #ifdef VTY_GROUP - .vty_group = VTY_GROUP, + .vty_group = VTY_GROUP, #endif - .caps_p = _caps_p, - .cap_num_p = array_size(_caps_p), - .cap_num_i = 0 -}; + .caps_p = _caps_p, + .cap_num_p = array_size(_caps_p), + .cap_num_i = 0}; unsigned int multipath_num = MULTIPATH_NUM; /* SIGHUP handler. */ -static void -sighup (void) +static void sighup(void) { - zlog_info ("SIGHUP received"); + zlog_info("SIGHUP received"); - /* Reload of config file. */ - ; + /* Reload of config file. */ + ; } /* SIGINT handler. */ -static void -sigint (void) +static void sigint(void) { - struct vrf *vrf; - struct zebra_vrf *zvrf; - struct zebra_ns *zns; + struct vrf *vrf; + struct zebra_vrf *zvrf; + struct zebra_ns *zns; - zlog_notice ("Terminating on signal"); + zlog_notice("Terminating on signal"); #ifdef HAVE_IRDP - irdp_finish(); + irdp_finish(); #endif - zebra_ptm_finish(); - list_delete_all_node (zebrad.client_list); - - if (retain_mode) - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) - { - zvrf = vrf->info; - if (zvrf) - SET_FLAG (zvrf->flags, ZEBRA_VRF_RETAIN); - } - vrf_terminate (); - - zns = zebra_ns_lookup (NS_DEFAULT); - zebra_ns_disable (0, (void **)&zns); - - access_list_reset (); - prefix_list_reset (); - route_map_finish (); - cmd_terminate (); - vty_terminate (); - zprivs_terminate (&zserv_privs); - list_delete (zebrad.client_list); - work_queue_free (zebrad.ribq); - if (zebrad.lsp_process_q) - work_queue_free (zebrad.lsp_process_q); - meta_queue_free (zebrad.mq); - thread_master_free (zebrad.master); - closezlog (); - - exit (0); + zebra_ptm_finish(); + list_delete_all_node(zebrad.client_list); + + if (retain_mode) + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + zvrf = vrf->info; + if (zvrf) + SET_FLAG(zvrf->flags, ZEBRA_VRF_RETAIN); + } + vrf_terminate(); + + zns = zebra_ns_lookup(NS_DEFAULT); + zebra_ns_disable(0, (void **)&zns); + + access_list_reset(); + prefix_list_reset(); + route_map_finish(); + cmd_terminate(); + vty_terminate(); + zprivs_terminate(&zserv_privs); + list_delete(zebrad.client_list); + work_queue_free(zebrad.ribq); + if (zebrad.lsp_process_q) + work_queue_free(zebrad.lsp_process_q); + meta_queue_free(zebrad.mq); + thread_master_free(zebrad.master); + closezlog(); + + exit(0); } /* SIGUSR1 handler. */ -static void -sigusr1 (void) +static void sigusr1(void) { - zlog_rotate(); + zlog_rotate(); } -struct quagga_signal_t zebra_signals[] = -{ - { - .signal = SIGHUP, - .handler = &sighup, - }, - { - .signal = SIGUSR1, - .handler = &sigusr1, - }, - { - .signal = SIGINT, - .handler = &sigint, - }, - { - .signal = SIGTERM, - .handler = &sigint, - }, +struct quagga_signal_t zebra_signals[] = { + { + .signal = SIGHUP, + .handler = &sighup, + }, + { + .signal = SIGUSR1, + .handler = &sigusr1, + }, + { + .signal = SIGINT, + .handler = &sigint, + }, + { + .signal = SIGTERM, + .handler = &sigint, + }, }; -FRR_DAEMON_INFO(zebra, ZEBRA, - .vty_port = ZEBRA_VTY_PORT, - .flags = FRR_NO_ZCLIENT, +FRR_DAEMON_INFO( + zebra, ZEBRA, .vty_port = ZEBRA_VTY_PORT, .flags = FRR_NO_ZCLIENT, - .proghelp = "Daemon which manages kernel routing table management " + .proghelp = + "Daemon which manages kernel routing table management " "and\nredistribution between different routing protocols.", - .signals = zebra_signals, - .n_signals = array_size(zebra_signals), + .signals = zebra_signals, .n_signals = array_size(zebra_signals), - .privs = &zserv_privs, -) + .privs = &zserv_privs, ) /* Main startup routine. */ -int -main (int argc, char **argv) +int main(int argc, char **argv) { - // int batch_mode = 0; - char *zserv_path = NULL; - /* Socket to external label manager */ - char *lblmgr_path = NULL; + // int batch_mode = 0; + char *zserv_path = NULL; + /* Socket to external label manager */ + char *lblmgr_path = NULL; - frr_preinit(&zebra_di, argc, argv); + frr_preinit(&zebra_di, argc, argv); - frr_opt_add("bakz:e:l:r" + frr_opt_add( + "bakz:e:l:r" #ifdef HAVE_NETLINK - "s:" + "s:" #endif - , longopts, - " -b, --batch Runs in batch mode\n" - " -a, --allow_delete Allow other processes to delete zebra routes\n" - " -z, --socket Set path of zebra socket\n" - " -e, --ecmp Specify ECMP to use.\n" - " -l, --label_socket Socket to external label manager\n"\ - " -k, --keep_kernel Don't delete old routes which installed by zebra.\n" - " -r, --retain When program terminates, retain added route by zebra.\n" + , + longopts, + " -b, --batch Runs in batch mode\n" + " -a, --allow_delete Allow other processes to delete zebra routes\n" + " -z, --socket Set path of zebra socket\n" + " -e, --ecmp Specify ECMP to use.\n" + " -l, --label_socket Socket to external label manager\n" + " -k, --keep_kernel Don't delete old routes which installed by zebra.\n" + " -r, --retain When program terminates, retain added route by zebra.\n" #ifdef HAVE_NETLINK - " -s, --nl-bufsize Set netlink receive buffer size\n" + " -s, --nl-bufsize Set netlink receive buffer size\n" #endif /* HAVE_NETLINK */ - ); - - while (1) - { - int opt = frr_getopt(argc, argv, NULL); - - if (opt == EOF) - break; - - switch (opt) - { - case 0: - break; - case 'b': - // batch_mode = 1; - break; - case 'a': - allow_delete = 1; - break; - case 'k': - keep_kernel_mode = 1; - break; - case 'e': - multipath_num = atoi (optarg); - if (multipath_num > MULTIPATH_NUM || multipath_num <= 0) - { - zlog_err ("Multipath Number specified must be less than %d and greater than 0", MULTIPATH_NUM); - return 1; - } - break; - case 'z': - zserv_path = optarg; - break; - case 'l': - lblmgr_path = optarg; - break; - case 'r': - retain_mode = 1; - break; + ); + + while (1) { + int opt = frr_getopt(argc, argv, NULL); + + if (opt == EOF) + break; + + switch (opt) { + case 0: + break; + case 'b': + // batch_mode = 1; + break; + case 'a': + allow_delete = 1; + break; + case 'k': + keep_kernel_mode = 1; + break; + case 'e': + multipath_num = atoi(optarg); + if (multipath_num > MULTIPATH_NUM + || multipath_num <= 0) { + zlog_err( + "Multipath Number specified must be less than %d and greater than 0", + MULTIPATH_NUM); + return 1; + } + break; + case 'z': + zserv_path = optarg; + break; + case 'l': + lblmgr_path = optarg; + break; + case 'r': + retain_mode = 1; + break; #ifdef HAVE_NETLINK - case 's': - nl_rcvbufsize = atoi (optarg); - break; + case 's': + nl_rcvbufsize = atoi(optarg); + break; #endif /* HAVE_NETLINK */ - default: - frr_help_exit (1); - break; + default: + frr_help_exit(1); + break; + } } - } - - vty_config_lockless (); - zebrad.master = frr_init(); - - /* Zebra related initialize. */ - zebra_init (); - rib_init (); - zebra_if_init (); - zebra_debug_init (); - router_id_cmd_init (); - zebra_vty_init (); - access_list_init (); - prefix_list_init (); -#if defined (HAVE_RTADV) - rtadv_cmd_init (); + + vty_config_lockless(); + zebrad.master = frr_init(); + + /* Zebra related initialize. */ + zebra_init(); + rib_init(); + zebra_if_init(); + zebra_debug_init(); + router_id_cmd_init(); + zebra_vty_init(); + access_list_init(); + prefix_list_init(); +#if defined(HAVE_RTADV) + rtadv_cmd_init(); #endif #ifdef HAVE_IRDP - irdp_init(); + irdp_init(); #endif - /* PTM socket */ +/* PTM socket */ #ifdef ZEBRA_PTM_SUPPORT - zebra_ptm_init(); + zebra_ptm_init(); #endif - zebra_mpls_init (); - zebra_mpls_vty_init (); - zebra_pw_vty_init (); - - /* For debug purpose. */ - /* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */ - - /* Initialize NS( and implicitly the VRF module), and make kernel routing socket. */ - zebra_ns_init (); - - /* Process the configuration file. Among other configuration - * directives we can meet those installing static routes. Such - * requests will not be executed immediately, but queued in - * zebra->ribq structure until we enter the main execution loop. - * The notifications from kernel will show originating PID equal - * to that after daemon() completes (if ever called). - */ - frr_config_fork(); - - /* Clean up rib -- before fork (?) */ - /* rib_weed_tables (); */ - - /* After we have successfully acquired the pidfile, we can be sure - * about being the only copy of zebra process, which is submitting - * changes to the FIB. - * Clean up zebra-originated routes. The requests will be sent to OS - * immediately, so originating PID in notifications from kernel - * will be equal to the current getpid(). To know about such routes, - * we have to have route_read() called before. - */ - if (! keep_kernel_mode) - rib_sweep_route (); - - /* Needed for BSD routing socket. */ - pid = getpid (); - - /* This must be done only after locking pidfile (bug #403). */ - zebra_zserv_socket_init (zserv_path); - - /* Init label manager */ - label_manager_init (lblmgr_path); - - frr_run (zebrad.master); - - /* Not reached... */ - return 0; + zebra_mpls_init(); + zebra_mpls_vty_init(); + zebra_pw_vty_init(); + + /* For debug purpose. */ + /* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */ + + /* Initialize NS( and implicitly the VRF module), and make kernel + * routing socket. */ + zebra_ns_init(); + + /* Process the configuration file. Among other configuration + * directives we can meet those installing static routes. Such + * requests will not be executed immediately, but queued in + * zebra->ribq structure until we enter the main execution loop. + * The notifications from kernel will show originating PID equal + * to that after daemon() completes (if ever called). + */ + frr_config_fork(); + + /* Clean up rib -- before fork (?) */ + /* rib_weed_tables (); */ + + /* After we have successfully acquired the pidfile, we can be sure + * about being the only copy of zebra process, which is submitting + * changes to the FIB. + * Clean up zebra-originated routes. The requests will be sent to OS + * immediately, so originating PID in notifications from kernel + * will be equal to the current getpid(). To know about such routes, + * we have to have route_read() called before. + */ + if (!keep_kernel_mode) + rib_sweep_route(); + + /* Needed for BSD routing socket. */ + pid = getpid(); + + /* This must be done only after locking pidfile (bug #403). */ + zebra_zserv_socket_init(zserv_path); + + /* Init label manager */ + label_manager_init(lblmgr_path); + + frr_run(zebrad.master); + + /* Not reached... */ + return 0; } |
