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 #if CONFDATE > 20190521
74 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
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'},
80 {"int_num", required_argument
, NULL
, 'I'},
83 /* signal definitions */
88 static void bgp_exit(int);
89 static void bgp_vrf_terminate(void);
91 static struct quagga_signal_t bgp_signals
[] = {
111 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
112 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
114 struct zebra_privs_t bgpd_privs
= {
115 #if defined(FRR_USER) && defined(FRR_GROUP)
120 .vty_group
= VTY_GROUP
,
123 .cap_num_p
= array_size(_caps_p
),
127 static struct frr_daemon_info bgpd_di
;
129 /* SIGHUP handler. */
132 zlog_info("SIGHUP received");
134 /* Terminate all thread. */
137 zlog_info("bgpd restarting!");
139 /* Reload config file. */
140 vty_read_config(bgpd_di
.config_file
, config_default
);
142 /* Try to return to normal operation. */
145 /* SIGINT handler. */
146 __attribute__((__noreturn__
)) void sigint(void)
148 zlog_notice("Terminating on signal");
149 assert(bm
->terminating
== false);
150 bm
->terminating
= true; /* global flag that shutting down */
159 /* SIGUSR1 handler. */
166 Try to free up allocations we know about so that diagnostic tools such as
167 valgrind are able to better illuminate leaks.
169 Zebra route removal and protocol teardown are not meant to be done here.
170 For example, "retain_mode" may be set.
172 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
174 struct bgp
*bgp
, *bgp_default
;
175 struct listnode
*node
, *nnode
;
177 /* it only makes sense for this to be called on a clean exit */
186 bgp_default
= bgp_get_default();
188 /* reverse bgp_master_init */
189 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
190 if (bgp_default
== bgp
)
195 bgp_delete(bgp_default
);
197 /* reverse bgp_dump_init */
200 /* reverse bgp_route_init */
203 /* cleanup route maps */
204 bgp_route_map_terminate();
206 /* reverse bgp_attr_init */
210 bgp_pthreads_finish();
212 /* reverse access_list_init */
213 access_list_add_hook(NULL
);
214 access_list_delete_hook(NULL
);
217 /* reverse bgp_filter_init */
218 as_list_add_hook(NULL
);
219 as_list_delete_hook(NULL
);
222 /* reverse prefix_list_init */
223 prefix_list_add_hook(NULL
);
224 prefix_list_delete_hook(NULL
);
227 /* reverse community_list_init */
228 community_list_terminate(bgp_clist
);
236 bf_free(bm
->rd_idspace
);
237 list_delete_and_null(&bm
->bgp
);
238 memset(bm
, 0, sizeof(*bm
));
244 static int bgp_vrf_new(struct vrf
*vrf
)
246 if (BGP_DEBUG(zebra
, ZEBRA
))
247 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
252 static int bgp_vrf_delete(struct vrf
*vrf
)
254 if (BGP_DEBUG(zebra
, ZEBRA
))
255 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
260 static int bgp_vrf_enable(struct vrf
*vrf
)
265 if (BGP_DEBUG(zebra
, ZEBRA
))
266 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
268 bgp
= bgp_lookup_by_name(vrf
->name
);
270 old_vrf_id
= bgp
->vrf_id
;
271 /* We have instance configured, link to VRF and make it "up". */
272 bgp_vrf_link(bgp
, vrf
);
274 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
275 /* Update any redistribute vrf bitmaps if the vrf_id changed */
276 if (old_vrf_id
!= bgp
->vrf_id
)
277 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
278 bgp_instance_up(bgp
);
279 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
280 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
281 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
282 bgp_get_default(), bgp
);
283 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
284 bgp_get_default(), bgp
);
285 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
286 bgp_get_default(), bgp
);
287 vpn_leak_postchange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
288 bgp_get_default(), bgp
);
294 static int bgp_vrf_disable(struct vrf
*vrf
)
299 if (vrf
->vrf_id
== VRF_DEFAULT
)
302 if (BGP_DEBUG(zebra
, ZEBRA
))
303 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
305 bgp
= bgp_lookup_by_name(vrf
->name
);
308 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
309 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
310 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
,
311 bgp_get_default(), bgp
);
312 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP
,
313 bgp_get_default(), bgp
);
314 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
315 bgp_get_default(), bgp
);
316 vpn_leak_prechange(BGP_VPN_POLICY_DIR_FROMVPN
, AFI_IP6
,
317 bgp_get_default(), bgp
);
319 old_vrf_id
= bgp
->vrf_id
;
320 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
321 /* We have instance configured, unlink from VRF and make it
323 bgp_vrf_unlink(bgp
, vrf
);
324 /* Update any redistribute vrf bitmaps if the vrf_id changed */
325 if (old_vrf_id
!= bgp
->vrf_id
)
326 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
327 bgp_instance_down(bgp
);
330 /* Note: This is a callback, the VRF will be deleted by the caller. */
334 static void bgp_vrf_init(void)
336 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
, bgp_vrf_delete
);
339 static void bgp_vrf_terminate(void)
344 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
346 .proghelp
= "Implementation of the BGP routing protocol.",
348 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
350 .privs
= &bgpd_privs
, )
352 #if CONFDATE > 20190521
353 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
355 #define DEPRECATED_OPTIONS "r"
357 /* Main routine of bgpd. Treatment of argument and start bgp finite
358 state machine is handled at here. */
359 int main(int argc
, char **argv
)
364 int bgp_port
= BGP_PORT_DEFAULT
;
365 char *bgp_address
= NULL
;
370 frr_preinit(&bgpd_di
, argc
, argv
);
372 "p:l:Sne:I:" DEPRECATED_OPTIONS
, longopts
,
373 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
374 " -l, --listenon Listen on specified address (implies -n)\n"
375 " -n, --no_kernel Do not install route to kernel.\n"
376 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
377 " -e, --ecmp Specify ECMP to use.\n"
378 " -I, --int_num Set instance number (label-manager)\n");
380 /* Command line argument treatment. */
382 opt
= frr_getopt(argc
, argv
, 0);
384 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
386 "The -%c option no longer exists.\nPlease refer to the manual.\n",
398 tmp_port
= atoi(optarg
);
399 if (tmp_port
< 0 || tmp_port
> 0xffff)
400 bgp_port
= BGP_PORT_DEFAULT
;
405 multipath_num
= atoi(optarg
);
406 if (multipath_num
> MULTIPATH_NUM
407 || multipath_num
<= 0) {
410 "Multipath Number specified must be less than %d and greater than 0",
416 bgp_address
= optarg
;
417 /* listenon implies -n */
426 instance
= atoi(optarg
);
427 if (instance
> (unsigned short)-1)
428 zlog_err("Instance %i out of range (0..%u)",
429 instance
, (unsigned short)-1);
437 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
439 /* BGP master init. */
440 bgp_master_init(frr_init());
443 bgp_option_set(BGP_OPT_NO_LISTEN
);
444 bm
->address
= bgp_address
;
446 bgp_option_set(BGP_OPT_NO_FIB
);
449 /* Initializations. */
452 /* BGP related initialization. */
453 bgp_init((unsigned short)instance
);
455 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
456 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
459 /* must be called after fork() */