summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2004-05-21 11:48:56 +0000
committerclaudio <claudio@openbsd.org>2004-05-21 11:48:56 +0000
commit97f080150d8fa67133ed5feb63219e9657d5ade9 (patch)
treecf11becc1d660278f5c0e4e7955b47a606fb98b6
parentuse 'mss' as lower limit, since 'ifp' might not be set; ok dhartmei@, henning@ (diff)
downloadwireguard-openbsd-97f080150d8fa67133ed5feb63219e9657d5ade9.tar.xz
wireguard-openbsd-97f080150d8fa67133ed5feb63219e9657d5ade9.zip
Add support for dynamic announcements. Usefule to annouce temporary
blackhole routes or to make network announcements dependent on a external state (e.g. for carp setups) OK henning@
-rw-r--r--usr.sbin/bgpd/bgpd.c4
-rw-r--r--usr.sbin/bgpd/bgpd.h7
-rw-r--r--usr.sbin/bgpd/control.c9
-rw-r--r--usr.sbin/bgpd/rde.c101
-rw-r--r--usr.sbin/bgpd/session.c3
5 files changed, 111 insertions, 13 deletions
diff --git a/usr.sbin/bgpd/bgpd.c b/usr.sbin/bgpd/bgpd.c
index 4f862f88f92..6cd92f39e83 100644
--- a/usr.sbin/bgpd/bgpd.c
+++ b/usr.sbin/bgpd/bgpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.c,v 1.93 2004/05/07 10:06:15 djm Exp $ */
+/* $OpenBSD: bgpd.c,v 1.94 2004/05/21 11:48:56 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -386,7 +386,7 @@ reconfigure(char *conffile, struct bgpd_config *conf, struct mrt_head *mrt_l,
&p->conf, sizeof(struct peer_config)) == -1)
return (-1);
while ((n = TAILQ_FIRST(&net_l)) != NULL) {
- if (imsg_compose(&ibuf_rde, IMSG_RECONF_NETWORK, 0,
+ if (imsg_compose(&ibuf_rde, IMSG_NETWORK_ADD, 0,
&n->net, sizeof(struct network_config)) == -1)
return (-1);
TAILQ_REMOVE(&net_l, n, network_l);
diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
index d8f54b081fe..ba5d5efac8f 100644
--- a/usr.sbin/bgpd/bgpd.h
+++ b/usr.sbin/bgpd/bgpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.h,v 1.123 2004/05/17 12:39:32 djm Exp $ */
+/* $OpenBSD: bgpd.h,v 1.124 2004/05/21 11:48:56 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -235,7 +235,6 @@ enum imsg_type {
IMSG_NONE,
IMSG_RECONF_CONF,
IMSG_RECONF_PEER,
- IMSG_RECONF_NETWORK,
IMSG_RECONF_FILTER,
IMSG_RECONF_DONE,
IMSG_UPDATE,
@@ -253,6 +252,9 @@ enum imsg_type {
IMSG_PFTABLE_ADD,
IMSG_PFTABLE_REMOVE,
IMSG_PFTABLE_COMMIT,
+ IMSG_NETWORK_ADD,
+ IMSG_NETWORK_REMOVE,
+ IMSG_NETWORK_FLUSH,
IMSG_CTL_SHOW_NEIGHBOR,
IMSG_CTL_END,
IMSG_CTL_RELOAD,
@@ -267,6 +269,7 @@ enum imsg_type {
IMSG_CTL_SHOW_RIB,
IMSG_CTL_SHOW_RIB_AS,
IMSG_CTL_SHOW_RIB_PREFIX,
+ IMSG_CTL_SHOW_NETWORK,
IMSG_REFRESH
};
diff --git a/usr.sbin/bgpd/control.c b/usr.sbin/bgpd/control.c
index b64236286bd..a680938e26d 100644
--- a/usr.sbin/bgpd/control.c
+++ b/usr.sbin/bgpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.30 2004/05/08 11:22:43 henning Exp $ */
+/* $OpenBSD: control.c,v 1.31 2004/05/21 11:48:56 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -271,10 +271,17 @@ control_dispatch_msg(struct pollfd *pfd)
case IMSG_CTL_SHOW_RIB:
case IMSG_CTL_SHOW_RIB_AS:
case IMSG_CTL_SHOW_RIB_PREFIX:
+ case IMSG_CTL_SHOW_NETWORK:
c->ibuf.pid = imsg.hdr.pid;
imsg_compose_rde(imsg.hdr.type, imsg.hdr.pid,
imsg.data, imsg.hdr.len - IMSG_HEADER_SIZE);
break;
+ case IMSG_NETWORK_ADD:
+ case IMSG_NETWORK_REMOVE:
+ case IMSG_NETWORK_FLUSH:
+ imsg_compose_rde(imsg.hdr.type, 0,
+ imsg.data, imsg.hdr.len - IMSG_HEADER_SIZE);
+ break;
default:
break;
}
diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c
index 9a6f4441701..caba905a651 100644
--- a/usr.sbin/bgpd/rde.c
+++ b/usr.sbin/bgpd/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.112 2004/05/08 19:17:20 henning Exp $ */
+/* $OpenBSD: rde.c,v 1.113 2004/05/21 11:48:56 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -66,7 +66,10 @@ void peer_down(u_int32_t);
void peer_dump(u_int32_t, u_int16_t, u_int8_t);
void network_init(struct network_head *);
-void network_add(struct network_config *);
+void network_add(struct network_config *, int);
+void network_delete(struct network_config *, int);
+void network_dump_upcall(struct pt_entry *, void *);
+void network_flush(int);
void rde_shutdown(void);
@@ -75,6 +78,7 @@ struct bgpd_config *conf, *nconf;
time_t reloadtime;
struct rde_peer_head peerlist;
struct rde_peer peerself;
+struct rde_peer peerdynamic;
struct filter_head *rules_l, *newrules;
struct imsgbuf ibuf_se;
struct imsgbuf ibuf_main;
@@ -250,6 +254,38 @@ rde_dispatch_imsg_session(struct imsgbuf *ibuf)
memcpy(&r, imsg.data, sizeof(r));
peer_dump(imsg.hdr.peerid, r.afi, r.safi);
break;
+ case IMSG_NETWORK_ADD:
+ if (imsg.hdr.len - IMSG_HEADER_SIZE !=
+ sizeof(struct network_config)) {
+ log_warnx("rde_dispatch: wrong imsg len");
+ break;
+ }
+ network_add(imsg.data, 0);
+ break;
+ case IMSG_NETWORK_REMOVE:
+ if (imsg.hdr.len - IMSG_HEADER_SIZE !=
+ sizeof(struct network_config)) {
+ log_warnx("rde_dispatch: wrong imsg len");
+ break;
+ }
+ network_delete(imsg.data, 0);
+ break;
+ case IMSG_NETWORK_FLUSH:
+ if (imsg.hdr.len != IMSG_HEADER_SIZE) {
+ log_warnx("rde_dispatch: wrong imsg len");
+ break;
+ }
+ network_flush(0);
+ break;
+ case IMSG_CTL_SHOW_NETWORK:
+ if (imsg.hdr.len != IMSG_HEADER_SIZE) {
+ log_warnx("rde_dispatch: wrong imsg len");
+ break;
+ }
+ pid = imsg.hdr.pid;
+ pt_dump(network_dump_upcall, &pid);
+ imsg_compose_pid(&ibuf_se, IMSG_CTL_END, pid, NULL, 0);
+ break;
case IMSG_CTL_SHOW_RIB:
if (imsg.hdr.len != IMSG_HEADER_SIZE) {
log_warnx("rde_dispatch: wrong imsg len");
@@ -317,8 +353,8 @@ rde_dispatch_imsg_parent(struct imsgbuf *ibuf)
fatal(NULL);
memcpy(nconf, imsg.data, sizeof(struct bgpd_config));
break;
- case IMSG_RECONF_NETWORK:
- network_add(imsg.data);
+ case IMSG_NETWORK_ADD:
+ network_add(imsg.data, 1);
break;
case IMSG_RECONF_FILTER:
if (imsg.hdr.len - IMSG_HEADER_SIZE !=
@@ -1122,16 +1158,22 @@ network_init(struct network_head *net_l)
peerself.conf.remote_as = conf->as;
snprintf(peerself.conf.descr, sizeof(peerself.conf.descr),
"LOCAL AS %hu", conf->as);
+ bzero(&peerdynamic, sizeof(peerdynamic));
+ peerdynamic.state = PEER_UP;
+ peerdynamic.remote_bgpid = conf->bgpid;
+ peerdynamic.conf.remote_as = conf->as;
+ snprintf(peerdynamic.conf.descr, sizeof(peerdynamic.conf.descr),
+ "LOCAL AS %hu", conf->as);
while ((n = TAILQ_FIRST(net_l)) != NULL) {
TAILQ_REMOVE(net_l, n, network_l);
- network_add(&n->net);
+ network_add(&n->net, 1);
free(n);
}
}
void
-network_add(struct network_config *nc)
+network_add(struct network_config *nc, int flagstatic)
{
struct attr_flags attrs;
@@ -1147,7 +1189,52 @@ network_add(struct network_config *nc)
/* apply default overrides */
rde_apply_set(&attrs, &nc->attrset);
- path_update(&peerself, &attrs, &nc->prefix, nc->prefixlen);
+ if (flagstatic)
+ path_update(&peerself, &attrs, &nc->prefix, nc->prefixlen);
+ else
+ path_update(&peerdynamic, &attrs, &nc->prefix, nc->prefixlen);
+}
+
+void
+network_delete(struct network_config *nc, int flagstatic)
+{
+ if (flagstatic)
+ prefix_remove(&peerself, &nc->prefix, nc->prefixlen);
+ else
+ prefix_remove(&peerdynamic, &nc->prefix, nc->prefixlen);
+}
+
+void
+network_dump_upcall(struct pt_entry *pt, void *ptr)
+{
+ struct prefix *p;
+ struct kroute k;
+ pid_t pid;
+
+ memcpy(&pid, ptr, sizeof(pid));
+
+ LIST_FOREACH(p, &pt->prefix_h, prefix_l)
+ if (p->aspath->nexthop->flags & NEXTHOP_ANNOUNCE) {
+ bzero(&k, sizeof(k));
+ memcpy(&k.prefix, &p->prefix->prefix.v4.s_addr,
+ sizeof(k.prefix));
+ k.prefixlen = p->prefix->prefixlen;
+ if (p->peer == &peerself)
+ k.flags = F_KERNEL;
+ if (imsg_compose_pid(&ibuf_se, IMSG_CTL_SHOW_NETWORK, pid,
+ &k, sizeof(k)) == -1)
+ log_warnx("network_dump_upcall: "
+ "imsg_compose error");
+ }
+}
+
+void
+network_flush(int flagstatic)
+{
+ if (flagstatic)
+ prefix_network_clean(&peerself, time(NULL));
+ else
+ prefix_network_clean(&peerdynamic, time(NULL));
}
/* clean up */
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c
index 12e41cbda68..086d44df291 100644
--- a/usr.sbin/bgpd/session.c
+++ b/usr.sbin/bgpd/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.169 2004/05/08 11:22:43 henning Exp $ */
+/* $OpenBSD: session.c,v 1.170 2004/05/21 11:48:56 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -1986,6 +1986,7 @@ session_dispatch_imsg(struct imsgbuf *ibuf, int idx)
break;
case IMSG_CTL_SHOW_RIB:
case IMSG_CTL_SHOW_RIB_PREFIX:
+ case IMSG_CTL_SHOW_NETWORK:
if (idx != PFD_PIPE_ROUTE)
fatalx("ctl rib request not from RDE");
control_imsg_relay(&imsg);