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