1 /* Main routine of bgpd.
2 * Copyright (C) 1996, 97, 98, 1999 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 #include <lib/version.h>
45 #include "bgpd/bgpd.h"
46 #include "bgpd/bgp_attr.h"
47 #include "bgpd/bgp_route.h"
48 #include "bgpd/bgp_mplsvpn.h"
49 #include "bgpd/bgp_aspath.h"
50 #include "bgpd/bgp_dump.h"
51 #include "bgpd/bgp_route.h"
52 #include "bgpd/bgp_nexthop.h"
53 #include "bgpd/bgp_regex.h"
54 #include "bgpd/bgp_clist.h"
55 #include "bgpd/bgp_debug.h"
56 #include "bgpd/bgp_errors.h"
57 #include "bgpd/bgp_filter.h"
58 #include "bgpd/bgp_zebra.h"
59 #include "bgpd/bgp_packet.h"
60 #include "bgpd/bgp_keepalives.h"
61 #include "bgpd/bgp_network.h"
62 #include "bgpd/bgp_errors.h"
65 #include "bgpd/rfapi/rfapi_backend.h"
68 /* bgpd options, we use GNU getopt library. */
69 static const struct option longopts
[] = {
70 {"bgp_port", required_argument
, NULL
, 'p'},
71 {"listenon", required_argument
, NULL
, 'l'},
72 {"no_kernel", no_argument
, NULL
, 'n'},
73 {"skip_runas", no_argument
, NULL
, 'S'},
74 {"ecmp", required_argument
, NULL
, 'e'},
75 {"int_num", required_argument
, NULL
, 'I'},
76 {"no_zebra", no_argument
, NULL
, 'Z'},
77 {"socket_size", required_argument
, NULL
, 's'},
80 /* signal definitions */
85 static void bgp_exit(int);
86 static void bgp_vrf_terminate(void);
88 static struct quagga_signal_t bgp_signals
[] = {
108 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
109 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
111 struct zebra_privs_t bgpd_privs
= {
112 #if defined(FRR_USER) && defined(FRR_GROUP)
117 .vty_group
= VTY_GROUP
,
120 .cap_num_p
= array_size(_caps_p
),
124 static struct frr_daemon_info bgpd_di
;
126 /* SIGHUP handler. */
129 zlog_info("SIGHUP received");
131 /* Terminate all thread. */
134 zlog_info("bgpd restarting!");
136 /* Reload config file. */
137 vty_read_config(NULL
, bgpd_di
.config_file
, config_default
);
139 /* Try to return to normal operation. */
142 /* SIGINT handler. */
143 __attribute__((__noreturn__
)) void sigint(void)
145 zlog_notice("Terminating on signal");
146 assert(bm
->terminating
== false);
147 bm
->terminating
= true; /* global flag that shutting down */
156 /* SIGUSR1 handler. */
163 Try to free up allocations we know about so that diagnostic tools such as
164 valgrind are able to better illuminate leaks.
166 Zebra route removal and protocol teardown are not meant to be done here.
167 For example, "retain_mode" may be set.
169 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
171 struct bgp
*bgp
, *bgp_default
, *bgp_evpn
;
172 struct listnode
*node
, *nnode
;
174 /* it only makes sense for this to be called on a clean exit */
183 bgp_default
= bgp_get_default();
184 bgp_evpn
= bgp_get_evpn();
186 /* reverse bgp_master_init */
187 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
188 if (bgp_default
== bgp
|| bgp_evpn
== bgp
)
192 if (bgp_evpn
&& bgp_evpn
!= bgp_default
)
193 bgp_delete(bgp_evpn
);
195 bgp_delete(bgp_default
);
197 /* reverse bgp_dump_init */
200 /* reverse bgp_route_init */
203 /* cleanup route maps */
204 bgp_route_map_terminate();
206 /* reverse bgp_attr_init */
210 bgp_pthreads_finish();
212 /* reverse access_list_init */
213 access_list_add_hook(NULL
);
214 access_list_delete_hook(NULL
);
217 /* reverse bgp_filter_init */
218 as_list_add_hook(NULL
);
219 as_list_delete_hook(NULL
);
222 /* reverse prefix_list_init */
223 prefix_list_add_hook(NULL
);
224 prefix_list_delete_hook(NULL
);
227 /* reverse community_list_init */
228 community_list_terminate(bgp_clist
);
236 bf_free(bm
->rd_idspace
);
237 list_delete(&bm
->bgp
);
241 memset(bm
, 0, sizeof(*bm
));
247 static int bgp_vrf_new(struct vrf
*vrf
)
249 if (BGP_DEBUG(zebra
, ZEBRA
))
250 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
255 static int bgp_vrf_delete(struct vrf
*vrf
)
257 if (BGP_DEBUG(zebra
, ZEBRA
))
258 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
263 static int bgp_vrf_enable(struct vrf
*vrf
)
268 if (BGP_DEBUG(zebra
, ZEBRA
))
269 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
271 bgp
= bgp_lookup_by_name(vrf
->name
);
272 if (bgp
&& bgp
->vrf_id
!= vrf
->vrf_id
) {
273 if (bgp
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
274 XFREE(MTYPE_BGP
, bgp
->name
);
276 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
277 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
278 bgp
->inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
281 bgp
->rfapi
= bgp_rfapi_new(bgp
);
283 assert(bgp
->rfapi_cfg
);
285 #endif /* ENABLE_BGP_VNC */
287 old_vrf_id
= bgp
->vrf_id
;
288 /* We have instance configured, link to VRF and make it "up". */
289 bgp_vrf_link(bgp
, vrf
);
291 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
292 /* Update any redistribution if vrf_id changed */
293 if (old_vrf_id
!= bgp
->vrf_id
)
294 bgp_redistribute_redo(bgp
);
295 bgp_instance_up(bgp
);
296 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
297 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
298 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
299 bgp_get_default(), bgp
);
300 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
301 bgp_get_default(), bgp
);
302 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
303 bgp_get_default(), bgp
);
304 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
305 bgp_get_default(), bgp
);
311 static int bgp_vrf_disable(struct vrf
*vrf
)
316 if (vrf
->vrf_id
== VRF_DEFAULT
)
319 if (BGP_DEBUG(zebra
, ZEBRA
))
320 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
322 bgp
= bgp_lookup_by_name(vrf
->name
);
325 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
326 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
327 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
328 bgp_get_default(), bgp
);
329 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
330 bgp_get_default(), bgp
);
331 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
332 bgp_get_default(), bgp
);
333 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
334 bgp_get_default(), bgp
);
336 old_vrf_id
= bgp
->vrf_id
;
337 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
338 /* We have instance configured, unlink from VRF and make it
340 bgp_vrf_unlink(bgp
, vrf
);
341 /* Delete any redistribute vrf bitmaps if the vrf_id changed */
342 if (old_vrf_id
!= bgp
->vrf_id
)
343 bgp_unset_redist_vrf_bitmaps(bgp
, old_vrf_id
);
344 bgp_instance_down(bgp
);
347 /* Note: This is a callback, the VRF will be deleted by the caller. */
351 static void bgp_vrf_init(void)
353 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
,
354 bgp_vrf_delete
, bgp_vrf_enable
);
357 static void bgp_vrf_terminate(void)
362 static const struct frr_yang_module_info
*const bgpd_yang_modules
[] = {
365 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
367 .proghelp
= "Implementation of the BGP routing protocol.",
369 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
371 .privs
= &bgpd_privs
, .yang_modules
= bgpd_yang_modules
,
372 .n_yang_modules
= array_size(bgpd_yang_modules
), )
374 #define DEPRECATED_OPTIONS ""
376 /* Main routine of bgpd. Treatment of argument and start bgp finite
377 state machine is handled at here. */
378 int main(int argc
, char **argv
)
383 int bgp_port
= BGP_PORT_DEFAULT
;
384 char *bgp_address
= NULL
;
386 int no_zebra_flag
= 0;
389 int buffer_size
= BGP_SOCKET_SNDBUF_SIZE
;
391 frr_preinit(&bgpd_di
, argc
, argv
);
393 "p:l:SnZe:I:s:" DEPRECATED_OPTIONS
, longopts
,
394 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
395 " -l, --listenon Listen on specified address (implies -n)\n"
396 " -n, --no_kernel Do not install route to kernel.\n"
397 " -Z, --no_zebra Do not communicate with Zebra.\n"
398 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
399 " -e, --ecmp Specify ECMP to use.\n"
400 " -I, --int_num Set instance number (label-manager)\n"
401 " -s, --socket_size Set BGP peer socket send buffer size\n");
403 /* Command line argument treatment. */
405 opt
= frr_getopt(argc
, argv
, 0);
407 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
409 "The -%c option no longer exists.\nPlease refer to the manual.\n",
421 tmp_port
= atoi(optarg
);
422 if (tmp_port
< 0 || tmp_port
> 0xffff)
423 bgp_port
= BGP_PORT_DEFAULT
;
428 multipath_num
= atoi(optarg
);
429 if (multipath_num
> MULTIPATH_NUM
430 || multipath_num
<= 0) {
433 "Multipath Number specified must be less than %d and greater than 0",
439 bgp_address
= optarg
;
440 /* listenon implies -n */
452 instance
= atoi(optarg
);
453 if (instance
> (unsigned short)-1)
454 zlog_err("Instance %i out of range (0..%u)",
455 instance
, (unsigned short)-1);
458 buffer_size
= atoi(optarg
);
466 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
468 /* BGP master init. */
469 bgp_master_init(frr_init(), buffer_size
);
472 bgp_option_set(BGP_OPT_NO_LISTEN
);
473 bm
->address
= bgp_address
;
474 if (no_fib_flag
|| no_zebra_flag
)
475 bgp_option_set(BGP_OPT_NO_FIB
);
477 bgp_option_set(BGP_OPT_NO_ZEBRA
);
479 /* Initializations. */
482 /* BGP related initialization. */
483 bgp_init((unsigned short)instance
);
485 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
486 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
489 /* must be called after fork() */
490 bgp_gr_apply_running_config();