diff options
author | 2004-05-21 11:48:56 +0000 | |
---|---|---|
committer | 2004-05-21 11:48:56 +0000 | |
commit | 97f080150d8fa67133ed5feb63219e9657d5ade9 (patch) | |
tree | cf11becc1d660278f5c0e4e7955b47a606fb98b6 | |
parent | use 'mss' as lower limit, since 'ifp' might not be set; ok dhartmei@, henning@ (diff) | |
download | wireguard-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.c | 4 | ||||
-rw-r--r-- | usr.sbin/bgpd/bgpd.h | 7 | ||||
-rw-r--r-- | usr.sbin/bgpd/control.c | 9 | ||||
-rw-r--r-- | usr.sbin/bgpd/rde.c | 101 | ||||
-rw-r--r-- | usr.sbin/bgpd/session.c | 3 |
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); |