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"
63 #include "bgpd/bgp_script.h"
64 #include "bgpd/bgp_evpn_mh.h"
65 #include "bgpd/bgp_nht.h"
66 #include "bgpd/bgp_routemap_nb.h"
67 #include "bgpd/bgp_community_alias.h"
70 #include "bgpd/rfapi/rfapi_backend.h"
73 /* bgpd options, we use GNU getopt library. */
74 static const struct option longopts
[] = {
75 {"bgp_port", required_argument
, NULL
, 'p'},
76 {"listenon", required_argument
, NULL
, 'l'},
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'},
82 {"socket_size", required_argument
, NULL
, 's'},
85 /* signal definitions */
90 static void bgp_exit(int);
91 static void bgp_vrf_terminate(void);
93 static struct frr_signal_t bgp_signals
[] = {
113 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
114 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
116 struct zebra_privs_t bgpd_privs
= {
117 #if defined(FRR_USER) && defined(FRR_GROUP)
122 .vty_group
= VTY_GROUP
,
125 .cap_num_p
= array_size(_caps_p
),
129 static struct frr_daemon_info bgpd_di
;
131 /* SIGHUP handler. */
134 zlog_info("SIGHUP received, ignoring");
139 * This is turned off for the moment. There is all
140 * sorts of config turned off by bgp_terminate
141 * that is not setup properly again in bgp_reset.
142 * I see no easy way to do this nor do I see that
143 * this is a desirable way to reload config
144 * given the yang work.
146 /* Terminate all thread. */
150 * zlog_info("bgpd restarting!");
152 * Reload config file.
153 * vty_read_config(NULL, bgpd_di.config_file, config_default);
155 /* Try to return to normal operation. */
158 /* SIGINT handler. */
159 __attribute__((__noreturn__
)) void sigint(void)
161 zlog_notice("Terminating on signal");
162 assert(bm
->terminating
== false);
163 bm
->terminating
= true; /* global flag that shutting down */
165 /* Disable BFD events to avoid wasting processing. */
166 bfd_protocol_integration_set_shutdown(true);
175 /* SIGUSR1 handler. */
182 Try to free up allocations we know about so that diagnostic tools such as
183 valgrind are able to better illuminate leaks.
185 Zebra route removal and protocol teardown are not meant to be done here.
186 For example, "retain_mode" may be set.
188 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
190 struct bgp
*bgp
, *bgp_default
, *bgp_evpn
;
191 struct listnode
*node
, *nnode
;
193 /* it only makes sense for this to be called on a clean exit */
200 bgp_default
= bgp_get_default();
201 bgp_evpn
= bgp_get_evpn();
203 /* reverse bgp_master_init */
204 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
205 if (bgp_default
== bgp
|| bgp_evpn
== bgp
)
209 if (bgp_evpn
&& bgp_evpn
!= bgp_default
)
210 bgp_delete(bgp_evpn
);
212 bgp_delete(bgp_default
);
214 bgp_evpn_mh_finish();
217 /* reverse bgp_dump_init */
220 /* BGP community aliases */
221 bgp_community_alias_finish();
223 /* reverse bgp_route_init */
226 /* cleanup route maps */
227 bgp_route_map_terminate();
229 /* reverse bgp_attr_init */
233 bgp_pthreads_finish();
235 /* reverse access_list_init */
236 access_list_add_hook(NULL
);
237 access_list_delete_hook(NULL
);
240 /* reverse bgp_filter_init */
241 as_list_add_hook(NULL
);
242 as_list_delete_hook(NULL
);
245 /* reverse prefix_list_init */
246 prefix_list_add_hook(NULL
);
247 prefix_list_delete_hook(NULL
);
250 /* reverse community_list_init */
251 community_list_terminate(bgp_clist
);
254 #ifdef ENABLE_BGP_VNC
259 bf_free(bm
->rd_idspace
);
260 list_delete(&bm
->bgp
);
261 list_delete(&bm
->addresses
);
265 memset(bm
, 0, sizeof(*bm
));
271 static int bgp_vrf_new(struct vrf
*vrf
)
273 if (BGP_DEBUG(zebra
, ZEBRA
))
274 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
279 static int bgp_vrf_delete(struct vrf
*vrf
)
281 if (BGP_DEBUG(zebra
, ZEBRA
))
282 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
287 static int bgp_vrf_enable(struct vrf
*vrf
)
292 if (BGP_DEBUG(zebra
, ZEBRA
))
293 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
295 bgp
= bgp_lookup_by_name(vrf
->name
);
296 if (bgp
&& bgp
->vrf_id
!= vrf
->vrf_id
) {
297 old_vrf_id
= bgp
->vrf_id
;
298 /* We have instance configured, link to VRF and make it "up". */
299 bgp_vrf_link(bgp
, vrf
);
301 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
302 bgp_instance_up(bgp
);
303 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
304 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
305 vpn_leak_zebra_vrf_sid_update(bgp
, AFI_IP
);
306 vpn_leak_zebra_vrf_sid_update(bgp
, AFI_IP6
);
307 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
308 bgp_get_default(), bgp
);
309 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
310 bgp_get_default(), bgp
);
311 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
312 bgp_get_default(), bgp
);
313 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
314 bgp_get_default(), bgp
);
320 static int bgp_vrf_disable(struct vrf
*vrf
)
324 if (vrf
->vrf_id
== VRF_DEFAULT
)
327 if (BGP_DEBUG(zebra
, ZEBRA
))
328 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
330 bgp
= bgp_lookup_by_name(vrf
->name
);
333 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
334 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
335 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
336 bgp_get_default(), bgp
);
337 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
338 bgp_get_default(), bgp
);
339 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
340 bgp_get_default(), bgp
);
341 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
342 bgp_get_default(), bgp
);
344 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
345 /* We have instance configured, unlink from VRF and make it
347 bgp_instance_down(bgp
);
348 bgp_vrf_unlink(bgp
, vrf
);
351 /* Note: This is a callback, the VRF will be deleted by the caller. */
355 static void bgp_vrf_init(void)
357 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
, bgp_vrf_delete
);
360 static void bgp_vrf_terminate(void)
365 static const struct frr_yang_module_info
*const bgpd_yang_modules
[] = {
370 &frr_bgp_route_map_info
,
373 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
375 .proghelp
= "Implementation of the BGP routing protocol.",
377 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
379 .privs
= &bgpd_privs
, .yang_modules
= bgpd_yang_modules
,
380 .n_yang_modules
= array_size(bgpd_yang_modules
),
383 #define DEPRECATED_OPTIONS ""
385 /* Main routine of bgpd. Treatment of argument and start bgp finite
386 state machine is handled at here. */
387 int main(int argc
, char **argv
)
392 int bgp_port
= BGP_PORT_DEFAULT
;
393 struct list
*addresses
= list_new();
395 int no_zebra_flag
= 0;
398 int buffer_size
= BGP_SOCKET_SNDBUF_SIZE
;
400 struct listnode
*node
;
402 addresses
->cmp
= (int (*)(void *, void *))strcmp
;
404 frr_preinit(&bgpd_di
, argc
, argv
);
406 "p:l:SnZe:I:s:" DEPRECATED_OPTIONS
, longopts
,
407 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
408 " -l, --listenon Listen on specified address (implies -n)\n"
409 " -n, --no_kernel Do not install route to kernel.\n"
410 " -Z, --no_zebra Do not communicate with Zebra.\n"
411 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
412 " -e, --ecmp Specify ECMP to use.\n"
413 " -I, --int_num Set instance number (label-manager)\n"
414 " -s, --socket_size Set BGP peer socket send buffer size\n");
416 /* Command line argument treatment. */
418 opt
= frr_getopt(argc
, argv
, 0);
420 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
422 "The -%c option no longer exists.\nPlease refer to the manual.\n",
434 tmp_port
= atoi(optarg
);
435 if (tmp_port
< 0 || tmp_port
> 0xffff)
436 bgp_port
= BGP_PORT_DEFAULT
;
441 unsigned long int parsed_multipath
=
442 strtoul(optarg
, NULL
, 10);
443 if (parsed_multipath
== 0
444 || parsed_multipath
> MULTIPATH_NUM
445 || parsed_multipath
> UINT_MAX
) {
448 "Multipath Number specified must be less than %u and greater than 0",
452 multipath_num
= parsed_multipath
;
456 listnode_add_sort_nodup(addresses
, optarg
);
468 instance
= atoi(optarg
);
469 if (instance
> (unsigned short)-1)
470 zlog_err("Instance %i out of range (0..%u)",
471 instance
, (unsigned short)-1);
474 buffer_size
= atoi(optarg
);
481 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
483 /* BGP master init. */
484 bgp_master_init(frr_init(), buffer_size
, addresses
);
487 bgp_option_set(BGP_OPT_NO_LISTEN
);
488 if (no_fib_flag
|| no_zebra_flag
)
489 bgp_option_set(BGP_OPT_NO_FIB
);
491 bgp_option_set(BGP_OPT_NO_ZEBRA
);
493 /* Initializations. */
496 #ifdef HAVE_SCRIPTING
500 /* BGP related initialization. */
501 bgp_init((unsigned short)instance
);
503 if (list_isempty(bm
->addresses
)) {
504 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
),
505 ", bgp@<all>:%d", bm
->port
);
507 for (ALL_LIST_ELEMENTS_RO(bm
->addresses
, node
, address
))
508 snprintf(bgpd_di
.startinfo
+ strlen(bgpd_di
.startinfo
),
509 sizeof(bgpd_di
.startinfo
)
510 - strlen(bgpd_di
.startinfo
),
511 ", bgp@%s:%d", address
, bm
->port
);
515 /* must be called after fork() */
516 bgp_gr_apply_running_config();