diff options
author | Kurt Jaeger <pi@FreeBSD.org> | 2019-06-03 20:08:36 +0000 |
---|---|---|
committer | Kurt Jaeger <pi@FreeBSD.org> | 2019-06-03 20:08:36 +0000 |
commit | 713c2289b8d66d3752c1225ca18d740daa50c8fc (patch) | |
tree | 26af7b6de4c410d2e2810fec4c81c3ab0b9c5e76 /net/openbgpd/files/patch-bgpctl_irr_prefix.c | |
parent | Upgrade to 0.0.5 (diff) |
net/openbgpd: revert upgrade from 6.5p0 to 5.2.20121209
- openbgpd version 6.5p0 was the "portable" version, which specifically
does *not* support kernel routing updates.
- Therefore this is only suitable for route servers/collectors, not
for production use in routers. This significantly violates POLA :)
PR: 213445
Submitted by: Oliver H <oliver@watershed.co.uk>
Diffstat (limited to 'net/openbgpd/files/patch-bgpctl_irr_prefix.c')
-rw-r--r-- | net/openbgpd/files/patch-bgpctl_irr_prefix.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/net/openbgpd/files/patch-bgpctl_irr_prefix.c b/net/openbgpd/files/patch-bgpctl_irr_prefix.c new file mode 100644 index 000000000000..4c97de2a4c7d --- /dev/null +++ b/net/openbgpd/files/patch-bgpctl_irr_prefix.c @@ -0,0 +1,157 @@ +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.8 +diff -u -p -r1.1.1.5 -r1.1.1.8 +--- bgpctl/irr_prefix.c 14 Feb 2010 20:20:14 -0000 1.1.1.5 ++++ bgpctl/irr_prefix.c 13 Oct 2012 18:22:52 -0000 1.1.1.8 +@@ -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 */ ++ /* see whether 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); + |