summaryrefslogtreecommitdiff
path: root/usr.sbin/bgpd/bgpd.c
diff options
context:
space:
mode:
authorClaudio Jeker <claudio@cvs.openbsd.org>2019-08-08 11:33:09 +0000
committerClaudio Jeker <claudio@cvs.openbsd.org>2019-08-08 11:33:09 +0000
commit9ad62736e9785a7b06032787f3efd6deec6b8eb1 (patch)
treeb9e7438b4e29572810d113aa4195c0564b8a1d20 /usr.sbin/bgpd/bgpd.c
parentc602ac7680769f25f3183951ae7af8f1c146f1b3 (diff)
Parse the config file early on startup before bgpd is daemonized.
This way config errors will be directly user visible on startup. To do this split out send_config() out of reconfigure() which is sending the config to the SE and RDE. OK sthen@
Diffstat (limited to 'usr.sbin/bgpd/bgpd.c')
-rw-r--r--usr.sbin/bgpd/bgpd.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/usr.sbin/bgpd/bgpd.c b/usr.sbin/bgpd/bgpd.c
index 4a666a3cff0..4e6923552cb 100644
--- a/usr.sbin/bgpd/bgpd.c
+++ b/usr.sbin/bgpd/bgpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.c,v 1.224 2019/08/05 08:46:55 claudio Exp $ */
+/* $OpenBSD: bgpd.c,v 1.225 2019/08/08 11:33:08 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -43,6 +43,7 @@ int main(int, char *[]);
pid_t start_child(enum bgpd_process, char *, int, int, int);
int send_filterset(struct imsgbuf *, struct filter_set_head *);
int reconfigure(char *, struct bgpd_config *);
+int send_config(struct bgpd_config *);
int dispatch_imsg(struct imsgbuf *, int, struct bgpd_config *);
int control_setup(struct bgpd_config *);
static void getsockpair(int [2]);
@@ -195,6 +196,14 @@ main(int argc, char *argv[])
if (getpwnam(BGPD_USER) == NULL)
errx(1, "unknown user %s", BGPD_USER);
+ if ((conf = parse_config(conffile, NULL)) == NULL) {
+ log_warnx("config file %s has errors", conffile);
+ exit(1);
+ }
+
+ if (prepare_listeners(conf) == -1)
+ exit(1);
+
log_init(debug, LOG_DAEMON);
log_setverbose(cmd_opts & BGPD_OPT_VERBOSE);
@@ -250,8 +259,11 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd",
if (imsg_send_sockets(ibuf_se, ibuf_rde))
fatal("could not establish imsg links");
- conf = new_config();
- quit = reconfigure(conffile, conf);
+ /* control setup needs to happen late since it sends imsgs */
+ if (control_setup(conf) == -1)
+ quit = 1;
+ if (send_config(conf) != 0)
+ quit = 1;
if (pftable_clear_all() != 0)
quit = 1;
@@ -325,9 +337,12 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd",
error = 0;
break;
case 2:
+ log_info("previous reload still running");
error = CTL_RES_PENDING;
break;
default: /* parse error */
+ log_warnx("config file %s has errors, "
+ "not reloading", conffile);
error = CTL_RES_PARSE_ERROR;
break;
}
@@ -456,40 +471,41 @@ int
reconfigure(char *conffile, struct bgpd_config *conf)
{
struct bgpd_config *new_conf;
- struct peer *p;
- struct filter_rule *r;
- struct listen_addr *la;
- struct rde_rib *rr;
- struct l3vpn *vpn;
- struct as_set *aset;
- struct prefixset *ps;
- struct prefixset_item *psi, *npsi;
- if (reconfpending) {
- log_info("previous reload still running");
+ if (reconfpending)
return (2);
- }
- reconfpending = 2; /* one per child */
log_info("rereading config");
- if ((new_conf = parse_config(conffile, &conf->peers)) == NULL) {
- log_warnx("config file %s has errors, not reloading",
- conffile);
- reconfpending = 0;
+ if ((new_conf = parse_config(conffile, &conf->peers)) == NULL)
return (1);
- }
+
merge_config(conf, new_conf);
if (prepare_listeners(conf) == -1) {
- reconfpending = 0;
return (1);
}
if (control_setup(conf) == -1) {
- reconfpending = 0;
return (1);
}
+ return send_config(conf);
+}
+
+int
+send_config(struct bgpd_config *conf)
+{
+ struct peer *p;
+ struct filter_rule *r;
+ struct listen_addr *la;
+ struct rde_rib *rr;
+ struct l3vpn *vpn;
+ struct as_set *aset;
+ struct prefixset *ps;
+ struct prefixset_item *psi, *npsi;
+
+ reconfpending = 2; /* one per child */
+
expand_networks(conf);
cflags = conf->flags;