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_filter.h"
58 #include "bgpd/bgp_zebra.h"
59 #include "bgpd/bgp_packet.h"
60 #include "bgpd/bgp_keepalives.h"
61 #include "bgpd/bgp_network.h"
64 #include "bgpd/rfapi/rfapi_backend.h"
67 /* bgpd options, we use GNU getopt library. */
68 static const struct option longopts
[] = {
69 {"bgp_port", required_argument
, NULL
, 'p'},
70 {"listenon", required_argument
, NULL
, 'l'},
71 #if CONFDATE > 20190521
72 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
74 {"retain", no_argument
, NULL
, 'r'},
75 {"no_kernel", no_argument
, NULL
, 'n'},
76 {"skip_runas", no_argument
, NULL
, 'S'},
77 {"ecmp", required_argument
, NULL
, 'e'},
80 /* signal definitions */
85 static void bgp_exit(int);
86 static void bgp_vrf_terminate(void);
88 static struct quagga_signal_t bgp_signals
[] = {
108 static zebra_capabilities_t _caps_p
[] = {ZCAP_BIND
, ZCAP_NET_RAW
,
109 ZCAP_NET_ADMIN
, ZCAP_SYS_ADMIN
};
111 struct zebra_privs_t bgpd_privs
= {
112 #if defined(FRR_USER) && defined(FRR_GROUP)
117 .vty_group
= VTY_GROUP
,
120 .cap_num_p
= array_size(_caps_p
),
124 static struct frr_daemon_info bgpd_di
;
126 /* SIGHUP handler. */
129 zlog_info("SIGHUP received");
131 /* Terminate all thread. */
134 zlog_info("bgpd restarting!");
136 /* Reload config file. */
137 vty_read_config(bgpd_di
.config_file
, config_default
);
139 /* Try to return to normal operation. */
142 /* SIGINT handler. */
143 __attribute__((__noreturn__
)) void sigint(void)
145 zlog_notice("Terminating on signal");
146 assert(bm
->terminating
== false);
147 bm
->terminating
= true; /* global flag that shutting down */
156 /* SIGUSR1 handler. */
163 Try to free up allocations we know about so that diagnostic tools such as
164 valgrind are able to better illuminate leaks.
166 Zebra route removal and protocol teardown are not meant to be done here.
167 For example, "retain_mode" may be set.
169 static __attribute__((__noreturn__
)) void bgp_exit(int status
)
171 struct bgp
*bgp
, *bgp_default
;
172 struct listnode
*node
, *nnode
;
174 /* it only makes sense for this to be called on a clean exit */
183 bgp_default
= bgp_get_default();
185 /* reverse bgp_master_init */
186 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
187 if (bgp_default
== bgp
)
192 bgp_delete(bgp_default
);
194 /* reverse bgp_dump_init */
197 /* reverse bgp_route_init */
200 /* cleanup route maps */
201 bgp_route_map_terminate();
203 /* reverse bgp_attr_init */
207 bgp_pthreads_finish();
209 /* reverse access_list_init */
210 access_list_add_hook(NULL
);
211 access_list_delete_hook(NULL
);
214 /* reverse bgp_filter_init */
215 as_list_add_hook(NULL
);
216 as_list_delete_hook(NULL
);
219 /* reverse prefix_list_init */
220 prefix_list_add_hook(NULL
);
221 prefix_list_delete_hook(NULL
);
224 /* reverse community_list_init */
225 community_list_terminate(bgp_clist
);
233 bf_free(bm
->rd_idspace
);
234 list_delete_and_null(&bm
->bgp
);
235 memset(bm
, 0, sizeof(*bm
));
241 static int bgp_vrf_new(struct vrf
*vrf
)
243 if (BGP_DEBUG(zebra
, ZEBRA
))
244 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
249 static int bgp_vrf_delete(struct vrf
*vrf
)
251 if (BGP_DEBUG(zebra
, ZEBRA
))
252 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
257 static int bgp_vrf_enable(struct vrf
*vrf
)
262 if (BGP_DEBUG(zebra
, ZEBRA
))
263 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
265 bgp
= bgp_lookup_by_name(vrf
->name
);
267 old_vrf_id
= bgp
->vrf_id
;
268 /* We have instance configured, link to VRF and make it "up". */
269 bgp_vrf_link(bgp
, vrf
);
271 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
272 /* Update any redistribute vrf bitmaps if the vrf_id changed */
273 if (old_vrf_id
!= bgp
->vrf_id
)
274 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
275 bgp_instance_up(bgp
);
276 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP
);
277 vpn_leak_zebra_vrf_label_update(bgp
, AFI_IP6
);
283 static int bgp_vrf_disable(struct vrf
*vrf
)
288 if (vrf
->vrf_id
== VRF_DEFAULT
)
291 if (BGP_DEBUG(zebra
, ZEBRA
))
292 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
294 bgp
= bgp_lookup_by_name(vrf
->name
);
297 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP
);
298 vpn_leak_zebra_vrf_label_withdraw(bgp
, AFI_IP6
);
300 old_vrf_id
= bgp
->vrf_id
;
301 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
302 /* We have instance configured, unlink from VRF and make it
304 bgp_vrf_unlink(bgp
, vrf
);
305 /* Update any redistribute vrf bitmaps if the vrf_id changed */
306 if (old_vrf_id
!= bgp
->vrf_id
)
307 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
308 bgp_instance_down(bgp
);
311 /* Note: This is a callback, the VRF will be deleted by the caller. */
315 static void bgp_vrf_init(void)
317 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
, bgp_vrf_delete
);
320 static void bgp_vrf_terminate(void)
325 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
327 .proghelp
= "Implementation of the BGP routing protocol.",
329 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
331 .privs
= &bgpd_privs
, )
333 #if CONFDATE > 20190521
334 CPP_NOTICE("-r / --retain has reached deprecation EOL, remove")
336 #define DEPRECATED_OPTIONS "r"
338 /* Main routine of bgpd. Treatment of argument and start bgp finite
339 state machine is handled at here. */
340 int main(int argc
, char **argv
)
345 int bgp_port
= BGP_PORT_DEFAULT
;
346 char *bgp_address
= NULL
;
350 frr_preinit(&bgpd_di
, argc
, argv
);
352 "p:l:Sne:" DEPRECATED_OPTIONS
, longopts
,
353 " -p, --bgp_port Set BGP listen port number (0 means do not listen).\n"
354 " -l, --listenon Listen on specified address (implies -n)\n"
355 " -n, --no_kernel Do not install route to kernel.\n"
356 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
357 " -e, --ecmp Specify ECMP to use.\n");
359 /* Command line argument treatment. */
361 opt
= frr_getopt(argc
, argv
, 0);
363 if (opt
&& opt
< 128 && strchr(DEPRECATED_OPTIONS
, opt
)) {
365 "The -%c option no longer exists.\nPlease refer to the manual.\n",
377 tmp_port
= atoi(optarg
);
378 if (tmp_port
< 0 || tmp_port
> 0xffff)
379 bgp_port
= BGP_PORT_DEFAULT
;
384 multipath_num
= atoi(optarg
);
385 if (multipath_num
> MULTIPATH_NUM
386 || multipath_num
<= 0) {
388 "Multipath Number specified must be less than %d and greater than 0",
394 bgp_address
= optarg
;
395 /* listenon implies -n */
409 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
411 /* BGP master init. */
412 bgp_master_init(frr_init());
415 bgp_option_set(BGP_OPT_NO_LISTEN
);
416 bm
->address
= bgp_address
;
418 bgp_option_set(BGP_OPT_NO_FIB
);
420 /* Initializations. */
423 /* BGP related initialization. */
426 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
427 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
430 /* must be called after fork() */