bgp_main.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:6k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* Main routine of bgpd.
  2.    Copyright (C) 1996, 97, 98, 1999 Kunihiro Ishiguro
  3. This file is part of GNU Zebra.
  4. GNU Zebra is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by the
  6. Free Software Foundation; either version 2, or (at your option) any
  7. later version.
  8. GNU Zebra is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNU Zebra; see the file COPYING.  If not, write to the Free
  14. Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.  */
  16. #include <zebra.h>
  17. #include "vector.h"
  18. #include "vty.h"
  19. #include "command.h"
  20. #include "getopt.h"
  21. #include "thread.h"
  22. #include "version.h"
  23. #include "memory.h"
  24. #include "prefix.h"
  25. #include "log.h"
  26. #include "bgpd/bgpd.h"
  27. #include "bgpd/bgp_attr.h"
  28. #include "bgpd/bgp_mplsvpn.h"
  29. /* bgpd options, we use GNU getopt library. */
  30. struct option longopts[] = 
  31. {
  32.   { "daemon",      no_argument,       NULL, 'd'},
  33.   { "config_file", required_argument, NULL, 'f'},
  34.   { "pid_file",    required_argument, NULL, 'i'},
  35.   { "bgp_port",    required_argument, NULL, 'p'},
  36.   { "vty_addr",    required_argument, NULL, 'A'},
  37.   { "vty_port",    required_argument, NULL, 'P'},
  38.   { "retain",      no_argument,       NULL, 'r'},
  39.   { "no_kernel",   no_argument,       NULL, 'n'},
  40.   { "version",     no_argument,       NULL, 'v'},
  41.   { "help",        no_argument,       NULL, 'h'},
  42.   { 0 }
  43. };
  44. /* Configuration file and directory. */
  45. char config_current[] = BGP_DEFAULT_CONFIG;
  46. char config_default[] = SYSCONFDIR BGP_DEFAULT_CONFIG;
  47. /* Route retain mode flag. */
  48. int retain_mode = 0;
  49. /* Master of threads. */
  50. struct thread_master *master;
  51. /* Manually specified configuration file name.  */
  52. char *config_file = NULL;
  53. /* Process ID saved for use by init system */
  54. char *pid_file = PATH_BGPD_PID;
  55. /* VTY port number and address.  */
  56. int vty_port = BGP_VTY_PORT;
  57. char *vty_addr = NULL;
  58. /* Help information display. */
  59. static void
  60. usage (char *progname, int status)
  61. {
  62.   if (status != 0)
  63.     fprintf (stderr, "Try `%s --help' for more information.n", progname);
  64.   else
  65.     {    
  66.       printf ("Usage : %s [OPTION...]nn
  67. Daemon which manages kernel routing table management and 
  68. redistribution between different routing protocols.nn
  69. -d, --daemon       Runs in daemon moden
  70. -f, --config_file  Set configuration file namen
  71. -i, --pid_file     Set process identifier file namen
  72. -p, --bgp_port     Set bgp protocol's port numbern
  73. -A, --vty_addr     Set vty's bind addressn
  74. -P, --vty_port     Set vty's port numbern
  75. -r, --retain       When program terminates, retain added route by bgpd.n
  76. -n, --no_kernel    Do not install route to kernel.n
  77. -v, --version      Print program versionn
  78. -h, --help         Display this help and exitn
  79. n
  80. Report bugs to %sn", progname, ZEBRA_BUG_ADDRESS);
  81.     }
  82.   exit (status);
  83. }
  84. /* SIGHUP handler. */
  85. void 
  86. sighup (int sig)
  87. {
  88.   zlog (NULL, LOG_INFO, "SIGHUP received");
  89.   /* Terminate all thread. */
  90.   bgp_terminate ();
  91.   bgp_reset ();
  92.   zlog_info ("bgpd restarting!");
  93.   /* Reload config file. */
  94.   vty_read_config (config_file, config_current, config_default);
  95.   /* Create VTY's socket */
  96.   vty_serv_sock (vty_addr, vty_port ? vty_port : BGP_VTY_PORT, BGP_VTYSH_PATH);
  97.   /* Try to return to normal operation. */
  98. }
  99. /* SIGINT handler. */
  100. void
  101. sigint (int sig)
  102. {
  103.   zlog (NULL, LOG_INFO, "Terminating on signal");
  104.   if (! retain_mode)
  105.     bgp_terminate ();
  106.   exit (0);
  107. }
  108. /* SIGUSR1 handler. */
  109. void
  110. sigusr1 (int sig)
  111. {
  112.   zlog_rotate (NULL);
  113. }
  114. /* Signale wrapper. */
  115. RETSIGTYPE *
  116. signal_set (int signo, void (*func)(int))
  117. {
  118.   int ret;
  119.   struct sigaction sig;
  120.   struct sigaction osig;
  121.   sig.sa_handler = func;
  122.   sigemptyset (&sig.sa_mask);
  123.   sig.sa_flags = 0;
  124. #ifdef SA_RESTART
  125.   sig.sa_flags |= SA_RESTART;
  126. #endif /* SA_RESTART */
  127.   ret = sigaction (signo, &sig, &osig);
  128.   if (ret < 0) 
  129.     return (SIG_ERR);
  130.   else
  131.     return (osig.sa_handler);
  132. }
  133. /* Initialization of signal handles. */
  134. void
  135. signal_init ()
  136. {
  137.   signal_set (SIGHUP, sighup);
  138.   signal_set (SIGINT, sigint);
  139.   signal_set (SIGTERM, sigint);
  140.   signal_set (SIGPIPE, SIG_IGN);
  141.   signal_set (SIGUSR1, sigusr1);
  142. }
  143. /* Main routine of bgpd. Treatment of argument and start bgp finite
  144.    state machine is handled at here. */
  145. int
  146. main (int argc, char **argv)
  147. {
  148.   char *p;
  149.   int opt;
  150.   int daemon_mode = 0;
  151.   char *progname;
  152.   struct thread thread;
  153.   /* Set umask before anything for security */
  154.   umask (0027);
  155.   /* Preserve name of myself. */
  156.   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
  157.   zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_BGP,
  158.    LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
  159.   /* BGP master init. */
  160.   bgp_master_init ();
  161.   /* Command line argument treatment. */
  162.   while (1) 
  163.     {
  164.       opt = getopt_long (argc, argv, "df:hp:A:P:rnv", longopts, 0);
  165.     
  166.       if (opt == EOF)
  167. break;
  168.       switch (opt) 
  169. {
  170. case 0:
  171.   break;
  172. case 'd':
  173.   daemon_mode = 1;
  174.   break;
  175. case 'f':
  176.   config_file = optarg;
  177.   break;
  178.         case 'i':
  179.           pid_file = optarg;
  180.           break;
  181. case 'p':
  182.   bm->port = atoi (optarg);
  183.   break;
  184. case 'A':
  185.   vty_addr = optarg;
  186.   break;
  187. case 'P':
  188.   vty_port = atoi (optarg);
  189.   break;
  190. case 'r':
  191.   retain_mode = 1;
  192.   break;
  193. case 'n':
  194.   bgp_option_set (BGP_OPT_NO_FIB);
  195.   break;
  196. case 'v':
  197.   print_version (progname);
  198.   exit (0);
  199.   break;
  200. case 'h':
  201.   usage (progname, 0);
  202.   break;
  203. default:
  204.   usage (progname, 1);
  205.   break;
  206. }
  207.     }
  208.   /* Make thread master. */
  209.   master = bm->master;
  210.   /* Initializations. */
  211.   srand (time (NULL));
  212.   signal_init ();
  213.   cmd_init (1);
  214.   vty_init ();
  215.   memory_init ();
  216.   /* BGP related initialization.  */
  217.   bgp_init ();
  218.   /* Sort CLI commands. */
  219.   sort_node ();
  220.   /* Parse config file. */
  221.   vty_read_config (config_file, config_current, config_default);
  222.   /* Turn into daemon if daemon_mode is set. */
  223.   if (daemon_mode)
  224.     daemon (0, 0);
  225.   /* Process ID file creation. */
  226.   pid_output (pid_file);
  227.   /* Make bgp vty socket. */
  228.   vty_serv_sock (vty_addr, vty_port, BGP_VTYSH_PATH);
  229.   /* Print banner. */
  230.   zlog_info ("BGPd %s starting: vty@%d, bgp@%d", ZEBRA_BGPD_VERSION,
  231.      vty_port, bm->port);
  232.   /* Start finite state machine, here we go! */
  233.   while (thread_fetch (master, &thread))
  234.     thread_call (&thread);
  235.   /* Not reached. */
  236.   exit (0);
  237. }