diff options
Diffstat (limited to 'bgpd/bgp_main.c')
| -rw-r--r-- | bgpd/bgp_main.c | 227 |
1 files changed, 40 insertions, 187 deletions
diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 2598d66656..423c9453eb 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -39,7 +39,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include "queue.h" #include "vrf.h" #include "bfd.h" -#include "sockopt.h" +#include "libfrr.h" #include "bgpd/bgpd.h" #include "bgpd/bgp_attr.h" @@ -60,27 +60,13 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #endif /* bgpd options, we use GNU getopt library. */ -#define OPTION_VTYSOCK 1000 static const struct option longopts[] = { - { "daemon", no_argument, NULL, 'd'}, - { "config_file", required_argument, NULL, 'f'}, - { "pid_file", required_argument, NULL, 'i'}, - { "socket", required_argument, NULL, 'z'}, { "bgp_port", required_argument, NULL, 'p'}, { "listenon", required_argument, NULL, 'l'}, - { "vty_addr", required_argument, NULL, 'A'}, - { "vty_port", required_argument, NULL, 'P'}, - { "vty_socket", required_argument, NULL, OPTION_VTYSOCK }, { "retain", no_argument, NULL, 'r'}, { "no_kernel", no_argument, NULL, 'n'}, { "ecmp", required_argument, NULL, 'e'}, - { "user", required_argument, NULL, 'u'}, - { "group", required_argument, NULL, 'g'}, - { "skip_runas", no_argument, NULL, 'S'}, - { "version", no_argument, NULL, 'v'}, - { "dryrun", no_argument, NULL, 'C'}, - { "help", no_argument, NULL, 'h'}, { 0 } }; @@ -112,26 +98,9 @@ static struct quagga_signal_t bgp_signals[] = }, }; -/* Configuration file and directory. */ -char config_default[] = SYSCONFDIR BGP_DEFAULT_CONFIG; - -/* VTY Socket prefix */ -char vty_sock_path[MAXPATHLEN] = BGP_VTYSH_PATH; - /* Route retain mode flag. */ static int retain_mode = 0; -/* Manually specified configuration file name. */ -char *config_file = NULL; - -/* Process ID saved for use by init system */ -static const char *pid_file = PATH_BGPD_PID; - -/* VTY port number and address. */ -int vty_port = BGP_VTY_PORT; -char *vty_addr = NULL; -char *vty_sock_name; - /* privileges */ static zebra_capabilities_t _caps_p [] = { @@ -154,41 +123,7 @@ struct zebra_privs_t bgpd_privs = .cap_num_i = 0, }; -/* Help information display. */ -static void -usage (char *progname, int status) -{ - if (status != 0) - fprintf (stderr, "Try `%s --help' for more information.\n", progname); - else - { - printf ("Usage : %s [OPTION...]\n\n\ -Daemon which manages kernel routing table management and \ -redistribution between different routing protocols.\n\n\ --d, --daemon Runs in daemon mode\n\ --f, --config_file Set configuration file name\n\ --i, --pid_file Set process identifier file name\n\ --z, --socket Set path of zebra socket\n\ --p, --bgp_port Set bgp protocol's port number\n\ --l, --listenon Listen on specified address (implies -n)\n\ --A, --vty_addr Set vty's bind address\n\ --P, --vty_port Set vty's port number\n\ - --vty_socket Override vty socket path\n\ --r, --retain When program terminates, retain added route by bgpd.\n\ --n, --no_kernel Do not install route to kernel.\n\ --e, --ecmp Specify ECMP to use.\n\ --u, --user User to run as\n\ --g, --group Group to run as\n\ --S, --skip_runas Skip user and group run as\n\ --v, --version Print program version\n\ --C, --dryrun Check configuration for validity and exit\n\ --h, --help Display this help and exit\n\ -\n\ -Report bugs to %s\n", progname, FRR_BUG_ADDRESS); - } - - exit (status); -} +static struct frr_daemon_info bgpd_di; /* SIGHUP handler. */ void @@ -202,10 +137,7 @@ sighup (void) zlog_info ("bgpd restarting!"); /* Reload config file. */ - vty_read_config (config_file, config_default); - - /* Create VTY's socket */ - vty_serv_sock (vty_addr, vty_port, vty_sock_path); + vty_read_config (bgpd_di.config_file, config_default); /* Try to return to normal operation. */ } @@ -219,8 +151,7 @@ sigint (void) if (! retain_mode) { bgp_terminate (); - if (bgpd_privs.user) /* NULL if skip_runas flag set */ - zprivs_terminate (&bgpd_privs); + zprivs_terminate (&bgpd_privs); } bgp_exit (0); @@ -232,7 +163,7 @@ sigint (void) void sigusr1 (void) { - zlog_rotate (NULL); + zlog_rotate(); } /* @@ -309,8 +240,7 @@ bgp_exit (int status) if (bm->master) thread_master_free (bm->master); - if (zlog_default) - closezlog (zlog_default); + closezlog (); memset (bm, 0, sizeof (*bm)); @@ -412,33 +342,40 @@ bgp_vrf_terminate (void) vrf_terminate (); } +FRR_DAEMON_INFO(bgpd, BGP, + .vty_port = BGP_VTY_PORT, + + .proghelp = "Implementation of the BGP routing protocol.", + + .signals = bgp_signals, + .n_signals = array_size(bgp_signals), + + .privs = &bgpd_privs, +) + /* Main routine of bgpd. Treatment of argument and start bgp finite state machine is handled at here. */ int main (int argc, char **argv) { - char *p; int opt; - int daemon_mode = 0; - int dryrun = 0; - char *progname; - struct thread thread; int tmp_port; - int skip_runas = 0; - /* Set umask before anything for security */ - umask (0027); + int bgp_port = BGP_PORT_DEFAULT; + char *bgp_address = NULL; - /* Preserve name of myself. */ - progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); - - /* BGP master init. */ - bgp_master_init (); + frr_preinit(&bgpd_di, argc, argv); + frr_opt_add("p:l:rne:", longopts, + " -p, --bgp_port Set bgp protocol's port number\n" + " -l, --listenon Listen on specified address (implies -n)\n" + " -r, --retain When program terminates, retain added route by bgpd.\n" + " -n, --no_kernel Do not install route to kernel.\n" + " -e, --ecmp Specify ECMP to use.\n"); /* Command line argument treatment. */ - while (1) + while (1) { - opt = getopt_long (argc, argv, "df:i:z:hp:l:A:P:rnu:g:vCS", longopts, 0); + opt = frr_getopt (argc, argv, 0); if (opt == EOF) break; @@ -447,28 +384,13 @@ main (int argc, char **argv) { case 0: break; - case 'd': - daemon_mode = 1; - break; - case 'f': - config_file = optarg; - break; - case 'i': - pid_file = optarg; - break; - case 'z': - zclient_serv_path_set (optarg); - break; case 'p': tmp_port = atoi (optarg); if (tmp_port <= 0 || tmp_port > 0xffff) - bm->port = BGP_PORT_DEFAULT; + bgp_port = BGP_PORT_DEFAULT; else bm->port = tmp_port; break; - case 'A': - vty_addr = optarg; - break; case 'e': multipath_num = atoi (optarg); if (multipath_num > MULTIPATH_NUM || multipath_num <= 0) @@ -477,107 +399,38 @@ main (int argc, char **argv) return 1; } break; - case 'P': - /* Deal with atoi() returning 0 on failure, and bgpd not - listening on bgp port... */ - if (strcmp(optarg, "0") == 0) - { - vty_port = 0; - break; - } - vty_port = atoi (optarg); - if (vty_port <= 0 || vty_port > 0xffff) - vty_port = BGP_VTY_PORT; - break; - case OPTION_VTYSOCK: - set_socket_path(vty_sock_path, BGP_VTYSH_PATH, optarg, sizeof (vty_sock_path)); - break; case 'r': retain_mode = 1; break; case 'l': - bm->address = optarg; + bgp_address = optarg; /* listenon implies -n */ case 'n': bgp_option_set (BGP_OPT_NO_FIB); break; - case 'u': - bgpd_privs.user = optarg; - break; - case 'g': - bgpd_privs.group = optarg; - break; - case 'S': /* skip run as = override bgpd_privs */ - skip_runas = 1; - break; - case 'v': - print_version (progname); - exit (0); - break; - case 'C': - dryrun = 1; - break; - case 'h': - usage (progname, 0); - break; default: - usage (progname, 1); + frr_help_exit (1); break; } } - zlog_default = openzlog (progname, ZLOG_BGP, 0, - LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON); - - if (skip_runas) - memset (&bgpd_privs, 0, sizeof (bgpd_privs)); - zprivs_init (&bgpd_privs); - -#if defined(HAVE_CUMULUS) - zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl); -#endif + /* BGP master init. */ + bgp_master_init (frr_init ()); + bm->port = bgp_port; + bm->address = bgp_address; /* Initializations. */ - srandom (time (NULL)); - signal_init (bm->master, array_size(bgp_signals), bgp_signals); - cmd_init (1); - vty_init (bm->master); - memory_init (); bgp_vrf_init (); /* BGP related initialization. */ bgp_init (); - /* Parse config file. */ - vty_read_config (config_file, config_default); - - /* Start execution only if not in dry-run mode */ - if(dryrun) - return(0); - - /* Turn into daemon if daemon_mode is set. */ - if (daemon_mode && daemon (0, 0) < 0) - { - zlog_err("BGPd daemon failed: %s", strerror(errno)); - return (1); - } - - - /* Process ID file creation. */ - pid_output (pid_file); - - /* Make bgp vty socket. */ - vty_serv_sock (vty_addr, vty_port, vty_sock_path); - - /* Print banner. */ - zlog_notice ("BGPd %s starting: vty@%d, bgp@%s:%d", FRR_COPYRIGHT, - vty_port, - (bm->address ? bm->address : "<all>"), - bm->port); + snprintf (bgpd_di.startinfo, sizeof (bgpd_di.startinfo), ", bgp@%s:%d", + (bm->address ? bm->address : "<all>"), + bm->port); - /* Start finite state machine, here we go! */ - while (thread_fetch (bm->master, &thread)) - thread_call (&thread); + frr_config_fork (); + frr_run (bm->master); /* Not reached. */ return (0); |
