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