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 {"no_kernel", no_argument
, NULL
, 'n'},
74 {"skip_runas", no_argument
, NULL
, 'S'},
75 {"ecmp", required_argument
, NULL
, 'e'},
76 {"int_num", required_argument
, NULL
, 'I'},
77 {"no_zebra", no_argument
, NULL
, 'Z'},
78 {"socket_size", required_argument
, NULL
, 's'},
81 /* signal definitions */
86 static void bgp_exit(int);
87 static void bgp_vrf_terminate(void);
89 static struct quagga_signal_t bgp_signals
[] = {
109 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
110 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
112 struct zebra_privs_t bgpd_privs
= {
113 #if defined(FRR_USER) && defined(FRR_GROUP)
118 .vty_group
= VTY_GROUP
,
121 .cap_num_p
= array_size(_caps_p
),
125 static struct frr_daemon_info bgpd_di
;
127 /* SIGHUP handler. */
130 zlog_info("SIGHUP received");
132 /* Terminate all thread. */
135 zlog_info("bgpd restarting!");
137 /* Reload config file. */
138 vty_read_config(NULL
, bgpd_di
.config_file
, config_default
);
140 /* Try to return to normal operation. */
143 /* SIGINT handler. */
144 __attribute__((__noreturn__
)) void sigint(void)
146 zlog_notice("Terminating on signal");
147 assert(bm
->terminating
== false);
148 bm
->terminating
= true; /* global flag that shutting down */
157 /* SIGUSR1 handler. */
164 Try to free up allocations we know about so that diagnostic tools such as
165 valgrind are able to better illuminate leaks.
167 Zebra route removal and protocol teardown are not meant to be done here.
168 For example, "retain_mode" may be set.
170 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
172 struct bgp
*bgp
, *bgp_default
, *bgp_evpn
;
173 struct listnode
*node
, *nnode
;
175 /* it only makes sense for this to be called on a clean exit */
184 bgp_default
= bgp_get_default();
185 bgp_evpn
= bgp_get_evpn();
187 /* reverse bgp_master_init */
188 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
189 if (bgp_default
== bgp
|| bgp_evpn
== bgp
)
193 if (bgp_evpn
&& bgp_evpn
!= bgp_default
)
194 bgp_delete(bgp_evpn
);
196 bgp_delete(bgp_default
);
198 /* reverse bgp_dump_init */
201 /* reverse bgp_route_init */
204 /* cleanup route maps */
205 bgp_route_map_terminate();
207 /* reverse bgp_attr_init */
211 bgp_pthreads_finish();
213 /* reverse access_list_init */
214 access_list_add_hook(NULL
);
215 access_list_delete_hook(NULL
);
218 /* reverse bgp_filter_init */
219 as_list_add_hook(NULL
);
220 as_list_delete_hook(NULL
);
223 /* reverse prefix_list_init */
224 prefix_list_add_hook(NULL
);
225 prefix_list_delete_hook(NULL
);
228 /* reverse community_list_init */
229 community_list_terminate(bgp_clist
);
237 bf_free(bm
->rd_idspace
);
238 list_delete(&bm
->bgp
);
242 memset(bm
, 0, sizeof(*bm
));
248 static int bgp_vrf_new(struct vrf
*vrf
)
250 if (BGP_DEBUG(zebra
, ZEBRA
))
251 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
256 static int bgp_vrf_delete(struct vrf
*vrf
)
258 if (BGP_DEBUG(zebra
, ZEBRA
))
259 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
264 static int bgp_vrf_enable(struct vrf
*vrf
)
269 if (BGP_DEBUG(zebra
, ZEBRA
))
270 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
272 bgp
= bgp_lookup_by_name(vrf
->name
);
273 if (bgp
&& bgp
->vrf_id
!= vrf
->vrf_id
) {
274 if (bgp
->name
&& strmatch(vrf
->name
, VRF_DEFAULT_NAME
)) {
275 XFREE(MTYPE_BGP
, bgp
->name
);
277 XFREE(MTYPE_BGP
, bgp
->name_pretty
);
278 bgp
->name_pretty
= XSTRDUP(MTYPE_BGP
, "VRF default");
279 bgp
->inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
282 bgp
->rfapi
= bgp_rfapi_new(bgp
);
284 assert(bgp
->rfapi_cfg
);
286 #endif /* ENABLE_BGP_VNC */
288 old_vrf_id
= bgp
->vrf_id
;
289 /* We have instance configured, link to VRF and make it "up". */
290 bgp_vrf_link(bgp
, vrf
);
292 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
293 /* Update any redistribution if vrf_id changed */
294 if (old_vrf_id
!= bgp
->vrf_id
)
295 bgp_redistribute_redo(bgp
);
296 bgp_instance_up(bgp
);
297 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
298 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
299 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
300 bgp_get_default(), bgp
);
301 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
302 bgp_get_default(), bgp
);
303 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
304 bgp_get_default(), bgp
);
305 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
306 bgp_get_default(), bgp
);
312 static int bgp_vrf_disable(struct vrf
*vrf
)
317 if (vrf
->vrf_id
== VRF_DEFAULT
)
320 if (BGP_DEBUG(zebra
, ZEBRA
))
321 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
323 bgp
= bgp_lookup_by_name(vrf
->name
);
326 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
327 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
328 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
329 bgp_get_default(), bgp
);
330 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
331 bgp_get_default(), bgp
);
332 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
333 bgp_get_default(), bgp
);
334 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
335 bgp_get_default(), bgp
);
337 old_vrf_id
= bgp
->vrf_id
;
338 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
339 /* We have instance configured, unlink from VRF and make it
341 bgp_vrf_unlink(bgp
, vrf
);
342 /* Delete any redistribute vrf bitmaps if the vrf_id changed */
343 if (old_vrf_id
!= bgp
->vrf_id
)
344 bgp_unset_redist_vrf_bitmaps(bgp
, old_vrf_id
);
345 bgp_instance_down(bgp
);
348 /* Note: This is a callback, the VRF will be deleted by the caller. */
352 static void bgp_vrf_init(void)
354 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
,
355 bgp_vrf_delete
, bgp_vrf_enable
);
358 static void bgp_vrf_terminate(void)
363 static const struct frr_yang_module_info
*const bgpd_yang_modules
[] = {
366 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
368 .proghelp
= "Implementation of the BGP routing protocol.",
370 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
372 .privs
= &bgpd_privs
, .yang_modules
= bgpd_yang_modules
,
373 .n_yang_modules
= array_size(bgpd_yang_modules
), )
375 #define DEPRECATED_OPTIONS ""
377 /* Main routine of bgpd. Treatment of argument and start bgp finite
378 state machine is handled at here. */
379 int main(int argc
, char **argv
)
384 int bgp_port
= BGP_PORT_DEFAULT
;
385 char *bgp_address
= NULL
;
387 int no_zebra_flag
= 0;
390 int buffer_size
= BGP_SOCKET_SNDBUF_SIZE
;
392 frr_preinit(&bgpd_di
, argc
, argv
);
394 "p:l:SnZe:I:s:" DEPRECATED_OPTIONS
, longopts
,
395 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
396 " -l, --listenon Listen on specified address (implies -n)\n"
397 " -n, --no_kernel Do not install route to kernel.\n"
398 " -Z, --no_zebra Do not communicate with Zebra.\n"
399 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
400 " -e, --ecmp Specify ECMP to use.\n"
401 " -I, --int_num Set instance number (label-manager)\n"
402 " -s, --socket_size Set BGP peer socket send buffer size\n");
404 /* Command line argument treatment. */
406 opt
= frr_getopt(argc
, argv
, 0);
408 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
410 "The -%c option no longer exists.\nPlease refer to the manual.\n",
422 tmp_port
= atoi(optarg
);
423 if (tmp_port
< 0 || tmp_port
> 0xffff)
424 bgp_port
= BGP_PORT_DEFAULT
;
429 multipath_num
= atoi(optarg
);
430 if (multipath_num
> MULTIPATH_NUM
431 || multipath_num
<= 0) {
434 "Multipath Number specified must be less than %d and greater than 0",
440 bgp_address
= optarg
;
441 /* listenon implies -n */
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);
459 buffer_size
= atoi(optarg
);
467 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
469 /* BGP master init. */
470 bgp_master_init(frr_init(), buffer_size
);
473 bgp_option_set(BGP_OPT_NO_LISTEN
);
474 bm
->address
= bgp_address
;
475 if (no_fib_flag
|| no_zebra_flag
)
476 bgp_option_set(BGP_OPT_NO_FIB
);
478 bgp_option_set(BGP_OPT_NO_ZEBRA
);
480 /* Initializations. */
483 /* BGP related initialization. */
484 bgp_init((unsigned short)instance
);
486 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
487 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
490 /* must be called after fork() */