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 {"retain", no_argument
, NULL
, 'r'},
72 {"no_kernel", no_argument
, NULL
, 'n'},
73 {"skip_runas", no_argument
, NULL
, 'S'},
74 {"ecmp", required_argument
, NULL
, 'e'},
77 /* signal definitions */
82 static void bgp_exit(int);
83 static void bgp_vrf_terminate(void);
85 static struct quagga_signal_t bgp_signals
[] = {
104 /* Route retain mode flag. */
105 static int retain_mode
= 0;
108 static zebra_capabilities_t _caps_p
[] = {
109 ZCAP_BIND
, ZCAP_NET_RAW
, 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(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");
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
)
172 struct listnode
*node
, *nnode
;
174 /* it only makes sense for this to be called on a clean exit */
183 /* reverse bgp_master_init */
184 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
187 /* reverse bgp_dump_init */
190 /* reverse bgp_route_init */
193 /* cleanup route maps */
194 bgp_route_map_terminate();
196 /* reverse bgp_attr_init */
200 bgp_pthreads_finish();
202 /* reverse access_list_init */
203 access_list_add_hook(NULL
);
204 access_list_delete_hook(NULL
);
207 /* reverse bgp_filter_init */
208 as_list_add_hook(NULL
);
209 as_list_delete_hook(NULL
);
212 /* reverse prefix_list_init */
213 prefix_list_add_hook(NULL
);
214 prefix_list_delete_hook(NULL
);
217 /* reverse community_list_init */
218 community_list_terminate(bgp_clist
);
226 bf_free(bm
->rd_idspace
);
227 list_delete_and_null(&bm
->bgp
);
228 memset(bm
, 0, sizeof(*bm
));
234 static int bgp_vrf_new(struct vrf
*vrf
)
236 if (BGP_DEBUG(zebra
, ZEBRA
))
237 zlog_debug("VRF Created: %s(%u)", vrf
->name
, vrf
->vrf_id
);
242 static int bgp_vrf_delete(struct vrf
*vrf
)
244 if (BGP_DEBUG(zebra
, ZEBRA
))
245 zlog_debug("VRF Deletion: %s(%u)", vrf
->name
, vrf
->vrf_id
);
250 static int bgp_vrf_enable(struct vrf
*vrf
)
255 if (BGP_DEBUG(zebra
, ZEBRA
))
256 zlog_debug("VRF enable add %s id %u", vrf
->name
, vrf
->vrf_id
);
258 bgp
= bgp_lookup_by_name(vrf
->name
);
260 old_vrf_id
= bgp
->vrf_id
;
261 /* We have instance configured, link to VRF and make it "up". */
262 bgp_vrf_link(bgp
, vrf
);
264 bgp_handle_socket(bgp
, vrf
, old_vrf_id
, true);
265 /* Update any redistribute vrf bitmaps if the vrf_id changed */
266 if (old_vrf_id
!= bgp
->vrf_id
)
267 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
268 bgp_instance_up(bgp
);
274 static int bgp_vrf_disable(struct vrf
*vrf
)
279 if (vrf
->vrf_id
== VRF_DEFAULT
)
282 if (BGP_DEBUG(zebra
, ZEBRA
))
283 zlog_debug("VRF disable %s id %d", vrf
->name
, vrf
->vrf_id
);
285 bgp
= bgp_lookup_by_name(vrf
->name
);
287 old_vrf_id
= bgp
->vrf_id
;
288 bgp_handle_socket(bgp
, vrf
, VRF_UNKNOWN
, false);
289 /* We have instance configured, unlink from VRF and make it
291 bgp_vrf_unlink(bgp
, vrf
);
292 /* Update any redistribute vrf bitmaps if the vrf_id changed */
293 if (old_vrf_id
!= bgp
->vrf_id
)
294 bgp_update_redist_vrf_bitmaps(bgp
, old_vrf_id
);
295 bgp_instance_down(bgp
);
298 /* Note: This is a callback, the VRF will be deleted by the caller. */
302 static void bgp_vrf_init(void)
304 vrf_init(bgp_vrf_new
, bgp_vrf_enable
, bgp_vrf_disable
, bgp_vrf_delete
);
307 static void bgp_vrf_terminate(void)
312 FRR_DAEMON_INFO(bgpd
, BGP
, .vty_port
= BGP_VTY_PORT
,
314 .proghelp
= "Implementation of the BGP routing protocol.",
316 .signals
= bgp_signals
, .n_signals
= array_size(bgp_signals
),
318 .privs
= &bgpd_privs
, )
320 /* Main routine of bgpd. Treatment of argument and start bgp finite
321 state machine is handled at here. */
322 int main(int argc
, char **argv
)
327 int bgp_port
= BGP_PORT_DEFAULT
;
328 char *bgp_address
= NULL
;
332 frr_preinit(&bgpd_di
, argc
, argv
);
334 "p:l:rSne:", longopts
,
335 " -p, --bgp_port Set bgp protocol's port number\n"
336 " -l, --listenon Listen on specified address (implies -n)\n"
337 " -r, --retain When program terminates, retain added route by bgpd.\n"
338 " -n, --no_kernel Do not install route to kernel.\n"
339 " -S, --skip_runas Skip capabilities checks, and changing user and group IDs.\n"
340 " -e, --ecmp Specify ECMP to use.\n");
342 /* Command line argument treatment. */
344 opt
= frr_getopt(argc
, argv
, 0);
353 tmp_port
= atoi(optarg
);
354 if (tmp_port
<= 0 || tmp_port
> 0xffff)
355 bgp_port
= BGP_PORT_DEFAULT
;
360 multipath_num
= atoi(optarg
);
361 if (multipath_num
> MULTIPATH_NUM
362 || multipath_num
<= 0) {
364 "Multipath Number specified must be less than %d and greater than 0",
373 bgp_address
= optarg
;
374 /* listenon implies -n */
388 memset(&bgpd_privs
, 0, sizeof(bgpd_privs
));
390 /* BGP master init. */
391 bgp_master_init(frr_init());
393 bm
->address
= bgp_address
;
395 bgp_option_set(BGP_OPT_NO_FIB
);
397 /* Initializations. */
400 /* BGP related initialization. */
403 snprintf(bgpd_di
.startinfo
, sizeof(bgpd_di
.startinfo
), ", bgp@%s:%d",
404 (bm
->address
? bm
->address
: "<all>"), bm
->port
);
407 /* must be called after fork() */