summaryrefslogtreecommitdiff
path: root/net/openbgpd/files/patch-bgpd_util.c
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2010-02-16 19:27:03 +0000
committerHiroki Sato <hrs@FreeBSD.org>2010-02-16 19:27:03 +0000
commit7ab9a19af615666cef45e1b4538c8460d19e1ec0 (patch)
tree301a68c22691daf3b616754a383cd1730c23dae7 /net/openbgpd/files/patch-bgpd_util.c
parentAdd updating instructions for sysutils/bacula-{server,client}. (diff)
Update to 4.6.20100215.
Feature safe: yes
Notes
Notes: svn path=/head/; revision=249966
Diffstat (limited to 'net/openbgpd/files/patch-bgpd_util.c')
-rw-r--r--net/openbgpd/files/patch-bgpd_util.c202
1 files changed, 168 insertions, 34 deletions
diff --git a/net/openbgpd/files/patch-bgpd_util.c b/net/openbgpd/files/patch-bgpd_util.c
index 85bb12c7ccc2..4503f07a196b 100644
--- a/net/openbgpd/files/patch-bgpd_util.c
+++ b/net/openbgpd/files/patch-bgpd_util.c
@@ -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)
++/* address family translation functions */
++const struct aid aid_vals[AID_MAX] = AID_VALS;
++
++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 (prefixlen == 0)
++ 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 (0xffffffff << (32 - prefixlen));
++ return (-1);
+}
+
-+void
-+inet6applymask(struct in6_addr *dest, const struct in6_addr *src, int prefixlen)
++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)
+{
-+ struct in6_addr mask;
-+ int i;
++ 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;
++ }
+
-+ 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;
++ return ((struct sockaddr *)&ss);
++}
++
++void
++sa2addr(struct sockaddr *sa, struct bgpd_addr *addr)
++{
++ struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
++ struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)sa;
+
-+ 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;
++ }
+}