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;  }  | 
