]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/bgp_main.c
bgpd: Replace bgp_flag_* to [UN]SET/CHECK_FLAG macros
[mirror_frr.git] / bgpd / bgp_main.c
CommitLineData
718e3744 1/* Main routine of bgpd.
896014f4
DL
2 * Copyright (C) 1996, 97, 98, 1999 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
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
19 */
718e3744 20
21#include <zebra.h>
22
03014d48 23#include <pthread.h>
718e3744 24#include "vector.h"
718e3744 25#include "command.h"
26#include "getopt.h"
27#include "thread.h"
5e4fa164 28#include <lib/version.h>
718e3744 29#include "memory.h"
30#include "prefix.h"
31#include "log.h"
edd7c245 32#include "privs.h"
2d75d052 33#include "sigevent.h"
228da428
CC
34#include "zclient.h"
35#include "routemap.h"
36#include "filter.h"
37#include "plist.h"
8196f13d 38#include "stream.h"
3f9c7369 39#include "queue.h"
6a69b354 40#include "vrf.h"
567b877d 41#include "bfd.h"
4f04a76b 42#include "libfrr.h"
61cf4b37 43#include "ns.h"
718e3744 44
45#include "bgpd/bgpd.h"
46#include "bgpd/bgp_attr.h"
b2f0fa55 47#include "bgpd/bgp_route.h"
718e3744 48#include "bgpd/bgp_mplsvpn.h"
228da428
CC
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"
14454c9f 56#include "bgpd/bgp_errors.h"
228da428 57#include "bgpd/bgp_filter.h"
8196f13d 58#include "bgpd/bgp_zebra.h"
d3ecc69e 59#include "bgpd/bgp_packet.h"
03014d48 60#include "bgpd/bgp_keepalives.h"
61cf4b37 61#include "bgpd/bgp_network.h"
def31c13 62#include "bgpd/bgp_errors.h"
718e3744 63
65efcfce 64#ifdef ENABLE_BGP_VNC
f8b6f499 65#include "bgpd/rfapi/rfapi_backend.h"
65efcfce
LB
66#endif
67
718e3744 68/* bgpd options, we use GNU getopt library. */
d62a17ae 69static const struct option longopts[] = {
70 {"bgp_port", required_argument, NULL, 'p'},
71 {"listenon", required_argument, NULL, 'l'},
d62a17ae 72 {"no_kernel", no_argument, NULL, 'n'},
73 {"skip_runas", no_argument, NULL, 'S'},
74 {"ecmp", required_argument, NULL, 'e'},
f533be73 75 {"int_num", required_argument, NULL, 'I'},
c0064d2a 76 {"no_zebra", no_argument, NULL, 'Z'},
c2d020ad 77 {"socket_size", required_argument, NULL, 's'},
d62a17ae 78 {0}};
718e3744 79
2d75d052 80/* signal definitions */
d62a17ae 81void sighup(void);
82void sigint(void);
83void sigusr1(void);
2d75d052 84
d62a17ae 85static void bgp_exit(int);
86static void bgp_vrf_terminate(void);
228da428 87
d62a17ae 88static struct quagga_signal_t bgp_signals[] = {
89 {
90 .signal = SIGHUP,
91 .handler = &sighup,
92 },
93 {
94 .signal = SIGUSR1,
95 .handler = &sigusr1,
96 },
97 {
98 .signal = SIGINT,
99 .handler = &sigint,
100 },
101 {
102 .signal = SIGTERM,
103 .handler = &sigint,
104 },
2d75d052 105};
106
edd7c245 107/* privileges */
996c9314
LB
108static zebra_capabilities_t _caps_p[] = {ZCAP_BIND, ZCAP_NET_RAW,
109 ZCAP_NET_ADMIN, ZCAP_SYS_ADMIN};
edd7c245 110
d62a17ae 111struct zebra_privs_t bgpd_privs = {
b2f36157 112#if defined(FRR_USER) && defined(FRR_GROUP)
d62a17ae 113 .user = FRR_USER,
114 .group = FRR_GROUP,
d81fadfd 115#endif
116#ifdef VTY_GROUP
d62a17ae 117 .vty_group = VTY_GROUP,
edd7c245 118#endif
d62a17ae 119 .caps_p = _caps_p,
120 .cap_num_p = array_size(_caps_p),
121 .cap_num_i = 0,
edd7c245 122};
123
eb05883f
DL
124static struct frr_daemon_info bgpd_di;
125
718e3744 126/* SIGHUP handler. */
d62a17ae 127void sighup(void)
718e3744 128{
d62a17ae 129 zlog_info("SIGHUP received");
718e3744 130
d62a17ae 131 /* Terminate all thread. */
132 bgp_terminate();
133 bgp_reset();
134 zlog_info("bgpd restarting!");
718e3744 135
d62a17ae 136 /* Reload config file. */
1c2facd1 137 vty_read_config(NULL, bgpd_di.config_file, config_default);
718e3744 138
d62a17ae 139 /* Try to return to normal operation. */
718e3744 140}
141
142/* SIGINT handler. */
d62a17ae 143__attribute__((__noreturn__)) void sigint(void)
718e3744 144{
d62a17ae 145 zlog_notice("Terminating on signal");
97b4a0ec
LB
146 assert(bm->terminating == false);
147 bm->terminating = true; /* global flag that shutting down */
718e3744 148
c8dde10f 149 bgp_terminate();
718e3744 150
d62a17ae 151 bgp_exit(0);
540766e7 152
d62a17ae 153 exit(0);
718e3744 154}
155
156/* SIGUSR1 handler. */
d62a17ae 157void sigusr1(void)
718e3744 158{
d62a17ae 159 zlog_rotate();
718e3744 160}
228da428
CC
161
162/*
163 Try to free up allocations we know about so that diagnostic tools such as
164 valgrind are able to better illuminate leaks.
165
166 Zebra route removal and protocol teardown are not meant to be done here.
167 For example, "retain_mode" may be set.
168*/
d62a17ae 169static __attribute__((__noreturn__)) void bgp_exit(int status)
228da428 170{
e2f3a930 171 struct bgp *bgp, *bgp_default, *bgp_evpn;
d62a17ae 172 struct listnode *node, *nnode;
228da428 173
d62a17ae 174 /* it only makes sense for this to be called on a clean exit */
175 assert(status == 0);
228da428 176
03951374
DL
177 frr_early_fini();
178
d62a17ae 179 bfd_gbl_exit();
567b877d 180
d62a17ae 181 bgp_close();
1ff9a340 182
0e42e319 183 bgp_default = bgp_get_default();
e2f3a930 184 bgp_evpn = bgp_get_evpn();
0e42e319 185
d62a17ae 186 /* reverse bgp_master_init */
0e42e319 187 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
e2f3a930 188 if (bgp_default == bgp || bgp_evpn == bgp)
0e42e319 189 continue;
d62a17ae 190 bgp_delete(bgp);
0e42e319 191 }
e2f3a930
T
192 if (bgp_evpn && bgp_evpn != bgp_default)
193 bgp_delete(bgp_evpn);
1f4b2cce
DS
194 if (bgp_default)
195 bgp_delete(bgp_default);
46abd3e3 196
d62a17ae 197 /* reverse bgp_dump_init */
198 bgp_dump_finish();
228da428 199
d62a17ae 200 /* reverse bgp_route_init */
201 bgp_route_finish();
228da428 202
d62a17ae 203 /* cleanup route maps */
204 bgp_route_map_terminate();
228da428 205
d62a17ae 206 /* reverse bgp_attr_init */
207 bgp_attr_finish();
7b8def58 208
2d4ee774
QY
209 /* stop pthreads */
210 bgp_pthreads_finish();
211
d62a17ae 212 /* reverse access_list_init */
213 access_list_add_hook(NULL);
214 access_list_delete_hook(NULL);
215 access_list_reset();
228da428 216
d62a17ae 217 /* reverse bgp_filter_init */
218 as_list_add_hook(NULL);
219 as_list_delete_hook(NULL);
220 bgp_filter_reset();
228da428 221
d62a17ae 222 /* reverse prefix_list_init */
223 prefix_list_add_hook(NULL);
224 prefix_list_delete_hook(NULL);
225 prefix_list_reset();
228da428 226
d62a17ae 227 /* reverse community_list_init */
228 community_list_terminate(bgp_clist);
228da428 229
d62a17ae 230 bgp_vrf_terminate();
65efcfce 231#if ENABLE_BGP_VNC
d62a17ae 232 vnc_zebra_destroy();
65efcfce 233#endif
d62a17ae 234 bgp_zebra_destroy();
228da428 235
3d57c994 236 bf_free(bm->rd_idspace);
6a154c88 237 list_delete(&bm->bgp);
0768f289
PG
238
239 bgp_lp_finish();
240
d62a17ae 241 memset(bm, 0, sizeof(*bm));
46857efe 242
03951374 243 frr_fini();
d62a17ae 244 exit(status);
228da428 245}
6b0655a2 246
d62a17ae 247static int bgp_vrf_new(struct vrf *vrf)
2fcc254e 248{
d62a17ae 249 if (BGP_DEBUG(zebra, ZEBRA))
a8bf7d9c 250 zlog_debug("VRF Created: %s(%u)", vrf->name, vrf->vrf_id);
2fcc254e 251
d62a17ae 252 return 0;
2fcc254e
DS
253}
254
d62a17ae 255static int bgp_vrf_delete(struct vrf *vrf)
2fcc254e 256{
d62a17ae 257 if (BGP_DEBUG(zebra, ZEBRA))
a8bf7d9c 258 zlog_debug("VRF Deletion: %s(%u)", vrf->name, vrf->vrf_id);
2fcc254e 259
d62a17ae 260 return 0;
2fcc254e
DS
261}
262
d62a17ae 263static int bgp_vrf_enable(struct vrf *vrf)
2fcc254e 264{
d62a17ae 265 struct bgp *bgp;
266 vrf_id_t old_vrf_id;
267
268 if (BGP_DEBUG(zebra, ZEBRA))
a8bf7d9c 269 zlog_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
d62a17ae 270
271 bgp = bgp_lookup_by_name(vrf->name);
d5f31d5f 272 if (bgp && bgp->vrf_id != vrf->vrf_id) {
9a8bdf1c
PG
273 if (bgp->name && strmatch(vrf->name, VRF_DEFAULT_NAME)) {
274 XFREE(MTYPE_BGP, bgp->name);
9a8bdf1c
PG
275 XFREE(MTYPE_BGP, bgp->name_pretty);
276 bgp->name_pretty = XSTRDUP(MTYPE_BGP, "VRF default");
d5f31d5f
PG
277 bgp->inst_type = BGP_INSTANCE_TYPE_DEFAULT;
278#if ENABLE_BGP_VNC
279 if (!bgp->rfapi) {
280 bgp->rfapi = bgp_rfapi_new(bgp);
281 assert(bgp->rfapi);
282 assert(bgp->rfapi_cfg);
283 }
284#endif /* ENABLE_BGP_VNC */
9a8bdf1c 285 }
d62a17ae 286 old_vrf_id = bgp->vrf_id;
287 /* We have instance configured, link to VRF and make it "up". */
288 bgp_vrf_link(bgp, vrf);
289
e5619c28 290 bgp_handle_socket(bgp, vrf, old_vrf_id, true);
401d56cc 291 /* Update any redistribution if vrf_id changed */
d62a17ae 292 if (old_vrf_id != bgp->vrf_id)
401d56cc 293 bgp_redistribute_redo(bgp);
d62a17ae 294 bgp_instance_up(bgp);
ddb5b488
PZ
295 vpn_leak_zebra_vrf_label_update(bgp, AFI_IP);
296 vpn_leak_zebra_vrf_label_update(bgp, AFI_IP6);
e504cf3b
DS
297 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP,
298 bgp_get_default(), bgp);
299 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN, AFI_IP,
300 bgp_get_default(), bgp);
301 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP6,
302 bgp_get_default(), bgp);
303 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN, AFI_IP6,
304 bgp_get_default(), bgp);
d62a17ae 305 }
306
307 return 0;
2fcc254e
DS
308}
309
d62a17ae 310static int bgp_vrf_disable(struct vrf *vrf)
2fcc254e 311{
d62a17ae 312 struct bgp *bgp;
313 vrf_id_t old_vrf_id;
314
315 if (vrf->vrf_id == VRF_DEFAULT)
316 return 0;
317
318 if (BGP_DEBUG(zebra, ZEBRA))
319 zlog_debug("VRF disable %s id %d", vrf->name, vrf->vrf_id);
320
321 bgp = bgp_lookup_by_name(vrf->name);
322 if (bgp) {
ddb5b488
PZ
323
324 vpn_leak_zebra_vrf_label_withdraw(bgp, AFI_IP);
325 vpn_leak_zebra_vrf_label_withdraw(bgp, AFI_IP6);
e504cf3b
DS
326 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP,
327 bgp_get_default(), bgp);
328 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN, AFI_IP,
329 bgp_get_default(), bgp);
330 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, AFI_IP6,
331 bgp_get_default(), bgp);
332 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN, AFI_IP6,
333 bgp_get_default(), bgp);
ddb5b488 334
d62a17ae 335 old_vrf_id = bgp->vrf_id;
e5619c28 336 bgp_handle_socket(bgp, vrf, VRF_UNKNOWN, false);
d62a17ae 337 /* We have instance configured, unlink from VRF and make it
338 * "down". */
339 bgp_vrf_unlink(bgp, vrf);
401d56cc 340 /* Delete any redistribute vrf bitmaps if the vrf_id changed */
d62a17ae 341 if (old_vrf_id != bgp->vrf_id)
401d56cc 342 bgp_unset_redist_vrf_bitmaps(bgp, old_vrf_id);
d62a17ae 343 bgp_instance_down(bgp);
344 }
345
346 /* Note: This is a callback, the VRF will be deleted by the caller. */
347 return 0;
2fcc254e
DS
348}
349
d62a17ae 350static void bgp_vrf_init(void)
2fcc254e 351{
ecbc5a37 352 vrf_init(bgp_vrf_new, bgp_vrf_enable, bgp_vrf_disable,
d5f31d5f 353 bgp_vrf_delete, bgp_vrf_enable);
2fcc254e
DS
354}
355
d62a17ae 356static void bgp_vrf_terminate(void)
021530c1 357{
d62a17ae 358 vrf_terminate();
021530c1 359}
360
0d8c7a26 361static const struct frr_yang_module_info *const bgpd_yang_modules[] = {
91835f1f
RZ
362 &frr_interface_info,
363 &frr_route_map_info,
8fcdd0d6
RW
364};
365
d62a17ae 366FRR_DAEMON_INFO(bgpd, BGP, .vty_port = BGP_VTY_PORT,
4f04a76b 367
d62a17ae 368 .proghelp = "Implementation of the BGP routing protocol.",
4f04a76b 369
d62a17ae 370 .signals = bgp_signals, .n_signals = array_size(bgp_signals),
4f04a76b 371
8fcdd0d6
RW
372 .privs = &bgpd_privs, .yang_modules = bgpd_yang_modules,
373 .n_yang_modules = array_size(bgpd_yang_modules), )
4f04a76b 374
f28963f7 375#define DEPRECATED_OPTIONS ""
c8dde10f 376
718e3744 377/* Main routine of bgpd. Treatment of argument and start bgp finite
378 state machine is handled at here. */
d62a17ae 379int main(int argc, char **argv)
718e3744 380{
d62a17ae 381 int opt;
382 int tmp_port;
383
384 int bgp_port = BGP_PORT_DEFAULT;
385 char *bgp_address = NULL;
386 int no_fib_flag = 0;
0b014ea6 387 int no_zebra_flag = 0;
d62a17ae 388 int skip_runas = 0;
f533be73 389 int instance = 0;
c2d020ad 390 int buffer_size = BGP_SOCKET_SNDBUF_SIZE;
d62a17ae 391
392 frr_preinit(&bgpd_di, argc, argv);
393 frr_opt_add(
c2d020ad 394 "p:l:SnZe:I:s:" DEPRECATED_OPTIONS, longopts,
580f8636 395 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
d62a17ae 396 " -l, --listenon Listen on specified address (implies -n)\n"
d62a17ae 397 " -n, --no_kernel Do not install route to kernel.\n"
0b014ea6 398 " -Z, --no_zebra Do not communicate with Zebra.\n"
d62a17ae 399 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
f533be73 400 " -e, --ecmp Specify ECMP to use.\n"
c2d020ad
DS
401 " -I, --int_num Set instance number (label-manager)\n"
402 " -s, --socket_size Set BGP peer socket send buffer size\n");
d62a17ae 403
404 /* Command line argument treatment. */
405 while (1) {
406 opt = frr_getopt(argc, argv, 0);
407
c8dde10f
QY
408 if (opt && opt < 128 && strchr(DEPRECATED_OPTIONS, opt)) {
409 fprintf(stderr,
410 "The -%c option no longer exists.\nPlease refer to the manual.\n",
411 opt);
412 continue;
413 }
414
d62a17ae 415 if (opt == EOF)
416 break;
417
418 switch (opt) {
419 case 0:
420 break;
421 case 'p':
422 tmp_port = atoi(optarg);
580f8636 423 if (tmp_port < 0 || tmp_port > 0xffff)
d62a17ae 424 bgp_port = BGP_PORT_DEFAULT;
425 else
426 bgp_port = tmp_port;
427 break;
428 case 'e':
429 multipath_num = atoi(optarg);
430 if (multipath_num > MULTIPATH_NUM
431 || multipath_num <= 0) {
af4c2728 432 flog_err(
e50f7cfd 433 EC_BGP_MULTIPATH,
d62a17ae 434 "Multipath Number specified must be less than %d and greater than 0",
435 MULTIPATH_NUM);
436 return 1;
437 }
438 break;
d62a17ae 439 case 'l':
440 bgp_address = optarg;
441 /* listenon implies -n */
442 /* fallthru */
443 case 'n':
444 no_fib_flag = 1;
445 break;
0b014ea6
PG
446 case 'Z':
447 no_zebra_flag = 1;
448 break;
d62a17ae 449 case 'S':
450 skip_runas = 1;
451 break;
f533be73 452 case 'I':
453 instance = atoi(optarg);
454 if (instance > (unsigned short)-1)
455 zlog_err("Instance %i out of range (0..%u)",
456 instance, (unsigned short)-1);
457 break;
c2d020ad
DS
458 case 's':
459 buffer_size = atoi(optarg);
460 break;
d62a17ae 461 default:
462 frr_help_exit(1);
463 break;
464 }
718e3744 465 }
d62a17ae 466 if (skip_runas)
467 memset(&bgpd_privs, 0, sizeof(bgpd_privs));
718e3744 468
d62a17ae 469 /* BGP master init. */
c2d020ad 470 bgp_master_init(frr_init(), buffer_size);
d62a17ae 471 bm->port = bgp_port;
580f8636 472 if (bgp_port == 0)
473 bgp_option_set(BGP_OPT_NO_LISTEN);
d62a17ae 474 bm->address = bgp_address;
0b014ea6 475 if (no_fib_flag || no_zebra_flag)
d62a17ae 476 bgp_option_set(BGP_OPT_NO_FIB);
0b014ea6
PG
477 if (no_zebra_flag)
478 bgp_option_set(BGP_OPT_NO_ZEBRA);
def31c13 479 bgp_error_init();
d62a17ae 480 /* Initializations. */
481 bgp_vrf_init();
718e3744 482
d62a17ae 483 /* BGP related initialization. */
f533be73 484 bgp_init((unsigned short)instance);
718e3744 485
d62a17ae 486 snprintf(bgpd_di.startinfo, sizeof(bgpd_di.startinfo), ", bgp@%s:%d",
487 (bm->address ? bm->address : "<all>"), bm->port);
718e3744 488
d62a17ae 489 frr_config_fork();
2d4ee774 490 /* must be called after fork() */
034e185d 491 bgp_gr_apply_running_config();
419dfe6a 492 bgp_pthreads_run();
d62a17ae 493 frr_run(bm->master);
718e3744 494
d62a17ae 495 /* Not reached. */
496 return (0);
718e3744 497}