mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 01:39:16 -04:00
Update to 4.6.20100215.
Feature safe: yes
This commit is contained in:
parent
888120ca23
commit
7ab9a19af6
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=249966
51 changed files with 6804 additions and 8082 deletions
|
@ -6,11 +6,11 @@
|
|||
#
|
||||
|
||||
PORTNAME= openbgpd
|
||||
PORTVERSION= 4.5.20091022
|
||||
PORTVERSION= 4.6.20100215
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= ${MASTER_SITE_OPENBSD}
|
||||
MASTER_SITE_SUBDIR= OpenBGPD
|
||||
DISTNAME= ${PORTNAME}-4.4.1
|
||||
DISTNAME= ${PORTNAME}-4.6
|
||||
EXTRACT_SUFX= .tgz
|
||||
DIST_SUBDIR= ${PORTNAME}
|
||||
|
||||
|
|
|
@ -1,12 +1,3 @@
|
|||
MD5 (openbgpd/openbgpd-4.4.1.tgz) = 5ac036b2ca2905a7efe2e0364aef00e7
|
||||
SHA256 (openbgpd/openbgpd-4.4.1.tgz) = 284406daa359bf1e9386e5055a1803453d04fd9c9ef5479ac324c8d1eebc33a4
|
||||
SIZE (openbgpd/openbgpd-4.4.1.tgz) = 163070
|
||||
MD5 (openbgpd/if_media.h) = 4ff9297f5c133425dafe3ca565c0f811
|
||||
SHA256 (openbgpd/if_media.h) = 58225d0ed363c2beb23426f0f8254089d4541c3334776f3750ba434d4491a1d1
|
||||
SIZE (openbgpd/if_media.h) = 23762
|
||||
MD5 (openbgpd/hash.h) = 0c397692b9b152f1bca968b6248bc09c
|
||||
SHA256 (openbgpd/hash.h) = 0c5561c6765325f49d82d5c5fd9471dbfadf21f44e554758eb112a23f7c317b1
|
||||
SIZE (openbgpd/hash.h) = 3488
|
||||
MD5 (openbgpd/strtonum.c) = da3ba14723ae645c13b8ea96d3f78f20
|
||||
SHA256 (openbgpd/strtonum.c) = eabeece529ed7678b5d79774813818ed1d46b7c7a934c98e474c8f62c56abaec
|
||||
SIZE (openbgpd/strtonum.c) = 1769
|
||||
MD5 (openbgpd/openbgpd-4.6.tgz) = 846feb4de328e7d47526a83087000863
|
||||
SHA256 (openbgpd/openbgpd-4.6.tgz) = d9a0a3542e5ec744889ca12871f01aa1d86f12844e093010f37d0601796e15cf
|
||||
SIZE (openbgpd/openbgpd-4.6.tgz) = 168197
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
--- /dev/null 2009-06-24 01:22:00.000000000 +0900
|
||||
+++ bgpctl/compat-openbsd.h 2009-06-24 01:24:55.000000000 +0900
|
||||
@@ -0,0 +1,3 @@
|
||||
+#include <sys/endian.h>
|
||||
+
|
||||
+#define betoh64(x) (be64toh(x))
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpctl/bgpctl.8
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/bgpctl.8,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.1 -r1.3
|
||||
--- bgpctl/bgpctl.8 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/bgpctl.8 9 Jul 2009 17:22:12 -0000 1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpctl/bgpctl.8 14 Feb 2010 20:20:13 -0000 1.1.1.6
|
||||
+++ bgpctl/bgpctl.8 4 Feb 2010 16:22:26 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-.\" $OpenBSD: bgpctl.8,v 1.47 2008/06/07 18:14:41 henning Exp $
|
||||
+.\" $OpenBSD: bgpctl.8,v 1.49 2009/06/06 06:11:17 claudio Exp $
|
||||
-.\" $OpenBSD: bgpctl.8,v 1.49 2009/06/06 06:11:17 claudio Exp $
|
||||
+.\" $OpenBSD: bgpctl.8,v 1.52 2009/11/03 08:09:15 jmc Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
|
||||
.\"
|
||||
|
@ -16,30 +16,28 @@ diff -u -p -r1.1.1.1 -r1.3
|
|||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
-.Dd $Mdocdate: June 7 2008 $
|
||||
+.Dd $Mdocdate: December 6 2008 $
|
||||
-.Dd $Mdocdate: June 6 2009 $
|
||||
+.Dd $Mdocdate: November 2 2009 $
|
||||
.Dt BGPCTL 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
@@ -25,7 +25,7 @@
|
||||
.Op Fl n
|
||||
.Op Fl s Ar socket
|
||||
.Ar command
|
||||
-.Op Ar arguments ...
|
||||
+.Op Ar argument ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@@ -202,6 +202,8 @@ Show all entries with community
|
||||
.Ar community .
|
||||
.It Cm neighbor Ar peer
|
||||
Show only entries from the specified peer.
|
||||
+.It Cm table Ar rib
|
||||
+Show only entries from the specified RIB table.
|
||||
.It Cm summary
|
||||
This is the same as the
|
||||
.Ic show summary
|
||||
@@ -244,7 +246,7 @@ in a terse format.
|
||||
@@ -79,7 +79,15 @@ The options are as follows:
|
||||
Use
|
||||
.Ar directory
|
||||
to write the filter files to.
|
||||
+.It Fl 4
|
||||
+Fetch only IPv4 prefixes from the registry.
|
||||
+.It Fl 6
|
||||
+Fetch only IPv6 prefixes from the registry.
|
||||
.El
|
||||
+.It Cm log brief
|
||||
+Disable verbose debug logging.
|
||||
+.It Cm log verbose
|
||||
+Enable verbose debug logging.
|
||||
.It Cm neighbor Ar peer Cm up
|
||||
Take the BGP session to the specified neighbor up.
|
||||
.Ar peer
|
||||
@@ -246,7 +254,7 @@ in a terse format.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Bl -tag -width "/var/run/bgpd.sockXXX" -compact
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpctl/bgpctl.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/bgpctl.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.1 -r1.4
|
||||
--- bgpctl/bgpctl.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/bgpctl.c 10 Aug 2009 21:20:02 -0000 1.4
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.7 -r1.6
|
||||
--- bgpctl/bgpctl.c 14 Feb 2010 20:20:14 -0000 1.1.1.7
|
||||
+++ bgpctl/bgpctl.c 14 Feb 2010 19:55:02 -0000 1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: bgpctl.c,v 1.134 2008/06/07 20:23:15 henning Exp $ */
|
||||
+/* $OpenBSD: bgpctl.c,v 1.145 2009/07/23 14:55:25 claudio Exp $ */
|
||||
-/* $OpenBSD: bgpctl.c,v 1.142 2009/06/06 06:33:15 eric Exp $ */
|
||||
+/* $OpenBSD: bgpctl.c,v 1.155 2010/01/10 00:16:23 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
|
||||
|
@ -55,6 +55,15 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
enum neighbor_views {
|
||||
NV_DEFAULT,
|
||||
NV_TIMERS
|
||||
@@ -50,7 +66,7 @@ int show_summary_msg(struct imsg *, in
|
||||
int show_summary_terse_msg(struct imsg *, int);
|
||||
int show_neighbor_terse(struct imsg *);
|
||||
int show_neighbor_msg(struct imsg *, enum neighbor_views);
|
||||
-void print_neighbor_capa_mp_safi(u_int8_t);
|
||||
+void print_neighbor_capa_mp(struct peer *);
|
||||
void print_neighbor_msgstats(struct peer *);
|
||||
void print_timer(const char *, time_t);
|
||||
static char *fmt_timeframe(time_t t);
|
||||
@@ -65,7 +81,7 @@ void show_interface_head(void);
|
||||
int ift2ifm(int);
|
||||
const char * get_media_descr(int);
|
||||
|
@ -64,58 +73,217 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
int show_interface_msg(struct imsg *);
|
||||
void show_rib_summary_head(void);
|
||||
void print_prefix(struct bgpd_addr *, u_int8_t, u_int8_t);
|
||||
@@ -89,8 +105,8 @@ usage(void)
|
||||
@@ -74,7 +90,6 @@ void print_flags(u_int8_t, int);
|
||||
int show_rib_summary_msg(struct imsg *);
|
||||
int show_rib_detail_msg(struct imsg *, int);
|
||||
void show_community(u_char *, u_int16_t);
|
||||
-const char *get_ext_subtype(u_int8_t);
|
||||
void show_ext_community(u_char *, u_int16_t);
|
||||
char *fmt_mem(int64_t);
|
||||
int show_rib_memory_msg(struct imsg *);
|
||||
@@ -98,7 +113,7 @@ int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
extern char *__progname;
|
||||
struct sockaddr_un sun;
|
||||
- int fd, n, done, ch, nodescr = 0;
|
||||
+ int fd, n, done, ch, nodescr = 0, verbose = 0;
|
||||
struct imsg imsg;
|
||||
struct network_config net;
|
||||
struct parse_result *res;
|
||||
@@ -164,15 +179,17 @@ main(int argc, char *argv[])
|
||||
imsg_compose(ibuf, IMSG_CTL_SHOW_TERSE, 0, 0, -1, NULL, 0);
|
||||
break;
|
||||
case SHOW_FIB:
|
||||
- if (!res->addr.af) {
|
||||
+ if (!res->addr.aid) {
|
||||
struct buf *msg;
|
||||
+ sa_family_t af;
|
||||
|
||||
- fprintf(stderr, "usage: %s [-n] [-s socket] "
|
||||
- "command [arguments ...]\n", __progname);
|
||||
+ fprintf(stderr, "usage: %s [-n] [-s socket] command [argument ...]\n",
|
||||
+ __progname);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -174,8 +190,7 @@ main(int argc, char *argv[])
|
||||
+ af = aid2af(res->aid);
|
||||
if ((msg = imsg_create(ibuf, IMSG_CTL_KROUTE, 0, 0,
|
||||
- sizeof(res->flags) + sizeof(res->af))) == NULL)
|
||||
+ sizeof(res->flags) + sizeof(af))) == NULL)
|
||||
errx(1, "imsg_create failure");
|
||||
if (imsg_add(msg, &res->flags, sizeof(res->flags)) ==
|
||||
-1 ||
|
||||
imsg_add(msg, &res->af, sizeof(res->af)) == -1)
|
||||
- imsg_add(msg, &res->af, sizeof(res->af)) == -1)
|
||||
+ imsg_add(msg, &af, sizeof(af)) == -1)
|
||||
errx(1, "imsg_add failure");
|
||||
- if (imsg_close(ibuf, msg) < 0)
|
||||
- errx(1, "imsg_close error");
|
||||
+ imsg_close(ibuf, msg);
|
||||
imsg_close(ibuf, msg);
|
||||
} else
|
||||
imsg_compose(ibuf, IMSG_CTL_KROUTE_ADDR, 0, 0, -1,
|
||||
&res->addr, sizeof(res->addr));
|
||||
@@ -220,6 +235,7 @@ main(int argc, char *argv[])
|
||||
@@ -192,7 +209,7 @@ main(int argc, char *argv[])
|
||||
case SHOW_NEIGHBOR_TIMERS:
|
||||
case SHOW_NEIGHBOR_TERSE:
|
||||
neighbor.show_timers = (res->action == SHOW_NEIGHBOR_TIMERS);
|
||||
- if (res->peeraddr.af || res->peerdesc[0])
|
||||
+ if (res->peeraddr.aid || res->peerdesc[0])
|
||||
imsg_compose(ibuf, IMSG_CTL_SHOW_NEIGHBOR, 0, 0, -1,
|
||||
&neighbor, sizeof(neighbor));
|
||||
else
|
||||
@@ -206,7 +223,7 @@ main(int argc, char *argv[])
|
||||
memcpy(&ribreq.as, &res->as, sizeof(res->as));
|
||||
type = IMSG_CTL_SHOW_RIB_AS;
|
||||
}
|
||||
- if (res->addr.af) {
|
||||
+ if (res->addr.aid) {
|
||||
memcpy(&ribreq.prefix, &res->addr, sizeof(res->addr));
|
||||
ribreq.prefixlen = res->prefixlen;
|
||||
type = IMSG_CTL_SHOW_RIB_PREFIX;
|
||||
@@ -220,7 +237,7 @@ main(int argc, char *argv[])
|
||||
memcpy(&ribreq.neighbor, &neighbor,
|
||||
sizeof(ribreq.neighbor));
|
||||
+ strlcpy(ribreq.rib, res->rib, sizeof(ribreq.rib));
|
||||
ribreq.af = res->af;
|
||||
strlcpy(ribreq.rib, res->rib, sizeof(ribreq.rib));
|
||||
- ribreq.af = res->af;
|
||||
+ ribreq.aid = res->aid;
|
||||
ribreq.flags = res->flags;
|
||||
imsg_compose(ibuf, type, 0, 0, -1, &ribreq, sizeof(ribreq));
|
||||
@@ -289,8 +305,11 @@ main(int argc, char *argv[])
|
||||
done = 1;
|
||||
if (!(res->flags & F_CTL_DETAIL))
|
||||
@@ -290,12 +307,21 @@ main(int argc, char *argv[])
|
||||
break;
|
||||
case NETWORK_SHOW:
|
||||
+ bzero(&ribreq, sizeof(ribreq));
|
||||
+ ribreq.af = res->af;
|
||||
+ strlcpy(ribreq.rib, res->rib, sizeof(ribreq.rib));
|
||||
bzero(&ribreq, sizeof(ribreq));
|
||||
- ribreq.af = res->af;
|
||||
+ ribreq.aid = res->aid;
|
||||
strlcpy(ribreq.rib, res->rib, sizeof(ribreq.rib));
|
||||
imsg_compose(ibuf, IMSG_CTL_SHOW_NETWORK, 0, 0, -1,
|
||||
- &res->af, sizeof(res->af));
|
||||
+ &ribreq, sizeof(ribreq));
|
||||
&ribreq, sizeof(ribreq));
|
||||
show_network_head();
|
||||
break;
|
||||
}
|
||||
@@ -410,7 +429,7 @@ fmt_peer(const char *descr, const struct
|
||||
void
|
||||
show_summary_head(void)
|
||||
{
|
||||
- printf("%-20s %-8s %-10s %-10s %-5s %-8s %s\n", "Neighbor", "AS",
|
||||
+ printf("%-20s %8s %10s %10s %5s %-8s %s\n", "Neighbor", "AS",
|
||||
"MsgRcvd", "MsgSent", "OutQ", "Up/Down", "State/PrfRcvd");
|
||||
+ case LOG_VERBOSE:
|
||||
+ verbose = 1;
|
||||
+ /* FALLTHROUGH */
|
||||
+ case LOG_BRIEF:
|
||||
+ imsg_compose(ibuf, IMSG_CTL_LOG_VERBOSE, 0, 0, -1,
|
||||
+ &verbose, sizeof(verbose));
|
||||
+ printf("logging request sent.\n");
|
||||
+ done = 1;
|
||||
+ break;
|
||||
}
|
||||
|
||||
@@ -677,7 +696,7 @@ print_neighbor_msgstats(struct peer *p)
|
||||
while (ibuf->w.queued)
|
||||
@@ -304,13 +330,13 @@ main(int argc, char *argv[])
|
||||
|
||||
while (!done) {
|
||||
if ((n = imsg_read(ibuf)) == -1)
|
||||
- errx(1, "imsg_read error");
|
||||
+ err(1, "imsg_read error");
|
||||
if (n == 0)
|
||||
errx(1, "pipe closed");
|
||||
|
||||
while (!done) {
|
||||
if ((n = imsg_get(ibuf, &imsg)) == -1)
|
||||
- errx(1, "imsg_get error");
|
||||
+ err(1, "imsg_get error");
|
||||
if (n == 0)
|
||||
break;
|
||||
|
||||
@@ -373,6 +399,8 @@ main(int argc, char *argv[])
|
||||
case NETWORK_REMOVE:
|
||||
case NETWORK_FLUSH:
|
||||
case IRRFILTER:
|
||||
+ case LOG_VERBOSE:
|
||||
+ case LOG_BRIEF:
|
||||
break;
|
||||
}
|
||||
imsg_free(&imsg);
|
||||
@@ -398,8 +426,8 @@ fmt_peer(const char *descr, const struct
|
||||
}
|
||||
|
||||
ip = log_addr(remote_addr);
|
||||
- if (masklen != -1 && ((remote_addr->af == AF_INET && masklen != 32) ||
|
||||
- (remote_addr->af == AF_INET6 && masklen != 128))) {
|
||||
+ if (masklen != -1 && ((remote_addr->aid == AID_INET && masklen != 32) ||
|
||||
+ (remote_addr->aid == AID_INET6 && masklen != 128))) {
|
||||
if (asprintf(&p, "%s/%u", ip, masklen) == -1)
|
||||
err(1, NULL);
|
||||
} else {
|
||||
@@ -521,13 +549,15 @@ show_neighbor_msg(struct imsg *imsg, enu
|
||||
struct ctl_timer *t;
|
||||
struct in_addr ina;
|
||||
char buf[NI_MAXHOST], pbuf[NI_MAXSERV], *s;
|
||||
+ int hascapamp = 0;
|
||||
+ u_int8_t i;
|
||||
|
||||
switch (imsg->hdr.type) {
|
||||
case IMSG_CTL_SHOW_NEIGHBOR:
|
||||
p = imsg->data;
|
||||
- if ((p->conf.remote_addr.af == AF_INET &&
|
||||
+ if ((p->conf.remote_addr.aid == AID_INET &&
|
||||
p->conf.remote_masklen != 32) ||
|
||||
- (p->conf.remote_addr.af == AF_INET6 &&
|
||||
+ (p->conf.remote_addr.aid == AID_INET6 &&
|
||||
p->conf.remote_masklen != 128)) {
|
||||
if (asprintf(&s, "%s/%u",
|
||||
log_addr(&p->conf.remote_addr),
|
||||
@@ -549,6 +579,10 @@ show_neighbor_msg(struct imsg *imsg, enu
|
||||
printf(", Template");
|
||||
if (p->conf.cloned)
|
||||
printf(", Cloned");
|
||||
+ if (p->conf.passive)
|
||||
+ printf(", Passive");
|
||||
+ if (p->conf.ebgp && p->conf.distance > 1)
|
||||
+ printf(", Multihop (%u)", (int)p->conf.distance);
|
||||
printf("\n");
|
||||
if (p->conf.descr[0])
|
||||
printf(" Description: %s\n", p->conf.descr);
|
||||
@@ -563,17 +597,16 @@ show_neighbor_msg(struct imsg *imsg, enu
|
||||
printf(" Last read %s, holdtime %us, keepalive interval %us\n",
|
||||
fmt_timeframe(p->stats.last_read),
|
||||
p->holdtime, p->holdtime/3);
|
||||
- if (p->capa.peer.mp_v4 || p->capa.peer.mp_v6 ||
|
||||
- p->capa.peer.refresh || p->capa.peer.restart ||
|
||||
- p->capa.peer.as4byte) {
|
||||
+ for (i = 0; i < AID_MAX; i++)
|
||||
+ if (p->capa.peer.mp[i])
|
||||
+ hascapamp = 1;
|
||||
+ if (hascapamp || p->capa.peer.refresh ||
|
||||
+ p->capa.peer.restart || p->capa.peer.as4byte) {
|
||||
printf(" Neighbor capabilities:\n");
|
||||
- if (p->capa.peer.mp_v4) {
|
||||
- printf(" Multiprotocol extensions: IPv4");
|
||||
- print_neighbor_capa_mp_safi(p->capa.peer.mp_v4);
|
||||
- }
|
||||
- if (p->capa.peer.mp_v6) {
|
||||
- printf(" Multiprotocol extensions: IPv6");
|
||||
- print_neighbor_capa_mp_safi(p->capa.peer.mp_v6);
|
||||
+ if (hascapamp) {
|
||||
+ printf(" Multiprotocol extensions: ");
|
||||
+ print_neighbor_capa_mp(p);
|
||||
+ printf("\n");
|
||||
}
|
||||
if (p->capa.peer.refresh)
|
||||
printf(" Route Refresh\n");
|
||||
@@ -633,20 +666,16 @@ show_neighbor_msg(struct imsg *imsg, enu
|
||||
}
|
||||
|
||||
void
|
||||
-print_neighbor_capa_mp_safi(u_int8_t safi)
|
||||
+print_neighbor_capa_mp(struct peer *p)
|
||||
{
|
||||
- switch (safi) {
|
||||
- case SAFI_UNICAST:
|
||||
- printf(" Unicast");
|
||||
- break;
|
||||
- case SAFI_MULTICAST:
|
||||
- printf(" Multicast");
|
||||
- break;
|
||||
- default:
|
||||
- printf(" unknown (%u)", safi);
|
||||
- break;
|
||||
- }
|
||||
- printf("\n");
|
||||
+ int comma;
|
||||
+ u_int8_t i;
|
||||
+
|
||||
+ for (i = 0, comma = 0; i < AID_MAX; i++)
|
||||
+ if (p->capa.peer.mp[i]) {
|
||||
+ printf("%s%s", comma ? ", " : "", aid2str(i));
|
||||
+ comma = 1;
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
@@ -680,7 +709,7 @@ print_neighbor_msgstats(struct peer *p)
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -124,34 +292,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
{
|
||||
printf(" %-20s ", name);
|
||||
|
||||
@@ -738,7 +757,7 @@ show_fib_head(void)
|
||||
printf("flags: * = valid, B = BGP, C = Connected, S = Static\n");
|
||||
printf(" N = BGP Nexthop reachable via this route\n");
|
||||
printf(" r = reject route, b = blackhole route\n\n");
|
||||
- printf("flags destination gateway\n");
|
||||
+ printf("flags prio destination gateway\n");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -801,7 +820,7 @@ show_fib_msg(struct imsg *imsg)
|
||||
if (asprintf(&p, "%s/%u", inet_ntoa(k->prefix), k->prefixlen) ==
|
||||
-1)
|
||||
err(1, NULL);
|
||||
- printf("%-20s ", p);
|
||||
+ printf("%4i %-20s ", k->priority, p);
|
||||
free(p);
|
||||
|
||||
if (k->nexthop.s_addr)
|
||||
@@ -822,7 +841,7 @@ show_fib_msg(struct imsg *imsg)
|
||||
if (asprintf(&p, "%s/%u", log_in6addr(&k6->prefix),
|
||||
k6->prefixlen) == -1)
|
||||
err(1, NULL);
|
||||
- printf("%-20s ", p);
|
||||
+ printf("%4i %-20s ", k6->priority, p);
|
||||
free(p);
|
||||
|
||||
if (!IN6_IS_ADDR_UNSPECIFIED(&k6->nexthop))
|
||||
@@ -845,35 +864,77 @@ show_fib_msg(struct imsg *imsg)
|
||||
@@ -848,35 +877,70 @@ show_fib_msg(struct imsg *imsg)
|
||||
void
|
||||
show_nexthop_head(void)
|
||||
{
|
||||
|
@ -165,10 +306,10 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
show_nexthop_msg(struct imsg *imsg)
|
||||
{
|
||||
struct ctl_show_nexthop *p;
|
||||
- int ifms_type;
|
||||
+ struct kroute *k;
|
||||
+ struct kroute6 *k6;
|
||||
+ char *s;
|
||||
int ifms_type;
|
||||
|
||||
switch (imsg->hdr.type) {
|
||||
case IMSG_CTL_SHOW_NEXTHOP:
|
||||
|
@ -180,8 +321,8 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
+ printf("\n");
|
||||
+ return (0);
|
||||
+ }
|
||||
+ switch (p->addr.af) {
|
||||
+ case AF_INET:
|
||||
+ switch (p->addr.aid) {
|
||||
+ case AID_INET:
|
||||
+ k = &p->kr.kr4;
|
||||
+ if (asprintf(&s, "%s/%u", inet_ntoa(k->prefix),
|
||||
+ k->prefixlen) == -1)
|
||||
|
@ -192,7 +333,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
+ k->flags & F_CONNECTED ? "connected" :
|
||||
+ inet_ntoa(k->nexthop));
|
||||
+ break;
|
||||
+ case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
+ k6 = &p->kr.kr6;
|
||||
+ if (asprintf(&s, "%s/%u", log_in6addr(&k6->prefix),
|
||||
+ k6->prefixlen) == -1)
|
||||
|
@ -204,7 +345,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
+ log_in6addr(&k6->nexthop));
|
||||
+ break;
|
||||
+ default:
|
||||
+ printf("unknown address familiy %d\n", p->addr.af);
|
||||
+ printf("unknown address family\n");
|
||||
+ return (0);
|
||||
+ }
|
||||
if (p->kif.ifname[0]) {
|
||||
|
@ -217,24 +358,19 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
- get_media_descr(ifms_type),
|
||||
- get_linkstate(ifms_type,
|
||||
- p->kif.link_state));
|
||||
+ char *s1;
|
||||
+ ifms_type = ift2ifm(p->kif.media_type);
|
||||
+ if (LINK_STATE_IS_UP(p->kif.link_state)) {
|
||||
if (p->kif.baudrate) {
|
||||
- if (p->kif.baudrate) {
|
||||
- printf(", ");
|
||||
- print_baudrate(p->kif.baudrate);
|
||||
- }
|
||||
- }
|
||||
+ char *s1;
|
||||
+ if (p->kif.baudrate) {
|
||||
+ if (asprintf(&s1, ", %s",
|
||||
+ get_baudrate(p->kif.baudrate,
|
||||
+ "bps")) == -1)
|
||||
+ err(1, NULL);
|
||||
+ } else if (asprintf(&s1, ", %s", get_linkstate(
|
||||
+ ifms_type, p->kif.link_state)) == -1)
|
||||
+ err(1, NULL);
|
||||
+ } else if (ifms_type)
|
||||
+ if (asprintf(&s1, ", %s", get_linkstate(
|
||||
+ ifms_type, p->kif.link_state)) == -1)
|
||||
+ p->kif.media_type, p->kif.link_state)) == -1)
|
||||
+ err(1, NULL);
|
||||
+ if (asprintf(&s, "%s (%s%s)", p->kif.ifname,
|
||||
+ p->kif.flags & IFF_UP ? "UP" : "DOWN", s1) == -1)
|
||||
|
@ -245,8 +381,47 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
}
|
||||
printf("\n");
|
||||
break;
|
||||
@@ -952,17 +1013,25 @@ get_linkstate(int media_type, int link_s
|
||||
return ("unknown link state");
|
||||
@@ -898,9 +962,8 @@ show_interface_head(void)
|
||||
"Link state");
|
||||
}
|
||||
|
||||
-const int ifm_status_valid_list[] = IFM_STATUS_VALID_LIST;
|
||||
-const struct ifmedia_status_description
|
||||
- ifm_status_descriptions[] = IFM_STATUS_DESCRIPTIONS;
|
||||
+const struct if_status_description
|
||||
+ if_status_descriptions[] = LINK_STATE_DESCRIPTIONS;
|
||||
const struct ifmedia_description
|
||||
ifm_type_descriptions[] = IFM_TYPE_DESCRIPTIONS;
|
||||
|
||||
@@ -936,36 +999,36 @@ get_media_descr(int media_type)
|
||||
const char *
|
||||
get_linkstate(int media_type, int link_state)
|
||||
{
|
||||
- const struct ifmedia_status_description *p;
|
||||
- int i;
|
||||
+ const struct if_status_description *p;
|
||||
+ static char buf[8];
|
||||
|
||||
- if (link_state == LINK_STATE_UNKNOWN)
|
||||
- return ("unknown");
|
||||
-
|
||||
- for (i = 0; ifm_status_valid_list[i] != 0; i++)
|
||||
- for (p = ifm_status_descriptions; p->ifms_valid != 0; p++) {
|
||||
- if (p->ifms_type != media_type ||
|
||||
- p->ifms_valid != ifm_status_valid_list[i])
|
||||
- continue;
|
||||
- if (LINK_STATE_IS_UP(link_state))
|
||||
- return (p->ifms_string[1]);
|
||||
- return (p->ifms_string[0]);
|
||||
- }
|
||||
-
|
||||
- return ("unknown link state");
|
||||
+ for (p = if_status_descriptions; p->ifs_string != NULL; p++) {
|
||||
+ if (LINK_STATE_DESC_MATCH(p, media_type, link_state))
|
||||
+ return (p->ifs_string);
|
||||
+ }
|
||||
+ snprintf(buf, sizeof(buf), "[#%d]", link_state);
|
||||
+ return (buf);
|
||||
}
|
||||
|
||||
-void
|
||||
|
@ -277,42 +452,162 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
}
|
||||
|
||||
int
|
||||
@@ -987,8 +1056,7 @@ show_interface_msg(struct imsg *imsg)
|
||||
printf("link state %u", k->link_state);
|
||||
@@ -982,17 +1045,12 @@ show_interface_msg(struct imsg *imsg)
|
||||
printf("%-15s", k->flags & IFF_UP ? "UP" : "");
|
||||
|
||||
if (k->link_state != LINK_STATE_DOWN && k->baudrate > 0) {
|
||||
if ((ifms_type = ift2ifm(k->media_type)) != 0)
|
||||
- printf("%s, %s", get_media_descr(ifms_type),
|
||||
- get_linkstate(ifms_type, k->link_state));
|
||||
- else if (k->link_state == LINK_STATE_UNKNOWN)
|
||||
- printf("unknown");
|
||||
- else
|
||||
- printf("link state %u", k->link_state);
|
||||
+ printf("%s, ", get_media_descr(ifms_type));
|
||||
|
||||
- if (k->link_state != LINK_STATE_DOWN && k->baudrate > 0) {
|
||||
- printf(", ");
|
||||
- print_baudrate(k->baudrate);
|
||||
- }
|
||||
+ printf("%s", get_linkstate(k->media_type, k->link_state));
|
||||
+
|
||||
+ if (k->link_state != LINK_STATE_DOWN && k->baudrate > 0)
|
||||
+ printf(", %s", get_baudrate(k->baudrate, "Bit/s"));
|
||||
}
|
||||
printf("\n");
|
||||
break;
|
||||
@@ -1186,8 +1254,8 @@ show_rib_detail_msg(struct imsg *imsg, i
|
||||
case ATTR_AGGREGATOR:
|
||||
case IMSG_CTL_END:
|
||||
@@ -1011,7 +1069,7 @@ show_rib_summary_head(void)
|
||||
printf(
|
||||
"flags: * = Valid, > = Selected, I = via IBGP, A = Announced\n");
|
||||
printf("origin: i = IGP, e = EGP, ? = Incomplete\n\n");
|
||||
- printf("%-5s %-20s%-15s %5s %5s %s\n", "flags", "destination",
|
||||
+ printf("%-5s %-20s %-15s %5s %5s %s\n", "flags", "destination",
|
||||
"gateway", "lpref", "med", "aspath origin");
|
||||
}
|
||||
|
||||
@@ -1085,7 +1143,7 @@ show_rib_summary_msg(struct imsg *imsg)
|
||||
memcpy(&rib, imsg->data, sizeof(rib));
|
||||
|
||||
print_prefix(&rib.prefix, rib.prefixlen, rib.flags);
|
||||
- printf("%-15s ", log_addr(&rib.exit_nexthop));
|
||||
+ printf(" %-15s ", log_addr(&rib.exit_nexthop));
|
||||
|
||||
printf(" %5u %5u ", rib.local_pref, rib.med);
|
||||
|
||||
@@ -1190,7 +1248,7 @@ show_rib_detail_msg(struct imsg *imsg, i
|
||||
memcpy(&as, data, sizeof(as));
|
||||
memcpy(&id, data + sizeof(as), sizeof(id));
|
||||
- printf(" Aggregator: %s [%s]\n", log_as(as),
|
||||
- inet_ntoa(id));
|
||||
+ printf(" Aggregator: %s [%s]\n",
|
||||
+ log_as(htonl(as)), inet_ntoa(id));
|
||||
printf(" Aggregator: %s [%s]\n",
|
||||
- log_as(htonl(as)), inet_ntoa(id));
|
||||
+ log_as(ntohl(as)), inet_ntoa(id));
|
||||
break;
|
||||
case ATTR_ORIGINATOR_ID:
|
||||
memcpy(&id, data, sizeof(id));
|
||||
@@ -1249,6 +1317,9 @@ show_rib_memory_msg(struct imsg *imsg)
|
||||
printf("%10lld IPv6 network entries using "
|
||||
"%s of memory\n", (long long)stats.pt6_cnt,
|
||||
fmt_mem(stats.pt6_cnt * sizeof(struct pt_entry6)));
|
||||
+ printf("%10lld rib entries using %s of memory\n",
|
||||
+ (long long)stats.rib_cnt, fmt_mem(stats.rib_cnt *
|
||||
+ sizeof(struct rib_entry)));
|
||||
printf("%10lld prefix entries using %s of memory\n",
|
||||
(long long)stats.prefix_cnt, fmt_mem(stats.prefix_cnt *
|
||||
sizeof(struct prefix)));
|
||||
@@ -1270,6 +1341,7 @@ show_rib_memory_msg(struct imsg *imsg)
|
||||
stats.pt4_cnt * sizeof(struct pt_entry4) +
|
||||
stats.pt6_cnt * sizeof(struct pt_entry6) +
|
||||
@@ -1236,22 +1294,27 @@ fmt_mem(int64_t num)
|
||||
return (buf);
|
||||
}
|
||||
|
||||
+size_t pt_sizes[AID_MAX] = AID_PTSIZE;
|
||||
+
|
||||
int
|
||||
show_rib_memory_msg(struct imsg *imsg)
|
||||
{
|
||||
struct rde_memstats stats;
|
||||
+ size_t pts = 0;
|
||||
+ int i;
|
||||
|
||||
switch (imsg->hdr.type) {
|
||||
case IMSG_CTL_SHOW_RIB_MEM:
|
||||
memcpy(&stats, imsg->data, sizeof(stats));
|
||||
printf("RDE memory statistics\n");
|
||||
- printf("%10lld IPv4 network entries using %s of memory\n",
|
||||
- (long long)stats.pt4_cnt, fmt_mem(stats.pt4_cnt *
|
||||
- sizeof(struct pt_entry4)));
|
||||
- if (stats.pt6_cnt != 0)
|
||||
- printf("%10lld IPv6 network entries using "
|
||||
- "%s of memory\n", (long long)stats.pt6_cnt,
|
||||
- fmt_mem(stats.pt6_cnt * sizeof(struct pt_entry6)));
|
||||
+ for (i = 0; i < AID_MAX; i++) {
|
||||
+ if (stats.pt_cnt[i] == 0)
|
||||
+ continue;
|
||||
+ pts += stats.pt_cnt[i] * pt_sizes[i];
|
||||
+ printf("%10lld %s network entries using %s of memory\n",
|
||||
+ (long long)stats.pt_cnt[i], aid_vals[i].name,
|
||||
+ fmt_mem(stats.pt_cnt[i] * pt_sizes[i]));
|
||||
+ }
|
||||
printf("%10lld rib entries using %s of memory\n",
|
||||
(long long)stats.rib_cnt, fmt_mem(stats.rib_cnt *
|
||||
sizeof(struct rib_entry)));
|
||||
@@ -1272,9 +1335,7 @@ show_rib_memory_msg(struct imsg *imsg)
|
||||
(long long)stats.attr_refs);
|
||||
printf("%10lld BGP attributes using %s of memory\n",
|
||||
(long long)stats.attr_dcnt, fmt_mem(stats.attr_data));
|
||||
- printf("RIB using %s of memory\n", fmt_mem(
|
||||
- stats.pt4_cnt * sizeof(struct pt_entry4) +
|
||||
- stats.pt6_cnt * sizeof(struct pt_entry6) +
|
||||
+ printf("RIB using %s of memory\n", fmt_mem(pts +
|
||||
stats.prefix_cnt * sizeof(struct prefix) +
|
||||
+ stats.rib_cnt * sizeof(struct rib_entry) +
|
||||
stats.rib_cnt * sizeof(struct rib_entry) +
|
||||
stats.path_cnt * sizeof(struct rde_aspath) +
|
||||
stats.aspath_size + stats.attr_cnt * sizeof(struct attr) +
|
||||
stats.attr_data));
|
||||
@@ -1328,30 +1389,6 @@ show_community(u_char *data, u_int16_t l
|
||||
}
|
||||
}
|
||||
|
||||
-const char *
|
||||
-get_ext_subtype(u_int8_t type)
|
||||
-{
|
||||
- static char etype[6];
|
||||
-
|
||||
- switch (type) {
|
||||
- case EXT_COMMUNITY_ROUTE_TGT:
|
||||
- return "rt"; /* route target */
|
||||
- case EXT_CUMMUNITY_ROUTE_ORIG:
|
||||
- return "soo"; /* source of origin */
|
||||
- case EXT_COMMUNITY_OSPF_DOM_ID:
|
||||
- return "odi"; /* ospf domain id */
|
||||
- case EXT_COMMUNITY_OSPF_RTR_TYPE:
|
||||
- return "ort"; /* ospf route type */
|
||||
- case EXT_COMMUNITY_OSPF_RTR_ID:
|
||||
- return "ori"; /* ospf router id */
|
||||
- case EXT_COMMUNITY_BGP_COLLECT:
|
||||
- return "bdc"; /* bgp data collection */
|
||||
- default:
|
||||
- snprintf(etype, sizeof(etype), "[%i]", (int)type);
|
||||
- return etype;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
void
|
||||
show_ext_community(u_char *data, u_int16_t len)
|
||||
{
|
||||
@@ -1372,24 +1409,25 @@ show_ext_community(u_char *data, u_int16
|
||||
case EXT_COMMUNITY_TWO_AS:
|
||||
memcpy(&as2, data + i + 2, sizeof(as2));
|
||||
memcpy(&u32, data + i + 4, sizeof(u32));
|
||||
- printf("%s %hu:%u", get_ext_subtype(subtype), as2, u32);
|
||||
+ printf("%s %s:%u", log_ext_subtype(subtype),
|
||||
+ log_as(ntohs(as2)), ntohl(u32));
|
||||
break;
|
||||
case EXT_COMMUNITY_IPV4:
|
||||
memcpy(&ip, data + i + 2, sizeof(ip));
|
||||
memcpy(&u16, data + i + 6, sizeof(u16));
|
||||
- printf("%s %s:%hu", get_ext_subtype(subtype),
|
||||
- inet_ntoa(ip), u16);
|
||||
+ printf("%s %s:%hu", log_ext_subtype(subtype),
|
||||
+ inet_ntoa(ip), ntohs(u16));
|
||||
break;
|
||||
case EXT_COMMUNITY_FOUR_AS:
|
||||
memcpy(&as4, data + i + 2, sizeof(as4));
|
||||
memcpy(&u16, data + i + 6, sizeof(u16));
|
||||
- printf("%s %s:%hu", get_ext_subtype(subtype),
|
||||
- log_as(as4), u16);
|
||||
+ printf("%s %s:%hu", log_ext_subtype(subtype),
|
||||
+ log_as(ntohl(as4)), ntohs(u16));
|
||||
break;
|
||||
case EXT_COMMUNITY_OPAQUE:
|
||||
memcpy(&ext, data + i, sizeof(ext));
|
||||
ext = betoh64(ext) & 0xffffffffffffLL;
|
||||
- printf("%s 0x%llx", get_ext_subtype(subtype), ext);
|
||||
+ printf("%s 0x%llx", log_ext_subtype(subtype), ext);
|
||||
break;
|
||||
default:
|
||||
memcpy(&ext, data + i, sizeof(ext));
|
||||
|
|
|
@ -1,271 +0,0 @@
|
|||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ bgpctl/fmt_scaled.c 2008-03-18 13:27:29.000000000 +0100
|
||||
@@ -0,0 +1,268 @@
|
||||
+/* $OpenBSD: fmt_scaled.c,v 1.9 2007/03/20 03:42:52 tedu Exp $ */
|
||||
+
|
||||
+/*
|
||||
+ * Copyright (c) 2001, 2002, 2003 Ian F. Darwin. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ * 1. Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * 3. The name of the author may not be used to endorse or promote products
|
||||
+ * derived from this software without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * fmt_scaled: Format numbers scaled for human comprehension
|
||||
+ * scan_scaled: Scan numbers in this format.
|
||||
+ *
|
||||
+ * "Human-readable" output uses 4 digits max, and puts a unit suffix at
|
||||
+ * the end. Makes output compact and easy-to-read esp. on huge disks.
|
||||
+ * Formatting code was originally in OpenBSD "df", converted to library routine.
|
||||
+ * Scanning code written for OpenBSD libutil.
|
||||
+ */
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <errno.h>
|
||||
+#include <string.h>
|
||||
+#include <ctype.h>
|
||||
+#include <limits.h>
|
||||
+
|
||||
+#include "util.h"
|
||||
+
|
||||
+typedef enum {
|
||||
+ NONE = 0, KILO = 1, MEGA = 2, GIGA = 3, TERA = 4, PETA = 5, EXA = 6
|
||||
+} unit_type;
|
||||
+
|
||||
+/* These three arrays MUST be in sync! XXX make a struct */
|
||||
+static unit_type units[] = { NONE, KILO, MEGA, GIGA, TERA, PETA, EXA };
|
||||
+static char scale_chars[] = "BKMGTPE";
|
||||
+static long long scale_factors[] = {
|
||||
+ 1LL,
|
||||
+ 1024LL,
|
||||
+ 1024LL*1024,
|
||||
+ 1024LL*1024*1024,
|
||||
+ 1024LL*1024*1024*1024,
|
||||
+ 1024LL*1024*1024*1024*1024,
|
||||
+ 1024LL*1024*1024*1024*1024*1024,
|
||||
+};
|
||||
+#define SCALE_LENGTH (sizeof(units)/sizeof(units[0]))
|
||||
+
|
||||
+#define MAX_DIGITS (SCALE_LENGTH * 3) /* XXX strlen(sprintf("%lld", -1)? */
|
||||
+
|
||||
+/** Convert the given input string "scaled" into numeric in "result".
|
||||
+ * Return 0 on success, -1 and errno set on error.
|
||||
+ */
|
||||
+int
|
||||
+scan_scaled(char *scaled, long long *result)
|
||||
+{
|
||||
+ char *p = scaled;
|
||||
+ int sign = 0;
|
||||
+ unsigned int i, ndigits = 0, fract_digits = 0;
|
||||
+ long long scale_fact = 1, whole = 0, fpart = 0;
|
||||
+
|
||||
+ /* Skip leading whitespace */
|
||||
+ while (isascii(*p) && isspace(*p))
|
||||
+ ++p;
|
||||
+
|
||||
+ /* Then at most one leading + or - */
|
||||
+ while (*p == '-' || *p == '+') {
|
||||
+ if (*p == '-') {
|
||||
+ if (sign) {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ sign = -1;
|
||||
+ ++p;
|
||||
+ } else if (*p == '+') {
|
||||
+ if (sign) {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ sign = +1;
|
||||
+ ++p;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Main loop: Scan digits, find decimal point, if present.
|
||||
+ * We don't allow exponentials, so no scientific notation
|
||||
+ * (but note that E for Exa might look like e to some!).
|
||||
+ * Advance 'p' to end, to get scale factor.
|
||||
+ */
|
||||
+ for (; isascii(*p) && (isdigit(*p) || *p=='.'); ++p) {
|
||||
+ if (*p == '.') {
|
||||
+ if (fract_digits > 0) { /* oops, more than one '.' */
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ fract_digits = 1;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ i = (*p) - '0'; /* whew! finally a digit we can use */
|
||||
+ if (fract_digits > 0) {
|
||||
+ if (fract_digits >= MAX_DIGITS-1)
|
||||
+ /* ignore extra fractional digits */
|
||||
+ continue;
|
||||
+ fract_digits++; /* for later scaling */
|
||||
+ fpart *= 10;
|
||||
+ fpart += i;
|
||||
+ } else { /* normal digit */
|
||||
+ if (++ndigits >= MAX_DIGITS) {
|
||||
+ errno = ERANGE;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ whole *= 10;
|
||||
+ whole += i;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (sign) {
|
||||
+ whole *= sign;
|
||||
+ fpart *= sign;
|
||||
+ }
|
||||
+
|
||||
+ /* If no scale factor given, we're done. fraction is discarded. */
|
||||
+ if (!*p) {
|
||||
+ *result = whole;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* Validate scale factor, and scale whole and fraction by it. */
|
||||
+ for (i = 0; i < SCALE_LENGTH; i++) {
|
||||
+
|
||||
+ /** Are we there yet? */
|
||||
+ if (*p == scale_chars[i] ||
|
||||
+ *p == tolower(scale_chars[i])) {
|
||||
+
|
||||
+ /* If it ends with alphanumerics after the scale char, bad. */
|
||||
+ if (isalnum(*(p+1))) {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ scale_fact = scale_factors[i];
|
||||
+
|
||||
+ /* scale whole part */
|
||||
+ whole *= scale_fact;
|
||||
+
|
||||
+ /* truncate fpart so it does't overflow.
|
||||
+ * then scale fractional part.
|
||||
+ */
|
||||
+ while (fpart >= LLONG_MAX / scale_fact) {
|
||||
+ fpart /= 10;
|
||||
+ fract_digits--;
|
||||
+ }
|
||||
+ fpart *= scale_fact;
|
||||
+ if (fract_digits > 0) {
|
||||
+ for (i = 0; i < fract_digits -1; i++)
|
||||
+ fpart /= 10;
|
||||
+ }
|
||||
+ whole += fpart;
|
||||
+ *result = whole;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+ errno = ERANGE;
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+/* Format the given "number" into human-readable form in "result".
|
||||
+ * Result must point to an allocated buffer of length FMT_SCALED_STRSIZE.
|
||||
+ * Return 0 on success, -1 and errno set if error.
|
||||
+ */
|
||||
+int
|
||||
+fmt_scaled(long long number, char *result)
|
||||
+{
|
||||
+ long long abval, fract = 0;
|
||||
+ unsigned int i;
|
||||
+ unit_type unit = NONE;
|
||||
+
|
||||
+ abval = (number < 0LL) ? -number : number; /* no long long_abs yet */
|
||||
+
|
||||
+ /* Not every negative long long has a positive representation.
|
||||
+ * Also check for numbers that are just too darned big to format
|
||||
+ */
|
||||
+ if (abval < 0 || abval / 1024 >= scale_factors[SCALE_LENGTH-1]) {
|
||||
+ errno = ERANGE;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ /* scale whole part; get unscaled fraction */
|
||||
+ for (i = 0; i < SCALE_LENGTH; i++) {
|
||||
+ if (abval/1024 < scale_factors[i]) {
|
||||
+ unit = units[i];
|
||||
+ fract = (i == 0) ? 0 : abval % scale_factors[i];
|
||||
+ number /= scale_factors[i];
|
||||
+ if (i > 0)
|
||||
+ fract /= scale_factors[i - 1];
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fract = (10 * fract + 512) / 1024;
|
||||
+ /* if the result would be >= 10, round main number */
|
||||
+ if (fract == 10) {
|
||||
+ if (number >= 0)
|
||||
+ number++;
|
||||
+ else
|
||||
+ number--;
|
||||
+ fract = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (number == 0)
|
||||
+ strlcpy(result, "0B", FMT_SCALED_STRSIZE);
|
||||
+ else if (unit == NONE || number >= 100 || number <= -100) {
|
||||
+ if (fract >= 5) {
|
||||
+ if (number >= 0)
|
||||
+ number++;
|
||||
+ else
|
||||
+ number--;
|
||||
+ }
|
||||
+ (void)snprintf(result, FMT_SCALED_STRSIZE, "%lld%c",
|
||||
+ number, scale_chars[unit]);
|
||||
+ } else
|
||||
+ (void)snprintf(result, FMT_SCALED_STRSIZE, "%lld.%1lld%c",
|
||||
+ number, fract, scale_chars[unit]);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#ifdef MAIN
|
||||
+/*
|
||||
+ * This is the original version of the program in the man page.
|
||||
+ * Copy-and-paste whatever you need from it.
|
||||
+ */
|
||||
+int
|
||||
+main(int argc, char **argv)
|
||||
+{
|
||||
+ char *cinput = "1.5K", buf[FMT_SCALED_STRSIZE];
|
||||
+ long long ninput = 10483892, result;
|
||||
+
|
||||
+ if (scan_scaled(cinput, &result) == 0)
|
||||
+ printf("\"%s\" -> %lld\n", cinput, result);
|
||||
+ else
|
||||
+ perror(cinput);
|
||||
+
|
||||
+ if (fmt_scaled(ninput, buf) == 0)
|
||||
+ printf("%lld -> \"%s\"\n", ninput, buf);
|
||||
+ else
|
||||
+ fprintf(stderr, "%lld invalid (%s)\n", ninput, strerror(errno));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
|
@ -1,23 +0,0 @@
|
|||
Index: bgpctl/irr_asset.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/irr_asset.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpctl/irr_asset.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/irr_asset.c 9 Jul 2009 16:49:55 -0000 1.1.1.2
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: irr_asset.c,v 1.7 2007/03/31 12:46:55 henning Exp $ */
|
||||
+/* $OpenBSD: irr_asset.c,v 1.8 2009/04/14 21:10:54 jj Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Henning Brauer <henning@openbsd.org>
|
||||
@@ -105,7 +105,7 @@ asset_get(char *name)
|
||||
break;
|
||||
case T_AUTNUM:
|
||||
/*
|
||||
- * make a dummy as-set with the the AS both as name
|
||||
+ * make a dummy as-set with the AS both as name
|
||||
* and its only member
|
||||
*/
|
||||
asset_add_as(ass, name);
|
|
@ -1,16 +1,41 @@
|
|||
Index: bgpctl/irr_parser.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/irr_parser.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.2
|
||||
diff -u -p -r1.1.1.1 -r1.2
|
||||
--- bgpctl/irr_parser.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/irr_parser.c 30 Jun 2009 06:40:06 -0000 1.2
|
||||
@@ -18,6 +18,7 @@
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.5 -r1.4
|
||||
--- bgpctl/irr_parser.c 14 Feb 2010 20:20:14 -0000 1.1.1.5
|
||||
+++ bgpctl/irr_parser.c 4 Feb 2010 16:22:26 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: irr_parser.c,v 1.8 2007/03/05 22:34:08 henning Exp $ */
|
||||
+/* $OpenBSD: irr_parser.c,v 1.9 2009/09/08 15:40:25 claudio Exp $ */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
+
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
/*
|
||||
* Copyright (c) 2007 Henning Brauer <henning@openbsd.org>
|
||||
@@ -81,6 +81,7 @@ parse_response(FILE *f, enum qtype qtype
|
||||
return (-1);
|
||||
break;
|
||||
case QTYPE_ROUTE:
|
||||
+ case QTYPE_ROUTE6:
|
||||
if ((n = parse_route(key, val)) == -1)
|
||||
return (-1);
|
||||
break;
|
||||
@@ -281,7 +282,7 @@ parse_policy(char *key, char *val)
|
||||
!isdigit(tok[2]))
|
||||
errx(1, "peering spec \"%s\": format "
|
||||
"error, AS expected", tok);
|
||||
- pi->peer_as = strtonum(tok + 2, 1, USHRT_MAX,
|
||||
+ pi->peer_as = strtonum(tok + 2, 1, UINT_MAX,
|
||||
&errstr);
|
||||
if (errstr)
|
||||
errx(1, "peering spec \"%s\": format "
|
||||
@@ -407,7 +408,8 @@ parse_asset(char *key, char *val)
|
||||
int
|
||||
parse_route(char *key, char *val)
|
||||
{
|
||||
- if (strcmp(key, "route")) /* ignore everything else */
|
||||
+ if (strcmp(key, "route") && strcmp(key, "route6"))
|
||||
+ /* ignore everything else */
|
||||
return (0);
|
||||
|
||||
/* route is single-value, but seen trailing , in the wild */
|
||||
|
|
156
net/openbgpd/files/patch-bgpctl_irr_prefix.c
Normal file
156
net/openbgpd/files/patch-bgpctl_irr_prefix.c
Normal file
|
@ -0,0 +1,156 @@
|
|||
Index: bgpctl/irr_prefix.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/irr_prefix.c,v
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.1.1.6
|
||||
diff -u -p -r1.1.1.5 -r1.1.1.6
|
||||
--- bgpctl/irr_prefix.c 14 Feb 2010 20:20:14 -0000 1.1.1.5
|
||||
+++ bgpctl/irr_prefix.c 14 Feb 2010 20:27:21 -0000 1.1.1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: irr_prefix.c,v 1.15 2007/05/27 18:54:25 henning Exp $ */
|
||||
+/* $OpenBSD: irr_prefix.c,v 1.17 2009/09/08 16:11:36 sthen Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Henning Brauer <henning@openbsd.org>
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "irrfilter.h"
|
||||
+#include "bgpd.h"
|
||||
|
||||
void prefixset_aggregate(struct prefix_set *);
|
||||
int prefix_aggregate(struct irr_prefix *, const struct irr_prefix *);
|
||||
@@ -63,7 +64,11 @@ prefixset_get(char *as)
|
||||
fflush(stdout);
|
||||
}
|
||||
curpfxs = pfxs;
|
||||
- if (whois(as, QTYPE_ROUTE) == -1)
|
||||
+ if ((irrflags & F_IPV4) && whois(as, QTYPE_ROUTE) == -1)
|
||||
+ errx(1, "whois error, prefixset_get %s", as);
|
||||
+ if ((irrflags & F_IPV6) && whois(as, QTYPE_ROUTE6) == -1)
|
||||
+ errx(1, "whois error, prefixset_get %s", as);
|
||||
+ if (whois(as, QTYPE_ROUTE6) == -1)
|
||||
errx(1, "whois error, prefixset_get %s", as);
|
||||
curpfxs = NULL;
|
||||
if (irrverbose >= 3)
|
||||
@@ -80,9 +85,11 @@ prefixset_addmember(char *s)
|
||||
void *p;
|
||||
u_int i;
|
||||
struct irr_prefix *pfx;
|
||||
- int len;
|
||||
+ int len, ret;
|
||||
+ char *slash;
|
||||
+ const char *errstr;
|
||||
|
||||
- if (strchr(s, '/') == NULL) {
|
||||
+ if ((slash = strchr(s, '/')) == NULL) {
|
||||
fprintf(stderr, "%s: prefix %s does not have the len "
|
||||
"specified, ignoring\n", curpfxs->as, s);
|
||||
return (0);
|
||||
@@ -92,17 +99,26 @@ prefixset_addmember(char *s)
|
||||
err(1, "prefixset_addmember calloc");
|
||||
|
||||
if ((len = inet_net_pton(AF_INET, s, &pfx->addr.in,
|
||||
- sizeof(pfx->addr.in))) == -1) {
|
||||
- if (errno == ENOENT) {
|
||||
- fprintf(stderr, "%s: prefix \"%s\": parse error\n",
|
||||
+ sizeof(pfx->addr.in))) != -1) {
|
||||
+ pfx->af = AF_INET;
|
||||
+ } else {
|
||||
+ len = strtonum(slash + 1, 0, 128, &errstr);
|
||||
+ if (errstr)
|
||||
+ errx(1, "prefixset_addmember %s prefix %s: prefixlen "
|
||||
+ "is %s", curpfxs->as, s, errstr);
|
||||
+ *slash = '\0';
|
||||
+
|
||||
+ if ((ret = inet_pton(AF_INET6, s, &pfx->addr.in6)) == -1)
|
||||
+ err(1, "prefixset_addmember %s prefix \"%s\"",
|
||||
curpfxs->as, s);
|
||||
+ else if (ret == 0) {
|
||||
+ fprintf(stderr, "prefixset_addmember %s prefix \"%s\": "
|
||||
+ "No matching address family found", curpfxs->as, s);
|
||||
+ free(pfx);
|
||||
return (0);
|
||||
- } else
|
||||
- err(1, "prefixset_addmember %s inet_net_pton \"%s\"",
|
||||
- curpfxs->as, s);
|
||||
+ }
|
||||
+ pfx->af = AF_INET6;
|
||||
}
|
||||
-
|
||||
- pfx->af = AF_INET;
|
||||
pfx->len = pfx->maxlen = len;
|
||||
|
||||
/* yes, there are dupes... e. g. from multiple sources */
|
||||
@@ -175,24 +191,47 @@ prefixset_aggregate(struct prefix_set *p
|
||||
int
|
||||
prefix_aggregate(struct irr_prefix *a, const struct irr_prefix *b)
|
||||
{
|
||||
- in_addr_t mask;
|
||||
+ in_addr_t mask;
|
||||
+ struct in6_addr ma;
|
||||
+ struct in6_addr mb;
|
||||
|
||||
if (a->len == 0)
|
||||
return (1);
|
||||
|
||||
- mask = htonl(0xffffffff << (32 - a->len));
|
||||
+ if (a->af != b->af)
|
||||
+ /* We cannot aggregate addresses of different families. */
|
||||
+ return (0);
|
||||
|
||||
- if ((a->addr.in.s_addr & mask) == (b->addr.in.s_addr & mask))
|
||||
- return (1);
|
||||
+ if (a->af == AF_INET) {
|
||||
+ mask = htonl(prefixlen2mask(a->len));
|
||||
+ if ((a->addr.in.s_addr & mask) == (b->addr.in.s_addr & mask))
|
||||
+ return (1);
|
||||
+ } else if (a->af == AF_INET6) {
|
||||
+ inet6applymask(&ma, &a->addr.in6, a->len);
|
||||
+ inet6applymask(&mb, &b->addr.in6, a->len);
|
||||
+ if (IN6_ARE_ADDR_EQUAL(&ma, &mb))
|
||||
+ return (1);
|
||||
+ }
|
||||
|
||||
/* see wether we can fold them in one */
|
||||
if (a->len == b->len && a->len > 1) {
|
||||
- mask = htonl(0xffffffff << (32 - (a->len - 1)));
|
||||
- if ((a->addr.in.s_addr & mask) ==
|
||||
- (b->addr.in.s_addr & mask)) {
|
||||
- a->len--;
|
||||
- a->addr.in.s_addr &= mask;
|
||||
- return (1);
|
||||
+ if (a->af == AF_INET) {
|
||||
+ mask = htonl(prefixlen2mask(a->len - 1));
|
||||
+ if ((a->addr.in.s_addr & mask) ==
|
||||
+ (b->addr.in.s_addr & mask)) {
|
||||
+ a->len--;
|
||||
+ a->addr.in.s_addr &= mask;
|
||||
+ return (1);
|
||||
+ }
|
||||
+ } else if (a->af == AF_INET6) {
|
||||
+ inet6applymask(&ma, &a->addr.in6, a->len - 1);
|
||||
+ inet6applymask(&mb, &b->addr.in6, a->len - 1);
|
||||
+
|
||||
+ if (IN6_ARE_ADDR_EQUAL(&ma, &mb)) {
|
||||
+ a->len--;
|
||||
+ memcpy(&a->addr.in6, &ma, sizeof(ma));
|
||||
+ return (1);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,6 +258,13 @@ irr_prefix_cmp(const void *a, const void
|
||||
if (ntohl(pa->addr.in.s_addr) >
|
||||
ntohl(pb->addr.in.s_addr))
|
||||
return (1);
|
||||
+ } else if (pa->af == AF_INET6) {
|
||||
+ for (r = 0; r < 16; r++) {
|
||||
+ if (pa->addr.in6.s6_addr[r] < pb->addr.in6.s6_addr[r])
|
||||
+ return (-1);
|
||||
+ if (pa->addr.in6.s6_addr[r] > pb->addr.in6.s6_addr[r])
|
||||
+ return (1);
|
||||
+ }
|
||||
} else
|
||||
errx(1, "irr_prefix_cmp unknown af %u", pa->af);
|
||||
|
|
@ -1,12 +1,18 @@
|
|||
Index: bgpctl/irrfilter.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/irrfilter.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.2
|
||||
diff -u -p -r1.1.1.1 -r1.2
|
||||
--- bgpctl/irrfilter.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/irrfilter.h 30 Jun 2009 06:40:06 -0000 1.2
|
||||
@@ -16,6 +16,10 @@
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.5 -r1.3
|
||||
--- bgpctl/irrfilter.h 14 Feb 2010 20:20:14 -0000 1.1.1.5
|
||||
+++ bgpctl/irrfilter.h 4 Feb 2010 16:22:26 -0000 1.3
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: irrfilter.h,v 1.7 2007/03/06 16:45:34 henning Exp $ */
|
||||
+/* $OpenBSD: irrfilter.h,v 1.9 2009/09/08 16:11:36 sthen Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Henning Brauer <henning@openbsd.org>
|
||||
@@ -16,11 +16,17 @@
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
|
@ -17,3 +23,37 @@ diff -u -p -r1.1.1.1 -r1.2
|
|||
#include <sys/queue.h>
|
||||
#include <sys/tree.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define F_IMPORTONLY 0x01 /* skip export: items */
|
||||
+#define F_IPV4 0x02 /* use IPv4 items */
|
||||
+#define F_IPV6 0x04 /* use IPv6 items */
|
||||
|
||||
int irrflags;
|
||||
int irrverbose;
|
||||
@@ -37,7 +43,7 @@ struct policy_item {
|
||||
char *action;
|
||||
char *filter;
|
||||
enum pdir dir;
|
||||
- u_int16_t peer_as;
|
||||
+ u_int32_t peer_as;
|
||||
};
|
||||
|
||||
TAILQ_HEAD(policy_head, policy_item);
|
||||
@@ -55,7 +61,8 @@ enum qtype {
|
||||
QTYPE_NONE,
|
||||
QTYPE_OWNAS,
|
||||
QTYPE_ASSET,
|
||||
- QTYPE_ROUTE
|
||||
+ QTYPE_ROUTE,
|
||||
+ QTYPE_ROUTE6
|
||||
};
|
||||
|
||||
struct as_set {
|
||||
@@ -72,6 +79,7 @@ struct as_set {
|
||||
struct irr_prefix {
|
||||
union {
|
||||
struct in_addr in;
|
||||
+ struct in6_addr in6;
|
||||
} addr;
|
||||
sa_family_t af;
|
||||
u_int8_t len;
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpctl/parser.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/parser.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.1 -r1.3
|
||||
--- bgpctl/parser.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/parser.c 9 Jul 2009 17:22:12 -0000 1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpctl/parser.c 14 Feb 2010 20:20:14 -0000 1.1.1.6
|
||||
+++ bgpctl/parser.c 4 Feb 2010 16:22:26 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: parser.c,v 1.50 2008/06/15 09:58:43 claudio Exp $ */
|
||||
+/* $OpenBSD: parser.c,v 1.54 2009/06/12 16:44:02 claudio Exp $ */
|
||||
-/* $OpenBSD: parser.c,v 1.54 2009/06/12 16:44:02 claudio Exp $ */
|
||||
+/* $OpenBSD: parser.c,v 1.60 2010/01/13 06:04:00 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
|
@ -23,126 +23,144 @@ diff -u -p -r1.1.1.1 -r1.3
|
|||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
@@ -42,6 +46,7 @@ enum token_type {
|
||||
ASTYPE,
|
||||
PREFIX,
|
||||
PEERDESC,
|
||||
+ RIBNAME,
|
||||
COMMUNITY,
|
||||
LOCALPREF,
|
||||
MED,
|
||||
@@ -72,6 +77,7 @@ static const struct token t_show_summary
|
||||
static const struct token t_show_fib[];
|
||||
static const struct token t_show_rib[];
|
||||
static const struct token t_show_rib_neigh[];
|
||||
+static const struct token t_show_rib_rib[];
|
||||
static const struct token t_show_neighbor[];
|
||||
static const struct token t_show_neighbor_modifiers[];
|
||||
static const struct token t_fib[];
|
||||
@@ -148,6 +154,7 @@ static const struct token t_show_rib[] =
|
||||
{ FLAG, "in", F_CTL_ADJ_IN, t_show_rib},
|
||||
{ FLAG, "out", F_CTL_ADJ_OUT, t_show_rib},
|
||||
{ KEYWORD, "neighbor", NONE, t_show_rib_neigh},
|
||||
+ { KEYWORD, "table", NONE, t_show_rib_rib},
|
||||
{ KEYWORD, "summary", SHOW_SUMMARY, t_show_summary},
|
||||
{ KEYWORD, "memory", SHOW_RIB_MEM, NULL},
|
||||
{ FAMILY, "", NONE, t_show_rib},
|
||||
@@ -161,6 +168,11 @@ static const struct token t_show_rib_nei
|
||||
@@ -97,6 +101,7 @@ static const struct token t_prepself[];
|
||||
static const struct token t_weight[];
|
||||
static const struct token t_irrfilter[];
|
||||
static const struct token t_irrfilter_opts[];
|
||||
+static const struct token t_log[];
|
||||
|
||||
static const struct token t_main[] = {
|
||||
{ KEYWORD, "reload", RELOAD, NULL},
|
||||
@@ -105,6 +110,7 @@ static const struct token t_main[] = {
|
||||
{ KEYWORD, "neighbor", NEIGHBOR, t_neighbor},
|
||||
{ KEYWORD, "network", NONE, t_network},
|
||||
{ KEYWORD, "irrfilter", IRRFILTER, t_irrfilter},
|
||||
+ { KEYWORD, "log", NONE, t_log},
|
||||
{ ENDTOKEN, "", NONE, NULL}
|
||||
};
|
||||
|
||||
+static const struct token t_show_rib_rib[] = {
|
||||
+ { RIBNAME, "", NONE, t_show_rib},
|
||||
@@ -311,6 +317,12 @@ static const struct token t_irrfilter_op
|
||||
{ ENDTOKEN, "", NONE, NULL}
|
||||
};
|
||||
|
||||
+static const struct token t_log[] = {
|
||||
+ { KEYWORD, "verbose", LOG_VERBOSE, NULL},
|
||||
+ { KEYWORD, "brief", LOG_BRIEF, NULL},
|
||||
+ { ENDTOKEN, "", NONE, NULL}
|
||||
+};
|
||||
+
|
||||
static const struct token t_show_neighbor[] = {
|
||||
{ NOTOKEN, "", NONE, NULL},
|
||||
{ PEERADDRESS, "", NONE, t_show_neighbor_modifiers},
|
||||
@@ -456,6 +468,15 @@ match_token(int *argc, char **argv[], co
|
||||
t = &table[i];
|
||||
}
|
||||
static struct parse_result res;
|
||||
|
||||
const struct token *match_token(int *argc, char **argv[],
|
||||
@@ -336,6 +348,7 @@ parse(int argc, char *argv[])
|
||||
bzero(&res, sizeof(res));
|
||||
res.community.as = COMMUNITY_UNSET;
|
||||
res.community.type = COMMUNITY_UNSET;
|
||||
+ res.flags = (F_IPV4 | F_IPV6);
|
||||
TAILQ_INIT(&res.set);
|
||||
if ((res.irr_outdir = getcwd(NULL, 0)) == NULL) {
|
||||
fprintf(stderr, "getcwd failed: %s", strerror(errno));
|
||||
@@ -404,15 +417,22 @@ match_token(int *argc, char **argv[], co
|
||||
case FAMILY:
|
||||
if (word == NULL)
|
||||
break;
|
||||
+ case RIBNAME:
|
||||
+ if (!match && word != NULL && strlen(word) > 0) {
|
||||
+ if (strlcpy(res.rib, word, sizeof(res.rib)) >=
|
||||
+ sizeof(res.rib))
|
||||
+ errx(1, "rib name too long");
|
||||
- if (!strcmp(word, "inet") || !strcmp(word, "IPv4")) {
|
||||
+ if (!strcmp(word, "inet") ||
|
||||
+ !strcasecmp(word, "IPv4")) {
|
||||
+ match++;
|
||||
+ t = &table[i];
|
||||
+ res.aid = AID_INET;
|
||||
+ }
|
||||
+ break;
|
||||
case COMMUNITY:
|
||||
if (word != NULL && strlen(word) > 0 &&
|
||||
parse_community(word, &res)) {
|
||||
@@ -547,6 +568,9 @@ show_valid_args(const struct token table
|
||||
case PEERDESC:
|
||||
fprintf(stderr, " <neighbor description>\n");
|
||||
+ if (!strcmp(word, "inet6") ||
|
||||
+ !strcasecmp(word, "IPv6")) {
|
||||
match++;
|
||||
t = &table[i];
|
||||
- res.af = AF_INET;
|
||||
+ res.aid = AID_INET6;
|
||||
}
|
||||
- if (!strcmp(word, "inet6") || !strcmp(word, "IPv6")) {
|
||||
+ if (!strcasecmp(word, "VPNv4")) {
|
||||
match++;
|
||||
t = &table[i];
|
||||
- res.af = AF_INET6;
|
||||
+ res.aid = AID_VPN_IPv4;
|
||||
}
|
||||
break;
|
||||
+ case RIBNAME:
|
||||
+ fprintf(stderr, " <rib name>\n");
|
||||
+ break;
|
||||
case COMMUNITY:
|
||||
fprintf(stderr, " <community>\n");
|
||||
case ADDRESS:
|
||||
@@ -584,7 +604,7 @@ show_valid_args(const struct token table
|
||||
fprintf(stderr, " <pftable>\n");
|
||||
break;
|
||||
@@ -686,7 +710,7 @@ parse_asnum(const char *word, u_int32_t
|
||||
case FAMILY:
|
||||
- fprintf(stderr, " [ inet | inet6 | IPv4 | IPv6 ]\n");
|
||||
+ fprintf(stderr, " [ inet | inet6 | IPv4 | IPv6 | VPNv4 ]\n");
|
||||
break;
|
||||
case GETOPT:
|
||||
fprintf(stderr, " <options>\n");
|
||||
@@ -608,7 +628,7 @@ parse_addr(const char *word, struct bgpd
|
||||
bzero(&ina, sizeof(ina));
|
||||
|
||||
if (inet_net_pton(AF_INET, word, &ina, sizeof(ina)) != -1) {
|
||||
- addr->af = AF_INET;
|
||||
+ addr->aid = AID_INET;
|
||||
addr->v4 = ina;
|
||||
return (1);
|
||||
}
|
||||
@@ -618,13 +638,7 @@ parse_addr(const char *word, struct bgpd
|
||||
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
if (getaddrinfo(word, "0", &hints, &r) == 0) {
|
||||
- addr->af = AF_INET6;
|
||||
- memcpy(&addr->v6,
|
||||
- &((struct sockaddr_in6 *)r->ai_addr)->sin6_addr,
|
||||
- sizeof(addr->v6));
|
||||
- addr->scope_id =
|
||||
- ((struct sockaddr_in6 *)r->ai_addr)->sin6_scope_id;
|
||||
-
|
||||
+ sa2addr(r->ai_addr, addr);
|
||||
freeaddrinfo(r);
|
||||
return (1);
|
||||
}
|
||||
@@ -663,15 +677,15 @@ parse_prefix(const char *word, struct bg
|
||||
if (parse_addr(word, addr) == 0)
|
||||
return (0);
|
||||
|
||||
- switch (addr->af) {
|
||||
- case AF_INET:
|
||||
+ switch (addr->aid) {
|
||||
+ case AID_INET:
|
||||
if (mask == -1)
|
||||
mask = 32;
|
||||
if (mask > 32)
|
||||
errx(1, "invalid netmask: too large");
|
||||
addr->v4.s_addr = addr->v4.s_addr & htonl(prefixlen2mask(mask));
|
||||
break;
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
if (mask == -1)
|
||||
mask = 128;
|
||||
inet6applymask(&addr->v6, &addr->v6, mask);
|
||||
@@ -706,7 +720,7 @@ parse_asnum(const char *word, u_int32_t
|
||||
if (errstr)
|
||||
errx(1, "AS number is %s: %s", errstr, word);
|
||||
} else {
|
||||
- uval = strtonum(word, 0, USHRT_MAX - 1, &errstr);
|
||||
+ uval = strtonum(word, 0, ASNUM_MAX - 1, &errstr);
|
||||
- uval = strtonum(word, 0, ASNUM_MAX - 1, &errstr);
|
||||
+ uval = strtonum(word, 0, UINT_MAX, &errstr);
|
||||
if (errstr)
|
||||
errx(1, "AS number is %s: %s", errstr, word);
|
||||
}
|
||||
@@ -801,7 +825,7 @@ parse_community(const char *word, struct
|
||||
type = getcommunity(p);
|
||||
@@ -882,8 +896,14 @@ bgpctl_getopt(int *argc, char **argv[],
|
||||
int ch;
|
||||
|
||||
done:
|
||||
- if (as == 0 || as == USHRT_MAX) {
|
||||
+ if (as == 0) {
|
||||
fprintf(stderr, "Invalid community\n");
|
||||
return (0);
|
||||
}
|
||||
@@ -814,7 +838,7 @@ done:
|
||||
optind = optreset = 1;
|
||||
- while ((ch = getopt((*argc) + 1, (*argv) - 1, "o:")) != -1) {
|
||||
+ while ((ch = getopt((*argc) + 1, (*argv) - 1, "46o:")) != -1) {
|
||||
switch (ch) {
|
||||
+ case '4':
|
||||
+ res.flags = (res.flags | F_IPV4) & ~F_IPV6;
|
||||
+ break;
|
||||
+ case '6':
|
||||
+ res.flags = (res.flags | F_IPV6) & ~F_IPV4;
|
||||
+ break;
|
||||
case 'o':
|
||||
res.irr_outdir = optarg;
|
||||
break;
|
||||
default:
|
||||
/* unknown */
|
||||
- fprintf(stderr, "Invalid well-known community\n");
|
||||
+ fprintf(stderr, "Unknown well-known community\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -856,33 +880,6 @@ parse_nexthop(const char *word, struct p
|
||||
return (1);
|
||||
}
|
||||
|
||||
-/* XXX local copies from kroute.c, should go to a shared file */
|
||||
-in_addr_t
|
||||
-prefixlen2mask(u_int8_t prefixlen)
|
||||
-{
|
||||
- if (prefixlen == 0)
|
||||
- return (0);
|
||||
-
|
||||
- return (0xffffffff << (32 - prefixlen));
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-inet6applymask(struct in6_addr *dest, const struct in6_addr *src, int prefixlen)
|
||||
-{
|
||||
- struct in6_addr mask;
|
||||
- int i;
|
||||
-
|
||||
- bzero(&mask, sizeof(mask));
|
||||
- for (i = 0; i < prefixlen / 8; i++)
|
||||
- mask.s6_addr[i] = 0xff;
|
||||
- i = prefixlen % 8;
|
||||
- if (i)
|
||||
- mask.s6_addr[prefixlen / 8] = 0xff00 >> i;
|
||||
-
|
||||
- for (i = 0; i < 16; i++)
|
||||
- dest->s6_addr[i] = src->s6_addr[i] & mask.s6_addr[i];
|
||||
-}
|
||||
-
|
||||
int
|
||||
bgpctl_getopt(int *argc, char **argv[], int type)
|
||||
{
|
||||
|
|
|
@ -1,22 +1,32 @@
|
|||
Index: bgpctl/parser.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/parser.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpctl/parser.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpctl/parser.h 9 Jul 2009 16:49:55 -0000 1.1.1.2
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.1.1.7
|
||||
diff -u -p -r1.1.1.6 -r1.1.1.7
|
||||
--- bgpctl/parser.h 14 Feb 2010 20:20:14 -0000 1.1.1.6
|
||||
+++ bgpctl/parser.h 14 Feb 2010 20:27:21 -0000 1.1.1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: parser.h,v 1.18 2008/06/07 18:14:41 henning Exp $ */
|
||||
+/* $OpenBSD: parser.h,v 1.19 2009/06/06 06:05:41 claudio Exp $ */
|
||||
-/* $OpenBSD: parser.h,v 1.19 2009/06/06 06:05:41 claudio Exp $ */
|
||||
+/* $OpenBSD: parser.h,v 1.21 2010/01/10 00:16:23 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -56,6 +56,7 @@ struct parse_result {
|
||||
struct filter_set_head set;
|
||||
struct filter_community community;
|
||||
char peerdesc[PEER_DESCR_LEN];
|
||||
+ char rib[PEER_DESCR_LEN];
|
||||
char *irr_outdir;
|
||||
@@ -37,6 +37,8 @@ enum actions {
|
||||
FIB,
|
||||
FIB_COUPLE,
|
||||
FIB_DECOUPLE,
|
||||
+ LOG_VERBOSE,
|
||||
+ LOG_BRIEF,
|
||||
NEIGHBOR,
|
||||
NEIGHBOR_UP,
|
||||
NEIGHBOR_DOWN,
|
||||
@@ -61,7 +63,7 @@ struct parse_result {
|
||||
int flags;
|
||||
enum actions action;
|
||||
u_int8_t prefixlen;
|
||||
- sa_family_t af;
|
||||
+ u_int8_t aid;
|
||||
};
|
||||
|
||||
__dead void usage(void);
|
||||
|
|
|
@ -1,122 +0,0 @@
|
|||
--- /dev/null 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ bgpctl/util.h 2008-03-18 13:27:29.000000000 +0100
|
||||
@@ -0,0 +1,119 @@
|
||||
+/* $OpenBSD: util.h,v 1.27 2006/06/14 02:14:25 krw Exp $ */
|
||||
+/* $NetBSD: util.h,v 1.2 1996/05/16 07:00:22 thorpej Exp $ */
|
||||
+
|
||||
+/*-
|
||||
+ * Copyright (c) 1995
|
||||
+ * The Regents of the University of California. All rights reserved.
|
||||
+ * Portions Copyright (c) 1996, Jason Downs. All rights reserved.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions
|
||||
+ * are met:
|
||||
+ * 1. Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * 2. Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * 3. Neither the name of the University nor the names of its contributors
|
||||
+ * may be used to endorse or promote products derived from this software
|
||||
+ * without specific prior written permission.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
+ * SUCH DAMAGE.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _UTIL_H_
|
||||
+#define _UTIL_H_
|
||||
+
|
||||
+#include <sys/cdefs.h>
|
||||
+#include <sys/types.h>
|
||||
+
|
||||
+/*
|
||||
+ * fparseln() specific operation flags.
|
||||
+ */
|
||||
+#define FPARSELN_UNESCESC 0x01
|
||||
+#define FPARSELN_UNESCCONT 0x02
|
||||
+#define FPARSELN_UNESCCOMM 0x04
|
||||
+#define FPARSELN_UNESCREST 0x08
|
||||
+#define FPARSELN_UNESCALL 0x0f
|
||||
+
|
||||
+/*
|
||||
+ * opendev() specific operation flags.
|
||||
+ */
|
||||
+#define OPENDEV_PART 0x01 /* Try to open the raw partition. */
|
||||
+#define OPENDEV_BLCK 0x04 /* Open block, not character device. */
|
||||
+
|
||||
+/*
|
||||
+ * uucplock(3) specific flags.
|
||||
+ */
|
||||
+#define UU_LOCK_INUSE (1)
|
||||
+#define UU_LOCK_OK (0)
|
||||
+#define UU_LOCK_OPEN_ERR (-1)
|
||||
+#define UU_LOCK_READ_ERR (-2)
|
||||
+#define UU_LOCK_CREAT_ERR (-3)
|
||||
+#define UU_LOCK_WRITE_ERR (-4)
|
||||
+#define UU_LOCK_LINK_ERR (-5)
|
||||
+#define UU_LOCK_TRY_ERR (-6)
|
||||
+#define UU_LOCK_OWNER_ERR (-7)
|
||||
+
|
||||
+/*
|
||||
+ * fmt_scaled(3) specific flags.
|
||||
+ */
|
||||
+#define FMT_SCALED_STRSIZE 7 /* minus sign, 4 digits, suffix, null byte */
|
||||
+
|
||||
+/*
|
||||
+ * stub struct definitions.
|
||||
+ */
|
||||
+struct __sFILE;
|
||||
+struct login_cap;
|
||||
+struct passwd;
|
||||
+struct termios;
|
||||
+struct utmp;
|
||||
+struct winsize;
|
||||
+
|
||||
+__BEGIN_DECLS
|
||||
+char *fparseln(struct __sFILE *, size_t *, size_t *, const char[3], int);
|
||||
+void login(struct utmp *);
|
||||
+int login_tty(int);
|
||||
+int logout(const char *);
|
||||
+void logwtmp(const char *, const char *, const char *);
|
||||
+int opendev(char *, int, int, char **);
|
||||
+int pidfile(const char *);
|
||||
+void pw_setdir(const char *);
|
||||
+char *pw_file(const char *);
|
||||
+int pw_lock(int retries);
|
||||
+int pw_mkdb(char *, int);
|
||||
+int pw_abort(void);
|
||||
+void pw_init(void);
|
||||
+void pw_edit(int, const char *);
|
||||
+void pw_prompt(void);
|
||||
+void pw_copy(int, int, const struct passwd *, const struct passwd *);
|
||||
+int pw_scan(char *, struct passwd *, int *);
|
||||
+void pw_error(const char *, int, int);
|
||||
+int openpty(int *, int *, char *, struct termios *, struct winsize *);
|
||||
+int opendisk(const char *path, int flags, char *buf, size_t buflen,
|
||||
+ int iscooked);
|
||||
+pid_t forkpty(int *, char *, struct termios *, struct winsize *);
|
||||
+int getmaxpartitions(void);
|
||||
+int getrawpartition(void);
|
||||
+void login_fbtab(const char *, uid_t, gid_t);
|
||||
+int login_check_expire(struct __sFILE *, struct passwd *, char *, int);
|
||||
+char *readlabelfs(char *, int);
|
||||
+const char *uu_lockerr(int _uu_lockresult);
|
||||
+int uu_lock(const char *_ttyname);
|
||||
+int uu_lock_txfr(const char *_ttyname, pid_t _pid);
|
||||
+int uu_unlock(const char *_ttyname);
|
||||
+int fmt_scaled(long long number, char *result);
|
||||
+int scan_scaled(char *scaled, long long *result);
|
||||
+__END_DECLS
|
||||
+
|
||||
+#endif /* !_UTIL_H_ */
|
24
net/openbgpd/files/patch-bgpctl_whois.c
Normal file
24
net/openbgpd/files/patch-bgpctl_whois.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
Index: bgpctl/whois.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/whois.c,v
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.1.1.6
|
||||
diff -u -p -r1.1.1.5 -r1.1.1.6
|
||||
--- bgpctl/whois.c 14 Feb 2010 20:20:14 -0000 1.1.1.5
|
||||
+++ bgpctl/whois.c 14 Feb 2010 20:27:21 -0000 1.1.1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: whois.c,v 1.3 2007/03/05 16:43:24 henning Exp $ */
|
||||
+/* $OpenBSD: whois.c,v 1.4 2009/09/08 15:40:25 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Henning Brauer <henning@openbsd.org>
|
||||
@@ -68,7 +68,8 @@ char *qtype_opts[] = {
|
||||
"",
|
||||
"-T aut-num",
|
||||
"-K -T as-set",
|
||||
- "-K -T route -i origin"
|
||||
+ "-K -T route -i origin",
|
||||
+ "-K -T route6 -i origin"
|
||||
};
|
||||
|
||||
char *server = "whois.radb.net";
|
|
@ -1,20 +1,18 @@
|
|||
Index: bgpd/Makefile
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/Makefile,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.1 -r1.6
|
||||
--- bgpd/Makefile 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
diff -u -p -r1.1.1.2 -r1.6
|
||||
--- bgpd/Makefile 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
+++ bgpd/Makefile 9 Jul 2009 17:22:14 -0000 1.6
|
||||
@@ -1,17 +1,23 @@
|
||||
-# $OpenBSD: Makefile,v 1.27 2007/12/20 17:08:47 henning Exp $
|
||||
+# $OpenBSD: Makefile,v 1.28 2009/06/25 14:14:54 deraadt Exp $
|
||||
@@ -1,15 +1,23 @@
|
||||
# $OpenBSD: Makefile,v 1.28 2009/06/25 14:14:54 deraadt Exp $
|
||||
|
||||
-.PATH: ${.CURDIR}/..
|
||||
+.PATH: ${.CURDIR}/.. ${.CURDIR}/../openbsd-compat
|
||||
+
|
||||
+CONFFILE?= ${PREFIX}/etc/bgpd.conf
|
||||
|
||||
+
|
||||
PROG= bgpd
|
||||
SRCS= bgpd.c buffer.c session.c log.c parse.y config.c imsg.c \
|
||||
rde.c rde_rib.c rde_decide.c rde_prefix.c mrt.c kroute.c \
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpd/bgpd.8
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.8,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.1 -r1.6
|
||||
--- bgpd/bgpd.8 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/bgpd.8 22 Oct 2009 15:10:02 -0000 1.6
|
||||
retrieving revision 1.1.1.8
|
||||
retrieving revision 1.7
|
||||
diff -u -p -r1.1.1.8 -r1.7
|
||||
--- bgpd/bgpd.8 14 Feb 2010 20:19:57 -0000 1.1.1.8
|
||||
+++ bgpd/bgpd.8 4 Feb 2010 16:22:23 -0000 1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-.\" $OpenBSD: bgpd.8,v 1.27 2007/05/31 19:20:22 jmc Exp $
|
||||
+.\" $OpenBSD: bgpd.8,v 1.29 2009/08/06 08:53:11 claudio Exp $
|
||||
-.\" $OpenBSD: bgpd.8,v 1.28 2009/01/13 23:01:36 sthen Exp $
|
||||
+.\" $OpenBSD: bgpd.8,v 1.33 2009/12/16 15:40:55 claudio Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
.\"
|
||||
|
@ -16,8 +16,8 @@ diff -u -p -r1.1.1.1 -r1.6
|
|||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
-.Dd $Mdocdate: May 31 2007 $
|
||||
+.Dd $Mdocdate: September 2 2009 $
|
||||
-.Dd $Mdocdate: January 13 2009 $
|
||||
+.Dd $Mdocdate: October 26 2009 $
|
||||
.Dt BGPD 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -51,7 +51,19 @@ diff -u -p -r1.1.1.1 -r1.6
|
|||
default
|
||||
.Nm
|
||||
configuration file
|
||||
@@ -175,11 +175,6 @@ control socket
|
||||
@@ -165,6 +165,11 @@ control socket
|
||||
.%D August 1998
|
||||
.Re
|
||||
.Rs
|
||||
+.%R RFC 2545
|
||||
+.%T "Use of BGP-4 Multiprotocol Extensions for IPv6 Inter-Domain Routing"
|
||||
+.%D March 1999
|
||||
+.Re
|
||||
+.Rs
|
||||
.%R RFC 2796
|
||||
.%T "BGP Route Reflection - An Alternative to Full Mesh IBGP"
|
||||
.%D April 2000
|
||||
@@ -175,11 +180,6 @@ control socket
|
||||
.%D September 2000
|
||||
.Re
|
||||
.Rs
|
||||
|
@ -63,10 +75,15 @@ diff -u -p -r1.1.1.1 -r1.6
|
|||
.%R RFC 3682
|
||||
.%T "The Generalized TTL Security Mechanism (GTSM)"
|
||||
.%D February 2004
|
||||
@@ -190,14 +185,29 @@ control socket
|
||||
@@ -190,6 +190,16 @@ control socket
|
||||
.%D April 2004
|
||||
.Re
|
||||
.Rs
|
||||
+.%R RFC 4360
|
||||
+.%T "BGP Extended Communities Attribute"
|
||||
+.%D February 2006
|
||||
+.Re
|
||||
+.Rs
|
||||
+.%R RFC 4486
|
||||
+.%T "BGP Cease Notification Message Subcodes"
|
||||
+.%D April 2006
|
||||
|
@ -75,14 +92,10 @@ diff -u -p -r1.1.1.1 -r1.6
|
|||
.%R RFC 4760
|
||||
.%T "Multiprotocol Extensions for BGP-4"
|
||||
.%D January 2007
|
||||
.Re
|
||||
.Rs
|
||||
-.%R draft-ietf-idr-as4bytes-13
|
||||
+.%R RFC 4893
|
||||
@@ -199,6 +209,16 @@ control socket
|
||||
.%T "BGP Support for Four-octet AS Number Space"
|
||||
-.%D February 2007
|
||||
+.%D May 2007
|
||||
+.Re
|
||||
.%D May 2007
|
||||
.Re
|
||||
+.Rs
|
||||
+.%R RFC 5492
|
||||
+.%T "Capabilities Advertisement with BGP-4"
|
||||
|
@ -92,6 +105,7 @@ diff -u -p -r1.1.1.1 -r1.6
|
|||
+.%R draft-ietf-idr-optional-transitive-00
|
||||
+.%T "Error Handling for Optional Transitive BGP Attributes"
|
||||
+.%D April 2009
|
||||
.Re
|
||||
+.Re
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
|
|
|
@ -1,72 +1,145 @@
|
|||
Index: bgpd/bgpd.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.3
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.3
|
||||
--- bgpd/bgpd.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/bgpd.c 10 Aug 2009 21:09:57 -0000 1.1.1.3
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.1.1.8
|
||||
diff -u -p -r1.1.1.7 -r1.1.1.8
|
||||
--- bgpd/bgpd.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/bgpd.c 14 Feb 2010 20:27:06 -0000 1.1.1.8
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: bgpd.c,v 1.145 2008/05/12 19:15:02 pyr Exp $ */
|
||||
+/* $OpenBSD: bgpd.c,v 1.149 2009/07/20 15:00:13 claudio Exp $ */
|
||||
-/* $OpenBSD: bgpd.c,v 1.148 2009/06/07 00:30:23 claudio Exp $ */
|
||||
+/* $OpenBSD: bgpd.c,v 1.154 2010/02/11 14:40:06 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -58,6 +58,7 @@ volatile sig_atomic_t reconfig = 0;
|
||||
pid_t reconfpid = 0;
|
||||
struct imsgbuf *ibuf_se;
|
||||
struct imsgbuf *ibuf_rde;
|
||||
+struct rib_names ribnames = SIMPLEQ_HEAD_INITIALIZER(ribnames);
|
||||
|
||||
void
|
||||
sighdlr(int sig)
|
||||
@@ -108,6 +109,7 @@ main(int argc, char *argv[])
|
||||
struct filter_rule *r;
|
||||
@@ -101,15 +101,11 @@ int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
struct bgpd_config conf;
|
||||
- struct peer *peer_l, *p;
|
||||
struct mrt_head mrt_l;
|
||||
- struct network_head net_l;
|
||||
+ struct peer *peer_l, *p;
|
||||
struct filter_head *rules_l;
|
||||
- struct network *net;
|
||||
- struct filter_rule *r;
|
||||
struct mrt *m;
|
||||
struct listen_addr *la;
|
||||
+ struct rde_rib *rr;
|
||||
- struct rde_rib *rr;
|
||||
struct pollfd pfd[POLL_MAX];
|
||||
pid_t io_pid = 0, rde_pid = 0, pid;
|
||||
char *conffile;
|
||||
@@ -181,7 +183,8 @@ main(int argc, char *argv[])
|
||||
@@ -129,9 +125,8 @@ main(int argc, char *argv[])
|
||||
err(1, NULL);
|
||||
|
||||
if (conf.opts & BGPD_OPT_NOACTION) {
|
||||
bzero(&conf, sizeof(conf));
|
||||
- LIST_INIT(&mrt_l);
|
||||
- TAILQ_INIT(&net_l);
|
||||
TAILQ_INIT(rules_l);
|
||||
+ LIST_INIT(&mrt_l);
|
||||
peer_l = NULL;
|
||||
conf.csock = SOCKET_NAME;
|
||||
|
||||
@@ -158,6 +153,7 @@ main(int argc, char *argv[])
|
||||
if (conf.opts & BGPD_OPT_VERBOSE)
|
||||
- print_config(&conf, &net_l, peer_l, rules_l, &mrt_l);
|
||||
+ print_config(&conf, &ribnames, &net_l, peer_l, rules_l,
|
||||
+ &mrt_l);
|
||||
else
|
||||
fprintf(stderr, "configuration OK\n");
|
||||
exit(0);
|
||||
@@ -225,9 +228,9 @@ main(int argc, char *argv[])
|
||||
prepare_listeners(&conf);
|
||||
conf.opts |= BGPD_OPT_VERBOSE2;
|
||||
conf.opts |= BGPD_OPT_VERBOSE;
|
||||
+ log_verbose(1);
|
||||
break;
|
||||
case 'r':
|
||||
conf.rcsock = optarg;
|
||||
@@ -176,12 +172,15 @@ main(int argc, char *argv[])
|
||||
if (argc > 0)
|
||||
usage();
|
||||
|
||||
- if (parse_config(conffile, &conf, &mrt_l, &peer_l, &net_l, rules_l)) {
|
||||
- free(rules_l);
|
||||
- exit(1);
|
||||
- }
|
||||
-
|
||||
if (conf.opts & BGPD_OPT_NOACTION) {
|
||||
+ struct network_head net_l;
|
||||
+ TAILQ_INIT(&net_l);
|
||||
+ if (parse_config(conffile, &conf, &mrt_l, &peer_l, &net_l,
|
||||
+ rules_l)) {
|
||||
+ free(rules_l);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
if (conf.opts & BGPD_OPT_VERBOSE)
|
||||
print_config(&conf, &ribnames, &net_l, peer_l, rules_l,
|
||||
&mrt_l);
|
||||
@@ -225,13 +224,10 @@ main(int argc, char *argv[])
|
||||
session_socket_blockmode(pipe_s2r_c[0], BM_NONBLOCK);
|
||||
session_socket_blockmode(pipe_s2r_c[1], BM_NONBLOCK);
|
||||
|
||||
- prepare_listeners(&conf);
|
||||
-
|
||||
/* fork children */
|
||||
- rde_pid = rde_main(&conf, peer_l, &net_l, rules_l, &mrt_l,
|
||||
+ rde_pid = rde_main(&conf, peer_l, &net_l, rules_l, &mrt_l, &ribnames,
|
||||
pipe_m2r, pipe_s2r, pipe_m2s, pipe_s2r_c, debug);
|
||||
- io_pid = session_main(&conf, peer_l, &net_l, rules_l, &mrt_l,
|
||||
+ io_pid = session_main(&conf, peer_l, &net_l, rules_l, &mrt_l, &ribnames,
|
||||
pipe_m2s, pipe_s2r, pipe_m2r, pipe_s2r_c);
|
||||
- rde_pid = rde_main(&conf, peer_l, &net_l, rules_l, &mrt_l, &ribnames,
|
||||
- pipe_m2r, pipe_s2r, pipe_m2s, pipe_s2r_c, debug);
|
||||
- io_pid = session_main(&conf, peer_l, &net_l, rules_l, &mrt_l, &ribnames,
|
||||
- pipe_m2s, pipe_s2r, pipe_m2r, pipe_s2r_c);
|
||||
+ rde_pid = rde_main(pipe_m2r, pipe_s2r, pipe_m2s, pipe_s2r_c, debug);
|
||||
+ io_pid = session_main(pipe_m2s, pipe_s2r, pipe_m2r, pipe_s2r_c,
|
||||
+ conf.csock, conf.rcsock);
|
||||
|
||||
setproctitle("parent");
|
||||
@@ -271,6 +274,10 @@ main(int argc, char *argv[])
|
||||
close(la->fd);
|
||||
la->fd = -1;
|
||||
|
||||
@@ -254,33 +250,13 @@ main(int argc, char *argv[])
|
||||
imsg_init(ibuf_se, pipe_m2s[0]);
|
||||
imsg_init(ibuf_rde, pipe_m2r[0]);
|
||||
mrt_init(ibuf_rde, ibuf_se);
|
||||
+ quit = reconfigure(conffile, &conf, &mrt_l, &peer_l, rules_l);
|
||||
if ((rfd = kr_init(!(conf.flags & BGPD_FLAG_NO_FIB_UPDATE),
|
||||
conf.rtableid)) == -1)
|
||||
quit = 1;
|
||||
if (pftable_clear_all() != 0)
|
||||
quit = 1;
|
||||
|
||||
- while ((net = TAILQ_FIRST(&net_l)) != NULL) {
|
||||
- TAILQ_REMOVE(&net_l, net, entry);
|
||||
- filterset_free(&net->net.attrset);
|
||||
- free(net);
|
||||
- }
|
||||
-
|
||||
- while ((r = TAILQ_FIRST(rules_l)) != NULL) {
|
||||
- TAILQ_REMOVE(rules_l, r, entry);
|
||||
- free(r);
|
||||
- }
|
||||
- TAILQ_FOREACH(la, conf.listen_addrs, entry) {
|
||||
- close(la->fd);
|
||||
- la->fd = -1;
|
||||
- }
|
||||
- while ((rr = SIMPLEQ_FIRST(&ribnames))) {
|
||||
- SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
|
||||
- free(rr);
|
||||
- }
|
||||
-
|
||||
- mrt_reconfigure(&mrt_l);
|
||||
-
|
||||
while (quit == 0) {
|
||||
bzero(pfd, sizeof(pfd));
|
||||
pfd[PFD_PIPE_SESSION].fd = ibuf_se->fd;
|
||||
@@ -389,11 +365,12 @@ main(int argc, char *argv[])
|
||||
LIST_REMOVE(m, entry);
|
||||
free(m);
|
||||
}
|
||||
+ while ((rr = SIMPLEQ_FIRST(&ribnames))) {
|
||||
+ SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
|
||||
+ free(rr);
|
||||
- while ((la = TAILQ_FIRST(conf.listen_addrs)) != NULL) {
|
||||
- TAILQ_REMOVE(conf.listen_addrs, la, entry);
|
||||
- close(la->fd);
|
||||
- free(la);
|
||||
- }
|
||||
+ if (conf.listen_addrs)
|
||||
+ while ((la = TAILQ_FIRST(conf.listen_addrs)) != NULL) {
|
||||
+ TAILQ_REMOVE(conf.listen_addrs, la, entry);
|
||||
+ close(la->fd);
|
||||
+ free(la);
|
||||
+ }
|
||||
|
||||
mrt_reconfigure(&mrt_l);
|
||||
|
||||
@@ -452,10 +459,15 @@ reconfigure(char *conffile, struct bgpd_
|
||||
struct peer *p;
|
||||
struct filter_rule *r;
|
||||
struct listen_addr *la;
|
||||
+ struct rde_rib *rr;
|
||||
|
||||
free(rules_l);
|
||||
control_cleanup(conf.csock);
|
||||
@@ -464,6 +441,10 @@ reconfigure(char *conffile, struct bgpd_
|
||||
if (parse_config(conffile, conf, mrt_l, peer_l, &net_l, rules_l)) {
|
||||
log_warnx("config file %s has errors, not reloading",
|
||||
conffile);
|
||||
|
@ -77,19 +150,59 @@ diff -u -p -r1.1.1.1 -r1.1.1.3
|
|||
return (1);
|
||||
}
|
||||
|
||||
@@ -488,6 +500,15 @@ reconfigure(char *conffile, struct bgpd_
|
||||
la->fd = -1;
|
||||
}
|
||||
@@ -550,8 +531,8 @@ int
|
||||
dispatch_imsg(struct imsgbuf *ibuf, int idx)
|
||||
{
|
||||
struct imsg imsg;
|
||||
- int n;
|
||||
- int rv;
|
||||
+ ssize_t n;
|
||||
+ int rv, verbose;
|
||||
|
||||
+ /* RIBs for the RDE */
|
||||
+ while ((rr = SIMPLEQ_FIRST(&ribnames))) {
|
||||
+ SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
|
||||
+ if (imsg_compose(ibuf_rde, IMSG_RECONF_RIB, 0, 0, -1,
|
||||
+ rr, sizeof(struct rde_rib)) == -1)
|
||||
+ return (-1);
|
||||
+ free(rr);
|
||||
+ }
|
||||
+
|
||||
/* networks for the RDE */
|
||||
while ((n = TAILQ_FIRST(&net_l)) != NULL) {
|
||||
if (imsg_compose(ibuf_rde, IMSG_NETWORK_ADD, 0, 0, -1,
|
||||
if ((n = imsg_read(ibuf)) == -1)
|
||||
return (-1);
|
||||
@@ -692,6 +673,11 @@ dispatch_imsg(struct imsgbuf *ibuf, int
|
||||
carp_demote_set(msg->demote_group, msg->level);
|
||||
}
|
||||
break;
|
||||
+ case IMSG_CTL_LOG_VERBOSE:
|
||||
+ /* already checked by SE */
|
||||
+ memcpy(&verbose, imsg.data, sizeof(verbose));
|
||||
+ log_verbose(verbose);
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -707,7 +693,7 @@ send_nexthop_update(struct kroute_nextho
|
||||
{
|
||||
char *gw = NULL;
|
||||
|
||||
- if (msg->gateway.af)
|
||||
+ if (msg->gateway.aid)
|
||||
if (asprintf(&gw, ": via %s",
|
||||
log_addr(&msg->gateway)) == -1) {
|
||||
log_warn("send_nexthop_update");
|
||||
@@ -717,7 +703,7 @@ send_nexthop_update(struct kroute_nextho
|
||||
log_info("nexthop %s now %s%s%s", log_addr(&msg->nexthop),
|
||||
msg->valid ? "valid" : "invalid",
|
||||
msg->connected ? ": directly connected" : "",
|
||||
- msg->gateway.af ? gw : "");
|
||||
+ msg->gateway.aid ? gw : "");
|
||||
|
||||
free(gw);
|
||||
|
||||
@@ -758,12 +744,12 @@ bgpd_redistribute(int type, struct krout
|
||||
fatalx("bgpd_redistribute: unable to redistribute v4 and v6"
|
||||
"together");
|
||||
if (kr != NULL) {
|
||||
- net.prefix.af = AF_INET;
|
||||
+ net.prefix.aid = AID_INET;
|
||||
net.prefix.v4.s_addr = kr->prefix.s_addr;
|
||||
net.prefixlen = kr->prefixlen;
|
||||
}
|
||||
if (kr6 != NULL) {
|
||||
- net.prefix.af = AF_INET6;
|
||||
+ net.prefix.aid = AID_INET6;
|
||||
memcpy(&net.prefix.v6, &kr6->prefix, sizeof(struct in6_addr));
|
||||
net.prefixlen = kr6->prefixlen;
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpd/bgpd.conf.5
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.conf.5,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.5
|
||||
diff -u -p -r1.1.1.1 -r1.5
|
||||
--- bgpd/bgpd.conf.5 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/bgpd.conf.5 22 Oct 2009 15:10:02 -0000 1.5
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.7 -r1.6
|
||||
--- bgpd/bgpd.conf.5 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/bgpd.conf.5 4 Feb 2010 16:22:23 -0000 1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-.\" $OpenBSD: bgpd.conf.5,v 1.88 2008/03/22 08:38:38 claudio Exp $
|
||||
+.\" $OpenBSD: bgpd.conf.5,v 1.94 2009/06/07 00:31:22 claudio Exp $
|
||||
-.\" $OpenBSD: bgpd.conf.5,v 1.94 2009/06/07 00:31:22 claudio Exp $
|
||||
+.\" $OpenBSD: bgpd.conf.5,v 1.103 2009/12/16 15:40:55 claudio Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
.\" Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
|
@ -16,73 +16,39 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
.\"
|
||||
-.Dd $Mdocdate: March 22 2008 $
|
||||
+.Dd $Mdocdate: October 6 2009 $
|
||||
-.Dd $Mdocdate: June 7 2009 $
|
||||
+.Dd $Mdocdate: November 26 2009 $
|
||||
.Dt BGPD.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
@@ -123,14 +123,26 @@ sets the local AS to 65001.
|
||||
The AS numbers 64512 \(en 65534 are designated for private use.
|
||||
The AS number 23456 is a specially designated Autonomous System Number and
|
||||
should not be used.
|
||||
-4-byte AS numbers are specified as two numbers separated by a dot.
|
||||
-For example:
|
||||
+4-byte AS numbers are specified as two numbers separated by a dot
|
||||
+(ASDOT format),
|
||||
+for example:
|
||||
.Bd -literal -offset indent
|
||||
AS 3.10
|
||||
.Ed
|
||||
.Pp
|
||||
+or as a large number (ASPLAIN format), for example:
|
||||
+.Bd -literal -offset indent
|
||||
+AS 196618
|
||||
+.Ed
|
||||
+.Pp
|
||||
+.It Ic connect-retry Ar seconds
|
||||
+Set the number of seconds before retrying to open a connection.
|
||||
+This timer should be sufficiently large in EBGP configurations.
|
||||
+The default is 120 seconds.
|
||||
+.Pp
|
||||
.It Xo
|
||||
.Ic dump
|
||||
+.Op Ic rib Ar name
|
||||
.Pq Ic table Ns \&| Ns Ic table-mp
|
||||
.Ar file Op Ar timeout
|
||||
@@ -93,7 +93,7 @@ Set the local
|
||||
.Em autonomous system
|
||||
number to
|
||||
.Ar as-number .
|
||||
-If the first AS number is a 4-byte AS it is possible to specifiy a secondary
|
||||
+If the first AS number is a 4-byte AS it is possible to specify a secondary
|
||||
2-byte AS number which is used for neighbors which do not support 4-byte AS
|
||||
numbers.
|
||||
The default for the secondary AS is 23456.
|
||||
@@ -313,7 +313,7 @@ is only compared between peers belonging
|
||||
.Ic rib Ar name
|
||||
.Op Ic no Ic evaluate
|
||||
.Xc
|
||||
@@ -145,7 +157,8 @@ Dump the RIB, a.k.a. the
|
||||
and all BGP messages in Multi-threaded Routing Toolkit (MRT) format.
|
||||
Dumping the RIB is normally an expensive operation,
|
||||
but it should not influence the session handling.
|
||||
-Excessive dumping may result in delayed update processing.
|
||||
+It is possible to dump alternate RIB with the use of
|
||||
+.Ar name .
|
||||
.Pp
|
||||
For example, the following will dump the entire table to the
|
||||
.Xr strftime 3 Ns -expanded
|
||||
@@ -297,6 +310,21 @@ is only compared between peers belonging
|
||||
-Creat an additional RIB named
|
||||
+Create an additional RIB named
|
||||
.Ar name .
|
||||
It is possible to disable the decision process per RIB with the
|
||||
.Ic no Ic evaluate
|
||||
@@ -321,7 +321,7 @@ flag.
|
||||
.Ic Adj-RIB-In
|
||||
and
|
||||
.Ic Loc-RIB
|
||||
-are created automaticaly and used as default.
|
||||
+are created automatically and used as default.
|
||||
.Pp
|
||||
.It Xo
|
||||
.Ic rde
|
||||
+.Ic rib Ar name
|
||||
+.Op Ic no Ic evaluate
|
||||
+.Xc
|
||||
+Create an additional RIB named
|
||||
+.Ar name .
|
||||
+It is possible to disable the decision process per RIB with the
|
||||
+.Ic no Ic evaluate
|
||||
+flag.
|
||||
+.Ic Adj-RIB-In
|
||||
+and
|
||||
+.Ic Loc-RIB
|
||||
+are created automaticaly and used as default.
|
||||
+.Pp
|
||||
+.It Xo
|
||||
+.Ic rde
|
||||
.Ic route-age
|
||||
.Pq Ic ignore Ns \&| Ns Ic evaluate
|
||||
.Xc
|
||||
@@ -455,6 +483,17 @@ Only routes for that address family and
|
||||
@@ -483,6 +483,17 @@ Only routes for that address family and
|
||||
announced and processed.
|
||||
.Pp
|
||||
.It Xo
|
||||
|
@ -100,7 +66,7 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
.Ic announce capabilities
|
||||
.Pq Ic yes Ns \&| Ns Ic no
|
||||
.Xc
|
||||
@@ -465,6 +504,29 @@ This can be helpful to connect to old or
|
||||
@@ -493,6 +504,29 @@ This can be helpful to connect to old or
|
||||
The default is
|
||||
.Ic yes .
|
||||
.Pp
|
||||
|
@ -130,7 +96,16 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
.It Ic demote Ar group
|
||||
Increase the
|
||||
.Xr carp 4
|
||||
@@ -561,6 +623,12 @@ Inherited from the global configuration
|
||||
@@ -504,7 +538,7 @@ The demotion counter will be increased a
|
||||
.Xr bgpd 8
|
||||
starts and decreased
|
||||
60 seconds after the session went to state
|
||||
-.Em ESTABLISHED.
|
||||
+.Em ESTABLISHED .
|
||||
For neighbors added at runtime, the demotion counter is only increased after
|
||||
the session has been
|
||||
.Em ESTABLISHED
|
||||
@@ -589,6 +623,12 @@ Inherited from the global configuration
|
||||
Set the minimal acceptable holdtime.
|
||||
Inherited from the global configuration if not given.
|
||||
.Pp
|
||||
|
@ -143,11 +118,11 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
.It Xo
|
||||
.Ic ipsec
|
||||
.Pq Ic ah Ns \&| Ns Ic esp
|
||||
@@ -611,11 +679,11 @@ is responsible for managing the session
|
||||
@@ -639,11 +679,11 @@ is responsible for managing the session
|
||||
With
|
||||
.Xr isakmpd 8 ,
|
||||
it is sufficient to copy the peer's public key, found in
|
||||
-.Pa /etc/isakmpd/private/local.pub ,
|
||||
-.Pa /etc/isakmpd/local.pub ,
|
||||
+.Pa %%PREFIX%%/etc/isakmpd/private/local.pub ,
|
||||
to the local machine.
|
||||
It must be stored in a file
|
||||
|
@ -157,44 +132,99 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
The local public key must be copied to the peer in the same way.
|
||||
As
|
||||
.Xr bgpd 8
|
||||
@@ -670,6 +738,9 @@ Do not attempt to actively open a TCP co
|
||||
@@ -698,7 +738,7 @@ Do not attempt to actively open a TCP co
|
||||
.It Ic remote-as Ar as-number
|
||||
Set the AS number of the remote system.
|
||||
.Pp
|
||||
-.It rib .Ar name
|
||||
+.It Ic rib Ar name
|
||||
+Bind the neighbor to the specified RIB.
|
||||
+.Pp
|
||||
Bind the neighbor to the specified RIB.
|
||||
.Pp
|
||||
.It Ic route-reflector Op Ar address
|
||||
Act as an RFC 2796
|
||||
.Em route-reflector
|
||||
@@ -728,6 +799,18 @@ tcp md5sig key deadbeef
|
||||
.Ed
|
||||
@@ -1028,6 +1068,12 @@ matches a rule which has the
|
||||
option set, this rule is considered the last matching rule, and evaluation
|
||||
of subsequent rules is skipped.
|
||||
.Pp
|
||||
+.It Ic rib Ar name
|
||||
+Apply rule only to the specified RIB.
|
||||
+This only applies for received updates, so not for rules using the
|
||||
+.Ar to peer
|
||||
+parameter.
|
||||
+.Pp
|
||||
.It Ic set Ar attribute ...
|
||||
All matching rules can set the
|
||||
.Em AS path attributes
|
||||
@@ -1079,6 +1125,48 @@ Alternately, well-known communities may
|
||||
or
|
||||
.Ic NO_PEER .
|
||||
.Pp
|
||||
+.It Xo
|
||||
+.Ic ext-community Op Ar delete
|
||||
+.Ar subtype Ar as-number Ns Li : Ns Ar local
|
||||
+.Xc
|
||||
+.It Xo
|
||||
+.Ic ext-community Op Ar delete
|
||||
+.Ar subtype Ar IP Ns Li : Ns Ar local
|
||||
+.Xc
|
||||
+.It Xo
|
||||
+.Ic ext-community Op Ar delete
|
||||
+.Ar subtype Ar numvalue
|
||||
+.Xc
|
||||
+Set or delete the
|
||||
+.Em Extended Community
|
||||
+AS path attribute.
|
||||
+Extended Communities are specified by a
|
||||
+.Ar subtype
|
||||
+and normally two values, a globally unique part (e.g. the AS number) and a
|
||||
+local part.
|
||||
+The type is selected depending on the encoding of the global part.
|
||||
+Two-octet AS Specific Extended Communities and Four-octet AS Specific Extended
|
||||
+Communities are encoded as
|
||||
+.Ar as-number Ns Li : Ns Ar local .
|
||||
+Four-octet encoding is used if the
|
||||
+.Ar as-number
|
||||
+is bigger then 65535 or if the AS_DOT encoding is used.
|
||||
+IPv4 Address Specific Extended Communities are encoded as
|
||||
+.Ar IP Ns Li : Ns Ar local .
|
||||
+Opaque Extended Communities are encoded with a single numeric value.
|
||||
+Currently the following subtypes are supported:
|
||||
+.Bd -literal -offset indent
|
||||
+rt Route Target
|
||||
+soo Source of Origin
|
||||
+odi OSPF Domain Identifier
|
||||
+ort OSPF Route Type
|
||||
+ori OSPF Router ID
|
||||
+bdc BGP Data Collection
|
||||
+.Ed
|
||||
+.Pp
|
||||
+Not all type and subtype value pairs are allowed by IANA and the parser
|
||||
+will ensure that no invalid combination is created.
|
||||
+.Pp
|
||||
.It Ic localpref Ar number
|
||||
Set the
|
||||
.Em LOCAL_PREF
|
||||
@@ -1108,6 +1196,20 @@ otherwise it will be set to
|
||||
.Ar number .
|
||||
.Pp
|
||||
.It Xo
|
||||
+.Ic transparent-as
|
||||
+.Pq Ic yes Ns \&| Ns Ic no
|
||||
+.Ic origin
|
||||
+.Sm off
|
||||
+.Po Ic igp \*(Ba
|
||||
+.Ic egp \*(Ba
|
||||
+.Ic incomplete Pc
|
||||
+.Sm on
|
||||
+.Xc
|
||||
+If set to
|
||||
+.Ic yes ,
|
||||
+.Em AS paths
|
||||
+to EBGP neighbors are not prepended with their own AS.
|
||||
+The default is inherited from the global
|
||||
+.Ic transparent-as
|
||||
+setting.
|
||||
+Set the
|
||||
+.Em ORIGIN
|
||||
+AS path attribute to mark the source of this
|
||||
+route as being injected from an igp protocol, an egp protocol
|
||||
+or being an aggregated route.
|
||||
+.Pp
|
||||
+.It Xo
|
||||
.Ic ttl-security
|
||||
.Pq Ic yes Ns \&| Ns Ic no
|
||||
.Xc
|
||||
@@ -1048,6 +1131,7 @@ will be adjusted by adding or subtractin
|
||||
.Ar number ;
|
||||
otherwise it will be set to
|
||||
.Ar number .
|
||||
+The default is 100.
|
||||
.Pp
|
||||
.It Ic med Ar number
|
||||
.It Ic metric Ar number
|
||||
@@ -1137,8 +1221,8 @@ For prefixes with equally long paths, th
|
||||
.Ic nexthop
|
||||
.Sm off
|
||||
.Po Ar address \*(Ba
|
||||
@@ -1181,8 +1283,8 @@ For prefixes with equally long paths, th
|
||||
is selected.
|
||||
.El
|
||||
.Sh FILES
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
Index: bgpd/bgpd.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.8
|
||||
diff -u -p -r1.1.1.1 -r1.8
|
||||
--- bgpd/bgpd.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/bgpd.h 22 Oct 2009 15:53:39 -0000 1.8
|
||||
retrieving revision 1.1.1.8
|
||||
retrieving revision 1.10
|
||||
diff -u -p -r1.1.1.8 -r1.10
|
||||
--- bgpd/bgpd.h 14 Feb 2010 20:19:57 -0000 1.1.1.8
|
||||
+++ bgpd/bgpd.h 14 Feb 2010 19:53:36 -0000 1.10
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: bgpd.h,v 1.222 2008/01/23 08:11:32 claudio Exp $ */
|
||||
+/* $OpenBSD: bgpd.h,v 1.243 2009/07/23 14:53:18 claudio Exp $ */
|
||||
-/* $OpenBSD: bgpd.h,v 1.241 2009/06/12 16:42:53 claudio Exp $ */
|
||||
+/* $OpenBSD: bgpd.h,v 1.252 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -30,9 +30,16 @@
|
||||
@@ -30,11 +30,16 @@
|
||||
#include <poll.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
-#include <imsg.h>
|
||||
+#if defined(__FreeBSD__) /* compat */
|
||||
+#include "openbsd-compat.h"
|
||||
+#endif /* defined(__FreeBSD__) */
|
||||
+#include "imsg.h"
|
||||
+
|
||||
|
||||
#define BGP_VERSION 4
|
||||
#define BGP_PORT 179
|
||||
+#ifndef CONFFILE
|
||||
|
@ -29,223 +30,137 @@ diff -u -p -r1.1.1.1 -r1.8
|
|||
#define BGPD_USER "_bgpd"
|
||||
#define PEER_DESCR_LEN 32
|
||||
#define PFTABLE_LEN 16
|
||||
@@ -40,6 +47,8 @@
|
||||
@@ -42,8 +47,6 @@
|
||||
#define IPSEC_ENC_KEY_LEN 32
|
||||
#define IPSEC_AUTH_KEY_LEN 20
|
||||
|
||||
+#define ASNUM_MAX 0xffffffff
|
||||
+
|
||||
-#define ASNUM_MAX 0xffffffff
|
||||
-
|
||||
#define MAX_PKTSIZE 4096
|
||||
#define MIN_HOLDTIME 3
|
||||
#define READ_BUF_SIZE 65535
|
||||
@@ -85,8 +94,8 @@
|
||||
|
||||
/*
|
||||
* Limit the number of control messages generated by the RDE and queued in
|
||||
- * session enigine. The RDE limit defines how many imsg are generated in
|
||||
- * on poll round. The if the SE limit is hit the RDE control socket will no
|
||||
+ * session engine. The RDE limit defines how many imsg are generated in
|
||||
+ * one poll round. Then if the SE limit is hit the RDE control socket will no
|
||||
* longer be polled.
|
||||
*/
|
||||
#define RDE_RUNNER_ROUNDS 100
|
||||
@@ -105,21 +114,6 @@ enum reconf_action {
|
||||
@@ -109,18 +112,74 @@ enum reconf_action {
|
||||
RECONF_DELETE
|
||||
};
|
||||
|
||||
-struct buf {
|
||||
- TAILQ_ENTRY(buf) entry;
|
||||
- u_char *buf;
|
||||
- size_t size;
|
||||
- size_t wpos;
|
||||
- size_t rpos;
|
||||
- int fd;
|
||||
-};
|
||||
-
|
||||
-struct msgbuf {
|
||||
- TAILQ_HEAD(, buf) bufs;
|
||||
- u_int32_t queued;
|
||||
- int fd;
|
||||
-};
|
||||
-
|
||||
+/* Address Family Numbers as per RFC 1700 */
|
||||
+#define AFI_UNSPEC 0
|
||||
+#define AFI_IPv4 1
|
||||
+#define AFI_IPv6 2
|
||||
+
|
||||
+/* Subsequent Address Family Identifier as per RFC 4760 */
|
||||
+#define SAFI_NONE 0
|
||||
+#define SAFI_UNICAST 1
|
||||
+#define SAFI_MULTICAST 2
|
||||
+#define SAFI_MPLS 4
|
||||
+#define SAFI_MPLSVPN 128
|
||||
+
|
||||
+struct aid {
|
||||
+ u_int16_t afi;
|
||||
+ sa_family_t af;
|
||||
+ u_int8_t safi;
|
||||
+ char *name;
|
||||
+};
|
||||
+
|
||||
+extern const struct aid aid_vals[];
|
||||
+
|
||||
+#define AID_UNSPEC 0
|
||||
+#define AID_INET 1
|
||||
+#define AID_INET6 2
|
||||
+#define AID_VPN_IPv4 3
|
||||
+#define AID_MAX 4
|
||||
+
|
||||
+#define AID_VALS { \
|
||||
+ /* afi, af, safii, name */ \
|
||||
+ { AFI_UNSPEC, AF_UNSPEC, SAFI_NONE, "unspec"}, \
|
||||
+ { AFI_IPv4, AF_INET, SAFI_UNICAST, "IPv4 unicast" }, \
|
||||
+ { AFI_IPv6, AF_INET6, SAFI_UNICAST, "IPv6 unicast" }, \
|
||||
+ { AFI_IPv4, AF_INET, SAFI_MPLSVPN, "IPv4 vpn" } \
|
||||
+}
|
||||
+
|
||||
+#define AID_PTSIZE { \
|
||||
+ 0, \
|
||||
+ sizeof(struct pt_entry4), \
|
||||
+ sizeof(struct pt_entry6), \
|
||||
+ sizeof(struct pt_entry_vpn4) \
|
||||
+}
|
||||
+
|
||||
+struct vpn4_addr {
|
||||
+ u_int64_t rd;
|
||||
+ struct in_addr addr;
|
||||
+ u_int8_t labelstack[21]; /* max that makes sense */
|
||||
+ u_int8_t labellen;
|
||||
+ u_int8_t pad1;
|
||||
+ u_int8_t pad2;
|
||||
+};
|
||||
+
|
||||
+#define BGP_MPLS_BOS 0x01
|
||||
+
|
||||
struct bgpd_addr {
|
||||
sa_family_t af;
|
||||
- sa_family_t af;
|
||||
union {
|
||||
@@ -169,12 +163,7 @@ struct bgpd_config {
|
||||
u_int16_t short_as;
|
||||
u_int16_t holdtime;
|
||||
u_int16_t min_holdtime;
|
||||
-};
|
||||
-
|
||||
-struct buf_read {
|
||||
- u_char buf[READ_BUF_SIZE];
|
||||
- u_char *rptr;
|
||||
- size_t wpos;
|
||||
+ u_int16_t connectretry;
|
||||
struct in_addr v4;
|
||||
struct in6_addr v6;
|
||||
- u_int8_t addr8[16];
|
||||
- u_int16_t addr16[8];
|
||||
- u_int32_t addr32[4];
|
||||
+ struct vpn4_addr vpn4;
|
||||
+ /* maximum size for a prefix is 256 bits */
|
||||
+ u_int8_t addr8[32];
|
||||
+ u_int16_t addr16[16];
|
||||
+ u_int32_t addr32[8];
|
||||
} ba; /* 128-bit address */
|
||||
u_int32_t scope_id; /* iface scope id for v6 */
|
||||
+ u_int8_t aid;
|
||||
#define v4 ba.v4
|
||||
#define v6 ba.v6
|
||||
+#define vpn4 ba.vpn4
|
||||
#define addr8 ba.addr8
|
||||
#define addr16 ba.addr16
|
||||
#define addr32 ba.addr32
|
||||
@@ -205,11 +264,10 @@ struct peer_auth {
|
||||
};
|
||||
|
||||
enum announce_type {
|
||||
@@ -235,11 +224,13 @@ struct peer_config {
|
||||
struct capabilities capabilities;
|
||||
char group[PEER_DESCR_LEN];
|
||||
char descr[PEER_DESCR_LEN];
|
||||
+ char rib[PEER_DESCR_LEN];
|
||||
char if_depend[IFNAMSIZ];
|
||||
char demote_group[IFNAMSIZ];
|
||||
u_int32_t id;
|
||||
u_int32_t groupid;
|
||||
u_int32_t remote_as;
|
||||
+ u_int32_t local_as;
|
||||
u_int32_t max_prefix;
|
||||
enum announce_type announce_type;
|
||||
enum enforce_as enforce_as;
|
||||
@@ -247,6 +238,7 @@ struct peer_config {
|
||||
u_int16_t max_prefix_restart;
|
||||
u_int16_t holdtime;
|
||||
u_int16_t min_holdtime;
|
||||
+ u_int16_t local_short_as;
|
||||
u_int8_t template;
|
||||
u_int8_t remote_masklen;
|
||||
u_int8_t cloned;
|
||||
@@ -259,8 +251,13 @@ struct peer_config {
|
||||
u_int8_t softreconfig_in;
|
||||
u_int8_t softreconfig_out;
|
||||
struct capabilities {
|
||||
- u_int8_t mp_v4; /* multiprotocol extensions, RFC 4760 */
|
||||
- u_int8_t mp_v6;
|
||||
- u_int8_t refresh; /* route refresh, RFC 2918 */
|
||||
- u_int8_t restart; /* graceful restart, RFC 4724 */
|
||||
- u_int8_t as4byte; /* draft-ietf-idr-as4bytes-13 */
|
||||
+ int8_t mp[AID_MAX]; /* multiprotocol extensions, RFC 4760 */
|
||||
+ int8_t refresh; /* route refresh, RFC 2918 */
|
||||
+ int8_t restart; /* graceful restart, RFC 4724 */
|
||||
+ int8_t as4byte; /* draft-ietf-idr-as4bytes-13 */
|
||||
};
|
||||
|
||||
struct peer_config {
|
||||
@@ -248,6 +306,7 @@ struct peer_config {
|
||||
u_int8_t ttlsec; /* TTL security hack */
|
||||
+ u_int8_t flags;
|
||||
+ u_int8_t pad[3];
|
||||
u_int8_t flags;
|
||||
u_int8_t pad[3];
|
||||
+ char lliface[IFNAMSIZ];
|
||||
};
|
||||
|
||||
+#define PEERFLAG_TRANS_AS 0x01
|
||||
+
|
||||
struct network_config {
|
||||
struct bgpd_addr prefix;
|
||||
struct filter_set_head attrset;
|
||||
@@ -274,54 +271,8 @@ struct network {
|
||||
TAILQ_ENTRY(network) entry;
|
||||
};
|
||||
|
||||
-/* ipc messages */
|
||||
-
|
||||
-#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr)
|
||||
-#define MAX_IMSGSIZE 8192
|
||||
-
|
||||
-struct imsg_fd {
|
||||
- TAILQ_ENTRY(imsg_fd) entry;
|
||||
- int fd;
|
||||
-};
|
||||
-
|
||||
-struct imsgbuf {
|
||||
- TAILQ_HEAD(fds, imsg_fd) fds;
|
||||
- struct buf_read r;
|
||||
- struct msgbuf w;
|
||||
- int fd;
|
||||
- pid_t pid;
|
||||
-};
|
||||
-
|
||||
enum imsg_type {
|
||||
IMSG_NONE,
|
||||
- IMSG_RECONF_CONF,
|
||||
- IMSG_RECONF_PEER,
|
||||
- IMSG_RECONF_FILTER,
|
||||
- IMSG_RECONF_LISTENER,
|
||||
- IMSG_RECONF_DONE,
|
||||
- IMSG_UPDATE,
|
||||
- IMSG_UPDATE_ERR,
|
||||
- IMSG_SESSION_ADD,
|
||||
- IMSG_SESSION_UP,
|
||||
- IMSG_SESSION_DOWN,
|
||||
- IMSG_MRT_OPEN,
|
||||
- IMSG_MRT_REOPEN,
|
||||
- IMSG_MRT_CLOSE,
|
||||
- IMSG_KROUTE_CHANGE,
|
||||
- IMSG_KROUTE_DELETE,
|
||||
- IMSG_KROUTE6_CHANGE,
|
||||
- IMSG_KROUTE6_DELETE,
|
||||
- IMSG_NEXTHOP_ADD,
|
||||
- IMSG_NEXTHOP_REMOVE,
|
||||
- IMSG_NEXTHOP_UPDATE,
|
||||
- IMSG_PFTABLE_ADD,
|
||||
- IMSG_PFTABLE_REMOVE,
|
||||
- IMSG_PFTABLE_COMMIT,
|
||||
- IMSG_NETWORK_ADD,
|
||||
- IMSG_NETWORK_REMOVE,
|
||||
- IMSG_NETWORK_FLUSH,
|
||||
- IMSG_NETWORK_DONE,
|
||||
- IMSG_FILTER_SET,
|
||||
IMSG_CTL_END,
|
||||
IMSG_CTL_RELOAD,
|
||||
IMSG_CTL_FIB_COUPLE,
|
||||
@@ -347,23 +298,40 @@ enum imsg_type {
|
||||
#define PEERFLAG_TRANS_AS 0x01
|
||||
@@ -292,6 +351,7 @@ enum imsg_type {
|
||||
IMSG_CTL_SHOW_RIB_MEM,
|
||||
IMSG_CTL_SHOW_TERSE,
|
||||
IMSG_CTL_SHOW_TIMER,
|
||||
+ IMSG_NETWORK_ADD,
|
||||
+ IMSG_NETWORK_REMOVE,
|
||||
+ IMSG_NETWORK_FLUSH,
|
||||
+ IMSG_NETWORK_DONE,
|
||||
+ IMSG_FILTER_SET,
|
||||
+ IMSG_RECONF_CONF,
|
||||
+ IMSG_RECONF_RIB,
|
||||
+ IMSG_RECONF_PEER,
|
||||
+ IMSG_RECONF_FILTER,
|
||||
+ IMSG_RECONF_LISTENER,
|
||||
+ IMSG_RECONF_DONE,
|
||||
+ IMSG_UPDATE,
|
||||
+ IMSG_UPDATE_ERR,
|
||||
+ IMSG_SESSION_ADD,
|
||||
+ IMSG_SESSION_UP,
|
||||
+ IMSG_SESSION_DOWN,
|
||||
+ IMSG_MRT_OPEN,
|
||||
+ IMSG_MRT_REOPEN,
|
||||
+ IMSG_MRT_CLOSE,
|
||||
+ IMSG_KROUTE_CHANGE,
|
||||
+ IMSG_KROUTE_DELETE,
|
||||
+ IMSG_KROUTE6_CHANGE,
|
||||
+ IMSG_KROUTE6_DELETE,
|
||||
+ IMSG_NEXTHOP_ADD,
|
||||
+ IMSG_NEXTHOP_REMOVE,
|
||||
+ IMSG_NEXTHOP_UPDATE,
|
||||
+ IMSG_PFTABLE_ADD,
|
||||
+ IMSG_PFTABLE_REMOVE,
|
||||
+ IMSG_PFTABLE_COMMIT,
|
||||
IMSG_REFRESH,
|
||||
IMSG_IFINFO,
|
||||
IMSG_DEMOTE
|
||||
+ IMSG_CTL_LOG_VERBOSE,
|
||||
IMSG_NETWORK_ADD,
|
||||
IMSG_NETWORK_REMOVE,
|
||||
IMSG_NETWORK_FLUSH,
|
||||
@@ -423,8 +483,7 @@ struct kif {
|
||||
struct session_up {
|
||||
struct bgpd_addr local_addr;
|
||||
struct bgpd_addr remote_addr;
|
||||
- struct capabilities capa_announced;
|
||||
- struct capabilities capa_received;
|
||||
+ struct capabilities capa;
|
||||
u_int32_t remote_bgpid;
|
||||
u_int16_t short_as;
|
||||
};
|
||||
|
||||
-struct imsg_hdr {
|
||||
- u_int32_t peerid;
|
||||
- pid_t pid;
|
||||
- enum imsg_type type;
|
||||
- u_int16_t len;
|
||||
-};
|
||||
-
|
||||
-struct imsg {
|
||||
- struct imsg_hdr hdr;
|
||||
- void *data;
|
||||
-};
|
||||
-
|
||||
struct demote_msg {
|
||||
char demote_group[IFNAMSIZ];
|
||||
int level;
|
||||
@@ -424,6 +392,7 @@ struct kroute {
|
||||
u_int16_t labelid;
|
||||
u_short ifindex;
|
||||
u_int8_t prefixlen;
|
||||
+ u_int8_t priority;
|
||||
};
|
||||
|
||||
struct kroute6 {
|
||||
@@ -433,6 +402,7 @@ struct kroute6 {
|
||||
u_int16_t labelid;
|
||||
u_short ifindex;
|
||||
u_int8_t prefixlen;
|
||||
+ u_int8_t priority;
|
||||
};
|
||||
|
||||
struct kroute_nexthop {
|
||||
@@ -473,8 +443,13 @@ struct pftable_msg {
|
||||
@@ -437,8 +496,13 @@ struct pftable_msg {
|
||||
|
||||
struct ctl_show_nexthop {
|
||||
struct bgpd_addr addr;
|
||||
|
@ -260,73 +175,159 @@ diff -u -p -r1.1.1.1 -r1.8
|
|||
};
|
||||
|
||||
struct ctl_neighbor {
|
||||
@@ -510,7 +485,7 @@ struct ctl_show_rib {
|
||||
u_int32_t med;
|
||||
u_int32_t prefix_cnt;
|
||||
u_int32_t active_cnt;
|
||||
- u_int32_t adjrib_cnt;
|
||||
+ u_int32_t rib_cnt;
|
||||
u_int16_t aspath_len;
|
||||
u_int16_t flags;
|
||||
u_int8_t prefixlen;
|
||||
@@ -545,6 +520,7 @@ struct filter_community {
|
||||
@@ -508,6 +572,27 @@ struct filter_community {
|
||||
int type;
|
||||
};
|
||||
|
||||
+struct filter_extcommunity {
|
||||
+ u_int8_t type;
|
||||
+ u_int8_t subtype; /* if extended type */
|
||||
+ union {
|
||||
+ struct ext_as {
|
||||
+ u_int16_t as;
|
||||
+ u_int32_t val;
|
||||
+ } ext_as;
|
||||
+ struct ext_as4 {
|
||||
+ u_int32_t as4;
|
||||
+ u_int16_t val;
|
||||
+ } ext_as4;
|
||||
+ struct ext_ip {
|
||||
+ struct in_addr addr;
|
||||
+ u_int16_t val;
|
||||
+ } ext_ip;
|
||||
+ u_int64_t ext_opaq; /* only 48 bits */
|
||||
+ } data;
|
||||
+};
|
||||
+
|
||||
+
|
||||
struct ctl_show_rib_request {
|
||||
+ char rib[PEER_DESCR_LEN];
|
||||
char rib[PEER_DESCR_LEN];
|
||||
struct ctl_neighbor neighbor;
|
||||
struct bgpd_addr prefix;
|
||||
struct filter_as as;
|
||||
@@ -590,6 +566,7 @@ enum comp_ops {
|
||||
struct filter_peers {
|
||||
u_int32_t peerid;
|
||||
u_int32_t groupid;
|
||||
+ u_int16_t ribid;
|
||||
@@ -518,8 +603,8 @@ struct ctl_show_rib_request {
|
||||
pid_t pid;
|
||||
u_int16_t flags;
|
||||
enum imsg_type type;
|
||||
- sa_family_t af;
|
||||
u_int8_t prefixlen;
|
||||
+ u_int8_t aid;
|
||||
};
|
||||
|
||||
/* special community type */
|
||||
@@ -644,6 +621,7 @@ TAILQ_HEAD(filter_head, filter_rule);
|
||||
enum filter_actions {
|
||||
@@ -585,6 +670,27 @@ struct filter_peers {
|
||||
#define EXT_COMMUNITY_OSPF_RTR_TYPE 6 /* RFC 4577 */
|
||||
#define EXT_COMMUNITY_OSPF_RTR_ID 7 /* RFC 4577 */
|
||||
#define EXT_COMMUNITY_BGP_COLLECT 8 /* RFC 4384 */
|
||||
+/* other handy defines */
|
||||
+#define EXT_COMMUNITY_OPAQUE_MAX 0xffffffffffffULL
|
||||
+
|
||||
+struct ext_comm_pairs {
|
||||
+ u_int8_t type;
|
||||
+ u_int8_t subtype;
|
||||
+ u_int8_t transitive; /* transitive bit needs to be set */
|
||||
+};
|
||||
+
|
||||
+#define IANA_EXT_COMMUNITIES { \
|
||||
+ { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_ROUTE_TGT, 0 }, \
|
||||
+ { EXT_COMMUNITY_TWO_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \
|
||||
+ { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_OSPF_DOM_ID, 0 }, \
|
||||
+ { EXT_COMMUNITY_TWO_AS, EXT_COMMUNITY_BGP_COLLECT, 0 }, \
|
||||
+ { EXT_COMMUNITY_FOUR_AS, EXT_COMMUNITY_ROUTE_TGT, 0 }, \
|
||||
+ { EXT_COMMUNITY_FOUR_AS, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \
|
||||
+ { EXT_COMMUNITY_IPV4, EXT_COMMUNITY_ROUTE_TGT, 0 }, \
|
||||
+ { EXT_COMMUNITY_IPV4, EXT_CUMMUNITY_ROUTE_ORIG, 0 }, \
|
||||
+ { EXT_COMMUNITY_IPV4, EXT_COMMUNITY_OSPF_RTR_ID, 0 }, \
|
||||
+ { EXT_COMMUNITY_OPAQUE, EXT_COMMUNITY_OSPF_RTR_TYPE, 0 } \
|
||||
+}
|
||||
|
||||
struct filter_rule {
|
||||
TAILQ_ENTRY(filter_rule) entry;
|
||||
+ char rib[PEER_DESCR_LEN];
|
||||
struct filter_peers peer;
|
||||
struct filter_match match;
|
||||
struct filter_set_head set;
|
||||
@@ -697,6 +675,7 @@ struct rrefresh {
|
||||
struct rde_memstats {
|
||||
int64_t path_cnt;
|
||||
int64_t prefix_cnt;
|
||||
+ int64_t rib_cnt;
|
||||
int64_t pt4_cnt;
|
||||
int64_t pt6_cnt;
|
||||
int64_t nexthop_cnt;
|
||||
@@ -709,6 +688,15 @@ struct rde_memstats {
|
||||
int64_t attr_dcnt;
|
||||
|
||||
struct filter_prefix {
|
||||
@@ -594,7 +700,7 @@ struct filter_prefix {
|
||||
|
||||
struct filter_prefixlen {
|
||||
enum comp_ops op;
|
||||
- sa_family_t af;
|
||||
+ u_int8_t aid;
|
||||
u_int8_t len_min;
|
||||
u_int8_t len_max;
|
||||
};
|
||||
@@ -635,10 +741,13 @@ enum action_types {
|
||||
ACTION_SET_NEXTHOP_SELF,
|
||||
ACTION_SET_COMMUNITY,
|
||||
ACTION_DEL_COMMUNITY,
|
||||
+ ACTION_SET_EXT_COMMUNITY,
|
||||
+ ACTION_DEL_EXT_COMMUNITY,
|
||||
ACTION_PFTABLE,
|
||||
ACTION_PFTABLE_ID,
|
||||
ACTION_RTLABEL,
|
||||
- ACTION_RTLABEL_ID
|
||||
+ ACTION_RTLABEL_ID,
|
||||
+ ACTION_SET_ORIGIN
|
||||
};
|
||||
|
||||
struct filter_set {
|
||||
@@ -650,23 +759,31 @@ struct filter_set {
|
||||
int32_t relative;
|
||||
struct bgpd_addr nexthop;
|
||||
struct filter_community community;
|
||||
+ struct filter_extcommunity ext_community;
|
||||
char pftable[PFTABLE_LEN];
|
||||
char rtlabel[RTLABEL_LEN];
|
||||
+ u_int8_t origin;
|
||||
} action;
|
||||
enum action_types type;
|
||||
};
|
||||
|
||||
-struct rrefresh {
|
||||
- u_int16_t afi;
|
||||
- u_int8_t safi;
|
||||
+struct rde_rib {
|
||||
+ SIMPLEQ_ENTRY(rde_rib) entry;
|
||||
+ char name[PEER_DESCR_LEN];
|
||||
+ u_int16_t id;
|
||||
+ u_int16_t flags;
|
||||
+};
|
||||
};
|
||||
+SIMPLEQ_HEAD(rib_names, rde_rib);
|
||||
+extern struct rib_names ribnames;
|
||||
+
|
||||
/* Address Family Numbers as per RFC 1700 */
|
||||
#define AFI_IPv4 1
|
||||
#define AFI_IPv6 2
|
||||
@@ -718,11 +706,24 @@ struct rde_memstats {
|
||||
#define SAFI_NONE 0x00
|
||||
#define SAFI_UNICAST 0x01
|
||||
#define SAFI_MULTICAST 0x02
|
||||
+#define SAFI_MPLS 0x04
|
||||
#define SAFI_ALL 0xff
|
||||
+/* 4-byte magic AS number */
|
||||
+#define AS_TRANS 23456
|
||||
|
||||
/* 4-byte magic AS number */
|
||||
#define AS_TRANS 23456
|
||||
struct rde_memstats {
|
||||
int64_t path_cnt;
|
||||
int64_t prefix_cnt;
|
||||
int64_t rib_cnt;
|
||||
- int64_t pt4_cnt;
|
||||
- int64_t pt6_cnt;
|
||||
+ int64_t pt_cnt[AID_MAX];
|
||||
int64_t nexthop_cnt;
|
||||
int64_t aspath_cnt;
|
||||
int64_t aspath_size;
|
||||
@@ -677,28 +794,17 @@ struct rde_memstats {
|
||||
int64_t attr_dcnt;
|
||||
};
|
||||
|
||||
-struct rde_rib {
|
||||
- SIMPLEQ_ENTRY(rde_rib) entry;
|
||||
- char name[PEER_DESCR_LEN];
|
||||
- u_int16_t id;
|
||||
- u_int16_t flags;
|
||||
-};
|
||||
-SIMPLEQ_HEAD(rib_names, rde_rib);
|
||||
-extern struct rib_names ribnames;
|
||||
-
|
||||
-/* Address Family Numbers as per RFC 1700 */
|
||||
-#define AFI_IPv4 1
|
||||
-#define AFI_IPv6 2
|
||||
-#define AFI_ALL 0xffff
|
||||
-
|
||||
-/* Subsequent Address Family Identifier as per RFC 4760 */
|
||||
-#define SAFI_NONE 0x00
|
||||
-#define SAFI_UNICAST 0x01
|
||||
-#define SAFI_MULTICAST 0x02
|
||||
-#define SAFI_ALL 0xff
|
||||
-
|
||||
-/* 4-byte magic AS number */
|
||||
-#define AS_TRANS 23456
|
||||
+/* macros for IPv6 link-local address */
|
||||
+#if defined(__KAME__) && defined(IPV6_LINKLOCAL_PEER)
|
||||
+#define IN6_LINKLOCAL_IFINDEX(addr) \
|
||||
|
@ -338,77 +339,34 @@ diff -u -p -r1.1.1.1 -r1.8
|
|||
+ (addr).s6_addr[3] = (index) & 0xff; \
|
||||
+ } while (0)
|
||||
+#endif
|
||||
+
|
||||
|
||||
/* prototypes */
|
||||
/* bgpd.c */
|
||||
void send_nexthop_update(struct kroute_nexthop *);
|
||||
@@ -730,18 +731,6 @@ void send_imsg_session(int, pid_t, voi
|
||||
int bgpd_redistribute(int, struct kroute *, struct kroute6 *);
|
||||
int bgpd_filternexthop(struct kroute *, struct kroute6 *);
|
||||
@@ -709,6 +815,7 @@ int bgpd_filternexthop(struct kroute *
|
||||
|
||||
-/* buffer.c */
|
||||
-struct buf *buf_open(size_t);
|
||||
-struct buf *buf_grow(struct buf *, size_t);
|
||||
-int buf_add(struct buf *, const void *, size_t);
|
||||
-void *buf_reserve(struct buf *, size_t);
|
||||
-int buf_close(struct msgbuf *, struct buf *);
|
||||
-int buf_write(int, struct buf *);
|
||||
-void buf_free(struct buf *);
|
||||
-void msgbuf_init(struct msgbuf *);
|
||||
-void msgbuf_clear(struct msgbuf *);
|
||||
-int msgbuf_write(struct msgbuf *);
|
||||
-
|
||||
/* log.c */
|
||||
void log_init(int);
|
||||
+void log_verbose(int);
|
||||
void vlog(int, const char *, va_list);
|
||||
@@ -760,19 +749,6 @@ int cmdline_symset(char *);
|
||||
/* config.c */
|
||||
int host(const char *, struct bgpd_addr *, u_int8_t *);
|
||||
|
||||
-/* imsg.c */
|
||||
-void imsg_init(struct imsgbuf *, int);
|
||||
-int imsg_read(struct imsgbuf *);
|
||||
-int imsg_get(struct imsgbuf *, struct imsg *);
|
||||
-int imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, int,
|
||||
- const void *, u_int16_t);
|
||||
-struct buf *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
|
||||
- u_int16_t);
|
||||
-int imsg_add(struct buf *, const void *, u_int16_t);
|
||||
-int imsg_close(struct imsgbuf *, struct buf *);
|
||||
-void imsg_free(struct imsg *);
|
||||
-int imsg_get_fd(struct imsgbuf *);
|
||||
-
|
||||
/* kroute.c */
|
||||
int kr_init(int, u_int);
|
||||
int kr_change(struct kroute_label *);
|
||||
@@ -788,10 +764,7 @@ void kr_nexthop_delete(struct bgpd_add
|
||||
void kr_show_route(struct imsg *);
|
||||
void kr_ifinfo(char *);
|
||||
int kr_reload(void);
|
||||
-in_addr_t prefixlen2mask(u_int8_t);
|
||||
struct in6_addr *prefixlen2mask6(u_int8_t prefixlen);
|
||||
-void inet6applymask(struct in6_addr *, const struct in6_addr *,
|
||||
- int);
|
||||
|
||||
/* control.c */
|
||||
void control_cleanup(const char *);
|
||||
@@ -806,6 +779,10 @@ int pftable_addr_remove(struct pftable_m
|
||||
int pftable_commit(void);
|
||||
|
||||
/* name2id.c */
|
||||
+u_int16_t rib_name2id(const char *);
|
||||
+const char *rib_id2name(u_int16_t);
|
||||
+void rib_unref(u_int16_t);
|
||||
+void rib_ref(u_int16_t);
|
||||
u_int16_t rtlabel_name2id(const char *);
|
||||
const char *rtlabel_id2name(u_int16_t);
|
||||
void rtlabel_unref(u_int16_t);
|
||||
@@ -829,5 +806,8 @@ const char *log_as(u_int32_t);
|
||||
void log_peer_warn(const struct peer_config *, const char *, ...);
|
||||
void log_peer_warnx(const struct peer_config *, const char *, ...);
|
||||
@@ -779,11 +886,19 @@ const char *log_addr(const struct bgpd_a
|
||||
const char *log_in6addr(const struct in6_addr *);
|
||||
const char *log_sockaddr(struct sockaddr *);
|
||||
const char *log_as(u_int32_t);
|
||||
+const char *log_ext_subtype(u_int8_t);
|
||||
int aspath_snprint(char *, size_t, void *, u_int16_t);
|
||||
int aspath_asprint(char **, void *, u_int16_t);
|
||||
size_t aspath_strlen(void *, u_int16_t);
|
||||
+in_addr_t prefixlen2mask(u_int8_t);
|
||||
+void inet6applymask(struct in6_addr *, const struct in6_addr *,
|
||||
+ int);
|
||||
in_addr_t prefixlen2mask(u_int8_t);
|
||||
void inet6applymask(struct in6_addr *, const struct in6_addr *,
|
||||
int);
|
||||
+const char *aid2str(u_int8_t);
|
||||
+int aid2afi(u_int8_t, u_int16_t *, u_int8_t *);
|
||||
+int afi2aid(u_int16_t, u_int8_t, u_int8_t *);
|
||||
+sa_family_t aid2af(u_int8_t);
|
||||
+int af2aid(sa_family_t, u_int8_t, u_int8_t *);
|
||||
+struct sockaddr *addr2sa(struct bgpd_addr *, u_int16_t);
|
||||
+void sa2addr(struct sockaddr *, struct bgpd_addr *);
|
||||
|
||||
#endif /* __BGPD_H__ */
|
||||
|
|
|
@ -1,191 +1,55 @@
|
|||
Index: bgpd/buffer.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/buffer.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.4
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.4
|
||||
--- bgpd/buffer.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/buffer.c 22 Oct 2009 14:24:02 -0000 1.1.1.4
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.1.1.8
|
||||
diff -u -p -r1.1.1.7 -r1.1.1.8
|
||||
--- bgpd/buffer.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/buffer.c 14 Feb 2010 20:27:06 -0000 1.1.1.8
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: buffer.c,v 1.39 2008/03/24 16:11:02 deraadt Exp $ */
|
||||
-/* $OpenBSD: buffer.c,v 1.43 2009/06/06 06:33:15 eric Exp $ */
|
||||
+/* $OpenBSD: buffer.c,v 1.44 2009/07/23 18:58:42 eric Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -16,18 +16,19 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
-#include <sys/types.h>
|
||||
+#include <sys/param.h>
|
||||
+#include <sys/queue.h>
|
||||
+#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <errno.h>
|
||||
-#include <limits.h>
|
||||
-#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
-#include "bgpd.h"
|
||||
+#include "imsg.h"
|
||||
|
||||
+int buf_realloc(struct buf *, size_t);
|
||||
void buf_enqueue(struct msgbuf *, struct buf *);
|
||||
void buf_dequeue(struct msgbuf *, struct buf *);
|
||||
|
||||
@@ -42,35 +43,55 @@ buf_open(size_t len)
|
||||
free(buf);
|
||||
return (NULL);
|
||||
}
|
||||
- buf->size = len;
|
||||
+ buf->size = buf->max = len;
|
||||
buf->fd = -1;
|
||||
|
||||
return (buf);
|
||||
}
|
||||
|
||||
struct buf *
|
||||
-buf_grow(struct buf *buf, size_t len)
|
||||
+buf_dynamic(size_t len, size_t max)
|
||||
@@ -144,7 +144,7 @@ int
|
||||
buf_write(struct msgbuf *msgbuf)
|
||||
{
|
||||
- void *p;
|
||||
struct iovec iov[IOV_MAX];
|
||||
- struct buf *buf, *next;
|
||||
+ struct buf *buf;
|
||||
|
||||
- if ((p = realloc(buf->buf, buf->size + len)) == NULL) {
|
||||
- free(buf->buf);
|
||||
- buf->buf = NULL;
|
||||
- buf->size = 0;
|
||||
+ if (max < len)
|
||||
return (NULL);
|
||||
- }
|
||||
|
||||
- buf->buf = p;
|
||||
- buf->size += len;
|
||||
+ if ((buf = buf_open(len)) == NULL)
|
||||
+ return (NULL);
|
||||
+
|
||||
+ if (max > 0)
|
||||
+ buf->max = max;
|
||||
|
||||
return (buf);
|
||||
}
|
||||
|
||||
int
|
||||
+buf_realloc(struct buf *buf, size_t len)
|
||||
+{
|
||||
+ u_char *b;
|
||||
+
|
||||
+ /* on static buffers max is eq size and so the following fails */
|
||||
+ if (buf->wpos + len > buf->max) {
|
||||
+ errno = ENOMEM;
|
||||
+ return (-1);
|
||||
+ }
|
||||
+
|
||||
+ b = realloc(buf->buf, buf->wpos + len);
|
||||
+ if (b == NULL)
|
||||
+ return (-1);
|
||||
+ buf->buf = b;
|
||||
+ buf->size = buf->wpos + len;
|
||||
+
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
buf_add(struct buf *buf, const void *data, size_t len)
|
||||
{
|
||||
if (buf->wpos + len > buf->size)
|
||||
- return (-1);
|
||||
+ if (buf_realloc(buf, len) == -1)
|
||||
+ return (-1);
|
||||
|
||||
memcpy(buf->buf + buf->wpos, data, len);
|
||||
buf->wpos += len;
|
||||
@@ -83,27 +104,60 @@ buf_reserve(struct buf *buf, size_t len)
|
||||
void *b;
|
||||
|
||||
if (buf->wpos + len > buf->size)
|
||||
- return (NULL);
|
||||
+ if (buf_realloc(buf, len) == -1)
|
||||
+ return (NULL);
|
||||
|
||||
b = buf->buf + buf->wpos;
|
||||
buf->wpos += len;
|
||||
return (b);
|
||||
}
|
||||
|
||||
-int
|
||||
+void *
|
||||
+buf_seek(struct buf *buf, size_t pos, size_t len)
|
||||
+{
|
||||
+ /* only allowed to seek in already written parts */
|
||||
+ if (pos + len > buf->wpos)
|
||||
+ return (NULL);
|
||||
+
|
||||
+ return (buf->buf + pos);
|
||||
+}
|
||||
+
|
||||
+size_t
|
||||
+buf_size(struct buf *buf)
|
||||
+{
|
||||
+ return (buf->wpos);
|
||||
+}
|
||||
+
|
||||
+size_t
|
||||
+buf_left(struct buf *buf)
|
||||
+{
|
||||
+ return (buf->max - buf->wpos);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
buf_close(struct msgbuf *msgbuf, struct buf *buf)
|
||||
{
|
||||
buf_enqueue(msgbuf, buf);
|
||||
- return (1);
|
||||
}
|
||||
|
||||
int
|
||||
-buf_write(int sock, struct buf *buf)
|
||||
+buf_write(struct msgbuf *msgbuf)
|
||||
{
|
||||
+ struct iovec iov[IOV_MAX];
|
||||
+ struct buf *buf;
|
||||
+ unsigned int i = 0;
|
||||
unsigned int i = 0;
|
||||
ssize_t n;
|
||||
|
||||
- if ((n = write(sock, buf->buf + buf->rpos,
|
||||
- buf->size - buf->rpos)) == -1) {
|
||||
+ bzero(&iov, sizeof(iov));
|
||||
+ TAILQ_FOREACH(buf, &msgbuf->bufs, entry) {
|
||||
+ if (i >= IOV_MAX)
|
||||
+ break;
|
||||
+ iov[i].iov_base = buf->buf + buf->rpos;
|
||||
@@ -153,7 +153,7 @@ buf_write(struct msgbuf *msgbuf)
|
||||
if (i >= IOV_MAX)
|
||||
break;
|
||||
iov[i].iov_base = buf->buf + buf->rpos;
|
||||
- iov[i].iov_len = buf->size - buf->rpos;
|
||||
+ iov[i].iov_len = buf->wpos - buf->rpos;
|
||||
+ i++;
|
||||
+ }
|
||||
+
|
||||
+ if ((n = writev(msgbuf->fd, iov, i)) == -1) {
|
||||
if (errno == EAGAIN || errno == ENOBUFS ||
|
||||
errno == EINTR) /* try later */
|
||||
return (0);
|
||||
@@ -116,11 +170,9 @@ buf_write(int sock, struct buf *buf)
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -170,17 +170,7 @@ buf_write(struct msgbuf *msgbuf)
|
||||
return (-2);
|
||||
}
|
||||
|
||||
- if (buf->rpos + n < buf->size) { /* not all data written yet */
|
||||
- for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
|
||||
- buf = next) {
|
||||
- next = TAILQ_NEXT(buf, entry);
|
||||
- if (buf->rpos + n >= buf->size) {
|
||||
- n -= buf->size - buf->rpos;
|
||||
- buf_dequeue(msgbuf, buf);
|
||||
- } else {
|
||||
- buf->rpos += n;
|
||||
- return (0);
|
||||
- } else
|
||||
- return (1);
|
||||
- n = 0;
|
||||
- }
|
||||
- }
|
||||
+ msgbuf_drain(msgbuf, n);
|
||||
+
|
||||
+ return (0);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -139,6 +191,24 @@ msgbuf_init(struct msgbuf *msgbuf)
|
||||
return (0);
|
||||
}
|
||||
@@ -201,6 +191,24 @@ msgbuf_init(struct msgbuf *msgbuf)
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -210,43 +74,24 @@ diff -u -p -r1.1.1.1 -r1.1.1.4
|
|||
msgbuf_clear(struct msgbuf *msgbuf)
|
||||
{
|
||||
struct buf *buf;
|
||||
@@ -151,14 +221,14 @@ int
|
||||
@@ -213,7 +221,7 @@ int
|
||||
msgbuf_write(struct msgbuf *msgbuf)
|
||||
{
|
||||
struct iovec iov[IOV_MAX];
|
||||
- struct buf *buf, *next;
|
||||
- int i = 0;
|
||||
+ struct buf *buf;
|
||||
+ unsigned int i = 0;
|
||||
unsigned int i = 0;
|
||||
ssize_t n;
|
||||
struct msghdr msg;
|
||||
struct cmsghdr *cmsg;
|
||||
union {
|
||||
- struct cmsghdr hdr;
|
||||
- char buf[CMSG_SPACE(sizeof(int))];
|
||||
+ struct cmsghdr hdr;
|
||||
+ char buf[CMSG_SPACE(sizeof(int))];
|
||||
} cmsgbuf;
|
||||
|
||||
bzero(&iov, sizeof(iov));
|
||||
@@ -167,7 +237,7 @@ msgbuf_write(struct msgbuf *msgbuf)
|
||||
if (i >= IOV_MAX)
|
||||
break;
|
||||
iov[i].iov_base = buf->buf + buf->rpos;
|
||||
- iov[i].iov_len = buf->size - buf->rpos;
|
||||
+ iov[i].iov_len = buf->wpos - buf->rpos;
|
||||
i++;
|
||||
if (buf->fd != -1)
|
||||
break;
|
||||
@@ -208,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf)
|
||||
@@ -270,17 +278,7 @@ msgbuf_write(struct msgbuf *msgbuf)
|
||||
buf->fd = -1;
|
||||
}
|
||||
|
||||
- for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0;
|
||||
- buf = next) {
|
||||
- next = TAILQ_NEXT(buf, entry);
|
||||
- if (buf->rpos + n >= buf->size) {
|
||||
- n -= buf->size - buf->rpos;
|
||||
- if (buf->rpos + n >= buf->wpos) {
|
||||
- n -= buf->wpos - buf->rpos;
|
||||
- buf_dequeue(msgbuf, buf);
|
||||
- } else {
|
||||
- buf->rpos += n;
|
||||
|
|
|
@ -1,31 +1,12 @@
|
|||
Index: bgpd/carp.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/carp.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.1 -r1.4
|
||||
--- bgpd/carp.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpd/carp.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/carp.c 22 Oct 2009 15:10:02 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: carp.c,v 1.5 2007/04/23 14:52:28 claudio Exp $ */
|
||||
+/* $OpenBSD: carp.c,v 1.6 2008/09/10 15:00:01 tobias Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006 Henning Brauer <henning@openbsd.org>
|
||||
@@ -72,8 +72,11 @@ carp_demote_init(char *group, int force)
|
||||
}
|
||||
|
||||
/* only demote if this group already is demoted */
|
||||
- if ((level = carp_demote_get(group)) == -1)
|
||||
+ if ((level = carp_demote_get(group)) == -1) {
|
||||
+ free(c->group);
|
||||
+ free(c);
|
||||
return (-1);
|
||||
+ }
|
||||
if (level > 0 || force)
|
||||
c->do_demote = 1;
|
||||
|
||||
@@ -90,9 +93,8 @@ carp_demote_shutdown(void)
|
||||
@@ -93,9 +93,8 @@ carp_demote_shutdown(void)
|
||||
|
||||
while ((c = TAILQ_FIRST(&carpgroups)) != NULL) {
|
||||
TAILQ_REMOVE(&carpgroups, c, entry);
|
||||
|
@ -37,7 +18,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
|
||||
free(c->group);
|
||||
free(c);
|
||||
@@ -102,6 +104,9 @@ carp_demote_shutdown(void)
|
||||
@@ -105,6 +104,9 @@ carp_demote_shutdown(void)
|
||||
int
|
||||
carp_demote_get(char *group)
|
||||
{
|
||||
|
@ -47,7 +28,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
int s;
|
||||
struct ifgroupreq ifgr;
|
||||
|
||||
@@ -124,6 +129,7 @@ carp_demote_get(char *group)
|
||||
@@ -127,6 +129,7 @@ carp_demote_get(char *group)
|
||||
|
||||
close(s);
|
||||
return ((int)ifgr.ifgr_attrib.ifg_carp_demoted);
|
||||
|
@ -55,7 +36,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
}
|
||||
|
||||
int
|
||||
@@ -156,6 +162,9 @@ carp_demote_set(char *group, int demote)
|
||||
@@ -159,6 +162,9 @@ carp_demote_set(char *group, int demote)
|
||||
int
|
||||
carp_demote_ioctl(char *group, int demote)
|
||||
{
|
||||
|
@ -65,7 +46,7 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
int s, res;
|
||||
struct ifgroupreq ifgr;
|
||||
|
||||
@@ -178,4 +187,5 @@ carp_demote_ioctl(char *group, int demot
|
||||
@@ -181,4 +187,5 @@ carp_demote_ioctl(char *group, int demot
|
||||
|
||||
close(s);
|
||||
return (res);
|
||||
|
|
|
@ -1,23 +1,38 @@
|
|||
Index: bgpd/config.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/config.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/config.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/config.c 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.1.1.7
|
||||
diff -u -p -r1.1.1.6 -r1.1.1.7
|
||||
--- bgpd/config.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/config.c 14 Feb 2010 20:27:06 -0000 1.1.1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: config.c,v 1.50 2007/10/13 16:35:20 deraadt Exp $ */
|
||||
+/* $OpenBSD: config.c,v 1.51 2009/01/26 23:10:02 claudio Exp $ */
|
||||
-/* $OpenBSD: config.c,v 1.51 2009/01/26 23:10:02 claudio Exp $ */
|
||||
+/* $OpenBSD: config.c,v 1.52 2009/12/01 14:28:05 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
|
||||
@@ -145,7 +145,7 @@ get_bgpid(void)
|
||||
cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
|
||||
if ((cur & localnet) == localnet) /* skip 127/8 */
|
||||
continue;
|
||||
- if (cur > ip)
|
||||
+ if (ntohl(cur) > ntohl(ip))
|
||||
ip = cur;
|
||||
@@ -208,7 +208,7 @@ host_v4(const char *s, struct bgpd_addr
|
||||
return (0);
|
||||
}
|
||||
|
||||
- h->af = AF_INET;
|
||||
+ h->aid = AID_INET;
|
||||
h->v4.s_addr = ina.s_addr;
|
||||
*len = bits;
|
||||
|
||||
@@ -225,13 +225,7 @@ host_v6(const char *s, struct bgpd_addr
|
||||
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
if (getaddrinfo(s, "0", &hints, &res) == 0) {
|
||||
- h->af = AF_INET6;
|
||||
- memcpy(&h->v6,
|
||||
- &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr,
|
||||
- sizeof(h->v6));
|
||||
- h->scope_id =
|
||||
- ((struct sockaddr_in6 *)res->ai_addr)->sin6_scope_id;
|
||||
-
|
||||
+ sa2addr(res->ai_addr, h);
|
||||
freeaddrinfo(res);
|
||||
return (1);
|
||||
}
|
||||
freeifaddrs(ifap);
|
||||
|
|
|
@ -1,18 +1,54 @@
|
|||
Index: bgpd/control.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/control.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.3
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.3
|
||||
--- bgpd/control.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/control.c 22 Oct 2009 14:24:02 -0000 1.1.1.3
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.1.1.8
|
||||
diff -u -p -r1.1.1.7 -r1.1.1.8
|
||||
--- bgpd/control.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/control.c 14 Feb 2010 20:27:06 -0000 1.1.1.8
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: control.c,v 1.60 2008/05/11 01:08:05 henning Exp $ */
|
||||
+/* $OpenBSD: control.c,v 1.61 2009/05/05 20:09:19 sthen Exp $ */
|
||||
-/* $OpenBSD: control.c,v 1.61 2009/05/05 20:09:19 sthen Exp $ */
|
||||
+/* $OpenBSD: control.c,v 1.68 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -328,11 +328,11 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
@@ -53,7 +53,7 @@ control_init(int restricted, char *path)
|
||||
|
||||
if (unlink(path) == -1)
|
||||
if (errno != ENOENT) {
|
||||
- log_warn("unlink %s", path);
|
||||
+ log_warn("control_init: unlink %s", path);
|
||||
close(fd);
|
||||
return (-1);
|
||||
}
|
||||
@@ -123,14 +123,14 @@ control_accept(int listenfd, int restric
|
||||
if ((connfd = accept(listenfd,
|
||||
(struct sockaddr *)&sun, &len)) == -1) {
|
||||
if (errno != EWOULDBLOCK && errno != EINTR)
|
||||
- log_warn("session_control_accept");
|
||||
+ log_warn("control_accept: accept");
|
||||
return (0);
|
||||
}
|
||||
|
||||
session_socket_blockmode(connfd, BM_NONBLOCK);
|
||||
|
||||
if ((ctl_conn = malloc(sizeof(struct ctl_conn))) == NULL) {
|
||||
- log_warn("session_control_accept");
|
||||
+ log_warn("control_accept");
|
||||
close(connfd);
|
||||
return (0);
|
||||
}
|
||||
@@ -191,7 +191,8 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
{
|
||||
struct imsg imsg;
|
||||
struct ctl_conn *c;
|
||||
- int n;
|
||||
+ ssize_t n;
|
||||
+ int verbose;
|
||||
struct peer *p;
|
||||
struct ctl_neighbor *neighbor;
|
||||
struct ctl_show_rib_request *ribreq;
|
||||
@@ -328,13 +329,19 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
control_result(c, CTL_RES_OK);
|
||||
break;
|
||||
case IMSG_CTL_NEIGHBOR_DOWN:
|
||||
|
@ -22,21 +58,57 @@ diff -u -p -r1.1.1.1 -r1.1.1.3
|
|||
break;
|
||||
case IMSG_CTL_NEIGHBOR_CLEAR:
|
||||
- bgp_fsm(p, EVNT_STOP);
|
||||
+ session_stop(p, ERR_CEASE_ADMIN_RESET);
|
||||
timer_set(p, Timer_IdleHold,
|
||||
SESSION_CLEAR_DELAY);
|
||||
- timer_set(p, Timer_IdleHold,
|
||||
- SESSION_CLEAR_DELAY);
|
||||
+ if (!p->conf.down) {
|
||||
+ session_stop(p,
|
||||
+ ERR_CEASE_ADMIN_RESET);
|
||||
+ timer_set(p, Timer_IdleHold,
|
||||
+ SESSION_CLEAR_DELAY);
|
||||
+ } else {
|
||||
+ session_stop(p,
|
||||
+ ERR_CEASE_ADMIN_DOWN);
|
||||
+ }
|
||||
control_result(c, CTL_RES_OK);
|
||||
@@ -396,6 +396,13 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
control_result(c, CTL_RES_NOCAP);
|
||||
break;
|
||||
case IMSG_CTL_NEIGHBOR_RREFRESH:
|
||||
@@ -370,7 +377,7 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
neighbor->descr[PEER_DESCR_LEN - 1] = 0;
|
||||
ribreq->peerid = 0;
|
||||
p = NULL;
|
||||
- if (neighbor->addr.af) {
|
||||
+ if (neighbor->addr.aid) {
|
||||
p = getpeerbyaddr(&neighbor->addr);
|
||||
if (p == NULL) {
|
||||
control_result(c,
|
||||
@@ -397,8 +404,7 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
break;
|
||||
}
|
||||
+ if ((imsg.hdr.type == IMSG_CTL_SHOW_RIB_PREFIX)
|
||||
+ && (ribreq->prefix.af != AF_INET)
|
||||
+ && (ribreq->prefix.af != AF_INET6)) {
|
||||
+ /* malformed request, must specify af */
|
||||
+ control_result(c, CTL_RES_PARSE_ERROR);
|
||||
+ break;
|
||||
+ }
|
||||
c->ibuf.pid = imsg.hdr.pid;
|
||||
imsg_compose_rde(imsg.hdr.type, imsg.hdr.pid,
|
||||
if ((imsg.hdr.type == IMSG_CTL_SHOW_RIB_PREFIX)
|
||||
- && (ribreq->prefix.af != AF_INET)
|
||||
- && (ribreq->prefix.af != AF_INET6)) {
|
||||
+ && (ribreq->prefix.aid == AID_UNSPEC)) {
|
||||
/* malformed request, must specify af */
|
||||
control_result(c, CTL_RES_PARSE_ERROR);
|
||||
break;
|
||||
@@ -425,6 +431,20 @@ control_dispatch_msg(struct pollfd *pfd,
|
||||
imsg_compose_rde(imsg.hdr.type, 0,
|
||||
imsg.data, imsg.hdr.len - IMSG_HEADER_SIZE);
|
||||
break;
|
||||
+ case IMSG_CTL_LOG_VERBOSE:
|
||||
+ if (imsg.hdr.len != IMSG_HEADER_SIZE +
|
||||
+ sizeof(verbose))
|
||||
+ break;
|
||||
+
|
||||
+ /* forward to other processes */
|
||||
+ imsg_compose_parent(imsg.hdr.type, imsg.hdr.pid,
|
||||
+ imsg.data, imsg.hdr.len - IMSG_HEADER_SIZE);
|
||||
+ imsg_compose_rde(imsg.hdr.type, 0,
|
||||
+ imsg.data, imsg.hdr.len - IMSG_HEADER_SIZE);
|
||||
+
|
||||
+ memcpy(&verbose, imsg.data, sizeof(verbose));
|
||||
+ log_verbose(verbose);
|
||||
+ break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1,267 +1,26 @@
|
|||
Index: bgpd/imsg.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/imsg.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.3
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.3
|
||||
--- bgpd/imsg.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/imsg.c 10 Aug 2009 21:09:57 -0000 1.1.1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.1.1.7
|
||||
diff -u -p -r1.1.1.6 -r1.1.1.7
|
||||
--- bgpd/imsg.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/imsg.c 14 Feb 2010 20:27:06 -0000 1.1.1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: imsg.c,v 1.42 2008/03/24 16:11:02 deraadt Exp $ */
|
||||
-/* $OpenBSD: imsg.c,v 1.47 2009/06/08 08:30:06 dlg Exp $ */
|
||||
+/* $OpenBSD: imsg.c,v 1.48 2009/08/08 18:33:40 nicm Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -16,7 +16,9 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
-#include <sys/types.h>
|
||||
+#include <sys/param.h>
|
||||
+#include <sys/queue.h>
|
||||
+#include <sys/socket.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <errno.h>
|
||||
@@ -24,7 +26,9 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
-#include "bgpd.h"
|
||||
+#include "imsg.h"
|
||||
+
|
||||
+int imsg_get_fd(struct imsgbuf *);
|
||||
|
||||
@@ -263,6 +263,9 @@ imsg_flush(struct imsgbuf *ibuf)
|
||||
void
|
||||
imsg_init(struct imsgbuf *ibuf, int fd)
|
||||
@@ -37,14 +41,14 @@ imsg_init(struct imsgbuf *ibuf, int fd)
|
||||
TAILQ_INIT(&ibuf->fds);
|
||||
}
|
||||
|
||||
-int
|
||||
+ssize_t
|
||||
imsg_read(struct imsgbuf *ibuf)
|
||||
imsg_clear(struct imsgbuf *ibuf)
|
||||
{
|
||||
struct msghdr msg;
|
||||
struct cmsghdr *cmsg;
|
||||
union {
|
||||
struct cmsghdr hdr;
|
||||
- char buf[CMSG_SPACE(sizeof(int) * 16)];
|
||||
+ char buf[CMSG_SPACE(sizeof(int) * 16)];
|
||||
} cmsgbuf;
|
||||
struct iovec iov;
|
||||
ssize_t n;
|
||||
@@ -52,6 +56,7 @@ imsg_read(struct imsgbuf *ibuf)
|
||||
struct imsg_fd *ifd;
|
||||
|
||||
bzero(&msg, sizeof(msg));
|
||||
+
|
||||
iov.iov_base = ibuf->r.buf + ibuf->r.wpos;
|
||||
iov.iov_len = sizeof(ibuf->r.buf) - ibuf->r.wpos;
|
||||
msg.msg_iov = &iov;
|
||||
@@ -61,7 +66,6 @@ imsg_read(struct imsgbuf *ibuf)
|
||||
|
||||
if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) {
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
- log_warn("imsg_read: pipe read error");
|
||||
return (-1);
|
||||
}
|
||||
return (-2);
|
||||
@@ -74,19 +78,20 @@ imsg_read(struct imsgbuf *ibuf)
|
||||
if (cmsg->cmsg_level == SOL_SOCKET &&
|
||||
cmsg->cmsg_type == SCM_RIGHTS) {
|
||||
fd = (*(int *)CMSG_DATA(cmsg));
|
||||
- if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL)
|
||||
- fatal("imsg_read calloc");
|
||||
+ if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) {
|
||||
+ /* XXX: this return can leak */
|
||||
+ return (-1);
|
||||
+ }
|
||||
ifd->fd = fd;
|
||||
TAILQ_INSERT_TAIL(&ibuf->fds, ifd, entry);
|
||||
- } else
|
||||
- log_warn("imsg_read: got unexpected ctl data level %d "
|
||||
- "type %d", cmsg->cmsg_level, cmsg->cmsg_type);
|
||||
+ }
|
||||
+ /* we do not handle other ctl data level */
|
||||
}
|
||||
|
||||
return (n);
|
||||
}
|
||||
|
||||
-int
|
||||
+ssize_t
|
||||
imsg_get(struct imsgbuf *ibuf, struct imsg *imsg)
|
||||
{
|
||||
size_t av, left, datalen;
|
||||
@@ -99,18 +104,21 @@ imsg_get(struct imsgbuf *ibuf, struct im
|
||||
memcpy(&imsg->hdr, ibuf->r.buf, sizeof(imsg->hdr));
|
||||
if (imsg->hdr.len < IMSG_HEADER_SIZE ||
|
||||
imsg->hdr.len > MAX_IMSGSIZE) {
|
||||
- log_warnx("imsg_get: imsg hdr len %u out of bounds, type=%u",
|
||||
- imsg->hdr.len, imsg->hdr.type);
|
||||
+ errno = ERANGE;
|
||||
return (-1);
|
||||
}
|
||||
if (imsg->hdr.len > av)
|
||||
return (0);
|
||||
datalen = imsg->hdr.len - IMSG_HEADER_SIZE;
|
||||
ibuf->r.rptr = ibuf->r.buf + IMSG_HEADER_SIZE;
|
||||
- if ((imsg->data = malloc(datalen)) == NULL) {
|
||||
- log_warn("imsg_get");
|
||||
+ if ((imsg->data = malloc(datalen)) == NULL)
|
||||
return (-1);
|
||||
- }
|
||||
+
|
||||
+ if (imsg->hdr.flags & IMSGF_HASFD)
|
||||
+ imsg->fd = imsg_get_fd(ibuf);
|
||||
+ else
|
||||
+ imsg->fd = -1;
|
||||
+
|
||||
memcpy(imsg->data, ibuf->r.rptr, datalen);
|
||||
|
||||
if (imsg->hdr.len < av) {
|
||||
@@ -124,11 +132,10 @@ imsg_get(struct imsgbuf *ibuf, struct im
|
||||
}
|
||||
|
||||
int
|
||||
-imsg_compose(struct imsgbuf *ibuf, enum imsg_type type, u_int32_t peerid,
|
||||
- pid_t pid, int fd, const void *data, u_int16_t datalen)
|
||||
+imsg_compose(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid,
|
||||
+ pid_t pid, int fd, void *data, u_int16_t datalen)
|
||||
{
|
||||
struct buf *wbuf;
|
||||
- int n;
|
||||
|
||||
if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL)
|
||||
return (-1);
|
||||
@@ -138,33 +145,55 @@ imsg_compose(struct imsgbuf *ibuf, enum
|
||||
|
||||
wbuf->fd = fd;
|
||||
|
||||
- if ((n = imsg_close(ibuf, wbuf)) < 0)
|
||||
+ imsg_close(ibuf, wbuf);
|
||||
+
|
||||
+ return (1);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+imsg_composev(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid,
|
||||
+ pid_t pid, int fd, const struct iovec *iov, int iovcnt)
|
||||
+{
|
||||
+ struct buf *wbuf;
|
||||
+ int i, datalen = 0;
|
||||
+
|
||||
+ for (i = 0; i < iovcnt; i++)
|
||||
+ datalen += iov[i].iov_len;
|
||||
+
|
||||
+ if ((wbuf = imsg_create(ibuf, type, peerid, pid, datalen)) == NULL)
|
||||
return (-1);
|
||||
|
||||
- return (n);
|
||||
+ for (i = 0; i < iovcnt; i++)
|
||||
+ if (imsg_add(wbuf, iov[i].iov_base, iov[i].iov_len) == -1)
|
||||
+ return (-1);
|
||||
+
|
||||
+ wbuf->fd = fd;
|
||||
+
|
||||
+ imsg_close(ibuf, wbuf);
|
||||
+
|
||||
+ return (1);
|
||||
}
|
||||
|
||||
+/* ARGSUSED */
|
||||
struct buf *
|
||||
-imsg_create(struct imsgbuf *ibuf, enum imsg_type type, u_int32_t peerid,
|
||||
+imsg_create(struct imsgbuf *ibuf, u_int32_t type, u_int32_t peerid,
|
||||
pid_t pid, u_int16_t datalen)
|
||||
{
|
||||
struct buf *wbuf;
|
||||
struct imsg_hdr hdr;
|
||||
|
||||
- if (datalen > MAX_IMSGSIZE - IMSG_HEADER_SIZE) {
|
||||
- log_warnx("imsg_create: len %u > MAX_IMSGSIZE; "
|
||||
- "type %u peerid %lu", datalen + IMSG_HEADER_SIZE,
|
||||
- type, peerid);
|
||||
+ datalen += IMSG_HEADER_SIZE;
|
||||
+ if (datalen > MAX_IMSGSIZE) {
|
||||
+ errno = ERANGE;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
- hdr.len = datalen + IMSG_HEADER_SIZE;
|
||||
hdr.type = type;
|
||||
+ hdr.flags = 0;
|
||||
hdr.peerid = peerid;
|
||||
if ((hdr.pid = pid) == 0)
|
||||
hdr.pid = ibuf->pid;
|
||||
- if ((wbuf = buf_open(hdr.len)) == NULL) {
|
||||
- log_warn("imsg_create: buf_open");
|
||||
+ if ((wbuf = buf_dynamic(datalen, MAX_IMSGSIZE)) == NULL) {
|
||||
return (NULL);
|
||||
}
|
||||
if (imsg_add(wbuf, &hdr, sizeof(hdr)) == -1)
|
||||
@@ -174,28 +203,30 @@ imsg_create(struct imsgbuf *ibuf, enum i
|
||||
}
|
||||
|
||||
int
|
||||
-imsg_add(struct buf *msg, const void *data, u_int16_t datalen)
|
||||
+imsg_add(struct buf *msg, void *data, u_int16_t datalen)
|
||||
{
|
||||
if (datalen)
|
||||
if (buf_add(msg, data, datalen) == -1) {
|
||||
- log_warnx("imsg_add: buf_add error");
|
||||
buf_free(msg);
|
||||
return (-1);
|
||||
}
|
||||
return (datalen);
|
||||
}
|
||||
|
||||
-int
|
||||
+void
|
||||
imsg_close(struct imsgbuf *ibuf, struct buf *msg)
|
||||
{
|
||||
- int n;
|
||||
+ struct imsg_hdr *hdr;
|
||||
|
||||
- if ((n = buf_close(&ibuf->w, msg)) < 0) {
|
||||
- log_warnx("imsg_close: buf_close error");
|
||||
- buf_free(msg);
|
||||
- return (-1);
|
||||
- }
|
||||
- return (n);
|
||||
+ hdr = (struct imsg_hdr *)msg->buf;
|
||||
+
|
||||
+ hdr->flags &= ~IMSGF_HASFD;
|
||||
+ if (msg->fd != -1)
|
||||
+ hdr->flags |= IMSGF_HASFD;
|
||||
+
|
||||
+ hdr->len = (u_int16_t)msg->wpos;
|
||||
+
|
||||
+ buf_close(&ibuf->w, msg);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -219,3 +250,22 @@ imsg_get_fd(struct imsgbuf *ibuf)
|
||||
|
||||
return (fd);
|
||||
}
|
||||
+
|
||||
+int
|
||||
+imsg_flush(struct imsgbuf *ibuf)
|
||||
+{
|
||||
+ while (ibuf->w.queued)
|
||||
+ if (msgbuf_write(&ibuf->w) < 0)
|
||||
+ return (-1);
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+imsg_clear(struct imsgbuf *ibuf)
|
||||
+{
|
||||
- while (ibuf->w.queued)
|
||||
- msgbuf_clear(&ibuf->w);
|
||||
+ int fd;
|
||||
+
|
||||
+ msgbuf_clear(&ibuf->w);
|
||||
+ while ((fd = imsg_get_fd(ibuf)) != -1)
|
||||
+ close(fd);
|
||||
+}
|
||||
}
|
||||
|
|
|
@ -1,116 +1,16 @@
|
|||
Index: bgpd/imsg.h
|
||||
===================================================================
|
||||
RCS file: bgpd/imsg.h
|
||||
diff -N bgpd/imsg.h
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ bgpd/imsg.h 22 Oct 2009 14:24:02 -0000 1.1.1.2
|
||||
@@ -0,0 +1,109 @@
|
||||
+/* $OpenBSD: imsg.h,v 1.3 2009/06/07 05:56:24 eric Exp $ */
|
||||
+
|
||||
+/*
|
||||
+ * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
|
||||
+ * Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
|
||||
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
+ *
|
||||
+ * Permission to use, copy, modify, and distribute this software for any
|
||||
+ * purpose with or without fee is hereby granted, provided that the above
|
||||
+ * copyright notice and this permission notice appear in all copies.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+#include <sys/tree.h>
|
||||
+
|
||||
+#define READ_BUF_SIZE 65535
|
||||
+#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr)
|
||||
+#define MAX_IMSGSIZE 16384
|
||||
+
|
||||
+struct buf {
|
||||
+ TAILQ_ENTRY(buf) entry;
|
||||
+ u_char *buf;
|
||||
+ size_t size;
|
||||
+ size_t max;
|
||||
+ size_t wpos;
|
||||
+ size_t rpos;
|
||||
+ int fd;
|
||||
+};
|
||||
+
|
||||
+struct msgbuf {
|
||||
+ TAILQ_HEAD(, buf) bufs;
|
||||
+ u_int32_t queued;
|
||||
+ int fd;
|
||||
+};
|
||||
+
|
||||
+struct buf_read {
|
||||
+ u_char buf[READ_BUF_SIZE];
|
||||
+ u_char *rptr;
|
||||
+ size_t wpos;
|
||||
+};
|
||||
+
|
||||
+struct imsg_fd {
|
||||
+ TAILQ_ENTRY(imsg_fd) entry;
|
||||
+ int fd;
|
||||
+};
|
||||
+
|
||||
+struct imsgbuf {
|
||||
+ TAILQ_HEAD(, imsg_fd) fds;
|
||||
+ struct buf_read r;
|
||||
+ struct msgbuf w;
|
||||
+ int fd;
|
||||
+ pid_t pid;
|
||||
+};
|
||||
+
|
||||
+#define IMSGF_HASFD 1
|
||||
+
|
||||
+struct imsg_hdr {
|
||||
+ u_int32_t type;
|
||||
+ u_int16_t len;
|
||||
+ u_int16_t flags;
|
||||
+ u_int32_t peerid;
|
||||
+ u_int32_t pid;
|
||||
+};
|
||||
+
|
||||
+struct imsg {
|
||||
+ struct imsg_hdr hdr;
|
||||
+ int fd;
|
||||
+ void *data;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+/* buffer.c */
|
||||
+struct buf *buf_open(size_t);
|
||||
+struct buf *buf_dynamic(size_t, size_t);
|
||||
+int buf_add(struct buf *, const void *, size_t);
|
||||
+void *buf_reserve(struct buf *, size_t);
|
||||
+void *buf_seek(struct buf *, size_t, size_t);
|
||||
+size_t buf_size(struct buf *);
|
||||
+size_t buf_left(struct buf *);
|
||||
+void buf_close(struct msgbuf *, struct buf *);
|
||||
+int buf_write(struct msgbuf *);
|
||||
+void buf_free(struct buf *);
|
||||
+void msgbuf_init(struct msgbuf *);
|
||||
+void msgbuf_clear(struct msgbuf *);
|
||||
+int msgbuf_write(struct msgbuf *);
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/imsg.h,v
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.1.1.6
|
||||
diff -u -p -r1.1.1.5 -r1.1.1.6
|
||||
--- bgpd/imsg.h 14 Feb 2010 20:19:57 -0000 1.1.1.5
|
||||
+++ bgpd/imsg.h 14 Feb 2010 20:27:06 -0000 1.1.1.6
|
||||
@@ -90,6 +90,7 @@ void buf_free(struct buf *);
|
||||
void msgbuf_init(struct msgbuf *);
|
||||
void msgbuf_clear(struct msgbuf *);
|
||||
int msgbuf_write(struct msgbuf *);
|
||||
+void msgbuf_drain(struct msgbuf *, size_t);
|
||||
+
|
||||
+/* imsg.c */
|
||||
+void imsg_init(struct imsgbuf *, int);
|
||||
+ssize_t imsg_read(struct imsgbuf *);
|
||||
+ssize_t imsg_get(struct imsgbuf *, struct imsg *);
|
||||
+int imsg_compose(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
|
||||
+ int, void *, u_int16_t);
|
||||
+int imsg_composev(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
|
||||
+ int, const struct iovec *, int);
|
||||
+struct buf *imsg_create(struct imsgbuf *, u_int32_t, u_int32_t, pid_t,
|
||||
+ u_int16_t);
|
||||
+int imsg_add(struct buf *, void *, u_int16_t);
|
||||
+void imsg_close(struct imsgbuf *, struct buf *);
|
||||
+void imsg_free(struct imsg *);
|
||||
+int imsg_flush(struct imsgbuf *);
|
||||
+void imsg_clear(struct imsgbuf *);
|
||||
|
||||
/* imsg.c */
|
||||
void imsg_init(struct imsgbuf *, int);
|
||||
|
|
File diff suppressed because it is too large
Load diff
74
net/openbgpd/files/patch-bgpd_log.c
Normal file
74
net/openbgpd/files/patch-bgpd_log.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
Index: bgpd/log.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/log.c,v
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.1.1.6
|
||||
diff -u -p -r1.1.1.5 -r1.1.1.6
|
||||
--- bgpd/log.c 14 Feb 2010 20:19:57 -0000 1.1.1.5
|
||||
+++ bgpd/log.c 14 Feb 2010 20:27:06 -0000 1.1.1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: log.c,v 1.50 2007/04/23 13:04:24 claudio Exp $ */
|
||||
+/* $OpenBSD: log.c,v 1.53 2009/12/03 19:20:35 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "log.h"
|
||||
|
||||
int debug;
|
||||
+int verbose;
|
||||
|
||||
void logit(int, const char *, ...);
|
||||
|
||||
@@ -42,8 +43,9 @@ log_fmt_peer(const struct peer_config *p
|
||||
char *pfmt, *p;
|
||||
|
||||
ip = log_addr(&peer->remote_addr);
|
||||
- if ((peer->remote_addr.af == AF_INET && peer->remote_masklen != 32) ||
|
||||
- (peer->remote_addr.af == AF_INET6 && peer->remote_masklen != 128)) {
|
||||
+ if ((peer->remote_addr.aid == AID_INET && peer->remote_masklen != 32) ||
|
||||
+ (peer->remote_addr.aid == AID_INET6 &&
|
||||
+ peer->remote_masklen != 128)) {
|
||||
if (asprintf(&p, "%s/%u", ip, peer->remote_masklen) == -1)
|
||||
fatal(NULL);
|
||||
} else {
|
||||
@@ -69,6 +71,7 @@ log_init(int n_debug)
|
||||
extern char *__progname;
|
||||
|
||||
debug = n_debug;
|
||||
+ verbose = n_debug;
|
||||
|
||||
if (!debug)
|
||||
openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
|
||||
@@ -77,6 +80,12 @@ log_init(int n_debug)
|
||||
}
|
||||
|
||||
void
|
||||
+log_verbose(int v)
|
||||
+{
|
||||
+ verbose = v;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
logit(int pri, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -193,7 +202,7 @@ log_debug(const char *emsg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
- if (debug) {
|
||||
+ if (verbose) {
|
||||
va_start(ap, emsg);
|
||||
vlog(LOG_DEBUG, emsg, ap);
|
||||
va_end(ap);
|
||||
@@ -318,6 +327,9 @@ log_conn_attempt(const struct peer *peer
|
||||
b = log_sockaddr(sa);
|
||||
logit(LOG_INFO, "connection from non-peer %s refused", b);
|
||||
} else {
|
||||
+ /* only log if there is a chance that the session may come up */
|
||||
+ if (peer->conf.down && peer->state == STATE_IDLE)
|
||||
+ return;
|
||||
p = log_fmt_peer(&peer->conf);
|
||||
logit(LOG_INFO, "Connection attempt from %s while session is "
|
||||
"in state %s", p, statenames[peer->state]);
|
|
@ -1,21 +0,0 @@
|
|||
Index: bgpd/log.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/log.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/log.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/log.h 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: log.h,v 1.10 2007/12/23 18:26:13 henning Exp $ */
|
||||
+/* $OpenBSD: log.h,v 1.11 2008/09/11 14:49:58 henning Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -119,5 +119,6 @@ static const char * const timernames[] =
|
||||
"HoldTimer",
|
||||
"IdleHoldTimer",
|
||||
"IdleHoldResetTimer",
|
||||
+ "CarpUndemoteTimer",
|
||||
""
|
||||
};
|
File diff suppressed because it is too large
Load diff
|
@ -1,208 +1,23 @@
|
|||
Index: bgpd/mrt.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/mrt.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/mrt.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/mrt.h 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.1.1.7
|
||||
diff -u -p -r1.1.1.6 -r1.1.1.7
|
||||
--- bgpd/mrt.h 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/mrt.h 14 Feb 2010 20:27:06 -0000 1.1.1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: mrt.h,v 1.16 2007/05/30 04:28:27 msf Exp $ */
|
||||
+/* $OpenBSD: mrt.h,v 1.23 2009/06/29 12:22:16 claudio Exp $ */
|
||||
-/* $OpenBSD: mrt.h,v 1.23 2009/06/29 12:22:16 claudio Exp $ */
|
||||
+/* $OpenBSD: mrt.h,v 1.24 2009/10/26 09:27:58 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
@@ -20,12 +20,10 @@
|
||||
|
||||
#include "bgpd.h"
|
||||
|
||||
-/* In cases of failure wait at least MRT_MIN_RETRY. */
|
||||
-#define MRT_MIN_RETRY 300
|
||||
-
|
||||
/*
|
||||
- * MRT binary packet format as used by zebra.
|
||||
+ * MRT binary packet format
|
||||
* For more info see:
|
||||
+ * draft-ietf-grow-mrt-04.txt, "MRT routing information export format"
|
||||
* http://www.quagga.net/docs/docs-multi/Packet-Binary-Dump-Format.html
|
||||
*/
|
||||
|
||||
@@ -38,24 +36,33 @@
|
||||
* +--------+--------+--------+--------+
|
||||
* | length | length of packet excluding this header
|
||||
* +--------+--------+--------+--------+
|
||||
+ *
|
||||
+ * ET types include an additional 32bit microsecond field comming after the
|
||||
+ * length field.
|
||||
*/
|
||||
#define MRT_HEADER_SIZE 12
|
||||
|
||||
enum MRT_MSG_TYPES {
|
||||
- MSG_NULL,
|
||||
+ MSG_NULL, /* 0 empty msg (deprecated) */
|
||||
MSG_START, /* 1 sender is starting up */
|
||||
- MSG_DIE, /* 2 receiver should shut down */
|
||||
+ MSG_DIE, /* 2 receiver should shut down (deprecated) */
|
||||
MSG_I_AM_DEAD, /* 3 sender is shutting down */
|
||||
- MSG_PEER_DOWN, /* 4 sender's peer is down */
|
||||
- MSG_PROTOCOL_BGP, /* 5 msg is a BGP packet */
|
||||
+ MSG_PEER_DOWN, /* 4 sender's peer is down (deprecated) */
|
||||
+ MSG_PROTOCOL_BGP, /* 5 msg is a BGP packet (deprecated) */
|
||||
MSG_PROTOCOL_RIP, /* 6 msg is a RIP packet */
|
||||
- MSG_PROTOCOL_IDRP, /* 7 msg is an IDRP packet */
|
||||
+ MSG_PROTOCOL_IDRP, /* 7 msg is an IDRP packet (deprecated) */
|
||||
MSG_PROTOCOL_RIPNG, /* 8 msg is a RIPNG packet */
|
||||
- MSG_PROTOCOL_BGP4PLUS, /* 9 msg is a BGP4+ packet */
|
||||
- MSG_PROTOCOL_BGP4PLUS1, /* 10 msg is a BGP4+ (draft 01) packet */
|
||||
+ MSG_PROTOCOL_BGP4PLUS, /* 9 msg is a BGP4+ packet (deprecated) */
|
||||
+ MSG_PROTOCOL_BGP4PLUS1, /* 10 msg is a BGP4+ (draft 01) (deprecated) */
|
||||
MSG_PROTOCOL_OSPF, /* 11 msg is an OSPF packet */
|
||||
MSG_TABLE_DUMP, /* 12 routing table dump */
|
||||
- MSG_PROTOCOL_BGP4MP=16 /* 16 zebras own packet format */
|
||||
+ MSG_TABLE_DUMP_V2, /* 13 routing table dump */
|
||||
+ MSG_PROTOCOL_BGP4MP=16, /* 16 zebras own packet format */
|
||||
+ MSG_PROTOCOL_BGP4MP_ET=17,
|
||||
+ MSG_PROTOCOL_ISIS=32, /* 32 msg is a ISIS package */
|
||||
+ MSG_PROTOCOL_ISIS_ET=33,
|
||||
+ MSG_PROTOCOL_OSPFV3=48, /* 48 msg is a OSPFv3 package */
|
||||
+ MSG_PROTOCOL_OSPFV3_ET=49
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -64,15 +71,20 @@ enum MRT_MSG_TYPES {
|
||||
* In most cases this is the format to choose to dump updates et al.
|
||||
*/
|
||||
enum MRT_BGP4MP_TYPES {
|
||||
- BGP4MP_STATE_CHANGE=0, /* state change */
|
||||
- BGP4MP_MESSAGE=1, /* bgp message */
|
||||
- BGP4MP_ENTRY=2, /* table dumps */
|
||||
- BGP4MP_SNAPSHOT=3
|
||||
+ BGP4MP_STATE_CHANGE, /* state change */
|
||||
+ BGP4MP_MESSAGE, /* bgp message */
|
||||
+ BGP4MP_ENTRY, /* table dumps (deprecated) */
|
||||
+ BGP4MP_SNAPSHOT, /* file name for dump (deprecated) */
|
||||
+ BGP4MP_STATE_CHANGE_AS4,
|
||||
+ BGP4MP_MESSAGE_AS4 /* same as BGP4MP_MESSAGE with 4byte AS */
|
||||
};
|
||||
|
||||
/* size of the BGP4MP headers without payload */
|
||||
#define MRT_BGP4MP_IPv4_HEADER_SIZE 16
|
||||
#define MRT_BGP4MP_IPv6_HEADER_SIZE 40
|
||||
+/* 4-byte AS variants of the previous */
|
||||
+#define MRT_BGP4MP_AS4_IPv4_HEADER_SIZE 20
|
||||
+#define MRT_BGP4MP_AS4_IPv6_HEADER_SIZE 44
|
||||
|
||||
/* If the type is PROTOCOL_BGP4MP and the subtype is either BGP4MP_STATE_CHANGE
|
||||
* or BGP4MP_MESSAGE the message consists of a common header plus the payload.
|
||||
@@ -110,6 +122,7 @@ enum MRT_BGP4MP_TYPES {
|
||||
*/
|
||||
#define MRT_BGP4MP_IPv4_ENTRY_SIZE 18
|
||||
#define MRT_BGP4MP_IPv6_ENTRY_SIZE 30
|
||||
+#define MRT_BGP4MP_MAX_PREFIXLEN 17
|
||||
/*
|
||||
* The "new" table dump format consists of messages of type PROTOCOL_BGP4MP
|
||||
* and subtype BGP4MP_ENTRY.
|
||||
@@ -151,9 +164,9 @@ enum MRT_BGP4MP_TYPES {
|
||||
* +--------+--------+--------+--------+
|
||||
* | prefix |
|
||||
* +--------+--------+--------+--------+
|
||||
- * | plen | status | originated
|
||||
+ * | plen | status | originated time
|
||||
* +--------+--------+--------+--------+
|
||||
- * originated | peer_ip
|
||||
+ * originated time | peer_ip
|
||||
* +--------+--------+--------+--------+
|
||||
* peer_ip | peer_as |
|
||||
* +--------+--------+--------+--------+
|
||||
@@ -166,8 +179,7 @@ enum MRT_BGP4MP_TYPES {
|
||||
*
|
||||
*
|
||||
* View is normaly 0 and seqnum just a simple counter for this dump.
|
||||
- * The status seems to be 1 by default but probably something to indicate
|
||||
- * the status of a prefix would be more useful.
|
||||
+ * The status field is unused and should be set to 1.
|
||||
*/
|
||||
|
||||
/* size of the dump header until attr_len */
|
||||
@@ -186,10 +198,14 @@ enum MRT_BGP_TYPES {
|
||||
and announcements) */
|
||||
MSG_BGP_PREF_UPDATE, /* tlv preferences followed by raw update */
|
||||
MSG_BGP_STATE_CHANGE, /* state change */
|
||||
- MSG_BGP_SYNC
|
||||
+ MSG_BGP_SYNC, /* file name for a table dump */
|
||||
+ MSG_BGP_OPEN, /* BGP open messages */
|
||||
+ MSG_BGP_NOTIFY, /* BGP notify messages */
|
||||
+ MSG_BGP_KEEPALIVE /* BGP keepalives */
|
||||
};
|
||||
|
||||
-/* if type MSG_PROTOCOL_BGP and subtype MSG_BGP_UPDATE
|
||||
+/* if type MSG_PROTOCOL_BGP and subtype MSG_BGP_UPDATE, MSG_BGP_OPEN,
|
||||
+ * MSG_BGP_NOTIFY or MSG_BGP_KEEPALIVE
|
||||
*
|
||||
* +--------+--------+--------+--------+
|
||||
* | source_as | source_ip
|
||||
@@ -225,7 +241,7 @@ enum MRT_BGP_TYPES {
|
||||
/*
|
||||
* if type MSG_PROTOCOL_BGP and subtype MSG_BGP_SYNC OR
|
||||
* if type MSG_PROTOCOL_BGP4MP and subtype BGP4MP_SNAPSHOT
|
||||
- * What is this for?
|
||||
+ * *DEPRECATED*
|
||||
*
|
||||
* +--------+--------+--------+--------+
|
||||
* | view | filename
|
||||
@@ -255,22 +271,22 @@ enum mrt_state {
|
||||
};
|
||||
|
||||
struct mrt {
|
||||
- enum mrt_type type;
|
||||
+ char rib[PEER_DESCR_LEN];
|
||||
+ struct msgbuf wbuf;
|
||||
+ LIST_ENTRY(mrt) entry;
|
||||
u_int32_t peer_id;
|
||||
u_int32_t group_id;
|
||||
- u_int32_t queued;
|
||||
- int fd;
|
||||
- TAILQ_HEAD(, buf) bufs;
|
||||
- LIST_ENTRY(mrt) entry;
|
||||
+ enum mrt_type type;
|
||||
+ enum mrt_state state;
|
||||
+ u_int16_t seqnum;
|
||||
};
|
||||
|
||||
struct mrt_config {
|
||||
struct mrt conf;
|
||||
- time_t ReopenTimer;
|
||||
- time_t ReopenTimerInterval;
|
||||
- enum mrt_state state;
|
||||
char name[MRT_FILE_LEN]; /* base file name */
|
||||
char file[MRT_FILE_LEN]; /* actual file name */
|
||||
+ time_t ReopenTimer;
|
||||
+ time_t ReopenTimerInterval;
|
||||
};
|
||||
|
||||
#define MRT2MC(x) ((struct mrt_config *)(x))
|
||||
@@ -278,16 +294,17 @@ struct mrt_config {
|
||||
|
||||
struct peer;
|
||||
struct prefix;
|
||||
-struct pt_entry;
|
||||
+struct rib_entry;
|
||||
|
||||
/* prototypes */
|
||||
-int mrt_dump_bgp_msg(struct mrt *, void *, u_int16_t,
|
||||
- struct peer *, struct bgpd_config *);
|
||||
-int mrt_dump_state(struct mrt *, u_int16_t, u_int16_t,
|
||||
- struct peer *, struct bgpd_config *);
|
||||
+void mrt_dump_bgp_msg(struct mrt *, void *, u_int16_t,
|
||||
+ struct peer *);
|
||||
+void mrt_dump_state(struct mrt *, u_int16_t, u_int16_t,
|
||||
+ struct peer *);
|
||||
@@ -303,7 +303,7 @@ void mrt_dump_state(struct mrt *, u_in
|
||||
struct peer *);
|
||||
void mrt_clear_seq(void);
|
||||
-void mrt_dump_upcall(struct pt_entry *, void *);
|
||||
-int mrt_write(struct mrt *);
|
||||
+void mrt_dump_upcall(struct rib_entry *, void *);
|
||||
+void mrt_dump_done(void *);
|
||||
+void mrt_write(struct mrt *);
|
||||
void mrt_dump_upcall(struct rib_entry *, void *);
|
||||
-void mrt_dump_done(void *);
|
||||
+void mrt_done(void *);
|
||||
void mrt_write(struct mrt *);
|
||||
void mrt_clean(struct mrt *);
|
||||
void mrt_init(struct imsgbuf *, struct imsgbuf *);
|
||||
int mrt_timeout(struct mrt_head *);
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
Index: bgpd/name2id.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/name2id.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/name2id.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/name2id.c 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: name2id.c,v 1.7 2006/05/02 14:41:26 claudio Exp $ */
|
||||
+/* $OpenBSD: name2id.c,v 1.9 2009/06/04 04:46:42 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004, 2005 Henning Brauer <henning@openbsd.org>
|
File diff suppressed because it is too large
Load diff
|
@ -1,81 +1,120 @@
|
|||
Index: bgpd/pfkey.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/pfkey.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/pfkey.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/pfkey.c 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.1.1.7
|
||||
diff -u -p -r1.1.1.6 -r1.1.1.7
|
||||
--- bgpd/pfkey.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/pfkey.c 14 Feb 2010 20:27:06 -0000 1.1.1.7
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: pfkey.c,v 1.34 2006/10/26 14:26:49 henning Exp $ */
|
||||
+/* $OpenBSD: pfkey.c,v 1.37 2009/04/21 15:25:52 henning Exp $ */
|
||||
-/* $OpenBSD: pfkey.c,v 1.37 2009/04/21 15:25:52 henning Exp $ */
|
||||
+/* $OpenBSD: pfkey.c,v 1.40 2009/12/14 17:38:18 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -36,7 +36,8 @@
|
||||
#define ROUNDUP(x) (((x) + (PFKEY2_CHUNK - 1)) & ~(PFKEY2_CHUNK - 1))
|
||||
#define IOV_CNT 20
|
||||
|
||||
-static u_int32_t sadb_msg_seq = 1;
|
||||
+static u_int32_t sadb_msg_seq = 0;
|
||||
+static u_int32_t pid = 0; /* should pid_t but pfkey needs u_int32_t */
|
||||
static int fd;
|
||||
|
||||
int pfkey_reply(int, u_int32_t *);
|
||||
@@ -74,6 +75,9 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
@@ -74,6 +74,7 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
int len = 0;
|
||||
int iov_cnt;
|
||||
struct sockaddr_storage ssrc, sdst, speer, smask, dmask;
|
||||
+ struct sockaddr *saptr;
|
||||
|
||||
+ if (!pid)
|
||||
+ pid = getpid();
|
||||
+
|
||||
if (!pid)
|
||||
pid = getpid();
|
||||
@@ -81,22 +82,17 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
/* we need clean sockaddr... no ports set */
|
||||
bzero(&ssrc, sizeof(ssrc));
|
||||
bzero(&smask, sizeof(smask));
|
||||
@@ -129,8 +133,8 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
- switch (src->af) {
|
||||
- case AF_INET:
|
||||
- ((struct sockaddr_in *)&ssrc)->sin_addr = src->v4;
|
||||
- ssrc.ss_len = sizeof(struct sockaddr_in);
|
||||
- ssrc.ss_family = AF_INET;
|
||||
+ if ((saptr = addr2sa(src, 0)))
|
||||
+ memcpy(&ssrc, saptr, sizeof(ssrc));
|
||||
+ switch (src->aid) {
|
||||
+ case AID_INET:
|
||||
memset(&((struct sockaddr_in *)&smask)->sin_addr, 0xff, 32/8);
|
||||
break;
|
||||
- case AF_INET6:
|
||||
- memcpy(&((struct sockaddr_in6 *)&ssrc)->sin6_addr,
|
||||
- &src->v6, sizeof(struct in6_addr));
|
||||
- ssrc.ss_len = sizeof(struct sockaddr_in6);
|
||||
- ssrc.ss_family = AF_INET6;
|
||||
+ case AID_INET6:
|
||||
memset(&((struct sockaddr_in6 *)&smask)->sin6_addr, 0xff,
|
||||
128/8);
|
||||
break;
|
||||
- case 0:
|
||||
+ case AID_UNSPEC:
|
||||
ssrc.ss_len = sizeof(struct sockaddr);
|
||||
break;
|
||||
default:
|
||||
@@ -107,22 +103,17 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
|
||||
bzero(&smsg, sizeof(smsg));
|
||||
smsg.sadb_msg_version = PF_KEY_V2;
|
||||
- smsg.sadb_msg_seq = sadb_msg_seq++;
|
||||
- smsg.sadb_msg_pid = getpid();
|
||||
+ smsg.sadb_msg_seq = ++sadb_msg_seq;
|
||||
+ smsg.sadb_msg_pid = pid;
|
||||
smsg.sadb_msg_len = sizeof(smsg) / 8;
|
||||
smsg.sadb_msg_type = mtype;
|
||||
smsg.sadb_msg_satype = satype;
|
||||
@@ -415,10 +419,23 @@ pfkey_reply(int sd, u_int32_t *spip)
|
||||
u_int8_t *data;
|
||||
ssize_t len;
|
||||
bzero(&sdst, sizeof(sdst));
|
||||
bzero(&dmask, sizeof(dmask));
|
||||
- switch (dst->af) {
|
||||
- case AF_INET:
|
||||
- ((struct sockaddr_in *)&sdst)->sin_addr = dst->v4;
|
||||
- sdst.ss_len = sizeof(struct sockaddr_in);
|
||||
- sdst.ss_family = AF_INET;
|
||||
+ if ((saptr = addr2sa(dst, 0)))
|
||||
+ memcpy(&sdst, saptr, sizeof(sdst));
|
||||
+ switch (dst->aid) {
|
||||
+ case AID_INET:
|
||||
memset(&((struct sockaddr_in *)&dmask)->sin_addr, 0xff, 32/8);
|
||||
break;
|
||||
- case AF_INET6:
|
||||
- memcpy(&((struct sockaddr_in6 *)&sdst)->sin6_addr,
|
||||
- &dst->v6, sizeof(struct in6_addr));
|
||||
- sdst.ss_len = sizeof(struct sockaddr_in6);
|
||||
- sdst.ss_family = AF_INET6;
|
||||
+ case AID_INET6:
|
||||
memset(&((struct sockaddr_in6 *)&dmask)->sin6_addr, 0xff,
|
||||
128/8);
|
||||
break;
|
||||
- case 0:
|
||||
+ case AID_UNSPEC:
|
||||
sdst.ss_len = sizeof(struct sockaddr);
|
||||
break;
|
||||
default:
|
||||
@@ -220,8 +211,8 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
sa_dst.sadb_address_exttype = SADB_X_EXT_DST_FLOW;
|
||||
|
||||
- if (recv(sd, &hdr, sizeof(hdr), MSG_PEEK) != sizeof(hdr)) {
|
||||
- log_warn("pfkey peek");
|
||||
- return (-1);
|
||||
+ for (;;) {
|
||||
+ if (recv(sd, &hdr, sizeof(hdr), MSG_PEEK) != sizeof(hdr)) {
|
||||
+ log_warn("pfkey peek");
|
||||
+ return (-1);
|
||||
+ }
|
||||
+
|
||||
+ if (hdr.sadb_msg_seq == sadb_msg_seq &&
|
||||
+ hdr.sadb_msg_pid == pid)
|
||||
+ break;
|
||||
+
|
||||
+ /* not ours, discard */
|
||||
+ if (read(sd, &hdr, sizeof(hdr)) == -1) {
|
||||
+ log_warn("pfkey read");
|
||||
+ return (-1);
|
||||
+ }
|
||||
bzero(&smask, sizeof(smask));
|
||||
- switch (src->af) {
|
||||
- case AF_INET:
|
||||
+ switch (src->aid) {
|
||||
+ case AID_INET:
|
||||
smask.ss_len = sizeof(struct sockaddr_in);
|
||||
smask.ss_family = AF_INET;
|
||||
memset(&((struct sockaddr_in *)&smask)->sin_addr,
|
||||
@@ -233,7 +224,7 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
htons(0xffff);
|
||||
}
|
||||
+
|
||||
if (hdr.sadb_msg_errno != 0) {
|
||||
errno = hdr.sadb_msg_errno;
|
||||
if (errno == ESRCH)
|
||||
@@ -497,6 +514,8 @@ pfkey_sa_remove(struct bgpd_addr *src, s
|
||||
int
|
||||
pfkey_md5sig_establish(struct peer *p)
|
||||
{
|
||||
+ sleep(1);
|
||||
+
|
||||
if (!p->auth.spi_out)
|
||||
if (pfkey_sa_add(&p->auth.local_addr, &p->conf.remote_addr,
|
||||
p->conf.auth.md5key_len, p->conf.auth.md5key,
|
||||
break;
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
smask.ss_len = sizeof(struct sockaddr_in6);
|
||||
smask.ss_family = AF_INET6;
|
||||
memset(&((struct sockaddr_in6 *)&smask)->sin6_addr,
|
||||
@@ -247,8 +238,8 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
break;
|
||||
}
|
||||
bzero(&dmask, sizeof(dmask));
|
||||
- switch (dst->af) {
|
||||
- case AF_INET:
|
||||
+ switch (dst->aid) {
|
||||
+ case AID_INET:
|
||||
dmask.ss_len = sizeof(struct sockaddr_in);
|
||||
dmask.ss_family = AF_INET;
|
||||
memset(&((struct sockaddr_in *)&dmask)->sin_addr,
|
||||
@@ -260,7 +251,7 @@ pfkey_send(int sd, uint8_t satype, uint8
|
||||
htons(0xffff);
|
||||
}
|
||||
break;
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
dmask.ss_len = sizeof(struct sockaddr_in6);
|
||||
dmask.ss_family = AF_INET6;
|
||||
memset(&((struct sockaddr_in6 *)&dmask)->sin6_addr,
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ bgpd/pfkey_compat.c 8 Feb 2007 10:31:16 -0000
|
||||
@@ -0,0 +1,27 @@
|
||||
+#include "bgpd.h"
|
||||
+#include "session.h"
|
||||
+
|
||||
+int
|
||||
+pfkey_establish(struct peer *p)
|
||||
+{
|
||||
+ if (p->conf.auth.method)
|
||||
+ return (-1);
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+pfkey_remove(struct peer *p)
|
||||
+{
|
||||
+ if (p->conf.auth.method)
|
||||
+ return (-1);
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+pfkey_init(struct bgpd_sysdep *sysdep)
|
||||
+{
|
||||
+ log_warnx("no kernel support for PF_KEY");
|
||||
+ sysdep->no_pfkey = 1;
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
23
net/openbgpd/files/patch-bgpd_pftable.c
Normal file
23
net/openbgpd/files/patch-bgpd_pftable.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
Index: bgpd/pftable.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/pftable.c,v
|
||||
retrieving revision 1.1.1.5
|
||||
retrieving revision 1.1.1.6
|
||||
diff -u -p -r1.1.1.5 -r1.1.1.6
|
||||
--- bgpd/pftable.c 14 Feb 2010 20:19:57 -0000 1.1.1.5
|
||||
+++ bgpd/pftable.c 14 Feb 2010 20:27:06 -0000 1.1.1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: pftable.c,v 1.5 2005/07/01 09:19:24 claudio Exp $ */
|
||||
+/* $OpenBSD: pftable.c,v 1.6 2009/12/01 14:28:05 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Damien Miller <djm@openbsd.org>
|
||||
@@ -214,7 +214,7 @@ pftable_add_work(const char *table, stru
|
||||
|
||||
bzero(pfa, sizeof(*pfa));
|
||||
memcpy(&pfa->pfra_u, &addr->ba, (len + 7U) / 8);
|
||||
- pfa->pfra_af = addr->af;
|
||||
+ pfa->pfra_af = aid2af(addr->aid);
|
||||
pfa->pfra_net = len;
|
||||
|
||||
pft->naddrs++;
|
|
@ -1,18 +1,18 @@
|
|||
Index: bgpd/printconf.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/printconf.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.5
|
||||
diff -u -p -r1.1.1.1 -r1.5
|
||||
--- bgpd/printconf.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/printconf.c 22 Oct 2009 15:10:02 -0000 1.5
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.7 -r1.6
|
||||
--- bgpd/printconf.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/printconf.c 4 Feb 2010 16:22:23 -0000 1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: printconf.c,v 1.65 2007/11/22 11:37:25 henning Exp $ */
|
||||
+/* $OpenBSD: printconf.c,v 1.70 2009/06/06 01:10:29 claudio Exp $ */
|
||||
-/* $OpenBSD: printconf.c,v 1.70 2009/06/06 01:10:29 claudio Exp $ */
|
||||
+/* $OpenBSD: printconf.c,v 1.77 2009/12/17 09:32:59 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -19,10 +19,14 @@
|
||||
@@ -19,6 +19,9 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -22,40 +22,117 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
|
||||
#include "bgpd.h"
|
||||
#include "mrt.h"
|
||||
#include "session.h"
|
||||
+#include "rde.h"
|
||||
@@ -27,6 +30,8 @@
|
||||
|
||||
void print_op(enum comp_ops);
|
||||
void print_community(int, int);
|
||||
@@ -185,6 +189,8 @@ print_mainconf(struct bgpd_config *conf)
|
||||
printf("holdtime %u\n", conf->holdtime);
|
||||
if (conf->min_holdtime)
|
||||
printf("holdtime min %u\n", conf->min_holdtime);
|
||||
+ if (conf->connectretry)
|
||||
+ printf("connect-retry %u\n", conf->connectretry);
|
||||
+void print_extcommunity(struct filter_extcommunity *);
|
||||
+void print_origin(u_int8_t);
|
||||
void print_set(struct filter_set_head *);
|
||||
void print_mainconf(struct bgpd_config *);
|
||||
void print_network(struct network_config *);
|
||||
@@ -34,7 +39,7 @@ void print_peer(struct peer_config *,
|
||||
const char *);
|
||||
const char *print_auth_alg(u_int8_t);
|
||||
const char *print_enc_alg(u_int8_t);
|
||||
-const char *print_safi(u_int8_t);
|
||||
+void print_announce(struct peer_config *, const char *);
|
||||
void print_rule(struct peer *, struct filter_rule *);
|
||||
const char * mrt_type(enum mrt_type);
|
||||
void print_mrt(u_int32_t, u_int32_t, const char *, const char *);
|
||||
@@ -94,6 +99,45 @@ print_community(int as, int type)
|
||||
}
|
||||
|
||||
if (conf->flags & BGPD_FLAG_NO_FIB_UPDATE)
|
||||
printf("fib-update no\n");
|
||||
@@ -200,9 +206,6 @@ print_mainconf(struct bgpd_config *conf)
|
||||
if (conf->flags & BGPD_FLAG_DECISION_MED_ALWAYS)
|
||||
printf("rde med compare always\n");
|
||||
void
|
||||
+print_extcommunity(struct filter_extcommunity *c)
|
||||
+{
|
||||
+ switch (c->type & EXT_COMMUNITY_VALUE) {
|
||||
+ case EXT_COMMUNITY_TWO_AS:
|
||||
+ printf("%s %i:%i", log_ext_subtype(c->subtype),
|
||||
+ c->data.ext_as.as, c->data.ext_as.val);
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_IPV4:
|
||||
+ printf("%s %s:%i", log_ext_subtype(c->subtype),
|
||||
+ inet_ntoa(c->data.ext_ip.addr), c->data.ext_ip.val);
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_FOUR_AS:
|
||||
+ printf("%s %s:%i", log_ext_subtype(c->subtype),
|
||||
+ log_as(c->data.ext_as4.as4), c->data.ext_as.val);
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_OPAQUE:
|
||||
+ printf("%s 0x%llx", log_ext_subtype(c->subtype),
|
||||
+ c->data.ext_opaq);
|
||||
+ break;
|
||||
+ default:
|
||||
+ printf("0x%x 0x%llx", c->type, c->data.ext_opaq);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+print_origin(u_int8_t o)
|
||||
+{
|
||||
+ if (o == ORIGIN_IGP)
|
||||
+ printf("igp ");
|
||||
+ else if (o == ORIGIN_EGP)
|
||||
+ printf("egp ");
|
||||
+ else if (o == ORIGIN_INCOMPLETE)
|
||||
+ printf("incomplete ");
|
||||
+ else
|
||||
+ printf("%u ", o);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
print_set(struct filter_set_head *set)
|
||||
{
|
||||
struct filter_set *s;
|
||||
@@ -161,11 +205,25 @@ print_set(struct filter_set_head *set)
|
||||
case ACTION_RTLABEL:
|
||||
printf("rtlabel %s ", s->action.rtlabel);
|
||||
break;
|
||||
+ case ACTION_SET_ORIGIN:
|
||||
+ printf("origin ");
|
||||
+ print_origin(s->action.origin);
|
||||
+ break;
|
||||
case ACTION_RTLABEL_ID:
|
||||
case ACTION_PFTABLE_ID:
|
||||
/* not possible */
|
||||
printf("king bula saiz: config broken");
|
||||
break;
|
||||
+ case ACTION_SET_EXT_COMMUNITY:
|
||||
+ printf("ext-community ");
|
||||
+ print_extcommunity(&s->action.ext_community);
|
||||
+ printf(" ");
|
||||
+ break;
|
||||
+ case ACTION_DEL_EXT_COMMUNITY:
|
||||
+ printf("ext-community delete ");
|
||||
+ print_extcommunity(&s->action.ext_community);
|
||||
+ printf(" ");
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
printf("}");
|
||||
@@ -263,8 +321,8 @@ print_peer(struct peer_config *p, struct
|
||||
char *method;
|
||||
struct in_addr ina;
|
||||
|
||||
- if (conf->flags & BGPD_FLAG_DECISION_TRANS_AS)
|
||||
- printf("transparent-as yes\n");
|
||||
-
|
||||
if (conf->log & BGPD_LOG_UPDATES)
|
||||
printf("log updates\n");
|
||||
|
||||
@@ -271,6 +274,8 @@ print_peer(struct peer_config *p, struct
|
||||
printf("%sneighbor %s {\n", c, log_addr(&p->remote_addr));
|
||||
if (p->descr[0])
|
||||
printf("%s\tdescr \"%s\"\n", c, p->descr);
|
||||
+ if (p->rib[0])
|
||||
+ printf("%s\trib \"%s\"\n", c, p->rib);
|
||||
if (p->remote_as)
|
||||
printf("%s\tremote-as %s\n", c, log_as(p->remote_as));
|
||||
if (p->down)
|
||||
@@ -293,6 +298,12 @@ print_peer(struct peer_config *p, struct
|
||||
- if ((p->remote_addr.af == AF_INET && p->remote_masklen != 32) ||
|
||||
- (p->remote_addr.af == AF_INET6 && p->remote_masklen != 128))
|
||||
+ if ((p->remote_addr.aid == AID_INET && p->remote_masklen != 32) ||
|
||||
+ (p->remote_addr.aid == AID_INET6 && p->remote_masklen != 128))
|
||||
printf("%sneighbor %s/%u {\n", c, log_addr(&p->remote_addr),
|
||||
p->remote_masklen);
|
||||
else
|
||||
@@ -281,7 +339,7 @@ print_peer(struct peer_config *p, struct
|
||||
printf("%s\tmultihop %u\n", c, p->distance);
|
||||
if (p->passive)
|
||||
printf("%s\tpassive\n", c);
|
||||
- if (p->local_addr.af)
|
||||
+ if (p->local_addr.aid)
|
||||
printf("%s\tlocal-address %s\n", c, log_addr(&p->local_addr));
|
||||
if (p->max_prefix) {
|
||||
printf("%s\tmax-prefix %u", c, p->max_prefix);
|
||||
@@ -295,6 +353,12 @@ print_peer(struct peer_config *p, struct
|
||||
printf("%s\tholdtime min %u\n", c, p->min_holdtime);
|
||||
if (p->announce_capa == 0)
|
||||
printf("%s\tannounce capabilities no\n", c);
|
||||
|
@ -68,12 +145,10 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
if (p->announce_type == ANNOUNCE_SELF)
|
||||
printf("%s\tannounce self\n", c);
|
||||
else if (p->announce_type == ANNOUNCE_NONE)
|
||||
@@ -320,6 +331,12 @@ print_peer(struct peer_config *p, struct
|
||||
printf("%s\tdemote %s\n", c, p->demote_group);
|
||||
if (p->if_depend[0])
|
||||
@@ -324,6 +388,10 @@ print_peer(struct peer_config *p, struct
|
||||
printf("%s\tdepend on \"%s\"\n", c, p->if_depend);
|
||||
+ if (p->flags & PEERFLAG_TRANS_AS)
|
||||
+ printf("%s\ttransparent-as yes\n", c);
|
||||
if (p->flags & PEERFLAG_TRANS_AS)
|
||||
printf("%s\ttransparent-as yes\n", c);
|
||||
+#if defined(IPV6_LINKLOCAL_PEER)
|
||||
+ if (p->lliface[0])
|
||||
+ printf("%s\tinterface %s\n", c, p->lliface);
|
||||
|
@ -81,64 +156,57 @@ diff -u -p -r1.1.1.1 -r1.5
|
|||
|
||||
if (p->auth.method == AUTH_MD5SIG)
|
||||
printf("%s\ttcp md5sig\n", c);
|
||||
@@ -419,10 +436,12 @@ print_rule(struct peer *peer_l, struct f
|
||||
printf("deny ");
|
||||
else
|
||||
printf("match ");
|
||||
-
|
||||
if (r->quick)
|
||||
printf("quick ");
|
||||
@@ -354,8 +422,7 @@ print_peer(struct peer_config *p, struct
|
||||
if (p->ttlsec)
|
||||
printf("%s\tttl-security yes\n", c);
|
||||
|
||||
+ if (r->rib[0])
|
||||
+ printf("rib %s ", r->rib);
|
||||
+
|
||||
if (r->dir == DIR_IN)
|
||||
printf("from ");
|
||||
else if (r->dir == DIR_OUT)
|
||||
@@ -532,12 +551,14 @@ print_mrt(u_int32_t pid, u_int32_t gid,
|
||||
LIST_FOREACH(m, xmrt_l, entry)
|
||||
if ((gid != 0 && m->group_id == gid) ||
|
||||
(m->peer_id == pid && m->group_id == gid)) {
|
||||
+ printf("%s%sdump ", prep, prep2);
|
||||
+ if (m->rib[0])
|
||||
+ printf("rib %s ", m->rib);
|
||||
if (MRT2MC(m)->ReopenTimerInterval == 0)
|
||||
- printf("%s%sdump %s %s\n", prep, prep2,
|
||||
- mrt_type(m->type), MRT2MC(m)->name);
|
||||
+ printf("%s %s\n", mrt_type(m->type),
|
||||
+ MRT2MC(m)->name);
|
||||
else
|
||||
- printf("%s%sdump %s %s %d\n", prep, prep2,
|
||||
- mrt_type(m->type),
|
||||
+ printf("%s %s %d\n", mrt_type(m->type),
|
||||
MRT2MC(m)->name,
|
||||
MRT2MC(m)->ReopenTimerInterval);
|
||||
- printf("%s\tannounce IPv4 %s\n", c, print_safi(p->capabilities.mp_v4));
|
||||
- printf("%s\tannounce IPv6 %s\n", c, print_safi(p->capabilities.mp_v6));
|
||||
+ print_announce(p, c);
|
||||
|
||||
if (p->softreconfig_in == 1)
|
||||
printf("%s\tsoftreconfig in yes\n", c);
|
||||
@@ -399,17 +466,14 @@ print_enc_alg(u_int8_t alg)
|
||||
}
|
||||
@@ -602,16 +623,25 @@ peer_compare(const void *aa, const void
|
||||
}
|
||||
|
||||
-const char *
|
||||
-print_safi(u_int8_t safi)
|
||||
+void
|
||||
+print_announce(struct peer_config *p, const char *c)
|
||||
{
|
||||
- switch (safi) {
|
||||
- case SAFI_NONE:
|
||||
- return ("none");
|
||||
- case SAFI_UNICAST:
|
||||
- return ("unicast");
|
||||
- default:
|
||||
- return ("?");
|
||||
- }
|
||||
+ u_int8_t aid;
|
||||
+
|
||||
+ for (aid = 0; aid < AID_MAX; aid++)
|
||||
+ if (p->capabilities.mp[aid])
|
||||
+ printf("%s\tannounce %s\n", c, aid2str(aid));
|
||||
}
|
||||
|
||||
void
|
||||
-print_config(struct bgpd_config *conf, struct network_head *net_l,
|
||||
- struct peer *peer_l, struct filter_head *rules_l, struct mrt_head *mrt_l)
|
||||
+print_config(struct bgpd_config *conf, struct rib_names *rib_l,
|
||||
+ struct network_head *net_l, struct peer *peer_l,
|
||||
+ struct filter_head *rules_l, struct mrt_head *mrt_l)
|
||||
{
|
||||
struct filter_rule *r;
|
||||
struct network *n;
|
||||
+ struct rde_rib *rr;
|
||||
@@ -455,14 +519,14 @@ print_rule(struct peer *peer_l, struct f
|
||||
} else
|
||||
printf("any ");
|
||||
|
||||
- if (r->match.prefix.addr.af)
|
||||
+ if (r->match.prefix.addr.aid)
|
||||
printf("prefix %s/%u ", log_addr(&r->match.prefix.addr),
|
||||
r->match.prefix.len);
|
||||
|
||||
- if (r->match.prefix.addr.af == 0 && r->match.prefixlen.af) {
|
||||
- if (r->match.prefixlen.af == AF_INET)
|
||||
+ if (r->match.prefix.addr.aid == 0 && r->match.prefixlen.aid) {
|
||||
+ if (r->match.prefixlen.aid == AID_INET)
|
||||
printf("inet ");
|
||||
- if (r->match.prefixlen.af == AF_INET6)
|
||||
+ if (r->match.prefixlen.aid == AID_INET6)
|
||||
printf("inet6 ");
|
||||
}
|
||||
|
||||
xmrt_l = mrt_l;
|
||||
printf("\n");
|
||||
print_mainconf(conf);
|
||||
printf("\n");
|
||||
+ SIMPLEQ_FOREACH(rr, rib_l, entry) {
|
||||
+ if (rr->flags & F_RIB_NOEVALUATE)
|
||||
+ printf("rde rib %s no evaluate\n", rr->name);
|
||||
+ else
|
||||
+ printf("rde rib %s\n", rr->name);
|
||||
+ }
|
||||
+ printf("\n");
|
||||
TAILQ_FOREACH(n, net_l, entry)
|
||||
print_network(&n->net);
|
||||
printf("\n");
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,311 +1,161 @@
|
|||
Index: bgpd/rde.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.4
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.4
|
||||
--- bgpd/rde.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/rde.h 22 Oct 2009 14:24:02 -0000 1.1.1.4
|
||||
retrieving revision 1.1.1.8
|
||||
retrieving revision 1.1.1.9
|
||||
diff -u -p -r1.1.1.8 -r1.1.1.9
|
||||
--- bgpd/rde.h 14 Feb 2010 20:19:57 -0000 1.1.1.8
|
||||
+++ bgpd/rde.h 14 Feb 2010 20:27:06 -0000 1.1.1.9
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde.h,v 1.102 2008/01/23 08:11:32 claudio Exp $ */
|
||||
+/* $OpenBSD: rde.h,v 1.121 2009/08/06 08:53:11 claudio Exp $ */
|
||||
-/* $OpenBSD: rde.h,v 1.120 2009/06/06 01:10:29 claudio Exp $ */
|
||||
+/* $OpenBSD: rde.h,v 1.129 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
|
||||
@@ -42,6 +42,7 @@ LIST_HEAD(rde_peer_head, rde_peer);
|
||||
LIST_HEAD(aspath_head, rde_aspath);
|
||||
RB_HEAD(uptree_prefix, update_prefix);
|
||||
RB_HEAD(uptree_attr, update_attr);
|
||||
+RB_HEAD(rib_tree, rib_entry);
|
||||
TAILQ_HEAD(uplist_prefix, update_prefix);
|
||||
TAILQ_HEAD(uplist_attr, update_attr);
|
||||
|
||||
@@ -66,13 +67,13 @@ struct rde_peer {
|
||||
@@ -56,12 +56,9 @@ struct rde_peer {
|
||||
struct bgpd_addr local_v6_addr;
|
||||
struct uptree_prefix up_prefix;
|
||||
struct uptree_attr up_attrs;
|
||||
- struct uplist_attr updates;
|
||||
- struct uplist_prefix withdraws;
|
||||
- struct uplist_attr updates6;
|
||||
- struct uplist_prefix withdraws6;
|
||||
- struct capabilities capa_announced;
|
||||
- struct capabilities capa_received;
|
||||
+ struct uplist_attr updates[AID_MAX];
|
||||
+ struct uplist_prefix withdraws[AID_MAX];
|
||||
+ struct capabilities capa;
|
||||
u_int64_t prefix_rcvd_update;
|
||||
u_int64_t prefix_rcvd_withdraw;
|
||||
u_int64_t prefix_sent_update;
|
||||
u_int64_t prefix_sent_withdraw;
|
||||
u_int32_t prefix_cnt; /* # of prefixes */
|
||||
- u_int32_t adjrib_cnt; /* # of p. in Adj-RIB-In */
|
||||
u_int32_t remote_bgpid; /* host byte order! */
|
||||
u_int32_t up_pcnt;
|
||||
u_int32_t up_acnt;
|
||||
u_int32_t up_nlricnt;
|
||||
u_int32_t up_wcnt;
|
||||
enum peer_state state;
|
||||
+ u_int16_t ribid;
|
||||
u_int16_t short_as;
|
||||
u_int8_t reconf_in; /* in filter changed */
|
||||
u_int8_t reconf_out; /* out filter changed */
|
||||
@@ -107,8 +108,8 @@ enum attrtypes {
|
||||
ATTR_MP_REACH_NLRI=14,
|
||||
ATTR_MP_UNREACH_NLRI=15,
|
||||
ATTR_EXT_COMMUNITIES=16,
|
||||
- ATTR_NEW_ASPATH=17,
|
||||
- ATTR_NEW_AGGREGATOR=18
|
||||
+ ATTR_AS4_PATH=17,
|
||||
+ ATTR_AS4_AGGREGATOR=18
|
||||
};
|
||||
|
||||
/* attribute flags. 4 low order bits reserved */
|
||||
@@ -154,16 +155,16 @@ LIST_HEAD(prefix_head, prefix);
|
||||
#define F_ATTR_MED_ANNOUNCE 0x00020
|
||||
#define F_ATTR_MP_REACH 0x00040
|
||||
#define F_ATTR_MP_UNREACH 0x00080
|
||||
-#define F_ATTR_AS4BYTE_NEW 0x00100 /* NEW_ASPATH or NEW_AGGREGATOR */
|
||||
+#define F_ATTR_AS4BYTE_NEW 0x00100 /* AS4_PATH or AS4_AGGREGATOR */
|
||||
#define F_ATTR_LOOP 0x00200 /* path would cause a route loop */
|
||||
-#define F_PREFIX_ANNOUNCED 0x01000
|
||||
+#define F_PREFIX_ANNOUNCED 0x00400
|
||||
+#define F_ANN_DYNAMIC 0x00800
|
||||
+#define F_NEXTHOP_SELF 0x01000
|
||||
@@ -163,6 +160,7 @@ LIST_HEAD(prefix_head, prefix);
|
||||
#define F_NEXTHOP_REJECT 0x02000
|
||||
#define F_NEXTHOP_BLACKHOLE 0x04000
|
||||
#define F_NEXTHOP_NOMODIFY 0x08000
|
||||
-#define F_NEXTHOP_SELF 0x10000
|
||||
+#define F_ATTR_PARSE_ERR 0x10000
|
||||
#define F_ATTR_LINKED 0x20000
|
||||
-#define F_LOCAL 0x40000 /* Local-RIB */
|
||||
-#define F_ORIGINAL 0x80000 /* Adj-RIB-In */
|
||||
|
||||
|
||||
#define ORIGIN_IGP 0
|
||||
@@ -184,7 +185,6 @@ struct rde_aspath {
|
||||
u_int32_t weight; /* low prio lpref */
|
||||
u_int32_t prefix_cnt; /* # of prefixes */
|
||||
u_int32_t active_cnt; /* # of active prefixes */
|
||||
- u_int32_t adjrib_cnt; /* # of p. in Adj-RIB-In */
|
||||
u_int32_t flags; /* internally used */
|
||||
u_int16_t rtlabelid; /* route label id */
|
||||
u_int16_t pftableid; /* pf table id */
|
||||
@@ -223,53 +223,72 @@ struct pt_entry {
|
||||
@@ -220,14 +218,14 @@ struct nexthop {
|
||||
/* generic entry without address specific part */
|
||||
struct pt_entry {
|
||||
RB_ENTRY(pt_entry) pt_e;
|
||||
sa_family_t af;
|
||||
- sa_family_t af;
|
||||
+ u_int8_t aid;
|
||||
u_int8_t prefixlen;
|
||||
- struct prefix_head prefix_h;
|
||||
- struct prefix *active; /* for fast access */
|
||||
+ u_int16_t refcnt;
|
||||
u_int16_t refcnt;
|
||||
};
|
||||
|
||||
struct pt_entry4 {
|
||||
RB_ENTRY(pt_entry) pt_e;
|
||||
sa_family_t af;
|
||||
- sa_family_t af;
|
||||
+ u_int8_t aid;
|
||||
u_int8_t prefixlen;
|
||||
- struct prefix_head prefix_h;
|
||||
- struct prefix *active; /* for fast access */
|
||||
+ u_int16_t refcnt;
|
||||
u_int16_t refcnt;
|
||||
struct in_addr prefix4;
|
||||
- /*
|
||||
- * Route Flap Damping structures
|
||||
- * Currently I think they belong into the prefix but for the moment
|
||||
- * we just ignore the dampening at all.
|
||||
- */
|
||||
};
|
||||
@@ -235,12 +233,25 @@ struct pt_entry4 {
|
||||
|
||||
struct pt_entry6 {
|
||||
RB_ENTRY(pt_entry) pt_e;
|
||||
sa_family_t af;
|
||||
- sa_family_t af;
|
||||
+ u_int8_t aid;
|
||||
u_int8_t prefixlen;
|
||||
- struct prefix_head prefix_h;
|
||||
- struct prefix *active; /* for fast access */
|
||||
+ u_int16_t refcnt;
|
||||
u_int16_t refcnt;
|
||||
struct in6_addr prefix6;
|
||||
};
|
||||
|
||||
-struct pt_context {
|
||||
- union {
|
||||
- struct pt_entry p;
|
||||
- struct pt_entry4 p4;
|
||||
- struct pt_entry6 p6;
|
||||
- } pu;
|
||||
-#define ctx_p pu.p
|
||||
-#define ctx_p4 pu.p4
|
||||
-#define ctx_p6 pu.p6
|
||||
- /* only count and done should be accessed by callers */
|
||||
- unsigned int count;
|
||||
- int done;
|
||||
-};
|
||||
+struct rib_context {
|
||||
+ LIST_ENTRY(rib_context) entry;
|
||||
+ struct rib_entry *ctx_re;
|
||||
+ struct rib *ctx_rib;
|
||||
+ void (*ctx_upcall)(struct rib_entry *, void *);
|
||||
+ void (*ctx_done)(void *);
|
||||
+ void (*ctx_wait)(void *);
|
||||
+ void *ctx_arg;
|
||||
+ unsigned int ctx_count;
|
||||
+ sa_family_t ctx_af;
|
||||
+struct pt_entry_vpn4 {
|
||||
+ RB_ENTRY(pt_entry) pt_e;
|
||||
+ u_int8_t aid;
|
||||
+ u_int8_t prefixlen;
|
||||
+ u_int16_t refcnt;
|
||||
+ struct in_addr prefix4;
|
||||
+ u_int64_t rd;
|
||||
+ u_int8_t labelstack[21];
|
||||
+ u_int8_t labellen;
|
||||
+ u_int8_t pad1;
|
||||
+ u_int8_t pad2;
|
||||
+};
|
||||
+
|
||||
+struct rib_entry {
|
||||
+ RB_ENTRY(rib_entry) rib_e;
|
||||
+ struct prefix_head prefix_h;
|
||||
+ struct prefix *active; /* for fast access */
|
||||
+ struct pt_entry *prefix;
|
||||
+ u_int16_t ribid;
|
||||
+ u_int16_t flags;
|
||||
+};
|
||||
+
|
||||
+enum rib_state {
|
||||
+ RIB_NONE,
|
||||
+ RIB_NEW,
|
||||
+ RIB_ACTIVE,
|
||||
+ RIB_DELETE
|
||||
+};
|
||||
+
|
||||
+struct rib {
|
||||
+ char name[PEER_DESCR_LEN];
|
||||
+ struct rib_tree rib;
|
||||
+ enum rib_state state;
|
||||
+ u_int16_t flags;
|
||||
+ u_int16_t id;
|
||||
+};
|
||||
+
|
||||
+#define F_RIB_ENTRYLOCK 0x0001
|
||||
+#define F_RIB_NOEVALUATE 0x0002
|
||||
+#define F_RIB_NOFIB 0x0004
|
||||
+#define RIB_FAILED 0xffff
|
||||
|
||||
struct prefix {
|
||||
- LIST_ENTRY(prefix) prefix_l, path_l;
|
||||
+ LIST_ENTRY(prefix) rib_l, path_l;
|
||||
struct rde_aspath *aspath;
|
||||
struct pt_entry *prefix;
|
||||
+ struct rib_entry *rib; /* NULL for Adj-RIB-In */
|
||||
time_t lastchange;
|
||||
- u_int32_t flags;
|
||||
struct rib_context {
|
||||
LIST_ENTRY(rib_context) entry;
|
||||
struct rib_entry *ctx_re;
|
||||
@@ -250,7 +261,7 @@ struct rib_context {
|
||||
void (*ctx_wait)(void *);
|
||||
void *ctx_arg;
|
||||
unsigned int ctx_count;
|
||||
- sa_family_t ctx_af;
|
||||
+ u_int8_t ctx_aid;
|
||||
};
|
||||
|
||||
extern struct rde_memstats rdemem;
|
||||
@@ -282,7 +301,8 @@ void rde_send_pftable(u_int16_t, struc
|
||||
u_int8_t, int);
|
||||
void rde_send_pftable_commit(void);
|
||||
struct rib_entry {
|
||||
@@ -264,6 +275,7 @@ struct rib_entry {
|
||||
|
||||
-void rde_generate_updates(struct prefix *, struct prefix *);
|
||||
+void rde_generate_updates(u_int16_t, struct prefix *,
|
||||
+ struct prefix *);
|
||||
u_int32_t rde_local_as(void);
|
||||
int rde_noevaluate(void);
|
||||
int rde_decisionflags(void);
|
||||
@@ -291,6 +311,8 @@ int rde_as4byte(struct rde_peer *);
|
||||
/* rde_attr.c */
|
||||
int attr_write(void *, u_int16_t, u_int8_t, u_int8_t, void *,
|
||||
u_int16_t);
|
||||
+int attr_writebuf(struct buf *, u_int8_t, u_int8_t, void *,
|
||||
+ u_int16_t);
|
||||
void attr_init(u_int32_t);
|
||||
void attr_shutdown(void);
|
||||
int attr_optadd(struct rde_aspath *, u_int8_t, u_int8_t,
|
||||
@@ -327,10 +349,24 @@ int community_set(struct rde_aspath *,
|
||||
enum rib_state {
|
||||
RIB_NONE,
|
||||
+ RIB_NEW,
|
||||
RIB_ACTIVE,
|
||||
RIB_DELETE
|
||||
};
|
||||
@@ -342,9 +354,13 @@ int aspath_loopfree(struct aspath *, u
|
||||
int aspath_compare(struct aspath *, struct aspath *);
|
||||
u_char *aspath_prepend(struct aspath *, u_int32_t, int, u_int16_t *);
|
||||
int aspath_match(struct aspath *, enum as_spec, u_int32_t);
|
||||
-int community_match(void *, u_int16_t, int, int);
|
||||
+int community_match(struct rde_aspath *, int, int);
|
||||
int community_set(struct rde_aspath *, int, int);
|
||||
void community_delete(struct rde_aspath *, int, int);
|
||||
+int community_ext_set(struct rde_aspath *,
|
||||
+ struct filter_extcommunity *, u_int16_t);
|
||||
+void community_ext_delete(struct rde_aspath *,
|
||||
+ struct filter_extcommunity *, u_int16_t);
|
||||
|
||||
/* rde_rib.c */
|
||||
+extern u_int16_t rib_size;
|
||||
+extern struct rib *ribs;
|
||||
+
|
||||
+u_int16_t rib_new(int, char *, u_int16_t);
|
||||
+u_int16_t rib_find(char *);
|
||||
+void rib_free(struct rib *);
|
||||
+struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int);
|
||||
+struct rib_entry *rib_lookup(struct rib *, struct bgpd_addr *);
|
||||
+void rib_dump(struct rib *, void (*)(struct rib_entry *, void *),
|
||||
+ void *, sa_family_t);
|
||||
+void rib_dump_r(struct rib_context *);
|
||||
+void rib_dump_runner(void);
|
||||
+int rib_dump_pending(void);
|
||||
+
|
||||
void path_init(u_int32_t);
|
||||
void path_shutdown(void);
|
||||
-void path_update(struct rde_peer *, struct rde_aspath *,
|
||||
- struct bgpd_addr *, int, u_int32_t);
|
||||
+int path_update(struct rib *, struct rde_peer *,
|
||||
+ struct rde_aspath *, struct bgpd_addr *, int);
|
||||
int path_compare(struct rde_aspath *, struct rde_aspath *);
|
||||
struct rde_aspath *path_lookup(struct rde_aspath *, struct rde_peer *);
|
||||
void path_remove(struct rde_aspath *);
|
||||
@@ -343,18 +379,20 @@ void path_put(struct rde_aspath *);
|
||||
#define PREFIX_SIZE(x) (((x) + 7) / 8 + 1)
|
||||
int prefix_compare(const struct bgpd_addr *,
|
||||
const struct bgpd_addr *, int);
|
||||
-struct prefix *prefix_get(struct rde_peer *, struct bgpd_addr *, int,
|
||||
- u_int32_t);
|
||||
-struct pt_entry *prefix_add(struct rde_aspath *, struct bgpd_addr *, int,
|
||||
- u_int32_t);
|
||||
-struct pt_entry *prefix_move(struct rde_aspath *, struct prefix *, u_int32_t);
|
||||
-void prefix_remove(struct rde_peer *, struct bgpd_addr *, int,
|
||||
- u_int32_t);
|
||||
+struct prefix *prefix_get(struct rib *, struct rde_peer *,
|
||||
+ struct bgpd_addr *, int, u_int32_t);
|
||||
+int prefix_add(struct rib *, struct rde_aspath *,
|
||||
+ struct bgpd_addr *, int);
|
||||
+void prefix_move(struct rde_aspath *, struct prefix *);
|
||||
+int prefix_remove(struct rib *, struct rde_peer *,
|
||||
+ struct bgpd_addr *, int, u_int32_t);
|
||||
int prefix_write(u_char *, int, struct bgpd_addr *, u_int8_t);
|
||||
-struct prefix *prefix_bypeer(struct pt_entry *, struct rde_peer *, u_int32_t);
|
||||
-void prefix_updateall(struct rde_aspath *, enum nexthop_state);
|
||||
+struct prefix *prefix_bypeer(struct rib_entry *, struct rde_peer *,
|
||||
+ u_int32_t);
|
||||
+void prefix_updateall(struct rde_aspath *, enum nexthop_state,
|
||||
+ enum nexthop_state);
|
||||
void prefix_destroy(struct prefix *);
|
||||
-void prefix_network_clean(struct rde_peer *, time_t);
|
||||
+void prefix_network_clean(struct rde_peer *, time_t, u_int32_t);
|
||||
|
||||
extern u_int16_t rib_size;
|
||||
@@ -356,7 +372,7 @@ void rib_free(struct rib *);
|
||||
struct rib_entry *rib_get(struct rib *, struct bgpd_addr *, int);
|
||||
struct rib_entry *rib_lookup(struct rib *, struct bgpd_addr *);
|
||||
void rib_dump(struct rib *, void (*)(struct rib_entry *, void *),
|
||||
- void *, sa_family_t);
|
||||
+ void *, u_int8_t);
|
||||
void rib_dump_r(struct rib_context *);
|
||||
void rib_dump_runner(void);
|
||||
int rib_dump_pending(void);
|
||||
@@ -395,7 +411,7 @@ void prefix_network_clean(struct rde_p
|
||||
void nexthop_init(u_int32_t);
|
||||
void nexthop_shutdown(void);
|
||||
@@ -368,7 +406,7 @@ struct nexthop *nexthop_get(struct bgpd_
|
||||
int nexthop_compare(struct nexthop *, struct nexthop *);
|
||||
|
||||
/* rde_decide.c */
|
||||
-void prefix_evaluate(struct prefix *, struct pt_entry *);
|
||||
+void prefix_evaluate(struct prefix *, struct rib_entry *);
|
||||
|
||||
/* rde_update.c */
|
||||
void up_init(struct rde_peer *);
|
||||
@@ -387,24 +425,34 @@ u_char *up_dump_mp_unreach(u_char *, u_
|
||||
u_char *up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *);
|
||||
void nexthop_modify(struct rde_aspath *, struct bgpd_addr *,
|
||||
- enum action_types, sa_family_t);
|
||||
+ enum action_types, u_int8_t);
|
||||
void nexthop_link(struct rde_aspath *);
|
||||
void nexthop_unlink(struct rde_aspath *);
|
||||
int nexthop_delete(struct nexthop *);
|
||||
@@ -415,12 +431,15 @@ int up_generate(struct rde_peer *, str
|
||||
void up_generate_updates(struct filter_head *, struct rde_peer *,
|
||||
struct prefix *, struct prefix *);
|
||||
void up_generate_default(struct filter_head *, struct rde_peer *,
|
||||
- sa_family_t);
|
||||
+ u_int8_t);
|
||||
+int up_generate_marker(struct rde_peer *, u_int8_t);
|
||||
int up_dump_prefix(u_char *, int, struct uplist_prefix *,
|
||||
struct rde_peer *);
|
||||
int up_dump_attrnlri(u_char *, int, struct rde_peer *);
|
||||
-u_char *up_dump_mp_unreach(u_char *, u_int16_t *, struct rde_peer *);
|
||||
-u_char *up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *);
|
||||
+u_char *up_dump_mp_unreach(u_char *, u_int16_t *, struct rde_peer *,
|
||||
+ u_int8_t);
|
||||
+int up_dump_mp_reach(u_char *, u_int16_t *, struct rde_peer *,
|
||||
+ u_int8_t);
|
||||
|
||||
/* rde_prefix.c */
|
||||
-void pt_init(void);
|
||||
-void pt_shutdown(void);
|
||||
-int pt_empty(struct pt_entry *);
|
||||
-void pt_getaddr(struct pt_entry *, struct bgpd_addr *);
|
||||
+#define pt_empty(pt) ((pt)->refcnt == 0)
|
||||
+#define pt_ref(pt) do { \
|
||||
+ ++(pt)->refcnt; \
|
||||
+ if ((pt)->refcnt == 0) \
|
||||
+ fatalx("pt_ref: overflow"); \
|
||||
+} while(0)
|
||||
+#define pt_unref(pt) do { \
|
||||
+ if ((pt)->refcnt == 0) \
|
||||
+ fatalx("pt_unref: underflow"); \
|
||||
+ --(pt)->refcnt; \
|
||||
+} while(0)
|
||||
+
|
||||
+void pt_init(void);
|
||||
+void pt_shutdown(void);
|
||||
+void pt_getaddr(struct pt_entry *, struct bgpd_addr *);
|
||||
+struct pt_entry *pt_fill(struct bgpd_addr *, int);
|
||||
struct pt_entry *pt_get(struct bgpd_addr *, int);
|
||||
struct pt_entry *pt_add(struct bgpd_addr *, int);
|
||||
-void pt_remove(struct pt_entry *);
|
||||
+void pt_remove(struct pt_entry *);
|
||||
struct pt_entry *pt_lookup(struct bgpd_addr *);
|
||||
-void pt_dump(void (*)(struct pt_entry *, void *), void *,
|
||||
- sa_family_t);
|
||||
-void pt_dump_r(void (*)(struct pt_entry *, void *), void *,
|
||||
- sa_family_t, struct pt_context *);
|
||||
+int pt_prefix_cmp(const struct pt_entry *, const struct pt_entry *);
|
||||
+
|
||||
|
||||
/* rde_filter.c */
|
||||
-enum filter_actions rde_filter(struct rde_aspath **, struct filter_head *,
|
||||
- struct rde_peer *, struct rde_aspath *,
|
||||
- struct bgpd_addr *, u_int8_t, struct rde_peer *,
|
||||
- enum directions);
|
||||
+enum filter_actions rde_filter(u_int16_t, struct rde_aspath **,
|
||||
+ struct filter_head *, struct rde_peer *,
|
||||
+ struct rde_aspath *, struct bgpd_addr *, u_int8_t,
|
||||
+ struct rde_peer *, enum directions);
|
||||
#define pt_empty(pt) ((pt)->refcnt == 0)
|
||||
@@ -452,8 +471,7 @@ enum filter_actions rde_filter(u_int16_t
|
||||
struct rde_aspath *, struct bgpd_addr *, u_int8_t,
|
||||
struct rde_peer *, enum directions);
|
||||
void rde_apply_set(struct rde_aspath *, struct filter_set_head *,
|
||||
sa_family_t, struct rde_peer *, struct rde_peer *);
|
||||
int rde_filter_community(struct rde_aspath *, int, int);
|
||||
- sa_family_t, struct rde_peer *, struct rde_peer *);
|
||||
-int rde_filter_community(struct rde_aspath *, int, int);
|
||||
+ u_int8_t, struct rde_peer *, struct rde_peer *);
|
||||
int rde_filter_equal(struct filter_head *, struct filter_head *,
|
||||
struct rde_peer *, enum directions);
|
||||
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpd/rde_attr.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_attr.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.1 -r1.3
|
||||
--- bgpd/rde_attr.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/rde_attr.c 9 Jul 2009 17:22:14 -0000 1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpd/rde_attr.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/rde_attr.c 4 Feb 2010 16:22:23 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde_attr.c,v 1.76.2.1 2009/02/18 20:30:36 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_attr.c,v 1.79 2009/03/19 06:52:59 claudio Exp $ */
|
||||
-/* $OpenBSD: rde_attr.c,v 1.79 2009/03/19 06:52:59 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_attr.c,v 1.81 2009/12/18 15:51:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
|
@ -34,44 +34,222 @@ diff -u -p -r1.1.1.1 -r1.3
|
|||
|
||||
#include "bgpd.h"
|
||||
#include "rde.h"
|
||||
@@ -62,6 +69,31 @@ attr_write(void *p, u_int16_t p_len, u_i
|
||||
return (tot_len);
|
||||
@@ -971,13 +978,26 @@ aspath_match(struct aspath *a, enum as_s
|
||||
return (0);
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Functions handling communities and extended communities.
|
||||
+ */
|
||||
+
|
||||
+int community_ext_conv(struct filter_extcommunity *, u_int16_t, u_int64_t *);
|
||||
+
|
||||
int
|
||||
-community_match(void *data, u_int16_t len, int as, int type)
|
||||
+community_match(struct rde_aspath *asp, int as, int type)
|
||||
{
|
||||
- u_int8_t *p = data;
|
||||
- u_int16_t eas, etype;
|
||||
+ struct attr *a;
|
||||
+ u_int8_t *p;
|
||||
+ u_int16_t eas, etype, len;
|
||||
|
||||
- len >>= 2; /* divide by four */
|
||||
+ a = attr_optget(asp, ATTR_COMMUNITIES);
|
||||
+ if (a == NULL)
|
||||
+ /* no communities, no match */
|
||||
+ return (0);
|
||||
+
|
||||
+ len = a->len / 4;
|
||||
+ p = a->data;
|
||||
|
||||
for (; len > 0; len--) {
|
||||
eas = *p++;
|
||||
@@ -1000,7 +1020,6 @@ community_set(struct rde_aspath *asp, in
|
||||
u_int8_t *p = NULL;
|
||||
unsigned int i, ncommunities = 0;
|
||||
u_int8_t f = ATTR_OPTIONAL|ATTR_TRANSITIVE;
|
||||
- u_int8_t t = ATTR_COMMUNITIES;
|
||||
|
||||
attr = attr_optget(asp, ATTR_COMMUNITIES);
|
||||
if (attr != NULL) {
|
||||
@@ -1017,7 +1036,7 @@ community_set(struct rde_aspath *asp, in
|
||||
p += 4;
|
||||
}
|
||||
|
||||
- if (ncommunities++ >= 0x3fff)
|
||||
+ if (ncommunities++ >= USHRT_MAX / 4)
|
||||
/* overflow */
|
||||
return (0);
|
||||
|
||||
@@ -1032,11 +1051,10 @@ community_set(struct rde_aspath *asp, in
|
||||
if (attr != NULL) {
|
||||
memcpy(p + 4, attr->data, attr->len);
|
||||
f = attr->flags;
|
||||
- t = attr->type;
|
||||
attr_free(asp, attr);
|
||||
}
|
||||
|
||||
- attr_optadd(asp, f, t, p, ncommunities << 2);
|
||||
+ attr_optadd(asp, f, ATTR_COMMUNITIES, p, ncommunities << 2);
|
||||
|
||||
free(p);
|
||||
return (1);
|
||||
@@ -1049,7 +1067,7 @@ community_delete(struct rde_aspath *asp,
|
||||
u_int8_t *p, *n;
|
||||
u_int16_t l, len = 0;
|
||||
u_int16_t eas, etype;
|
||||
- u_int8_t f, t;
|
||||
+ u_int8_t f;
|
||||
|
||||
attr = attr_optget(asp, ATTR_COMMUNITIES);
|
||||
if (attr == NULL)
|
||||
@@ -1100,10 +1118,146 @@ community_delete(struct rde_aspath *asp,
|
||||
}
|
||||
|
||||
f = attr->flags;
|
||||
- t = attr->type;
|
||||
|
||||
attr_free(asp, attr);
|
||||
- attr_optadd(asp, f, t, n, len);
|
||||
+ attr_optadd(asp, f, ATTR_COMMUNITIES, n, len);
|
||||
+ free(n);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+community_ext_set(struct rde_aspath *asp, struct filter_extcommunity *c,
|
||||
+ u_int16_t neighas)
|
||||
+{
|
||||
+ struct attr *attr;
|
||||
+ u_int8_t *p = NULL;
|
||||
+ u_int64_t community;
|
||||
+ unsigned int i, ncommunities = 0;
|
||||
+ u_int8_t f = ATTR_OPTIONAL|ATTR_TRANSITIVE;
|
||||
+
|
||||
+ if (community_ext_conv(c, neighas, &community))
|
||||
+ return (0);
|
||||
+
|
||||
+ attr = attr_optget(asp, ATTR_EXT_COMMUNITIES);
|
||||
+ if (attr != NULL) {
|
||||
+ p = attr->data;
|
||||
+ ncommunities = attr->len / 8; /* 64bit per ext-community */
|
||||
+ }
|
||||
+
|
||||
+ /* first check if the community is not already set */
|
||||
+ for (i = 0; i < ncommunities; i++) {
|
||||
+ if (memcmp(&community, p, sizeof(community)) == 0)
|
||||
+ /* already present, nothing todo */
|
||||
+ return (1);
|
||||
+ p += sizeof(community);
|
||||
+ }
|
||||
+
|
||||
+ if (ncommunities++ >= USHRT_MAX / sizeof(community))
|
||||
+ /* overflow */
|
||||
+ return (0);
|
||||
+
|
||||
+ if ((p = malloc(ncommunities * sizeof(community))) == NULL)
|
||||
+ fatal("community_ext_set");
|
||||
+
|
||||
+ memcpy(p, &community, sizeof(community));
|
||||
+ if (attr != NULL) {
|
||||
+ memcpy(p + sizeof(community), attr->data, attr->len);
|
||||
+ f = attr->flags;
|
||||
+ attr_free(asp, attr);
|
||||
+ }
|
||||
+
|
||||
+ attr_optadd(asp, f, ATTR_EXT_COMMUNITIES, p,
|
||||
+ ncommunities * sizeof(community));
|
||||
+
|
||||
+ free(p);
|
||||
+ return (1);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+community_ext_delete(struct rde_aspath *asp, struct filter_extcommunity *c,
|
||||
+ u_int16_t neighas)
|
||||
+{
|
||||
+ struct attr *attr;
|
||||
+ u_int8_t *p, *n;
|
||||
+ u_int64_t community;
|
||||
+ u_int16_t l, len = 0;
|
||||
+ u_int8_t f;
|
||||
+
|
||||
+ if (community_ext_conv(c, neighas, &community))
|
||||
+ return;
|
||||
+
|
||||
+ attr = attr_optget(asp, ATTR_EXT_COMMUNITIES);
|
||||
+ if (attr == NULL)
|
||||
+ /* no attr nothing to do */
|
||||
+ return;
|
||||
+
|
||||
+ p = attr->data;
|
||||
+ for (l = 0; l < attr->len; l += sizeof(community)) {
|
||||
+ if (memcmp(&community, p + l, sizeof(community)) == 0)
|
||||
+ /* match */
|
||||
+ continue;
|
||||
+ len += sizeof(community);
|
||||
+ }
|
||||
+
|
||||
+ if (len == 0) {
|
||||
+ attr_free(asp, attr);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if ((n = malloc(len)) == NULL)
|
||||
+ fatal("community_delete");
|
||||
+
|
||||
+ p = attr->data;
|
||||
+ for (l = 0; l < len && p < attr->data + attr->len;
|
||||
+ p += sizeof(community)) {
|
||||
+ if (memcmp(&community, p, sizeof(community)) == 0)
|
||||
+ /* match */
|
||||
+ continue;
|
||||
+ memcpy(n + l, p, sizeof(community));
|
||||
+ l += sizeof(community);
|
||||
+ }
|
||||
+
|
||||
+ f = attr->flags;
|
||||
+
|
||||
+ attr_free(asp, attr);
|
||||
+ attr_optadd(asp, f, ATTR_EXT_COMMUNITIES, n, len);
|
||||
free(n);
|
||||
}
|
||||
|
||||
+int
|
||||
+attr_writebuf(struct buf *buf, u_int8_t flags, u_int8_t type, void *data,
|
||||
+ u_int16_t data_len)
|
||||
+community_ext_conv(struct filter_extcommunity *c, u_int16_t neighas,
|
||||
+ u_int64_t *community)
|
||||
+{
|
||||
+ u_char hdr[4];
|
||||
+ u_int64_t com;
|
||||
+ u_int32_t ip;
|
||||
+
|
||||
+ if (data_len > 255) {
|
||||
+ flags |= ATTR_EXTLEN;
|
||||
+ hdr[2] = (data_len >> 8) & 0xff;
|
||||
+ hdr[3] = data_len & 0xff;
|
||||
+ } else {
|
||||
+ flags &= ~ATTR_EXTLEN;
|
||||
+ hdr[2] = data_len & 0xff;
|
||||
+ com = (u_int64_t)c->type << 56;
|
||||
+ switch (c->type & EXT_COMMUNITY_VALUE) {
|
||||
+ case EXT_COMMUNITY_TWO_AS:
|
||||
+ com |= (u_int64_t)c->subtype << 48;
|
||||
+ com |= (u_int64_t)c->data.ext_as.as << 32;
|
||||
+ com |= c->data.ext_as.val;
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_IPV4:
|
||||
+ com |= (u_int64_t)c->subtype << 48;
|
||||
+ ip = ntohl(c->data.ext_ip.addr.s_addr);
|
||||
+ com |= (u_int64_t)ip << 16;
|
||||
+ com |= c->data.ext_ip.val;
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_FOUR_AS:
|
||||
+ com |= (u_int64_t)c->subtype << 48;
|
||||
+ com |= (u_int64_t)c->data.ext_as4.as4 << 16;
|
||||
+ com |= c->data.ext_as4.val;
|
||||
+ break;
|
||||
+ case EXT_COMMUNITY_OPAQUE:
|
||||
+ com |= (u_int64_t)c->subtype << 48;
|
||||
+ com |= c->data.ext_opaq & EXT_COMMUNITY_OPAQUE_MAX;
|
||||
+ break;
|
||||
+ default:
|
||||
+ com |= c->data.ext_opaq & 0xffffffffffffffULL;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ hdr[0] = flags;
|
||||
+ hdr[1] = type;
|
||||
+ *community = htobe64(com);
|
||||
+
|
||||
+ if (buf_add(buf, hdr, flags & ATTR_EXTLEN ? 4 : 3) == -1)
|
||||
+ return (-1);
|
||||
+ if (buf_add(buf, data, data_len) == -1)
|
||||
+ return (-1);
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
/* optional attribute specific functions */
|
||||
int attr_diff(struct attr *, struct attr *);
|
||||
struct attr *attr_alloc(u_int8_t, u_int8_t, const void *, u_int16_t);
|
||||
@@ -588,7 +620,7 @@ aspath_merge(struct rde_aspath *a, struc
|
||||
|
||||
ascnt = aspath_count(attr->data, attr->len);
|
||||
if (ascnt > a->aspath->ascnt) {
|
||||
- /* ASPATH is shorter then NEW_ASPATH no way to merge */
|
||||
+ /* ASPATH is shorter then AS4_PATH no way to merge */
|
||||
attr_free(a, attr);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,27 +1,18 @@
|
|||
Index: bgpd/rde_decide.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_decide.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.2
|
||||
diff -u -p -r1.1.1.1 -r1.2
|
||||
--- bgpd/rde_decide.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
diff -u -p -r1.1.1.6 -r1.2
|
||||
--- bgpd/rde_decide.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/rde_decide.c 22 Oct 2009 15:12:21 -0000 1.2
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde_decide.c,v 1.51 2008/05/08 09:51:46 henning Exp $ */
|
||||
-/* $OpenBSD: rde_decide.c,v 1.58 2009/06/29 14:10:13 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_decide.c,v 1.59 2009/08/06 08:53:11 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
@@ -115,15 +115,15 @@ prefix_cmp(struct prefix *p1, struct pre
|
||||
if (p2 == NULL)
|
||||
return (1);
|
||||
|
||||
- /* only prefixes in the Local-RIB are eligible */
|
||||
- if (!(p1->flags & F_LOCAL))
|
||||
- return (-1);
|
||||
- if (!(p2->flags & F_LOCAL))
|
||||
- return (1);
|
||||
-
|
||||
@@ -118,6 +118,12 @@ prefix_cmp(struct prefix *p1, struct pre
|
||||
asp1 = p1->aspath;
|
||||
asp2 = p2->aspath;
|
||||
|
||||
|
@ -34,104 +25,21 @@ diff -u -p -r1.1.1.1 -r1.2
|
|||
/* only loop free pathes are eligible */
|
||||
if (asp1->flags & F_ATTR_LOOP)
|
||||
return (-1);
|
||||
@@ -201,9 +201,16 @@ prefix_cmp(struct prefix *p1, struct pre
|
||||
&p2->aspath->peer->remote_addr,
|
||||
sizeof(p1->aspath->peer->remote_addr)));
|
||||
@@ -204,7 +210,7 @@ prefix_cmp(struct prefix *p1, struct pre
|
||||
}
|
||||
|
||||
+ /* 12. for announced prefixes prefer dynamic routes */
|
||||
+ if ((asp1->flags & F_ANN_DYNAMIC) != (asp2->flags & F_ANN_DYNAMIC)) {
|
||||
+ if (asp1->flags & F_ANN_DYNAMIC)
|
||||
+ return (1);
|
||||
+ else
|
||||
+ return (-1);
|
||||
+ }
|
||||
+
|
||||
fatalx("Uh, oh a politician in the decision process");
|
||||
- /* NOTREACHED */
|
||||
- return (0);
|
||||
+ return(0); /* NOTREACHED */
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -212,59 +219,59 @@ prefix_cmp(struct prefix *p1, struct pre
|
||||
* The to evaluate prefix must not be in the prefix list.
|
||||
*/
|
||||
void
|
||||
-prefix_evaluate(struct prefix *p, struct pt_entry *pte)
|
||||
+prefix_evaluate(struct prefix *p, struct rib_entry *re)
|
||||
{
|
||||
struct prefix *xp;
|
||||
|
||||
- if (rde_noevaluate()) {
|
||||
+ if (re->flags & F_RIB_NOEVALUATE || rde_noevaluate()) {
|
||||
/* decision process is turned off */
|
||||
if (p != NULL)
|
||||
- LIST_INSERT_HEAD(&pte->prefix_h, p, prefix_l);
|
||||
- if (pte->active != NULL) {
|
||||
- pte->active->aspath->active_cnt--;
|
||||
- pte->active = NULL;
|
||||
+ LIST_INSERT_HEAD(&re->prefix_h, p, rib_l);
|
||||
+ if (re->active != NULL) {
|
||||
+ re->active->aspath->active_cnt--;
|
||||
+ re->active = NULL;
|
||||
}
|
||||
return;
|
||||
@@ -245,7 +251,7 @@ prefix_evaluate(struct prefix *p, struct
|
||||
}
|
||||
|
||||
if (p != NULL) {
|
||||
- if (LIST_EMPTY(&pte->prefix_h))
|
||||
- LIST_INSERT_HEAD(&pte->prefix_h, p, prefix_l);
|
||||
+ if (LIST_EMPTY(&re->prefix_h))
|
||||
+ LIST_INSERT_HEAD(&re->prefix_h, p, rib_l);
|
||||
else {
|
||||
- LIST_FOREACH(xp, &pte->prefix_h, prefix_l)
|
||||
+ LIST_FOREACH(xp, &re->prefix_h, rib_l)
|
||||
if (prefix_cmp(p, xp) > 0) {
|
||||
- LIST_INSERT_BEFORE(xp, p, prefix_l);
|
||||
+ LIST_INSERT_BEFORE(xp, p, rib_l);
|
||||
break;
|
||||
- } else if (LIST_NEXT(xp, prefix_l) == NULL) {
|
||||
+ } else if (LIST_NEXT(xp, rib_l) == NULL) {
|
||||
/* if xp last element ... */
|
||||
- LIST_INSERT_AFTER(xp, p, prefix_l);
|
||||
+ LIST_INSERT_AFTER(xp, p, rib_l);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- xp = LIST_FIRST(&pte->prefix_h);
|
||||
- if (xp == NULL || !(xp->flags & F_LOCAL) ||
|
||||
- xp->aspath->flags & F_ATTR_LOOP ||
|
||||
+ xp = LIST_FIRST(&re->prefix_h);
|
||||
xp = LIST_FIRST(&re->prefix_h);
|
||||
- if (xp == NULL || xp->aspath->flags & F_ATTR_LOOP ||
|
||||
+ if (xp == NULL || xp->aspath->flags & (F_ATTR_LOOP|F_ATTR_PARSE_ERR) ||
|
||||
(xp->aspath->nexthop != NULL &&
|
||||
xp->aspath->nexthop->state != NEXTHOP_REACH))
|
||||
/* xp is ineligible */
|
||||
xp = NULL;
|
||||
|
||||
- if (pte->active != xp) {
|
||||
+ if (re->active != xp) {
|
||||
/* need to generate an update */
|
||||
- if (pte->active != NULL)
|
||||
- pte->active->aspath->active_cnt--;
|
||||
+ if (re->active != NULL)
|
||||
+ re->active->aspath->active_cnt--;
|
||||
|
||||
/*
|
||||
- * Send update with remove for pte->active and add for xp
|
||||
+ * Send update with remove for re->active and add for xp
|
||||
* but remember that xp may be NULL aka ineligible.
|
||||
* Additional decision may be made by the called functions.
|
||||
*/
|
||||
- rde_generate_updates(xp, pte->active);
|
||||
- rde_send_kroute(xp, pte->active);
|
||||
+ rde_generate_updates(re->ribid, xp, re->active);
|
||||
+ if ((re->flags & F_RIB_NOFIB) == 0)
|
||||
+ rde_send_kroute(xp, re->active);
|
||||
|
||||
- pte->active = xp;
|
||||
+ re->active = xp;
|
||||
if (xp != NULL)
|
||||
xp->aspath->active_cnt++;
|
||||
}
|
||||
|
|
|
@ -1,27 +1,18 @@
|
|||
Index: bgpd/rde_filter.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_filter.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.1 -r1.4
|
||||
--- bgpd/rde_filter.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/rde_filter.c 10 Aug 2009 21:20:05 -0000 1.4
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.5
|
||||
diff -u -p -r1.1.1.7 -r1.5
|
||||
--- bgpd/rde_filter.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/rde_filter.c 4 Feb 2010 16:22:23 -0000 1.5
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde_filter.c,v 1.54 2008/06/15 10:19:21 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_filter.c,v 1.57 2009/08/06 08:53:11 claudio Exp $ */
|
||||
-/* $OpenBSD: rde_filter.c,v 1.56 2009/06/06 01:10:29 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_filter.c,v 1.61 2009/12/18 15:51:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
@@ -30,7 +30,7 @@ int rde_filter_match(struct filter_rule
|
||||
int filterset_equal(struct filter_set_head *, struct filter_set_head *);
|
||||
|
||||
enum filter_actions
|
||||
-rde_filter(struct rde_aspath **new, struct filter_head *rules,
|
||||
+rde_filter(u_int16_t ribid, struct rde_aspath **new, struct filter_head *rules,
|
||||
struct rde_peer *peer, struct rde_aspath *asp, struct bgpd_addr *prefix,
|
||||
u_int8_t prefixlen, struct rde_peer *from, enum directions dir)
|
||||
{
|
||||
@@ -40,9 +40,18 @@ rde_filter(struct rde_aspath **new, stru
|
||||
@@ -40,6 +40,13 @@ rde_filter(u_int16_t ribid, struct rde_a
|
||||
if (new != NULL)
|
||||
*new = NULL;
|
||||
|
||||
|
@ -35,26 +26,148 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
TAILQ_FOREACH(f, rules, entry) {
|
||||
if (dir != f->dir)
|
||||
continue;
|
||||
+ if (dir == DIR_IN && f->peer.ribid != ribid)
|
||||
+ continue;
|
||||
if (f->peer.groupid != 0 &&
|
||||
f->peer.groupid != peer->conf.groupid)
|
||||
continue;
|
||||
@@ -283,8 +292,11 @@ rde_filter_match(struct filter_rule *f,
|
||||
@@ -59,7 +66,7 @@ rde_filter(u_int16_t ribid, struct rde_a
|
||||
/* ... and use the copy from now on */
|
||||
asp = *new;
|
||||
}
|
||||
- rde_apply_set(asp, &f->set, prefix->af,
|
||||
+ rde_apply_set(asp, &f->set, prefix->aid,
|
||||
from, peer);
|
||||
}
|
||||
if (f->action != ACTION_NONE)
|
||||
@@ -73,7 +80,7 @@ rde_filter(u_int16_t ribid, struct rde_a
|
||||
|
||||
void
|
||||
rde_apply_set(struct rde_aspath *asp, struct filter_set_head *sh,
|
||||
- sa_family_t af, struct rde_peer *from, struct rde_peer *peer)
|
||||
+ u_int8_t aid, struct rde_peer *from, struct rde_peer *peer)
|
||||
{
|
||||
struct filter_set *set;
|
||||
u_char *np;
|
||||
@@ -167,7 +174,7 @@ rde_apply_set(struct rde_aspath *asp, st
|
||||
case ACTION_SET_NEXTHOP_NOMODIFY:
|
||||
case ACTION_SET_NEXTHOP_SELF:
|
||||
nexthop_modify(asp, &set->action.nexthop, set->type,
|
||||
- af);
|
||||
+ aid);
|
||||
break;
|
||||
case ACTION_SET_COMMUNITY:
|
||||
switch (set->action.community.as) {
|
||||
@@ -243,6 +250,17 @@ rde_apply_set(struct rde_aspath *asp, st
|
||||
asp->rtlabelid = set->action.id;
|
||||
rtlabel_ref(asp->rtlabelid);
|
||||
break;
|
||||
+ case ACTION_SET_ORIGIN:
|
||||
+ asp->origin = set->action.origin;
|
||||
+ break;
|
||||
+ case ACTION_SET_EXT_COMMUNITY:
|
||||
+ community_ext_set(asp, &set->action.ext_community,
|
||||
+ peer->conf.remote_as);
|
||||
+ break;
|
||||
+ case ACTION_DEL_EXT_COMMUNITY:
|
||||
+ community_ext_delete(asp, &set->action.ext_community,
|
||||
+ peer->conf.remote_as);
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -281,12 +299,12 @@ rde_filter_match(struct filter_rule *f,
|
||||
break;
|
||||
}
|
||||
|
||||
- if (rde_filter_community(asp, as, type) == 0)
|
||||
+ if (community_match(asp, as, type) == 0)
|
||||
return (0);
|
||||
}
|
||||
|
||||
- if (f->match.prefix.addr.af != 0 &&
|
||||
- f->match.prefix.addr.af == prefix->af) {
|
||||
+ if (f->match.prefix.addr.af != 0) {
|
||||
+ if (f->match.prefix.addr.af != prefix->af)
|
||||
+ /* don't use IPv4 rules for IPv6 and vice versa */
|
||||
+ return (0);
|
||||
+
|
||||
if (prefix_compare(prefix, &f->match.prefix.addr,
|
||||
f->match.prefix.len))
|
||||
- if (f->match.prefix.addr.af != 0) {
|
||||
- if (f->match.prefix.addr.af != prefix->af)
|
||||
+ if (f->match.prefix.addr.aid != 0) {
|
||||
+ if (f->match.prefix.addr.aid != prefix->aid)
|
||||
/* don't use IPv4 rules for IPv6 and vice versa */
|
||||
return (0);
|
||||
@@ -614,4 +626,5 @@ filterset_name(enum action_types type)
|
||||
|
||||
@@ -322,7 +340,7 @@ rde_filter_match(struct filter_rule *f,
|
||||
} else if (f->match.prefixlen.op != OP_NONE) {
|
||||
/* only prefixlen without a prefix */
|
||||
|
||||
- if (f->match.prefixlen.af != prefix->af)
|
||||
+ if (f->match.prefixlen.aid != prefix->aid)
|
||||
/* don't use IPv4 rules for IPv6 and vice versa */
|
||||
return (0);
|
||||
|
||||
@@ -356,19 +374,6 @@ rde_filter_match(struct filter_rule *f,
|
||||
}
|
||||
|
||||
int
|
||||
-rde_filter_community(struct rde_aspath *asp, int as, int type)
|
||||
-{
|
||||
- struct attr *a;
|
||||
-
|
||||
- a = attr_optget(asp, ATTR_COMMUNITIES);
|
||||
- if (a == NULL)
|
||||
- /* no communities, no match */
|
||||
- return (0);
|
||||
-
|
||||
- return (community_match(a->data, a->len, as, type));
|
||||
-}
|
||||
-
|
||||
-int
|
||||
rde_filter_equal(struct filter_head *a, struct filter_head *b,
|
||||
struct rde_peer *peer, enum directions dir)
|
||||
{
|
||||
@@ -476,6 +481,12 @@ filterset_cmp(struct filter_set *a, stru
|
||||
return (a->action.community.type - b->action.community.type);
|
||||
}
|
||||
|
||||
+ if (a->type == ACTION_SET_EXT_COMMUNITY ||
|
||||
+ a->type == ACTION_DEL_EXT_COMMUNITY) { /* a->type == b->type */
|
||||
+ return (memcmp(&a->action.ext_community,
|
||||
+ &b->action.ext_community, sizeof(a->action.ext_community)));
|
||||
+ }
|
||||
+
|
||||
if (a->type == ACTION_SET_NEXTHOP && b->type == ACTION_SET_NEXTHOP) {
|
||||
/*
|
||||
* This is the only interesting case, all others are considered
|
||||
@@ -483,7 +494,7 @@ filterset_cmp(struct filter_set *a, stru
|
||||
* reject it at the same time. Allow one IPv4 and one IPv6
|
||||
* per filter set or only one of the other nexthop modifiers.
|
||||
*/
|
||||
- return (a->action.nexthop.af - b->action.nexthop.af);
|
||||
+ return (a->action.nexthop.aid - b->action.nexthop.aid);
|
||||
}
|
||||
|
||||
/* equal */
|
||||
@@ -574,6 +585,19 @@ filterset_equal(struct filter_set_head *
|
||||
if (strcmp(as, bs) == 0)
|
||||
continue;
|
||||
break;
|
||||
+ case ACTION_SET_ORIGIN:
|
||||
+ if (a->type == b->type &&
|
||||
+ a->action.origin == b->action.origin)
|
||||
+ continue;
|
||||
+ break;
|
||||
+ case ACTION_SET_EXT_COMMUNITY:
|
||||
+ case ACTION_DEL_EXT_COMMUNITY:
|
||||
+ if (a->type == b->type && memcmp(
|
||||
+ &a->action.ext_community,
|
||||
+ &b->action.ext_community,
|
||||
+ sizeof(a->action.ext_community)) == 0)
|
||||
+ continue;
|
||||
+ break;
|
||||
}
|
||||
/* compare failed */
|
||||
return (0);
|
||||
@@ -616,7 +640,14 @@ filterset_name(enum action_types type)
|
||||
case ACTION_RTLABEL:
|
||||
case ACTION_RTLABEL_ID:
|
||||
return ("rtlabel");
|
||||
+ case ACTION_SET_ORIGIN:
|
||||
+ return ("origin");
|
||||
+ case ACTION_SET_EXT_COMMUNITY:
|
||||
+ return ("ext-community");
|
||||
+ case ACTION_DEL_EXT_COMMUNITY:
|
||||
+ return ("ext-community delete");
|
||||
}
|
||||
|
||||
fatalx("filterset_name: got lost");
|
||||
|
|
|
@ -1,332 +1,294 @@
|
|||
Index: bgpd/rde_prefix.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_prefix.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.1 -r1.3
|
||||
--- bgpd/rde_prefix.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/rde_prefix.c 9 Jul 2009 17:22:14 -0000 1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpd/rde_prefix.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/rde_prefix.c 4 Feb 2010 16:22:23 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde_prefix.c,v 1.25 2007/05/11 11:27:59 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_prefix.c,v 1.29 2009/05/30 18:27:17 claudio Exp $ */
|
||||
-/* $OpenBSD: rde_prefix.c,v 1.29 2009/05/30 18:27:17 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_prefix.c,v 1.31 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
@@ -40,46 +40,30 @@
|
||||
@@ -38,15 +38,16 @@
|
||||
* pt_lookup: lookup a IP in the prefix table. Mainly for "show ip bgp".
|
||||
* pt_empty: returns true if there is no bgp prefix linked to the pt_entry.
|
||||
* pt_init: initialize prefix table.
|
||||
* pt_alloc?: allocate a AF specific pt_entry. Internal function.
|
||||
- * pt_alloc?: allocate a AF specific pt_entry. Internal function.
|
||||
+ * pt_alloc: allocate a AF specific pt_entry. Internal function.
|
||||
* pt_free: free a pt_entry. Internal function.
|
||||
- * pt_restart used to restart a tree walk at the spot it was aborted earlier.
|
||||
*/
|
||||
|
||||
/* internal prototypes */
|
||||
static struct pt_entry4 *pt_alloc4(void);
|
||||
static struct pt_entry6 *pt_alloc6(void);
|
||||
-static struct pt_entry4 *pt_alloc4(void);
|
||||
-static struct pt_entry6 *pt_alloc6(void);
|
||||
+static struct pt_entry *pt_alloc(struct pt_entry *);
|
||||
static void pt_free(struct pt_entry *);
|
||||
-static struct pt_entry *pt_restart(struct pt_context *);
|
||||
|
||||
-int pt_prefix_cmp(const struct pt_entry *, const struct pt_entry *);
|
||||
-
|
||||
-#define MIN_PREFIX 0
|
||||
-#define MAX_PREFIX 32
|
||||
+size_t pt_sizes[AID_MAX] = AID_PTSIZE;
|
||||
+
|
||||
RB_HEAD(pt_tree, pt_entry);
|
||||
RB_PROTOTYPE(pt_tree, pt_entry, pt_e, pt_prefix_cmp);
|
||||
RB_GENERATE(pt_tree, pt_entry, pt_e, pt_prefix_cmp);
|
||||
|
||||
-struct pt_tree pttable4;
|
||||
-struct pt_tree pttable6;
|
||||
+struct pt_tree pttable;
|
||||
|
||||
void
|
||||
pt_init(void)
|
||||
@@ -70,17 +71,24 @@ void
|
||||
pt_getaddr(struct pt_entry *pte, struct bgpd_addr *addr)
|
||||
{
|
||||
- RB_INIT(&pttable4);
|
||||
- RB_INIT(&pttable6);
|
||||
+ RB_INIT(&pttable);
|
||||
bzero(addr, sizeof(struct bgpd_addr));
|
||||
- switch (pte->af) {
|
||||
- case AF_INET:
|
||||
- addr->af = pte->af;
|
||||
+ addr->aid = pte->aid;
|
||||
+ switch (addr->aid) {
|
||||
+ case AID_INET:
|
||||
addr->v4 = ((struct pt_entry4 *)pte)->prefix4;
|
||||
break;
|
||||
- case AF_INET6:
|
||||
- addr->af = pte->af;
|
||||
+ case AID_INET6:
|
||||
memcpy(&addr->v6, &((struct pt_entry6 *)pte)->prefix6,
|
||||
sizeof(addr->v6));
|
||||
/* XXX scope_id ??? */
|
||||
break;
|
||||
+ case AID_VPN_IPv4:
|
||||
+ addr->vpn4.addr = ((struct pt_entry_vpn4 *)pte)->prefix4;
|
||||
+ addr->vpn4.rd = ((struct pt_entry_vpn4 *)pte)->rd;
|
||||
+ addr->vpn4.labellen = ((struct pt_entry_vpn4 *)pte)->labellen;
|
||||
+ memcpy(addr->vpn4.labelstack,
|
||||
+ ((struct pt_entry_vpn4 *)pte)->labelstack,
|
||||
+ addr->vpn4.labellen);
|
||||
+ break;
|
||||
default:
|
||||
fatalx("pt_getaddr: unknown af");
|
||||
}
|
||||
|
||||
void
|
||||
pt_shutdown(void)
|
||||
{
|
||||
- if (!RB_EMPTY(&pttable4))
|
||||
- log_debug("pt_shutdown: IPv4 tree is not empty.");
|
||||
- if (!RB_EMPTY(&pttable6))
|
||||
- log_debug("pt_shutdown: IPv6 tree is not empty.");
|
||||
-}
|
||||
-
|
||||
-int
|
||||
-pt_empty(struct pt_entry *pte)
|
||||
-{
|
||||
- return LIST_EMPTY(&pte->prefix_h);
|
||||
+ if (!RB_EMPTY(&pttable))
|
||||
+ log_debug("pt_shutdown: tree is not empty.");
|
||||
}
|
||||
|
||||
void
|
||||
@@ -103,14 +87,15 @@ pt_getaddr(struct pt_entry *pte, struct
|
||||
}
|
||||
|
||||
@@ -89,33 +97,49 @@ pt_getaddr(struct pt_entry *pte, struct
|
||||
struct pt_entry *
|
||||
-pt_get(struct bgpd_addr *prefix, int prefixlen)
|
||||
+pt_fill(struct bgpd_addr *prefix, int prefixlen)
|
||||
pt_fill(struct bgpd_addr *prefix, int prefixlen)
|
||||
{
|
||||
- struct pt_entry4 pte4;
|
||||
- struct pt_entry6 pte6;
|
||||
- static struct pt_entry4 pte4;
|
||||
- static struct pt_entry6 pte6;
|
||||
- in_addr_t addr_hbo;
|
||||
+ static struct pt_entry4 pte4;
|
||||
+ static struct pt_entry6 pte6;
|
||||
in_addr_t addr_hbo;
|
||||
+ static struct pt_entry_vpn4 pte_vpn4;
|
||||
+ in_addr_t addr_hbo;
|
||||
|
||||
switch (prefix->af) {
|
||||
case AF_INET:
|
||||
+ bzero(&pte4, sizeof(pte4));
|
||||
- switch (prefix->af) {
|
||||
- case AF_INET:
|
||||
+ switch (prefix->aid) {
|
||||
+ case AID_INET:
|
||||
bzero(&pte4, sizeof(pte4));
|
||||
+ pte4.aid = prefix->aid;
|
||||
if (prefixlen > 32)
|
||||
fatalx("pt_get: bad IPv4 prefixlen");
|
||||
pte4.af = AF_INET;
|
||||
@@ -118,24 +103,33 @@ pt_get(struct bgpd_addr *prefix, int pre
|
||||
- fatalx("pt_get: bad IPv4 prefixlen");
|
||||
- pte4.af = AF_INET;
|
||||
+ fatalx("pt_fill: bad IPv4 prefixlen");
|
||||
addr_hbo = ntohl(prefix->v4.s_addr);
|
||||
pte4.prefix4.s_addr = htonl(addr_hbo &
|
||||
prefixlen2mask(prefixlen));
|
||||
pte4.prefixlen = prefixlen;
|
||||
- return RB_FIND(pt_tree, &pttable4, (struct pt_entry *)&pte4);
|
||||
+ return ((struct pt_entry *)&pte4);
|
||||
case AF_INET6:
|
||||
+ bzero(&pte6, sizeof(pte6));
|
||||
return ((struct pt_entry *)&pte4);
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
bzero(&pte6, sizeof(pte6));
|
||||
+ pte6.aid = prefix->aid;
|
||||
if (prefixlen > 128)
|
||||
fatalx("pt_get: bad IPv6 prefixlen");
|
||||
pte6.af = AF_INET6;
|
||||
- pte6.af = AF_INET6;
|
||||
pte6.prefixlen = prefixlen;
|
||||
inet6applymask(&pte6.prefix6, &prefix->v6, prefixlen);
|
||||
- return RB_FIND(pt_tree, &pttable6, (struct pt_entry *)&pte6);
|
||||
+ return ((struct pt_entry *)&pte6);
|
||||
return ((struct pt_entry *)&pte6);
|
||||
+ case AID_VPN_IPv4:
|
||||
+ bzero(&pte_vpn4, sizeof(pte_vpn4));
|
||||
+ pte_vpn4.aid = prefix->aid;
|
||||
+ if (prefixlen > 32)
|
||||
+ fatalx("pt_fill: bad IPv4 prefixlen");
|
||||
+ addr_hbo = ntohl(prefix->vpn4.addr.s_addr);
|
||||
+ pte_vpn4.prefix4.s_addr = htonl(addr_hbo &
|
||||
+ prefixlen2mask(prefixlen));
|
||||
+ pte_vpn4.prefixlen = prefixlen;
|
||||
+ pte_vpn4.rd = prefix->vpn4.rd;
|
||||
+ pte_vpn4.labellen = prefix->vpn4.labellen;
|
||||
+ memcpy(pte_vpn4.labelstack, prefix->vpn4.labelstack,
|
||||
+ prefix->vpn4.labellen);
|
||||
+ return ((struct pt_entry *)&pte_vpn4);
|
||||
default:
|
||||
log_warnx("pt_get: unknown af");
|
||||
+ return (NULL);
|
||||
}
|
||||
- log_warnx("pt_get: unknown af");
|
||||
- return (NULL);
|
||||
+}
|
||||
+
|
||||
+struct pt_entry *
|
||||
+pt_get(struct bgpd_addr *prefix, int prefixlen)
|
||||
+{
|
||||
+ struct pt_entry *pte;
|
||||
+
|
||||
+ pte = pt_fill(prefix, prefixlen);
|
||||
+ return RB_FIND(pt_tree, &pttable, pte);
|
||||
+ fatalx("pt_fill: unknown af");
|
||||
}
|
||||
+ /* NOT REACHED */
|
||||
+ return (NULL);
|
||||
}
|
||||
|
||||
struct pt_entry *
|
||||
@@ -131,34 +155,9 @@ struct pt_entry *
|
||||
pt_add(struct bgpd_addr *prefix, int prefixlen)
|
||||
{
|
||||
- struct pt_tree *tree = NULL;
|
||||
struct pt_entry *p = NULL;
|
||||
struct pt_entry4 *p4;
|
||||
struct pt_entry6 *p6;
|
||||
@@ -152,7 +146,6 @@ pt_add(struct bgpd_addr *prefix, int pre
|
||||
p4->prefix4.s_addr = htonl(addr_hbo &
|
||||
prefixlen2mask(prefixlen));
|
||||
p = (struct pt_entry *)p4;
|
||||
- tree = &pttable4;
|
||||
break;
|
||||
case AF_INET6:
|
||||
p6 = pt_alloc6();
|
||||
@@ -162,15 +155,13 @@ pt_add(struct bgpd_addr *prefix, int pre
|
||||
p6->prefixlen = prefixlen;
|
||||
inet6applymask(&p6->prefix6, &prefix->v6, prefixlen);
|
||||
p = (struct pt_entry *)p6;
|
||||
- tree = &pttable6;
|
||||
break;
|
||||
default:
|
||||
fatalx("pt_add: unknown af");
|
||||
}
|
||||
- LIST_INIT(&p->prefix_h);
|
||||
|
||||
- if (RB_INSERT(pt_tree, tree, p) != NULL) {
|
||||
- log_warnx("prefix_add: insert failed");
|
||||
+ if (RB_INSERT(pt_tree, &pttable, p) != NULL) {
|
||||
+ log_warnx("pt_add: insert failed");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -181,101 +172,35 @@ void
|
||||
pt_remove(struct pt_entry *pte)
|
||||
{
|
||||
if (!pt_empty(pte))
|
||||
- fatalx("pt_remove: entry not empty");
|
||||
- struct pt_entry4 *p4;
|
||||
- struct pt_entry6 *p6;
|
||||
- in_addr_t addr_hbo;
|
||||
-
|
||||
- switch (pte->af) {
|
||||
- switch (prefix->af) {
|
||||
- case AF_INET:
|
||||
- if (RB_REMOVE(pt_tree, &pttable4, pte) == NULL)
|
||||
- log_warnx("pt_remove: remove failed.");
|
||||
- p4 = pt_alloc4();
|
||||
- if (prefixlen > 32)
|
||||
- fatalx("pt_add: bad IPv4 prefixlen");
|
||||
- p4->af = AF_INET;
|
||||
- p4->prefixlen = prefixlen;
|
||||
- addr_hbo = ntohl(prefix->v4.s_addr);
|
||||
- p4->prefix4.s_addr = htonl(addr_hbo &
|
||||
- prefixlen2mask(prefixlen));
|
||||
- p = (struct pt_entry *)p4;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- if (RB_REMOVE(pt_tree, &pttable6, pte) == NULL)
|
||||
- log_warnx("pt_remove: remove failed.");
|
||||
- p6 = pt_alloc6();
|
||||
- if (prefixlen > 128)
|
||||
- fatalx("pt_add: bad IPv6 prefixlen");
|
||||
- p6->af = AF_INET6;
|
||||
- p6->prefixlen = prefixlen;
|
||||
- inet6applymask(&p6->prefix6, &prefix->v6, prefixlen);
|
||||
- p = (struct pt_entry *)p6;
|
||||
- break;
|
||||
- default:
|
||||
- fatalx("pt_remove: unknown af");
|
||||
- fatalx("pt_add: unknown af");
|
||||
- }
|
||||
+ fatalx("pt_remove: entry still holds references");
|
||||
+
|
||||
+ p = pt_fill(prefix, prefixlen);
|
||||
+ p = pt_alloc(p);
|
||||
|
||||
+ if (RB_REMOVE(pt_tree, &pttable, pte) == NULL)
|
||||
+ log_warnx("pt_remove: remove failed.");
|
||||
pt_free(pte);
|
||||
}
|
||||
|
||||
struct pt_entry *
|
||||
-pt_lookup(struct bgpd_addr *prefix)
|
||||
+pt_lookup(struct bgpd_addr *addr)
|
||||
if (RB_INSERT(pt_tree, &pttable, p) != NULL) {
|
||||
log_warnx("pt_add: insert failed");
|
||||
@@ -183,13 +182,14 @@ struct pt_entry *
|
||||
pt_lookup(struct bgpd_addr *addr)
|
||||
{
|
||||
struct pt_entry *p;
|
||||
int i;
|
||||
- int i;
|
||||
+ int i = 0;
|
||||
|
||||
- switch (prefix->af) {
|
||||
+ switch (addr->af) {
|
||||
case AF_INET:
|
||||
- for (i = 32; i >= 0; i--) {
|
||||
- p = pt_get(prefix, i);
|
||||
- if (p != NULL)
|
||||
- return (p);
|
||||
- }
|
||||
+ i = 32;
|
||||
- switch (addr->af) {
|
||||
- case AF_INET:
|
||||
+ switch (addr->aid) {
|
||||
+ case AID_INET:
|
||||
+ case AID_VPN_IPv4:
|
||||
i = 32;
|
||||
break;
|
||||
case AF_INET6:
|
||||
- for (i = 128; i >= 0; i--) {
|
||||
- p = pt_get(prefix, i);
|
||||
- if (p != NULL)
|
||||
- return (p);
|
||||
- }
|
||||
+ i = 128;
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
i = 128;
|
||||
break;
|
||||
default:
|
||||
fatalx("pt_lookup: unknown af");
|
||||
}
|
||||
- return (NULL);
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-pt_dump(void (*upcall)(struct pt_entry *, void *), void *arg, sa_family_t af)
|
||||
-{
|
||||
- if (af == AF_INET || af == AF_UNSPEC)
|
||||
- pt_dump_r(upcall, arg, AF_INET, NULL);
|
||||
- if (af == AF_INET6 || af == AF_UNSPEC)
|
||||
- pt_dump_r(upcall, arg, AF_INET6, NULL);
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-pt_dump_r(void (*upcall)(struct pt_entry *, void *), void *arg,
|
||||
- sa_family_t af, struct pt_context *ctx)
|
||||
-{
|
||||
- struct pt_entry *p;
|
||||
- unsigned int i;
|
||||
-
|
||||
- if (ctx == NULL || ctx->ctx_p.af != af) {
|
||||
- switch (af) {
|
||||
- case AF_INET:
|
||||
- p = RB_MIN(pt_tree, &pttable4);
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- p = RB_MIN(pt_tree, &pttable6);
|
||||
- break;
|
||||
- default:
|
||||
- return;
|
||||
- }
|
||||
- } else
|
||||
- p = pt_restart(ctx);
|
||||
-
|
||||
- for (i = 0; p != NULL; p = RB_NEXT(pt_tree, unused, p)) {
|
||||
- if (ctx && i++ >= ctx->count) {
|
||||
- /* store next start point */
|
||||
- switch (p->af) {
|
||||
- case AF_INET:
|
||||
- ctx->ctx_p4 = *(struct pt_entry4 *)p;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- ctx->ctx_p6 = *(struct pt_entry6 *)p;
|
||||
- break;
|
||||
- default:
|
||||
- fatalx("pt_dump_r: unknown af");
|
||||
- }
|
||||
- return;
|
||||
- }
|
||||
- upcall(p, arg);
|
||||
+ for (; i >= 0; i--) {
|
||||
+ p = pt_get(addr, i);
|
||||
+ if (p != NULL)
|
||||
+ return (p);
|
||||
}
|
||||
-
|
||||
- if (ctx)
|
||||
- ctx->done = 1;
|
||||
+ return (NULL);
|
||||
}
|
||||
|
||||
@@ -206,17 +206,18 @@ pt_lookup(struct bgpd_addr *addr)
|
||||
int
|
||||
@@ -285,8 +210,10 @@ pt_prefix_cmp(const struct pt_entry *a,
|
||||
const struct pt_entry6 *a6, *b6;
|
||||
int i;
|
||||
pt_prefix_cmp(const struct pt_entry *a, const struct pt_entry *b)
|
||||
{
|
||||
- const struct pt_entry4 *a4, *b4;
|
||||
- const struct pt_entry6 *a6, *b6;
|
||||
- int i;
|
||||
+ const struct pt_entry4 *a4, *b4;
|
||||
+ const struct pt_entry6 *a6, *b6;
|
||||
+ const struct pt_entry_vpn4 *va4, *vb4;
|
||||
+ int i;
|
||||
|
||||
- if (a->af != b->af)
|
||||
- fatalx("king bula sez: comparing pears with apples");
|
||||
+ if (a->af > b->af)
|
||||
- if (a->af > b->af)
|
||||
+ if (a->aid > b->aid)
|
||||
return (1);
|
||||
- if (a->af < b->af)
|
||||
+ if (a->aid < b->aid)
|
||||
return (-1);
|
||||
|
||||
- switch (a->af) {
|
||||
- case AF_INET:
|
||||
+ switch (a->aid) {
|
||||
+ case AID_INET:
|
||||
a4 = (const struct pt_entry4 *)a;
|
||||
b4 = (const struct pt_entry4 *)b;
|
||||
if (ntohl(a4->prefix4.s_addr) > ntohl(b4->prefix4.s_addr))
|
||||
@@ -228,7 +229,7 @@ pt_prefix_cmp(const struct pt_entry *a,
|
||||
if (a4->prefixlen < b4->prefixlen)
|
||||
return (-1);
|
||||
return (0);
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
a6 = (const struct pt_entry6 *)a;
|
||||
b6 = (const struct pt_entry6 *)b;
|
||||
|
||||
@@ -242,49 +243,49 @@ pt_prefix_cmp(const struct pt_entry *a,
|
||||
if (a6->prefixlen > b6->prefixlen)
|
||||
return (1);
|
||||
return (0);
|
||||
+ case AID_VPN_IPv4:
|
||||
+ va4 = (const struct pt_entry_vpn4 *)a;
|
||||
+ vb4 = (const struct pt_entry_vpn4 *)b;
|
||||
+ if (ntohl(va4->prefix4.s_addr) > ntohl(vb4->prefix4.s_addr))
|
||||
+ return (1);
|
||||
+ if (a->af < b->af)
|
||||
+ if (ntohl(va4->prefix4.s_addr) < ntohl(vb4->prefix4.s_addr))
|
||||
+ return (-1);
|
||||
|
||||
switch (a->af) {
|
||||
case AF_INET:
|
||||
@@ -361,56 +288,3 @@ pt_free(struct pt_entry *pte)
|
||||
+ if (va4->prefixlen > vb4->prefixlen)
|
||||
+ return (1);
|
||||
+ if (va4->prefixlen < vb4->prefixlen)
|
||||
+ return (-1);
|
||||
+ if (betoh64(va4->rd) > betoh64(vb4->rd))
|
||||
+ return (1);
|
||||
+ if (betoh64(va4->rd) < betoh64(vb4->rd))
|
||||
+ return (-1);
|
||||
+ return (0);
|
||||
default:
|
||||
fatalx("pt_prefix_cmp: unknown af");
|
||||
}
|
||||
return (-1);
|
||||
}
|
||||
|
||||
-/* returns a zeroed pt_entry function may not return on fail */
|
||||
-static struct pt_entry4 *
|
||||
-pt_alloc4(void)
|
||||
+/*
|
||||
+ * Returns a pt_entry cloned from the one passed in.
|
||||
+ * Function may not return on failure.
|
||||
+ */
|
||||
+static struct pt_entry *
|
||||
+pt_alloc(struct pt_entry *op)
|
||||
{
|
||||
- struct pt_entry4 *p;
|
||||
+ struct pt_entry *p;
|
||||
|
||||
- p = calloc(1, sizeof(*p));
|
||||
+ p = malloc(pt_sizes[op->aid]);
|
||||
if (p == NULL)
|
||||
fatal("pt_alloc");
|
||||
- rdemem.pt4_cnt++;
|
||||
- return (p);
|
||||
-}
|
||||
+ rdemem.pt_cnt[op->aid]++;
|
||||
+ memcpy(p, op, pt_sizes[op->aid]);
|
||||
|
||||
-static struct pt_entry6 *
|
||||
-pt_alloc6(void)
|
||||
-{
|
||||
- struct pt_entry6 *p;
|
||||
-
|
||||
- p = calloc(1, sizeof(*p));
|
||||
- if (p == NULL)
|
||||
- fatal("pt_alloc");
|
||||
- rdemem.pt6_cnt++;
|
||||
return (p);
|
||||
}
|
||||
|
||||
static void
|
||||
pt_free(struct pt_entry *pte)
|
||||
{
|
||||
- switch (pte->af) {
|
||||
- case AF_INET:
|
||||
- rdemem.pt4_cnt--;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- rdemem.pt6_cnt--;
|
||||
- break;
|
||||
- default:
|
||||
- break;
|
||||
- }
|
||||
+ rdemem.pt_cnt[pte->aid]--;
|
||||
free(pte);
|
||||
}
|
||||
-
|
||||
-static struct pt_entry *
|
||||
-pt_restart(struct pt_context *ctx)
|
||||
-{
|
||||
- struct pt_entry *tmp, *prev = NULL;
|
||||
- int comp;
|
||||
-
|
||||
- /* first select correct tree */
|
||||
- switch (ctx->ctx_p.af) {
|
||||
- case AF_INET:
|
||||
- tmp = RB_ROOT(&pttable4);
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- tmp = RB_ROOT(&pttable6);
|
||||
- break;
|
||||
- default:
|
||||
- fatalx("pt_restart: unknown af");
|
||||
- }
|
||||
-
|
||||
- /* then try to find the element */
|
||||
- while (tmp) {
|
||||
- prev = tmp;
|
||||
- comp = pt_prefix_cmp(&ctx->ctx_p, tmp);
|
||||
- if (comp < 0)
|
||||
- tmp = RB_LEFT(tmp, pt_e);
|
||||
- else if (comp > 0)
|
||||
- tmp = RB_RIGHT(tmp, pt_e);
|
||||
- else
|
||||
- return (tmp);
|
||||
- }
|
||||
-
|
||||
- /* no match, empty tree */
|
||||
- if (prev == NULL)
|
||||
- return (NULL);
|
||||
-
|
||||
- /*
|
||||
- * no perfect match
|
||||
- * if last element was bigger use that as new start point
|
||||
- */
|
||||
- if (comp < 0)
|
||||
- return (prev);
|
||||
-
|
||||
- /* backtrack until parent is bigger */
|
||||
- do {
|
||||
- prev = RB_PARENT(prev, pt_e);
|
||||
- if (prev == NULL)
|
||||
- /* all elements in the tree are smaler */
|
||||
- return (NULL);
|
||||
- comp = pt_prefix_cmp(&ctx->ctx_p, prev);
|
||||
- } while (comp > 0);
|
||||
-
|
||||
- return (prev);
|
||||
-}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,18 +1,18 @@
|
|||
Index: bgpd/rde_update.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_update.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.1 -r1.4
|
||||
--- bgpd/rde_update.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/rde_update.c 10 Aug 2009 21:20:05 -0000 1.4
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.6
|
||||
diff -u -p -r1.1.1.7 -r1.6
|
||||
--- bgpd/rde_update.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/rde_update.c 14 Feb 2010 19:53:36 -0000 1.6
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: rde_update.c,v 1.61 2007/11/27 01:13:54 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_update.c,v 1.69 2009/08/06 08:53:11 claudio Exp $ */
|
||||
-/* $OpenBSD: rde_update.c,v 1.68 2009/06/06 01:10:29 claudio Exp $ */
|
||||
+/* $OpenBSD: rde_update.c,v 1.77 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
|
||||
@@ -17,10 +17,17 @@
|
||||
@@ -17,19 +17,26 @@
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <sys/queue.h>
|
||||
|
@ -30,7 +30,120 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
|
||||
#include "bgpd.h"
|
||||
#include "rde.h"
|
||||
@@ -270,6 +277,8 @@ up_test_update(struct rde_peer *peer, st
|
||||
|
||||
in_addr_t up_get_nexthop(struct rde_peer *, struct rde_aspath *);
|
||||
int up_generate_mp_reach(struct rde_peer *, struct update_attr *,
|
||||
- struct rde_aspath *, sa_family_t);
|
||||
+ struct rde_aspath *, u_int8_t);
|
||||
int up_generate_attr(struct rde_peer *, struct update_attr *,
|
||||
- struct rde_aspath *, sa_family_t);
|
||||
+ struct rde_aspath *, u_int8_t);
|
||||
|
||||
/* update stuff. */
|
||||
struct update_prefix {
|
||||
@@ -65,10 +72,12 @@ RB_GENERATE(uptree_attr, update_attr, en
|
||||
void
|
||||
up_init(struct rde_peer *peer)
|
||||
{
|
||||
- TAILQ_INIT(&peer->updates);
|
||||
- TAILQ_INIT(&peer->withdraws);
|
||||
- TAILQ_INIT(&peer->updates6);
|
||||
- TAILQ_INIT(&peer->withdraws6);
|
||||
+ u_int8_t i;
|
||||
+
|
||||
+ for (i = 0; i < AID_MAX; i++) {
|
||||
+ TAILQ_INIT(&peer->updates[i]);
|
||||
+ TAILQ_INIT(&peer->withdraws[i]);
|
||||
+ }
|
||||
RB_INIT(&peer->up_prefix);
|
||||
RB_INIT(&peer->up_attrs);
|
||||
peer->up_pcnt = 0;
|
||||
@@ -103,8 +112,10 @@ up_clear(struct uplist_attr *updates, st
|
||||
void
|
||||
up_down(struct rde_peer *peer)
|
||||
{
|
||||
- up_clear(&peer->updates, &peer->withdraws);
|
||||
- up_clear(&peer->updates6, &peer->withdraws6);
|
||||
+ u_int8_t i;
|
||||
+
|
||||
+ for (i = 0; i < AID_MAX; i++)
|
||||
+ up_clear(&peer->updates[i], &peer->withdraws[i]);
|
||||
|
||||
RB_INIT(&peer->up_prefix);
|
||||
RB_INIT(&peer->up_attrs);
|
||||
@@ -120,19 +131,19 @@ up_prefix_cmp(struct update_prefix *a, s
|
||||
{
|
||||
int i;
|
||||
|
||||
- if (a->prefix.af < b->prefix.af)
|
||||
+ if (a->prefix.aid < b->prefix.aid)
|
||||
return (-1);
|
||||
- if (a->prefix.af > b->prefix.af)
|
||||
+ if (a->prefix.aid > b->prefix.aid)
|
||||
return (1);
|
||||
|
||||
- switch (a->prefix.af) {
|
||||
- case AF_INET:
|
||||
+ switch (a->prefix.aid) {
|
||||
+ case AID_INET:
|
||||
if (ntohl(a->prefix.v4.s_addr) < ntohl(b->prefix.v4.s_addr))
|
||||
return (-1);
|
||||
if (ntohl(a->prefix.v4.s_addr) > ntohl(b->prefix.v4.s_addr))
|
||||
return (1);
|
||||
break;
|
||||
- case AF_INET6:
|
||||
+ case AID_INET6:
|
||||
i = memcmp(&a->prefix.v6, &b->prefix.v6,
|
||||
sizeof(struct in6_addr));
|
||||
if (i > 0)
|
||||
@@ -140,6 +151,25 @@ up_prefix_cmp(struct update_prefix *a, s
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
break;
|
||||
+ case AID_VPN_IPv4:
|
||||
+ if (betoh64(a->prefix.vpn4.rd) < betoh64(b->prefix.vpn4.rd))
|
||||
+ return (-1);
|
||||
+ if (betoh64(a->prefix.vpn4.rd) > betoh64(b->prefix.vpn4.rd))
|
||||
+ return (1);
|
||||
+ if (ntohl(a->prefix.v4.s_addr) < ntohl(b->prefix.v4.s_addr))
|
||||
+ return (-1);
|
||||
+ if (ntohl(a->prefix.v4.s_addr) > ntohl(b->prefix.v4.s_addr))
|
||||
+ return (1);
|
||||
+ if (a->prefixlen < b->prefixlen)
|
||||
+ return (-1);
|
||||
+ if (a->prefixlen > b->prefixlen)
|
||||
+ return (1);
|
||||
+ if (a->prefix.vpn4.labellen < b->prefix.vpn4.labellen)
|
||||
+ return (-1);
|
||||
+ if (a->prefix.vpn4.labellen > b->prefix.vpn4.labellen)
|
||||
+ return (1);
|
||||
+ return (memcmp(a->prefix.vpn4.labelstack,
|
||||
+ b->prefix.vpn4.labelstack, a->prefix.vpn4.labellen));
|
||||
default:
|
||||
fatalx("pt_prefix_cmp: unknown af");
|
||||
}
|
||||
@@ -174,18 +204,8 @@ up_add(struct rde_peer *peer, struct upd
|
||||
struct uplist_attr *upl = NULL;
|
||||
struct uplist_prefix *wdl = NULL;
|
||||
|
||||
- switch (p->prefix.af) {
|
||||
- case AF_INET:
|
||||
- upl = &peer->updates;
|
||||
- wdl = &peer->withdraws;
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- upl = &peer->updates6;
|
||||
- wdl = &peer->withdraws6;
|
||||
- break;
|
||||
- default:
|
||||
- fatalx("up_add: unknown AF");
|
||||
- }
|
||||
+ upl = &peer->updates[p->prefix.aid];
|
||||
+ wdl = &peer->withdraws[p->prefix.aid];
|
||||
|
||||
/* 1. search for attr */
|
||||
if (a != NULL && (na = RB_FIND(uptree_attr, &peer->up_attrs, a)) ==
|
||||
@@ -270,21 +290,14 @@ up_test_update(struct rde_peer *peer, st
|
||||
/* Do not send routes back to sender */
|
||||
return (0);
|
||||
|
||||
|
@ -39,154 +152,461 @@ diff -u -p -r1.1.1.1 -r1.4
|
|||
if (p->aspath->flags & F_ATTR_LOOP)
|
||||
fatalx("try to send out a looped path");
|
||||
|
||||
@@ -360,7 +369,7 @@ up_generate(struct rde_peer *peer, struc
|
||||
if (asp) {
|
||||
ua = calloc(1, sizeof(struct update_attr));
|
||||
if (ua == NULL)
|
||||
- fatal("up_generate_updates");
|
||||
+ fatal("up_generate");
|
||||
pt_getaddr(p->prefix, &addr);
|
||||
- switch (addr.af) {
|
||||
- case AF_INET:
|
||||
- if (peer->capa_announced.mp_v4 == SAFI_NONE &&
|
||||
- peer->capa_received.mp_v6 != SAFI_NONE)
|
||||
- return (-1);
|
||||
- break;
|
||||
- case AF_INET6:
|
||||
- if (peer->capa_announced.mp_v6 == SAFI_NONE)
|
||||
- return (-1);
|
||||
- break;
|
||||
- }
|
||||
+ if (peer->capa.mp[addr.aid] == 0)
|
||||
+ return (-1);
|
||||
|
||||
if (up_generate_attr(peer, ua, asp, addr->af) == -1) {
|
||||
log_warnx("generation of bgp path attributes failed");
|
||||
@@ -379,7 +388,7 @@ up_generate(struct rde_peer *peer, struc
|
||||
|
||||
up = calloc(1, sizeof(struct update_prefix));
|
||||
if (up == NULL)
|
||||
- fatal("up_generate_updates");
|
||||
+ fatal("up_generate");
|
||||
up->prefix = *addr;
|
||||
up->prefixlen = prefixlen;
|
||||
|
||||
@@ -404,9 +413,9 @@ up_generate_updates(struct filter_head *
|
||||
return;
|
||||
|
||||
pt_getaddr(old->prefix, &addr);
|
||||
- if (rde_filter(NULL, rules, peer, old->aspath, &addr,
|
||||
- old->prefix->prefixlen, old->aspath->peer, DIR_OUT) ==
|
||||
- ACTION_DENY)
|
||||
+ if (rde_filter(peer->ribid, NULL, rules, peer, old->aspath,
|
||||
+ &addr, old->prefix->prefixlen, old->aspath->peer,
|
||||
+ DIR_OUT) == ACTION_DENY)
|
||||
return;
|
||||
|
||||
/* withdraw prefix */
|
||||
@@ -423,9 +432,9 @@ up_generate_updates(struct filter_head *
|
||||
if (p->aspath->peer->conf.ebgp == 0 && peer->conf.ebgp == 0) {
|
||||
/*
|
||||
@@ -325,13 +338,13 @@ up_test_update(struct rde_peer *peer, st
|
||||
}
|
||||
|
||||
pt_getaddr(new->prefix, &addr);
|
||||
- if (rde_filter(&asp, rules, peer, new->aspath, &addr,
|
||||
- new->prefix->prefixlen, new->aspath->peer, DIR_OUT) ==
|
||||
- ACTION_DENY) {
|
||||
+ if (rde_filter(peer->ribid, &asp, rules, peer, new->aspath,
|
||||
+ &addr, new->prefix->prefixlen, new->aspath->peer,
|
||||
+ DIR_OUT) == ACTION_DENY) {
|
||||
path_put(asp);
|
||||
up_generate_updates(rules, peer, NULL, old);
|
||||
return;
|
||||
@@ -473,8 +482,8 @@ up_generate_default(struct filter_head *
|
||||
bzero(&addr, sizeof(addr));
|
||||
addr.af = af;
|
||||
/* well known communities */
|
||||
- if (rde_filter_community(p->aspath,
|
||||
+ if (community_match(p->aspath,
|
||||
COMMUNITY_WELLKNOWN, COMMUNITY_NO_ADVERTISE))
|
||||
return (0);
|
||||
- if (peer->conf.ebgp && rde_filter_community(p->aspath,
|
||||
+ if (peer->conf.ebgp && community_match(p->aspath,
|
||||
COMMUNITY_WELLKNOWN, COMMUNITY_NO_EXPORT))
|
||||
return (0);
|
||||
- if (peer->conf.ebgp && rde_filter_community(p->aspath,
|
||||
+ if (peer->conf.ebgp && community_match(p->aspath,
|
||||
COMMUNITY_WELLKNOWN, COMMUNITY_NO_EXPSUBCONFED))
|
||||
return (0);
|
||||
|
||||
- if (rde_filter(&fasp, rules, peer, asp, &addr, 0, NULL, DIR_OUT) ==
|
||||
- ACTION_DENY) {
|
||||
+ if (rde_filter(peer->ribid, &fasp, rules, peer, asp, &addr, 0, NULL,
|
||||
+ DIR_OUT) == ACTION_DENY) {
|
||||
path_put(fasp);
|
||||
path_put(asp);
|
||||
return;
|
||||
@@ -617,7 +626,7 @@ up_generate_attr(struct rde_peer *peer,
|
||||
u_char *pdata;
|
||||
u_int32_t tmp32;
|
||||
in_addr_t nexthop;
|
||||
- int r, ismp = 0, neednewpath = 0;
|
||||
+ int flags, r, ismp = 0, neednewpath = 0;
|
||||
u_int16_t len = sizeof(up_attr_buf), wlen = 0, plen;
|
||||
u_int8_t l;
|
||||
@@ -362,7 +375,7 @@ up_generate(struct rde_peer *peer, struc
|
||||
if (ua == NULL)
|
||||
fatal("up_generate");
|
||||
|
||||
@@ -629,7 +638,7 @@ up_generate_attr(struct rde_peer *peer,
|
||||
|
||||
/* aspath */
|
||||
if (!peer->conf.ebgp ||
|
||||
- rde_decisionflags() & BGPD_FLAG_DECISION_TRANS_AS)
|
||||
+ peer->conf.flags & PEERFLAG_TRANS_AS)
|
||||
pdata = aspath_prepend(a->aspath, rde_local_as(), 0, &plen);
|
||||
else
|
||||
pdata = aspath_prepend(a->aspath, rde_local_as(), 1, &plen);
|
||||
@@ -762,25 +771,29 @@ up_generate_attr(struct rde_peer *peer,
|
||||
/* NEW to OLD conversion when going sending stuff to a 2byte AS peer */
|
||||
if (neednewpath) {
|
||||
if (!peer->conf.ebgp ||
|
||||
- rde_decisionflags() & BGPD_FLAG_DECISION_TRANS_AS)
|
||||
+ peer->conf.flags & PEERFLAG_TRANS_AS)
|
||||
pdata = aspath_prepend(a->aspath, rde_local_as(), 0,
|
||||
&plen);
|
||||
else
|
||||
pdata = aspath_prepend(a->aspath, rde_local_as(), 1,
|
||||
&plen);
|
||||
+ flags = ATTR_OPTIONAL|ATTR_TRANSITIVE;
|
||||
+ if (!(a->flags & F_PREFIX_ANNOUNCED))
|
||||
+ flags |= ATTR_PARTIAL;
|
||||
if (plen == 0)
|
||||
r = 0;
|
||||
- else if ((r = attr_write(up_attr_buf + wlen, len,
|
||||
- ATTR_OPTIONAL|ATTR_TRANSITIVE, ATTR_NEW_ASPATH,
|
||||
- pdata, plen)) == -1)
|
||||
+ else if ((r = attr_write(up_attr_buf + wlen, len, flags,
|
||||
+ ATTR_AS4_PATH, pdata, plen)) == -1)
|
||||
- if (up_generate_attr(peer, ua, asp, addr->af) == -1) {
|
||||
+ if (up_generate_attr(peer, ua, asp, addr->aid) == -1) {
|
||||
log_warnx("generation of bgp path attributes failed");
|
||||
free(ua);
|
||||
return (-1);
|
||||
@@ -444,18 +457,12 @@ up_generate_updates(struct filter_head *
|
||||
/* send a default route to the specified peer */
|
||||
void
|
||||
up_generate_default(struct filter_head *rules, struct rde_peer *peer,
|
||||
- sa_family_t af)
|
||||
+ u_int8_t aid)
|
||||
{
|
||||
struct rde_aspath *asp, *fasp;
|
||||
struct bgpd_addr addr;
|
||||
|
||||
- if (peer->capa_received.mp_v4 == SAFI_NONE &&
|
||||
- peer->capa_received.mp_v6 != SAFI_NONE &&
|
||||
- af == AF_INET)
|
||||
- return;
|
||||
-
|
||||
- if (peer->capa_received.mp_v6 == SAFI_NONE &&
|
||||
- af == AF_INET6)
|
||||
+ if (peer->capa.mp[aid] == 0)
|
||||
return;
|
||||
|
||||
asp = path_get();
|
||||
@@ -471,7 +478,7 @@ up_generate_default(struct filter_head *
|
||||
|
||||
/* filter as usual */
|
||||
bzero(&addr, sizeof(addr));
|
||||
- addr.af = af;
|
||||
+ addr.aid = aid;
|
||||
|
||||
if (rde_filter(peer->ribid, &fasp, rules, peer, asp, &addr, 0, NULL,
|
||||
DIR_OUT) == ACTION_DENY) {
|
||||
@@ -491,6 +498,43 @@ up_generate_default(struct filter_head *
|
||||
path_put(asp);
|
||||
}
|
||||
|
||||
+/* generate a EoR marker in the update list. This is a horrible hack. */
|
||||
+int
|
||||
+up_generate_marker(struct rde_peer *peer, u_int8_t aid)
|
||||
+{
|
||||
+ struct update_attr *ua;
|
||||
+ struct update_attr *na = NULL;
|
||||
+ struct uplist_attr *upl = NULL;
|
||||
+
|
||||
+ ua = calloc(1, sizeof(struct update_attr));
|
||||
+ if (ua == NULL)
|
||||
+ fatal("up_generate_marker");
|
||||
+
|
||||
+ upl = &peer->updates[aid];
|
||||
+
|
||||
+ /* 1. search for attr */
|
||||
+ if ((na = RB_FIND(uptree_attr, &peer->up_attrs, ua)) == NULL) {
|
||||
+ /* 1.1 if not found -> add */
|
||||
+ TAILQ_INIT(&ua->prefix_h);
|
||||
+ if (RB_INSERT(uptree_attr, &peer->up_attrs, ua) != NULL) {
|
||||
+ log_warnx("uptree_attr insert failed");
|
||||
+ /* cleanup */
|
||||
+ free(ua);
|
||||
+ return (-1);
|
||||
+ }
|
||||
+ TAILQ_INSERT_TAIL(upl, ua, attr_l);
|
||||
+ peer->up_acnt++;
|
||||
+ } else {
|
||||
+ /* 1.2 if found -> use that, free ua */
|
||||
+ free(ua);
|
||||
+ ua = na;
|
||||
+ /* move to end of update queue */
|
||||
+ TAILQ_REMOVE(upl, ua, attr_l);
|
||||
+ TAILQ_INSERT_TAIL(upl, ua, attr_l);
|
||||
+ }
|
||||
+ return (0);
|
||||
+}
|
||||
+
|
||||
u_char up_attr_buf[4096];
|
||||
|
||||
/* only for IPv4 */
|
||||
@@ -551,28 +595,41 @@ up_get_nexthop(struct rde_peer *peer, st
|
||||
|
||||
int
|
||||
up_generate_mp_reach(struct rde_peer *peer, struct update_attr *upa,
|
||||
- struct rde_aspath *a, sa_family_t af)
|
||||
+ struct rde_aspath *a, u_int8_t aid)
|
||||
{
|
||||
u_int16_t tmp;
|
||||
|
||||
- switch (af) {
|
||||
- case AF_INET6:
|
||||
+ switch (aid) {
|
||||
+ case AID_INET6:
|
||||
upa->mpattr_len = 21; /* AFI + SAFI + NH LEN + NH + Reserved */
|
||||
upa->mpattr = malloc(upa->mpattr_len);
|
||||
if (upa->mpattr == NULL)
|
||||
fatal("up_generate_mp_reach");
|
||||
- tmp = htons(AFI_IPv6);
|
||||
+ if (aid2afi(aid, &tmp, &upa->mpattr[2]))
|
||||
+ fatalx("up_generate_mp_reachi: bad AID");
|
||||
+ tmp = htons(tmp);
|
||||
memcpy(upa->mpattr, &tmp, sizeof(tmp));
|
||||
- upa->mpattr[2] = SAFI_UNICAST;
|
||||
upa->mpattr[3] = sizeof(struct in6_addr);
|
||||
upa->mpattr[20] = 0; /* Reserved must be 0 */
|
||||
|
||||
/* nexthop dance see also up_get_nexthop() */
|
||||
- if (peer->conf.ebgp == 0) {
|
||||
+ if (a->flags & F_NEXTHOP_NOMODIFY) {
|
||||
+ /* no modify flag set */
|
||||
+ if (a->nexthop == NULL)
|
||||
+ memcpy(&upa->mpattr[4], &peer->local_v6_addr.v6,
|
||||
+ sizeof(struct in6_addr));
|
||||
+ else
|
||||
+ memcpy(&upa->mpattr[4],
|
||||
+ &a->nexthop->exit_nexthop.v6,
|
||||
+ sizeof(struct in6_addr));
|
||||
+ } else if (a->flags & F_NEXTHOP_SELF)
|
||||
+ memcpy(&upa->mpattr[4], &peer->local_v6_addr.v6,
|
||||
+ sizeof(struct in6_addr));
|
||||
+ else if (!peer->conf.ebgp) {
|
||||
/* ibgp */
|
||||
if (a->nexthop == NULL ||
|
||||
- (a->nexthop->exit_nexthop.af == AF_INET6 &&
|
||||
- memcmp(&a->nexthop->exit_nexthop.v6,
|
||||
+ (a->nexthop->exit_nexthop.aid == AID_INET6 &&
|
||||
+ !memcmp(&a->nexthop->exit_nexthop.v6,
|
||||
&peer->remote_addr.v6, sizeof(struct in6_addr))))
|
||||
memcpy(&upa->mpattr[4], &peer->local_v6_addr.v6,
|
||||
sizeof(struct in6_addr));
|
||||
@@ -603,6 +660,68 @@ up_generate_mp_reach(struct rde_peer *pe
|
||||
memcpy(&upa->mpattr[4], &peer->local_v6_addr.v6,
|
||||
sizeof(struct in6_addr));
|
||||
return (0);
|
||||
+ case AID_VPN_IPv4:
|
||||
+ upa->mpattr_len = 17; /* AFI + SAFI + NH LEN + NH + Reserved */
|
||||
+ upa->mpattr = calloc(upa->mpattr_len, 1);
|
||||
+ if (upa->mpattr == NULL)
|
||||
+ fatal("up_generate_mp_reach");
|
||||
+ if (aid2afi(aid, &tmp, &upa->mpattr[2]))
|
||||
+ fatalx("up_generate_mp_reachi: bad AID");
|
||||
+ tmp = htons(tmp);
|
||||
+ memcpy(upa->mpattr, &tmp, sizeof(tmp));
|
||||
+ upa->mpattr[3] = sizeof(u_int64_t) + sizeof(struct in_addr);
|
||||
+
|
||||
+ /* nexthop dance see also up_get_nexthop() */
|
||||
+ if (a->flags & F_NEXTHOP_NOMODIFY) {
|
||||
+ /* no modify flag set */
|
||||
+ if (a->nexthop == NULL)
|
||||
+ memcpy(&upa->mpattr[12],
|
||||
+ &peer->local_v4_addr.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ else
|
||||
+ /* nexthops are stored as IPv4 addrs */
|
||||
+ memcpy(&upa->mpattr[12],
|
||||
+ &a->nexthop->exit_nexthop.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ } else if (a->flags & F_NEXTHOP_SELF)
|
||||
+ memcpy(&upa->mpattr[12], &peer->local_v4_addr.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ else if (!peer->conf.ebgp) {
|
||||
+ /* ibgp */
|
||||
+ if (a->nexthop == NULL ||
|
||||
+ (a->nexthop->exit_nexthop.aid == AID_INET &&
|
||||
+ !memcmp(&a->nexthop->exit_nexthop.v4,
|
||||
+ &peer->remote_addr.v4, sizeof(struct in_addr))))
|
||||
+ memcpy(&upa->mpattr[12],
|
||||
+ &peer->local_v4_addr.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ else
|
||||
+ memcpy(&upa->mpattr[12],
|
||||
+ &a->nexthop->exit_nexthop.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ } else if (peer->conf.distance == 1) {
|
||||
+ /* ebgp directly connected */
|
||||
+ if (a->nexthop != NULL &&
|
||||
+ a->nexthop->flags & NEXTHOP_CONNECTED)
|
||||
+ if (prefix_compare(&peer->remote_addr,
|
||||
+ &a->nexthop->nexthop_net,
|
||||
+ a->nexthop->nexthop_netlen) == 0) {
|
||||
+ /*
|
||||
+ * nexthop and peer are in the same
|
||||
+ * subnet
|
||||
+ */
|
||||
+ memcpy(&upa->mpattr[12],
|
||||
+ &a->nexthop->exit_nexthop.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ return (0);
|
||||
+ }
|
||||
+ memcpy(&upa->mpattr[12], &peer->local_v4_addr.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ } else
|
||||
+ /* ebgp multihop */
|
||||
+ memcpy(&upa->mpattr[12], &peer->local_v4_addr.v4,
|
||||
+ sizeof(struct in_addr));
|
||||
+ return (0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -611,7 +730,7 @@ up_generate_mp_reach(struct rde_peer *pe
|
||||
|
||||
int
|
||||
up_generate_attr(struct rde_peer *peer, struct update_attr *upa,
|
||||
- struct rde_aspath *a, sa_family_t af)
|
||||
+ struct rde_aspath *a, u_int8_t aid)
|
||||
{
|
||||
struct attr *oa, *newaggr = NULL;
|
||||
u_char *pdata;
|
||||
@@ -643,8 +762,8 @@ up_generate_attr(struct rde_peer *peer,
|
||||
wlen += r; len -= r;
|
||||
free(pdata);
|
||||
}
|
||||
if (newaggr) {
|
||||
- if ((r = attr_write(up_attr_buf + wlen, len,
|
||||
- ATTR_OPTIONAL|ATTR_TRANSITIVE, ATTR_NEW_AGGREGATOR,
|
||||
- newaggr->data, newaggr->len)) == -1)
|
||||
+ flags = ATTR_OPTIONAL|ATTR_TRANSITIVE;
|
||||
+ if (!(a->flags & F_PREFIX_ANNOUNCED))
|
||||
+ flags |= ATTR_PARTIAL;
|
||||
+ if ((r = attr_write(up_attr_buf + wlen, len, flags,
|
||||
+ ATTR_AS4_AGGREGATOR, newaggr->data, newaggr->len)) == -1)
|
||||
|
||||
- switch (af) {
|
||||
- case AF_INET:
|
||||
+ switch (aid) {
|
||||
+ case AID_INET:
|
||||
nexthop = up_get_nexthop(peer, a);
|
||||
if ((r = attr_write(up_attr_buf + wlen, len, ATTR_WELL_KNOWN,
|
||||
ATTR_NEXTHOP, &nexthop, 4)) == -1)
|
||||
@@ -659,9 +778,11 @@ up_generate_attr(struct rde_peer *peer,
|
||||
/*
|
||||
* The old MED from other peers MUST not be announced to others
|
||||
* unless the MED is originating from us or the peer is an IBGP one.
|
||||
+ * Only exception are routers with "transparent-as yes" set.
|
||||
*/
|
||||
if (a->flags & F_ATTR_MED && (peer->conf.ebgp == 0 ||
|
||||
- a->flags & F_ATTR_MED_ANNOUNCE)) {
|
||||
+ a->flags & F_ATTR_MED_ANNOUNCE ||
|
||||
+ peer->conf.flags & PEERFLAG_TRANS_AS)) {
|
||||
tmp32 = htonl(a->med);
|
||||
if ((r = attr_write(up_attr_buf + wlen, len, ATTR_OPTIONAL,
|
||||
ATTR_MED, &tmp32, 4)) == -1)
|
||||
@@ -791,7 +912,7 @@ up_generate_attr(struct rde_peer *peer,
|
||||
|
||||
/* write mp attribute to different buffer */
|
||||
if (ismp)
|
||||
- if (up_generate_mp_reach(peer, upa, a, AF_INET6) == -1)
|
||||
+ if (up_generate_mp_reach(peer, upa, a, aid) == -1)
|
||||
return (-1);
|
||||
wlen += r; len -= r;
|
||||
}
|
||||
@@ -913,13 +926,7 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
return (NULL);
|
||||
|
||||
datalen += 3; /* afi + safi */
|
||||
- if (datalen > 255) {
|
||||
- attrlen += 2 + datalen;
|
||||
- flags |= ATTR_EXTLEN;
|
||||
/* the bgp path attributes are now stored in the global buf */
|
||||
@@ -810,6 +931,7 @@ up_dump_prefix(u_char *buf, int len, str
|
||||
{
|
||||
struct update_prefix *upp;
|
||||
int r, wpos = 0;
|
||||
+ u_int8_t i;
|
||||
|
||||
while ((upp = TAILQ_FIRST(prefix_head)) != NULL) {
|
||||
if ((r = prefix_write(buf + wpos, len - wpos,
|
||||
@@ -820,13 +942,14 @@ up_dump_prefix(u_char *buf, int len, str
|
||||
log_warnx("dequeuing update failed.");
|
||||
TAILQ_REMOVE(upp->prefix_h, upp, prefix_l);
|
||||
peer->up_pcnt--;
|
||||
- if (upp->prefix_h == &peer->withdraws ||
|
||||
- upp->prefix_h == &peer->withdraws6) {
|
||||
- peer->up_wcnt--;
|
||||
- peer->prefix_sent_withdraw++;
|
||||
- } else {
|
||||
- attrlen += 1 + datalen;
|
||||
- buf++;
|
||||
- }
|
||||
+
|
||||
/* prepend header, need to do it reverse */
|
||||
/* safi & afi */
|
||||
buf[--wpos] = SAFI_UNICAST;
|
||||
@@ -929,11 +936,15 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
|
||||
/* attribute length */
|
||||
if (datalen > 255) {
|
||||
+ attrlen += 2 + datalen;
|
||||
+ flags |= ATTR_EXTLEN;
|
||||
wpos -= sizeof(u_int16_t);
|
||||
tmp = htons(datalen);
|
||||
memcpy(buf + wpos, &tmp, sizeof(u_int16_t));
|
||||
- } else
|
||||
- peer->up_nlricnt--;
|
||||
- peer->prefix_sent_update++;
|
||||
+ for (i = 0; i < AID_MAX; i++) {
|
||||
+ if (upp->prefix_h == &peer->withdraws[i]) {
|
||||
+ peer->up_wcnt--;
|
||||
+ peer->prefix_sent_withdraw++;
|
||||
+ } else {
|
||||
+ attrlen += 1 + datalen;
|
||||
buf[--wpos] = (u_char)datalen;
|
||||
+ peer->up_nlricnt--;
|
||||
+ peer->prefix_sent_update++;
|
||||
+ }
|
||||
}
|
||||
free(upp);
|
||||
}
|
||||
@@ -844,16 +967,21 @@ up_dump_attrnlri(u_char *buf, int len, s
|
||||
* It is possible that a queued path attribute has no nlri prefix.
|
||||
* Ignore and remove those path attributes.
|
||||
*/
|
||||
- while ((upa = TAILQ_FIRST(&peer->updates)) != NULL)
|
||||
+ while ((upa = TAILQ_FIRST(&peer->updates[AID_INET])) != NULL)
|
||||
if (TAILQ_EMPTY(&upa->prefix_h)) {
|
||||
+ attr_len = upa->attr_len;
|
||||
if (RB_REMOVE(uptree_attr, &peer->up_attrs,
|
||||
upa) == NULL)
|
||||
log_warnx("dequeuing update failed.");
|
||||
- TAILQ_REMOVE(&peer->updates, upa, attr_l);
|
||||
+ TAILQ_REMOVE(&peer->updates[AID_INET], upa, attr_l);
|
||||
free(upa->attr);
|
||||
free(upa->mpattr);
|
||||
free(upa);
|
||||
peer->up_acnt--;
|
||||
+ /* XXX horrible hack,
|
||||
+ * if attr_len is 0, it is a EoR marker */
|
||||
+ if (attr_len == 0)
|
||||
+ return (-1);
|
||||
} else
|
||||
break;
|
||||
|
||||
/* mp attribute */
|
||||
buf[--wpos] = (u_char)ATTR_MP_UNREACH_NLRI;
|
||||
@@ -954,7 +965,7 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
/* total length includes the two 2-bytes length fields. */
|
||||
*len = attrlen + 2 * sizeof(u_int16_t);
|
||||
|
||||
- return (buf);
|
||||
+ return (buf + wpos);
|
||||
@@ -884,7 +1012,7 @@ up_dump_attrnlri(u_char *buf, int len, s
|
||||
if (TAILQ_EMPTY(&upa->prefix_h)) {
|
||||
if (RB_REMOVE(uptree_attr, &peer->up_attrs, upa) == NULL)
|
||||
log_warnx("dequeuing update failed.");
|
||||
- TAILQ_REMOVE(&peer->updates, upa, attr_l);
|
||||
+ TAILQ_REMOVE(&peer->updates[AID_INET], upa, attr_l);
|
||||
free(upa->attr);
|
||||
free(upa->mpattr);
|
||||
free(upa);
|
||||
@@ -895,12 +1023,13 @@ up_dump_attrnlri(u_char *buf, int len, s
|
||||
}
|
||||
|
||||
u_char *
|
||||
-up_dump_mp_unreach(u_char *buf, u_int16_t *len, struct rde_peer *peer)
|
||||
+up_dump_mp_unreach(u_char *buf, u_int16_t *len, struct rde_peer *peer,
|
||||
+ u_int8_t aid)
|
||||
{
|
||||
int wpos;
|
||||
u_int16_t datalen, tmp;
|
||||
u_int16_t attrlen = 2; /* attribute header (without len) */
|
||||
- u_int8_t flags = ATTR_OPTIONAL;
|
||||
+ u_int8_t flags = ATTR_OPTIONAL, safi;
|
||||
|
||||
/*
|
||||
* reserve space for withdraw len, attr len, the attribute header
|
||||
@@ -912,7 +1041,7 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
return (NULL);
|
||||
|
||||
datalen = up_dump_prefix(buf + wpos, *len - wpos,
|
||||
- &peer->withdraws6, peer);
|
||||
+ &peer->withdraws[aid], peer);
|
||||
if (datalen == 0)
|
||||
return (NULL);
|
||||
|
||||
@@ -920,9 +1049,11 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
|
||||
/* prepend header, need to do it reverse */
|
||||
/* safi & afi */
|
||||
- buf[--wpos] = SAFI_UNICAST;
|
||||
+ if (aid2afi(aid, &tmp, &safi))
|
||||
+ fatalx("up_dump_mp_unreach: bad AID");
|
||||
+ buf[--wpos] = safi;
|
||||
wpos -= sizeof(u_int16_t);
|
||||
- tmp = htons(AFI_IPv6);
|
||||
+ tmp = htons(tmp);
|
||||
memcpy(buf + wpos, &tmp, sizeof(u_int16_t));
|
||||
|
||||
/* attribute length */
|
||||
@@ -959,33 +1090,39 @@ up_dump_mp_unreach(u_char *buf, u_int16_
|
||||
return (buf + wpos);
|
||||
}
|
||||
|
||||
-u_char *
|
||||
-up_dump_mp_reach(u_char *buf, u_int16_t *len, struct rde_peer *peer)
|
||||
+int
|
||||
+up_dump_mp_reach(u_char *buf, u_int16_t *len, struct rde_peer *peer,
|
||||
+ u_int8_t aid)
|
||||
{
|
||||
struct update_attr *upa;
|
||||
int wpos;
|
||||
- u_int16_t datalen, tmp;
|
||||
+ u_int16_t attr_len, datalen, tmp;
|
||||
u_int8_t flags = ATTR_OPTIONAL;
|
||||
|
||||
/*
|
||||
* It is possible that a queued path attribute has no nlri prefix.
|
||||
* Ignore and remove those path attributes.
|
||||
*/
|
||||
- while ((upa = TAILQ_FIRST(&peer->updates6)) != NULL)
|
||||
+ while ((upa = TAILQ_FIRST(&peer->updates[aid])) != NULL)
|
||||
if (TAILQ_EMPTY(&upa->prefix_h)) {
|
||||
+ attr_len = upa->attr_len;
|
||||
if (RB_REMOVE(uptree_attr, &peer->up_attrs,
|
||||
upa) == NULL)
|
||||
log_warnx("dequeuing update failed.");
|
||||
- TAILQ_REMOVE(&peer->updates6, upa, attr_l);
|
||||
+ TAILQ_REMOVE(&peer->updates[aid], upa, attr_l);
|
||||
free(upa->attr);
|
||||
free(upa->mpattr);
|
||||
free(upa);
|
||||
peer->up_acnt--;
|
||||
+ /* XXX horrible hack,
|
||||
+ * if attr_len is 0, it is a EoR marker */
|
||||
+ if (attr_len == 0)
|
||||
+ return (-1);
|
||||
} else
|
||||
break;
|
||||
|
||||
if (upa == NULL)
|
||||
- return (NULL);
|
||||
+ return (-2);
|
||||
|
||||
/*
|
||||
* reserve space for attr len, the attributes, the
|
||||
@@ -993,12 +1130,12 @@ up_dump_mp_reach(u_char *buf, u_int16_t
|
||||
*/
|
||||
wpos = 2 + 2 + upa->attr_len + 4 + upa->mpattr_len;
|
||||
if (*len < wpos)
|
||||
- return (NULL);
|
||||
+ return (-2);
|
||||
|
||||
datalen = up_dump_prefix(buf + wpos, *len - wpos,
|
||||
&upa->prefix_h, peer);
|
||||
if (datalen == 0)
|
||||
- return (NULL);
|
||||
+ return (-2);
|
||||
|
||||
if (upa->mpattr_len == 0 || upa->mpattr == NULL)
|
||||
fatalx("mulitprotocol update without MP attrs");
|
||||
@@ -1038,7 +1175,7 @@ up_dump_mp_reach(u_char *buf, u_int16_t
|
||||
if (TAILQ_EMPTY(&upa->prefix_h)) {
|
||||
if (RB_REMOVE(uptree_attr, &peer->up_attrs, upa) == NULL)
|
||||
log_warnx("dequeuing update failed.");
|
||||
- TAILQ_REMOVE(&peer->updates6, upa, attr_l);
|
||||
+ TAILQ_REMOVE(&peer->updates[aid], upa, attr_l);
|
||||
free(upa->attr);
|
||||
free(upa->mpattr);
|
||||
free(upa);
|
||||
@@ -1046,6 +1183,5 @@ up_dump_mp_reach(u_char *buf, u_int16_t
|
||||
}
|
||||
|
||||
*len = datalen + 4;
|
||||
- return (buf + wpos);
|
||||
+ return (wpos);
|
||||
}
|
||||
-
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,32 +1,43 @@
|
|||
Index: bgpd/session.h
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/session.h,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.3
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.3
|
||||
--- bgpd/session.h 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/session.h 22 Oct 2009 14:24:02 -0000 1.1.1.3
|
||||
retrieving revision 1.1.1.7
|
||||
retrieving revision 1.1.1.8
|
||||
diff -u -p -r1.1.1.7 -r1.1.1.8
|
||||
--- bgpd/session.h 14 Feb 2010 20:19:57 -0000 1.1.1.7
|
||||
+++ bgpd/session.h 14 Feb 2010 20:27:06 -0000 1.1.1.8
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: session.h,v 1.98 2008/05/08 09:53:12 henning Exp $ */
|
||||
+/* $OpenBSD: session.h,v 1.101 2009/06/05 20:26:38 claudio Exp $ */
|
||||
-/* $OpenBSD: session.h,v 1.101 2009/06/05 20:26:38 claudio Exp $ */
|
||||
+/* $OpenBSD: session.h,v 1.104 2009/12/31 15:34:02 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
|
||||
@@ -171,6 +171,7 @@ enum Timer {
|
||||
Timer_Hold,
|
||||
Timer_IdleHold,
|
||||
Timer_IdleHoldReset,
|
||||
+ Timer_CarpUndemote,
|
||||
Timer_Max
|
||||
@@ -189,6 +189,7 @@ struct peer {
|
||||
struct {
|
||||
struct capabilities ann;
|
||||
struct capabilities peer;
|
||||
+ struct capabilities neg;
|
||||
} capa;
|
||||
struct {
|
||||
struct bgpd_addr local_addr;
|
||||
@@ -217,7 +218,7 @@ struct peer {
|
||||
u_int8_t passive;
|
||||
};
|
||||
|
||||
@@ -227,13 +228,15 @@ struct ctl_timer {
|
||||
-struct peer *peers;
|
||||
+extern struct peer *peers;
|
||||
|
||||
struct ctl_timer {
|
||||
enum Timer type;
|
||||
@@ -226,16 +227,14 @@ struct ctl_timer {
|
||||
|
||||
/* session.c */
|
||||
void session_socket_blockmode(int, enum blockmodes);
|
||||
pid_t session_main(struct bgpd_config *, struct peer *,
|
||||
struct network_head *, struct filter_head *,
|
||||
- struct mrt_head *, int[2], int[2], int[2], int[2]);
|
||||
+ struct mrt_head *, struct rib_names *,
|
||||
+ int[2], int[2], int[2], int[2]);
|
||||
-pid_t session_main(struct bgpd_config *, struct peer *,
|
||||
- struct network_head *, struct filter_head *,
|
||||
- struct mrt_head *, struct rib_names *,
|
||||
- int[2], int[2], int[2], int[2]);
|
||||
+pid_t session_main(int[2], int[2], int[2], int[2], char *, char *);
|
||||
void bgp_fsm(struct peer *, enum session_events);
|
||||
int session_neighbor_rrefresh(struct peer *p);
|
||||
struct peer *getpeerbyaddr(struct bgpd_addr *);
|
||||
|
@ -37,26 +48,14 @@ diff -u -p -r1.1.1.1 -r1.1.1.3
|
|||
|
||||
/* log.c */
|
||||
char *log_fmt_peer(const struct peer_config *);
|
||||
@@ -254,8 +257,8 @@ void prepare_listeners(struct bgpd_conf
|
||||
@@ -255,9 +254,7 @@ int merge_config(struct bgpd_config *,
|
||||
void prepare_listeners(struct bgpd_config *);
|
||||
|
||||
/* rde.c */
|
||||
pid_t rde_main(struct bgpd_config *, struct peer *, struct network_head *,
|
||||
- struct filter_head *, struct mrt_head *, int[2], int[2], int[2],
|
||||
- int[2], int);
|
||||
+ struct filter_head *, struct mrt_head *, struct rib_names *,
|
||||
+ int[2], int[2], int[2], int[2], int);
|
||||
-pid_t rde_main(struct bgpd_config *, struct peer *, struct network_head *,
|
||||
- struct filter_head *, struct mrt_head *, struct rib_names *,
|
||||
- int[2], int[2], int[2], int[2], int);
|
||||
+pid_t rde_main(int[2], int[2], int[2], int[2], int);
|
||||
|
||||
/* control.c */
|
||||
int control_init(int, char *);
|
||||
@@ -270,8 +273,9 @@ int pfkey_remove(struct peer *);
|
||||
int pfkey_init(struct bgpd_sysdep *);
|
||||
|
||||
/* printconf.c */
|
||||
-void print_config(struct bgpd_config *, struct network_head *, struct peer *,
|
||||
- struct filter_head *, struct mrt_head *);
|
||||
+void print_config(struct bgpd_config *, struct rib_names *,
|
||||
+ struct network_head *, struct peer *, struct filter_head *,
|
||||
+ struct mrt_head *);
|
||||
|
||||
/* carp.c */
|
||||
int carp_demote_init(char *, int);
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
Index: bgpd/timer.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/timer.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.1.1.2
|
||||
diff -u -p -r1.1.1.1 -r1.1.1.2
|
||||
--- bgpd/timer.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/timer.c 9 Jul 2009 16:49:54 -0000 1.1.1.2
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: timer.c,v 1.12.2.1 2009/02/20 07:20:15 henning Exp $ */
|
||||
+/* $OpenBSD: timer.c,v 1.13 2009/01/21 20:32:53 henning Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003-2007 Henning Brauer <henning@openbsd.org>
|
|
@ -1,14 +1,14 @@
|
|||
Index: bgpd/util.c
|
||||
===================================================================
|
||||
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/util.c,v
|
||||
retrieving revision 1.1.1.1
|
||||
retrieving revision 1.3
|
||||
diff -u -p -r1.1.1.1 -r1.3
|
||||
--- bgpd/util.c 30 Jun 2009 05:46:15 -0000 1.1.1.1
|
||||
+++ bgpd/util.c 9 Jul 2009 17:22:14 -0000 1.3
|
||||
retrieving revision 1.1.1.6
|
||||
retrieving revision 1.4
|
||||
diff -u -p -r1.1.1.6 -r1.4
|
||||
--- bgpd/util.c 14 Feb 2010 20:19:57 -0000 1.1.1.6
|
||||
+++ bgpd/util.c 4 Feb 2010 16:22:23 -0000 1.4
|
||||
@@ -1,4 +1,4 @@
|
||||
-/* $OpenBSD: util.c,v 1.4 2008/03/17 20:40:04 henning Exp $ */
|
||||
+/* $OpenBSD: util.c,v 1.6 2009/06/12 16:42:53 claudio Exp $ */
|
||||
-/* $OpenBSD: util.c,v 1.6 2009/06/12 16:42:53 claudio Exp $ */
|
||||
+/* $OpenBSD: util.c,v 1.10 2010/01/13 06:02:37 claudio Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
|
||||
|
@ -22,42 +22,176 @@ diff -u -p -r1.1.1.1 -r1.3
|
|||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
@@ -143,7 +146,7 @@ aspath_snprint(char *buf, size_t size, v
|
||||
UPDATE();
|
||||
}
|
||||
}
|
||||
- /* ensure that we have a valid C-string especially for emtpy as path */
|
||||
+ /* ensure that we have a valid C-string especially for empty as path */
|
||||
if (size > 0)
|
||||
*buf = '\0';
|
||||
@@ -33,10 +36,20 @@ log_addr(const struct bgpd_addr *addr)
|
||||
{
|
||||
static char buf[48];
|
||||
|
||||
@@ -250,3 +253,29 @@ aspath_extract(const void *seg, int pos)
|
||||
memcpy(&as, ptr, sizeof(u_int32_t));
|
||||
return (ntohl(as));
|
||||
- if (inet_ntop(addr->af, &addr->ba, buf, sizeof(buf)) == NULL)
|
||||
- return ("?");
|
||||
- else
|
||||
+ switch (addr->aid) {
|
||||
+ case AID_INET:
|
||||
+ case AID_INET6:
|
||||
+ if (inet_ntop(aid2af(addr->aid), &addr->ba, buf,
|
||||
+ sizeof(buf)) == NULL)
|
||||
+ return ("?");
|
||||
+ return (buf);
|
||||
+ case AID_VPN_IPv4:
|
||||
+ if (inet_ntop(AF_INET, &addr->vpn4.addr, buf,
|
||||
+ sizeof(buf)) == NULL)
|
||||
+ return ("?");
|
||||
return (buf);
|
||||
+ }
|
||||
+ return ("???");
|
||||
}
|
||||
|
||||
const char *
|
||||
@@ -90,6 +103,32 @@ log_as(u_int32_t as)
|
||||
return (buf);
|
||||
}
|
||||
|
||||
+/* XXX this function does not check if the type/subtype combo is
|
||||
+ * actually valid. */
|
||||
+const char *
|
||||
+log_ext_subtype(u_int8_t subtype)
|
||||
+{
|
||||
+ static char etype[6];
|
||||
+
|
||||
+ switch (subtype) {
|
||||
+ case EXT_COMMUNITY_ROUTE_TGT:
|
||||
+ return ("rt"); /* route target */
|
||||
+ case EXT_CUMMUNITY_ROUTE_ORIG:
|
||||
+ return ("soo"); /* source of origin */
|
||||
+ case EXT_COMMUNITY_OSPF_DOM_ID:
|
||||
+ return ("odi"); /* ospf domain id */
|
||||
+ case EXT_COMMUNITY_OSPF_RTR_TYPE:
|
||||
+ return ("ort"); /* ospf route type */
|
||||
+ case EXT_COMMUNITY_OSPF_RTR_ID:
|
||||
+ return ("ori"); /* ospf router id */
|
||||
+ case EXT_COMMUNITY_BGP_COLLECT:
|
||||
+ return ("bdc"); /* bgp data collection */
|
||||
+ default:
|
||||
+ snprintf(etype, sizeof(etype), "[%i]", (int)subtype);
|
||||
+ return (etype);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int
|
||||
aspath_snprint(char *buf, size_t size, void *data, u_int16_t len)
|
||||
{
|
||||
@@ -276,3 +315,115 @@ inet6applymask(struct in6_addr *dest, co
|
||||
for (i = 0; i < 16; i++)
|
||||
dest->s6_addr[i] = src->s6_addr[i] & mask.s6_addr[i];
|
||||
}
|
||||
+
|
||||
+in_addr_t
|
||||
+prefixlen2mask(u_int8_t prefixlen)
|
||||
+{
|
||||
+ if (prefixlen == 0)
|
||||
+ return (0);
|
||||
+/* address family translation functions */
|
||||
+const struct aid aid_vals[AID_MAX] = AID_VALS;
|
||||
+
|
||||
+ return (0xffffffff << (32 - prefixlen));
|
||||
+const char *
|
||||
+aid2str(u_int8_t aid)
|
||||
+{
|
||||
+ if (aid < AID_MAX)
|
||||
+ return (aid_vals[aid].name);
|
||||
+ return ("unknown AID");
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+aid2afi(u_int8_t aid, u_int16_t *afi, u_int8_t *safi)
|
||||
+{
|
||||
+ if (aid < AID_MAX) {
|
||||
+ *afi = aid_vals[aid].afi;
|
||||
+ *safi = aid_vals[aid].safi;
|
||||
+ return (0);
|
||||
+ }
|
||||
+ return (-1);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+afi2aid(u_int16_t afi, u_int8_t safi, u_int8_t *aid)
|
||||
+{
|
||||
+ u_int8_t i;
|
||||
+
|
||||
+ for (i = 0; i < AID_MAX; i++)
|
||||
+ if (aid_vals[i].afi == afi && aid_vals[i].safi == safi) {
|
||||
+ *aid = i;
|
||||
+ return (0);
|
||||
+ }
|
||||
+
|
||||
+ return (-1);
|
||||
+}
|
||||
+
|
||||
+sa_family_t
|
||||
+aid2af(u_int8_t aid)
|
||||
+{
|
||||
+ if (aid < AID_MAX)
|
||||
+ return (aid_vals[aid].af);
|
||||
+ return (AF_UNSPEC);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+af2aid(sa_family_t af, u_int8_t safi, u_int8_t *aid)
|
||||
+{
|
||||
+ u_int8_t i;
|
||||
+
|
||||
+ if (safi == 0) /* default to unicast subclass */
|
||||
+ safi = SAFI_UNICAST;
|
||||
+
|
||||
+ for (i = 0; i < AID_MAX; i++)
|
||||
+ if (aid_vals[i].af == af && aid_vals[i].safi == safi) {
|
||||
+ *aid = i;
|
||||
+ return (0);
|
||||
+ }
|
||||
+
|
||||
+ return (-1);
|
||||
+}
|
||||
+
|
||||
+struct sockaddr *
|
||||
+addr2sa(struct bgpd_addr *addr, u_int16_t port)
|
||||
+{
|
||||
+ static struct sockaddr_storage ss;
|
||||
+ struct sockaddr_in *sa_in = (struct sockaddr_in *)&ss;
|
||||
+ struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)&ss;
|
||||
+
|
||||
+ if (addr->aid == AID_UNSPEC)
|
||||
+ return (NULL);
|
||||
+
|
||||
+ bzero(&ss, sizeof(ss));
|
||||
+ switch (addr->aid) {
|
||||
+ case AID_INET:
|
||||
+ sa_in->sin_family = AF_INET;
|
||||
+ sa_in->sin_len = sizeof(struct sockaddr_in);
|
||||
+ sa_in->sin_addr.s_addr = addr->v4.s_addr;
|
||||
+ sa_in->sin_port = htons(port);
|
||||
+ break;
|
||||
+ case AID_INET6:
|
||||
+ sa_in6->sin6_family = AF_INET6;
|
||||
+ sa_in6->sin6_len = sizeof(struct sockaddr_in6);
|
||||
+ memcpy(&sa_in6->sin6_addr, &addr->v6,
|
||||
+ sizeof(sa_in6->sin6_addr));
|
||||
+ sa_in6->sin6_port = htons(port);
|
||||
+ sa_in6->sin6_scope_id = addr->scope_id;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return ((struct sockaddr *)&ss);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+inet6applymask(struct in6_addr *dest, const struct in6_addr *src, int prefixlen)
|
||||
+sa2addr(struct sockaddr *sa, struct bgpd_addr *addr)
|
||||
+{
|
||||
+ struct in6_addr mask;
|
||||
+ int i;
|
||||
+ struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
|
||||
+ struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)sa;
|
||||
+
|
||||
+ bzero(&mask, sizeof(mask));
|
||||
+ for (i = 0; i < prefixlen / 8; i++)
|
||||
+ mask.s6_addr[i] = 0xff;
|
||||
+ i = prefixlen % 8;
|
||||
+ if (i)
|
||||
+ mask.s6_addr[prefixlen / 8] = 0xff00 >> i;
|
||||
+
|
||||
+ for (i = 0; i < 16; i++)
|
||||
+ dest->s6_addr[i] = src->s6_addr[i] & mask.s6_addr[i];
|
||||
+ bzero(addr, sizeof(*addr));
|
||||
+ switch (sa->sa_family) {
|
||||
+ case AF_INET:
|
||||
+ addr->aid = AID_INET;
|
||||
+ memcpy(&addr->v4, &sa_in->sin_addr, sizeof(addr->v4));
|
||||
+ break;
|
||||
+ case AF_INET6:
|
||||
+ addr->aid = AID_INET6;
|
||||
+ memcpy(&addr->v6, &sa_in6->sin6_addr, sizeof(addr->v6));
|
||||
+ addr->scope_id = sa_in6->sin6_scope_id; /* I hate v6 */
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
|
|
|
@ -3,10 +3,10 @@ Index: openbsd-compat/openbsd-compat.h
|
|||
RCS file: openbsd-compat/openbsd-compat.h
|
||||
diff -N openbsd-compat/openbsd-compat.h
|
||||
--- /dev/null 1 Jan 1970 00:00:00 -0000
|
||||
+++ openbsd-compat/openbsd-compat.h 9 Jul 2009 17:22:14 -0000 1.3
|
||||
@@ -0,0 +1,46 @@
|
||||
+++ openbsd-compat/openbsd-compat.h 4 Feb 2010 16:22:51 -0000 1.4
|
||||
@@ -0,0 +1,87 @@
|
||||
+/*
|
||||
+ * $hrs: openbgpd/openbsd-compat/openbsd-compat.h,v 1.3 2009/07/09 17:22:14 hrs Exp $
|
||||
+ * $hrs: openbgpd/openbsd-compat/openbsd-compat.h,v 1.4 2010/02/04 16:22:51 hrs Exp $
|
||||
+ */
|
||||
+
|
||||
+#ifndef _OPENBSD_COMPAT_H
|
||||
|
@ -50,4 +50,45 @@ diff -N openbsd-compat/openbsd-compat.h
|
|||
+#define RTP_MASK 0x7f
|
||||
+#define RTP_DOWN 0x80 /* route/link is down */
|
||||
+
|
||||
+/* missing LINK_STATE_* macros in net/if.h */
|
||||
+#define LINK_STATE_INVALID LINK_STATE_UNKNOWN /* link invalid */
|
||||
+#define LINK_STATE_KALIVE_DOWN 7 /* keepalive reports down */
|
||||
+#define LINK_STATE_HALF_DUPLEX 5 /* link is up and half duplex */
|
||||
+#define LINK_STATE_FULL_DUPLEX 6 /* link is up and full duplex */
|
||||
+
|
||||
+/*
|
||||
+ * Status bit descriptions for the various interface types.
|
||||
+ */
|
||||
+struct if_status_description {
|
||||
+ unsigned char ifs_type;
|
||||
+ unsigned char ifs_state;
|
||||
+ const char *ifs_string;
|
||||
+};
|
||||
+
|
||||
+#define LINK_STATE_DESC_MATCH(_ifs, _t, _s) \
|
||||
+ (((_ifs)->ifs_type == (_t) || (_ifs)->ifs_type == 0) && \
|
||||
+ (_ifs)->ifs_state == (_s))
|
||||
+
|
||||
+#define LINK_STATE_DESCRIPTIONS { \
|
||||
+ { IFT_ETHER, LINK_STATE_DOWN, "no carrier" }, \
|
||||
+ \
|
||||
+ { IFT_IEEE80211, LINK_STATE_DOWN, "no network" }, \
|
||||
+ \
|
||||
+ { IFT_PPP, LINK_STATE_DOWN, "no carrier" }, \
|
||||
+ \
|
||||
+ { IFT_CARP, LINK_STATE_DOWN, "backup" }, \
|
||||
+ { IFT_CARP, LINK_STATE_UP, "master" }, \
|
||||
+ { IFT_CARP, LINK_STATE_HALF_DUPLEX, "master" }, \
|
||||
+ { IFT_CARP, LINK_STATE_FULL_DUPLEX, "master" }, \
|
||||
+ \
|
||||
+ { 0, LINK_STATE_UP, "active" }, \
|
||||
+ { 0, LINK_STATE_HALF_DUPLEX, "active" }, \
|
||||
+ { 0, LINK_STATE_FULL_DUPLEX, "active" }, \
|
||||
+ \
|
||||
+/* { 0, LINK_STATE_UNKNOWN, "unknown" }, */ \
|
||||
+ { 0, LINK_STATE_INVALID, "invalid" }, \
|
||||
+ { 0, LINK_STATE_DOWN, "down" }, \
|
||||
+ { 0, LINK_STATE_KALIVE_DOWN, "keepalive down" }, \
|
||||
+ { 0, 0, NULL } \
|
||||
+}
|
||||
+#endif /* _OPENBSD_COMPAT_H */
|
||||
|
|
|
@ -2,7 +2,4 @@ OpenBGPD is a FREE implementation of the Border Gateway Protocol, Version 4.
|
|||
It allows ordinary machines to be used as routers exchanging routes with
|
||||
other systems speaking the BGP protocol.
|
||||
|
||||
WWW: http://www.openbgp.org/
|
||||
|
||||
- Florent Thoumie
|
||||
flz@xbsd.org
|
||||
WWW: http://www.openbgpd.org/
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#!/bin/sh
|
||||
# $FreeBSD$
|
||||
|
||||
case $2 in
|
||||
POST-INSTALL)
|
||||
|
|
Loading…
Add table
Reference in a new issue