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>
30 #include "memory_vty.h"
46 #include "bgpd/bgpd.h"
47 #include "bgpd/bgp_attr.h"
48 #include "bgpd/bgp_route.h"
49 #include "bgpd/bgp_mplsvpn.h"
50 #include "bgpd/bgp_aspath.h"
51 #include "bgpd/bgp_dump.h"
52 #include "bgpd/bgp_route.h"
53 #include "bgpd/bgp_nexthop.h"
54 #include "bgpd/bgp_regex.h"
55 #include "bgpd/bgp_clist.h"
56 #include "bgpd/bgp_debug.h"
57 #include "bgpd/bgp_errors.h"
58 #include "bgpd/bgp_filter.h"
59 #include "bgpd/bgp_zebra.h"
60 #include "bgpd/bgp_packet.h"
61 #include "bgpd/bgp_keepalives.h"
62 #include "bgpd/bgp_network.h"
63 #include "bgpd/bgp_errors.h"
66 #include "bgpd/rfapi/rfapi_backend.h"
69 /* bgpd options, we use GNU getopt library. */
70 static const struct option longopts
[] = {
71 {"bgp_port", required_argument
, NULL
, 'p'},
72 {"listenon", required_argument
, NULL
, 'l'},
73 #if CONFDATE > 20190521
74 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
76 {"retain", no_argument
, NULL
, 'r'},
77 {"no_kernel", no_argument
, NULL
, 'n'},
78 {"skip_runas", no_argument
, NULL
, 'S'},
79 {"ecmp", required_argument
, NULL
, 'e'},
80 {"int_num", required_argument
, NULL
, 'I'},
81 {"no_zebra", no_argument
, NULL
, 'Z'},
84 /* signal definitions */
89 static void bgp_exit(int);
90 static void bgp_vrf_terminate(void);
92 static struct quagga_signal_t bgp_signals
[] = {
112 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
113 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
115 struct zebra_privs_t bgpd_privs
= {
116 #if defined(FRR_USER) && defined(FRR_GROUP)
121 .vty_group
= VTY_GROUP
,
124 .cap_num_p
= array_size(_caps_p
),
128 static struct frr_daemon_info bgpd_di
;
130 /* SIGHUP handler. */
133 zlog_info("SIGHUP received");
135 /* Terminate all thread. */
138 zlog_info("bgpd restarting!");
140 /* Reload config file. */
141 vty_read_config(NULL
, bgpd_di
.config_file
, config_default
);
143 /* Try to return to normal operation. */
146 /* SIGINT handler. */
147 __attribute__((__noreturn__
)) void sigint(void)
149 zlog_notice("Terminating on signal");
150 assert(bm
->terminating
== false);
151 bm
->terminating
= true; /* global flag that shutting down */
160 /* SIGUSR1 handler. */
167 Try to free up allocations we know about so that diagnostic tools such as
168 valgrind are able to better illuminate leaks.
170 Zebra route removal and protocol teardown are not meant to be done here.
171 For example, "retain_mode" may be set.
173 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
175 struct bgp
*bgp
, *bgp_default
, *bgp_evpn
;
176 struct listnode
*node
, *nnode
;
178 /* it only makes sense for this to be called on a clean exit */
187 bgp_default
= bgp_get_default();
188 bgp_evpn
= bgp_get_evpn();
190 /* reverse bgp_master_init */
191 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
192 if (bgp_default
== bgp
|| bgp_evpn
== bgp
)
196 if (bgp_evpn
&& bgp_evpn
!= bgp_default
)
197 bgp_delete(bgp_evpn
);
199 bgp_delete(bgp_default
);
201 /* reverse bgp_dump_init */
204 /* reverse bgp_route_init */
207 /* cleanup route maps */
208 bgp_route_map_terminate();
210 /* reverse bgp_attr_init */
214 bgp_pthreads_finish();
216 /* reverse access_list_init */
217 access_list_add_hook(NULL
);
218 access_list_delete_hook(NULL
);
221 /* reverse bgp_filter_init */
222 as_list_add_hook(NULL
);
223 as_list_delete_hook(NULL
);
226 /* reverse prefix_list_init */
227 prefix_list_add_hook(NULL
);
228 prefix_list_delete_hook(NULL
);
231 /* reverse community_list_init */
232 community_list_terminate(bgp_clist
);
240 bf_free(bm
->rd_idspace
);
241 list_delete(&bm
->bgp
);
245 memset(bm
, 0, sizeof(*bm
));
251 static int bgp_vrf_new(struct vrf
*vrf
)
253 if (BGP_DEBUG(zebra
, ZEBRA
))
254 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
259 static int bgp_vrf_delete(struct vrf
*vrf
)
261 if (BGP_DEBUG(zebra
, ZEBRA
))
262 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
267 static int bgp_vrf_enable(struct vrf
*vrf
)
272 if (BGP_DEBUG(zebra
, ZEBRA
))
273 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
275 bgp
= bgp_lookup_by_name(vrf
->name
);
277 if (bgp
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
278 XFREE(MTYPE_BGP
, bgp
->name
);
280 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
281 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
283 old_vrf_id
= bgp
->vrf_id
;
284 /* We have instance configured, link to VRF and make it "up". */
285 bgp_vrf_link(bgp
, vrf
);
287 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
288 /* Update any redistribution if vrf_id changed */
289 if (old_vrf_id
!= bgp
->vrf_id
)
290 bgp_redistribute_redo(bgp
);
291 bgp_instance_up(bgp
);
292 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
293 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
294 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
295 bgp_get_default(), bgp
);
296 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
297 bgp_get_default(), bgp
);
298 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
299 bgp_get_default(), bgp
);
300 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
301 bgp_get_default(), bgp
);
307 static int bgp_vrf_disable(struct vrf
*vrf
)
312 if (vrf
->vrf_id
== VRF_DEFAULT
)
315 if (BGP_DEBUG(zebra
, ZEBRA
))
316 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
318 bgp
= bgp_lookup_by_name(vrf
->name
);
321 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
322 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
323 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
324 bgp_get_default(), bgp
);
325 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
326 bgp_get_default(), bgp
);
327 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
328 bgp_get_default(), bgp
);
329 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
330 bgp_get_default(), bgp
);
332 old_vrf_id
= bgp
->vrf_id
;
333 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
334 /* We have instance configured, unlink from VRF and make it
336 bgp_vrf_unlink(bgp
, vrf
);
337 /* Delete any redistribute vrf bitmaps if the vrf_id changed */
338 if (old_vrf_id
!= bgp
->vrf_id
)
339 bgp_unset_redist_vrf_bitmaps(bgp
, old_vrf_id
);
340 bgp_instance_down(bgp
);
343 /* Note: This is a callback, the VRF will be deleted by the caller. */
347 static void bgp_vrf_init(void)
349 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
,
350 bgp_vrf_delete
, NULL
);
353 static void bgp_vrf_terminate(void)
358 static const struct frr_yang_module_info
*bgpd_yang_modules
[] = {
361 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
363 .proghelp
= "Implementation of the BGP routing protocol.",
365 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
367 .privs
= &bgpd_privs
, .yang_modules
= bgpd_yang_modules
,
368 .n_yang_modules
= array_size(bgpd_yang_modules
), )
370 #if CONFDATE > 20190521
371 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
373 #define DEPRECATED_OPTIONS "r"
375 /* Main routine of bgpd. Treatment of argument and start bgp finite
376 state machine is handled at here. */
377 int main(int argc
, char **argv
)
382 int bgp_port
= BGP_PORT_DEFAULT
;
383 char *bgp_address
= NULL
;
385 int no_zebra_flag
= 0;
389 frr_preinit(&bgpd_di
, argc
, argv
);
391 "p:l:SnZe:I:" DEPRECATED_OPTIONS
, longopts
,
392 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
393 " -l, --listenon Listen on specified address (implies -n)\n"
394 " -n, --no_kernel Do not install route to kernel.\n"
395 " -Z, --no_zebra Do not communicate with Zebra.\n"
396 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
397 " -e, --ecmp Specify ECMP to use.\n"
398 " -I, --int_num Set instance number (label-manager)\n");
400 /* Command line argument treatment. */
402 opt
= frr_getopt(argc
, argv
, 0);
404 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
406 "The -%c option no longer exists.\nPlease refer to the manual.\n",
418 tmp_port
= atoi(optarg
);
419 if (tmp_port
< 0 || tmp_port
> 0xffff)
420 bgp_port
= BGP_PORT_DEFAULT
;
425 multipath_num
= atoi(optarg
);
426 if (multipath_num
> MULTIPATH_NUM
427 || multipath_num
<= 0) {
430 "Multipath Number specified must be less than %d and greater than 0",
436 bgp_address
= optarg
;
437 /* listenon implies -n */
449 instance
= atoi(optarg
);
450 if (instance
> (unsigned short)-1)
451 zlog_err("Instance %i out of range (0..%u)",
452 instance
, (unsigned short)-1);
460 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
462 /* BGP master init. */
463 bgp_master_init(frr_init());
466 bgp_option_set(BGP_OPT_NO_LISTEN
);
467 bm
->address
= bgp_address
;
468 if (no_fib_flag
|| no_zebra_flag
)
469 bgp_option_set(BGP_OPT_NO_FIB
);
471 bgp_option_set(BGP_OPT_NO_ZEBRA
);
473 /* Initializations. */
476 /* BGP related initialization. */
477 bgp_init((unsigned short)instance
);
479 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
480 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
483 /* must be called after fork() */