summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2007-02-12 19:15:14 +0000
committerclaudio <claudio@openbsd.org>2007-02-12 19:15:14 +0000
commite1d31db50fc5e4420e25f0d561bdac6316df1e45 (patch)
treeab97a976ed8d03e182126d6d97b2f379c87ade49
parentif -f is not used, readlink should not print anything on error, but if (diff)
downloadwireguard-openbsd-e1d31db50fc5e4420e25f0d561bdac6316df1e45.tar.xz
wireguard-openbsd-e1d31db50fc5e4420e25f0d561bdac6316df1e45.zip
Switch address and AS fields in mrt dump messages for incoming traffic so
that source and destination match the actual traffic flow. Found and initial diff by Adam Chappell (Adam.Chappell at interoute dot com)
-rw-r--r--usr.sbin/bgpd/mrt.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/usr.sbin/bgpd/mrt.c b/usr.sbin/bgpd/mrt.c
index baeefc93178..3b16001cc72 100644
--- a/usr.sbin/bgpd/mrt.c
+++ b/usr.sbin/bgpd/mrt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mrt.c,v 1.51 2007/02/12 13:12:30 claudio Exp $ */
+/* $OpenBSD: mrt.c,v 1.52 2007/02/12 19:15:14 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -91,6 +91,7 @@ mrt_dump_bgp_msg(struct mrt *mrt, void *pkg, u_int16_t pkglen,
{
struct buf *buf;
u_int16_t len;
+ int incoming = 0;
switch (peer->sa_local.ss_family) {
case AF_INET:
@@ -103,6 +104,10 @@ mrt_dump_bgp_msg(struct mrt *mrt, void *pkg, u_int16_t pkglen,
return (-1);
}
+ /* get the direction of the message to swap address and AS fields */
+ if (mrt->type == MRT_ALL_IN || mrt->type == MRT_UPDATE_IN)
+ incoming = 1;
+
if ((buf = buf_open(len + MRT_HEADER_SIZE)) == NULL) {
log_warnx("mrt_dump_bgp_msg: buf_open error");
return (-1);
@@ -114,29 +119,49 @@ mrt_dump_bgp_msg(struct mrt *mrt, void *pkg, u_int16_t pkglen,
return (-1);
}
- DUMP_SHORT(buf, bgp->as);
+ if (!incoming)
+ DUMP_SHORT(buf, bgp->as);
DUMP_SHORT(buf, peer->conf.remote_as);
+ if (incoming)
+ DUMP_SHORT(buf, bgp->as);
DUMP_SHORT(buf, /* ifindex */ 0);
switch (peer->sa_local.ss_family) {
case AF_INET:
DUMP_SHORT(buf, AFI_IPv4);
- DUMP_NLONG(buf,
- ((struct sockaddr_in *)&peer->sa_local)->sin_addr.s_addr);
+ if (!incoming)
+ DUMP_NLONG(buf, ((struct sockaddr_in *)
+ &peer->sa_local)->sin_addr.s_addr);
DUMP_NLONG(buf,
((struct sockaddr_in *)&peer->sa_remote)->sin_addr.s_addr);
+ if (incoming)
+ DUMP_NLONG(buf, ((struct sockaddr_in *)
+ &peer->sa_local)->sin_addr.s_addr);
break;
case AF_INET6:
DUMP_SHORT(buf, AFI_IPv6);
+ if (!incoming)
+ if (buf_add(buf, &((struct sockaddr_in6 *)
+ &peer->sa_local)->sin6_addr,
+ sizeof(struct in6_addr)) == -1) {
+ log_warnx("mrt_dump_bgp_msg: buf_add error");
+ buf_free(buf);
+ return (-1);
+ }
if (buf_add(buf,
- &((struct sockaddr_in6 *)&peer->sa_local)->sin6_addr,
- sizeof(struct in6_addr)) == -1 ||
- buf_add(buf,
&((struct sockaddr_in6 *)&peer->sa_remote)->sin6_addr,
sizeof(struct in6_addr)) == -1) {
log_warnx("mrt_dump_bgp_msg: buf_add error");
buf_free(buf);
return (-1);
}
+ if (incoming)
+ if (buf_add(buf, &((struct sockaddr_in6 *)
+ &peer->sa_local)->sin6_addr,
+ sizeof(struct in6_addr)) == -1) {
+ log_warnx("mrt_dump_bgp_msg: buf_add error");
+ buf_free(buf);
+ return (-1);
+ }
break;
}