aboutsummaryrefslogtreecommitdiff
path: root/net/openbgpd
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2010-04-10 12:26:08 +0000
committerHiroki Sato <hrs@FreeBSD.org>2010-04-10 12:26:08 +0000
commitb513219508cd0c3f4ccb7848c520c2c85653dc28 (patch)
treed554632aa1aefab7d72474e1c0512fef168f1753 /net/openbgpd
parent448f9afa68eefd956a31bbcdea7dc53b42630a3f (diff)
downloadports-b513219508cd0c3f4ccb7848c520c2c85653dc28.tar.gz
ports-b513219508cd0c3f4ccb7848c520c2c85653dc28.zip
Notes
Diffstat (limited to 'net/openbgpd')
-rw-r--r--net/openbgpd/Makefile2
-rw-r--r--net/openbgpd/files/patch-bgpctl_bgpctl.c75
-rw-r--r--net/openbgpd/files/patch-bgpctl_parser.c30
-rw-r--r--net/openbgpd/files/patch-bgpd_bgpd.c126
-rw-r--r--net/openbgpd/files/patch-bgpd_bgpd.conf.550
-rw-r--r--net/openbgpd/files/patch-bgpd_bgpd.h64
-rw-r--r--net/openbgpd/files/patch-bgpd_imsg.c17
-rw-r--r--net/openbgpd/files/patch-bgpd_kroute.c157
-rw-r--r--net/openbgpd/files/patch-bgpd_parse.y106
-rw-r--r--net/openbgpd/files/patch-bgpd_printconf.c56
-rw-r--r--net/openbgpd/files/patch-bgpd_rde.c39
-rw-r--r--net/openbgpd/files/patch-bgpd_rde.h49
-rw-r--r--net/openbgpd/files/patch-bgpd_rde_attr.c137
-rw-r--r--net/openbgpd/files/patch-bgpd_rde_filter.c27
-rw-r--r--net/openbgpd/files/patch-bgpd_rde_prefix.c31
-rw-r--r--net/openbgpd/files/patch-bgpd_rde_rib.c112
-rw-r--r--net/openbgpd/files/patch-bgpd_util.c56
17 files changed, 813 insertions, 321 deletions
diff --git a/net/openbgpd/Makefile b/net/openbgpd/Makefile
index a4a44309e8c5..21feb49d6059 100644
--- a/net/openbgpd/Makefile
+++ b/net/openbgpd/Makefile
@@ -6,7 +6,7 @@
#
PORTNAME= openbgpd
-PORTVERSION= 4.6.20100227
+PORTVERSION= 4.7.20100410
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_OPENBSD}
MASTER_SITE_SUBDIR= OpenBGPD
diff --git a/net/openbgpd/files/patch-bgpctl_bgpctl.c b/net/openbgpd/files/patch-bgpctl_bgpctl.c
index 96f7769b8144..a55bb3e66674 100644
--- a/net/openbgpd/files/patch-bgpctl_bgpctl.c
+++ b/net/openbgpd/files/patch-bgpctl_bgpctl.c
@@ -2,13 +2,13 @@ Index: bgpctl/bgpctl.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/bgpctl.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.6
-diff -u -p -r1.1.1.7 -r1.6
+retrieving revision 1.7
+diff -u -p -r1.1.1.7 -r1.7
--- 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
++++ bgpctl/bgpctl.c 10 Apr 2010 12:17:18 -0000 1.7
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: bgpctl.c,v 1.157 2010/03/08 17:02:19 claudio Exp $ */
/*
* Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
@@ -90,7 +90,20 @@ diff -u -p -r1.1.1.7 -r1.6
struct imsg imsg;
struct network_config net;
struct parse_result *res;
-@@ -164,15 +179,17 @@ main(int argc, char *argv[])
+@@ -128,8 +143,11 @@ main(int argc, char *argv[])
+ if ((res = parse(argc, argv)) == NULL)
+ exit(1);
+
+- if (res->action == IRRFILTER)
++ if (res->action == IRRFILTER) {
++ if (!(res->flags & (F_IPV4|F_IPV6)))
++ res->flags |= (F_IPV4|F_IPV6);
+ irr_main(res->as.as, res->flags, res->irr_outdir);
++ }
+
+ memcpy(&neighbor.addr, &res->peeraddr, sizeof(neighbor.addr));
+ strlcpy(neighbor.descr, res->peerdesc, sizeof(neighbor.descr));
+@@ -164,15 +182,17 @@ main(int argc, char *argv[])
imsg_compose(ibuf, IMSG_CTL_SHOW_TERSE, 0, 0, -1, NULL, 0);
break;
case SHOW_FIB:
@@ -111,7 +124,7 @@ diff -u -p -r1.1.1.7 -r1.6
errx(1, "imsg_add failure");
imsg_close(ibuf, msg);
} else
-@@ -192,7 +209,7 @@ main(int argc, char *argv[])
+@@ -192,7 +212,7 @@ main(int argc, char *argv[])
case SHOW_NEIGHBOR_TIMERS:
case SHOW_NEIGHBOR_TERSE:
neighbor.show_timers = (res->action == SHOW_NEIGHBOR_TIMERS);
@@ -120,7 +133,7 @@ diff -u -p -r1.1.1.7 -r1.6
imsg_compose(ibuf, IMSG_CTL_SHOW_NEIGHBOR, 0, 0, -1,
&neighbor, sizeof(neighbor));
else
-@@ -206,7 +223,7 @@ main(int argc, char *argv[])
+@@ -206,7 +226,7 @@ main(int argc, char *argv[])
memcpy(&ribreq.as, &res->as, sizeof(res->as));
type = IMSG_CTL_SHOW_RIB_AS;
}
@@ -129,7 +142,7 @@ diff -u -p -r1.1.1.7 -r1.6
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[])
+@@ -220,7 +240,7 @@ main(int argc, char *argv[])
memcpy(&ribreq.neighbor, &neighbor,
sizeof(ribreq.neighbor));
strlcpy(ribreq.rib, res->rib, sizeof(ribreq.rib));
@@ -138,7 +151,7 @@ diff -u -p -r1.1.1.7 -r1.6
ribreq.flags = res->flags;
imsg_compose(ibuf, type, 0, 0, -1, &ribreq, sizeof(ribreq));
if (!(res->flags & F_CTL_DETAIL))
-@@ -290,12 +307,21 @@ main(int argc, char *argv[])
+@@ -290,12 +310,21 @@ main(int argc, char *argv[])
break;
case NETWORK_SHOW:
bzero(&ribreq, sizeof(ribreq));
@@ -161,7 +174,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
while (ibuf->w.queued)
-@@ -304,13 +330,13 @@ main(int argc, char *argv[])
+@@ -304,13 +333,13 @@ main(int argc, char *argv[])
while (!done) {
if ((n = imsg_read(ibuf)) == -1)
@@ -177,7 +190,7 @@ diff -u -p -r1.1.1.7 -r1.6
if (n == 0)
break;
-@@ -373,6 +399,8 @@ main(int argc, char *argv[])
+@@ -373,6 +402,8 @@ main(int argc, char *argv[])
case NETWORK_REMOVE:
case NETWORK_FLUSH:
case IRRFILTER:
@@ -186,7 +199,7 @@ diff -u -p -r1.1.1.7 -r1.6
break;
}
imsg_free(&imsg);
-@@ -398,8 +426,8 @@ fmt_peer(const char *descr, const struct
+@@ -398,8 +429,8 @@ fmt_peer(const char *descr, const struct
}
ip = log_addr(remote_addr);
@@ -197,7 +210,7 @@ diff -u -p -r1.1.1.7 -r1.6
if (asprintf(&p, "%s/%u", ip, masklen) == -1)
err(1, NULL);
} else {
-@@ -521,13 +549,15 @@ show_neighbor_msg(struct imsg *imsg, enu
+@@ -521,13 +552,15 @@ show_neighbor_msg(struct imsg *imsg, enu
struct ctl_timer *t;
struct in_addr ina;
char buf[NI_MAXHOST], pbuf[NI_MAXSERV], *s;
@@ -215,7 +228,7 @@ diff -u -p -r1.1.1.7 -r1.6
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
+@@ -549,6 +582,10 @@ show_neighbor_msg(struct imsg *imsg, enu
printf(", Template");
if (p->conf.cloned)
printf(", Cloned");
@@ -226,7 +239,7 @@ diff -u -p -r1.1.1.7 -r1.6
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
+@@ -563,17 +600,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);
@@ -253,7 +266,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
if (p->capa.peer.refresh)
printf(" Route Refresh\n");
-@@ -633,20 +666,16 @@ show_neighbor_msg(struct imsg *imsg, enu
+@@ -633,20 +669,16 @@ show_neighbor_msg(struct imsg *imsg, enu
}
void
@@ -283,7 +296,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
void
-@@ -680,7 +709,7 @@ print_neighbor_msgstats(struct peer *p)
+@@ -680,7 +712,7 @@ print_neighbor_msgstats(struct peer *p)
}
void
@@ -292,7 +305,7 @@ diff -u -p -r1.1.1.7 -r1.6
{
printf(" %-20s ", name);
-@@ -848,35 +877,70 @@ show_fib_msg(struct imsg *imsg)
+@@ -848,35 +880,70 @@ show_fib_msg(struct imsg *imsg)
void
show_nexthop_head(void)
{
@@ -381,7 +394,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
printf("\n");
break;
-@@ -898,9 +962,8 @@ show_interface_head(void)
+@@ -898,9 +965,8 @@ show_interface_head(void)
"Link state");
}
@@ -393,18 +406,18 @@ diff -u -p -r1.1.1.7 -r1.6
const struct ifmedia_description
ifm_type_descriptions[] = IFM_TYPE_DESCRIPTIONS;
-@@ -936,36 +999,36 @@ get_media_descr(int media_type)
+@@ -936,36 +1002,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;
+-
+- if (link_state == LINK_STATE_UNKNOWN)
+- return ("unknown");
+ 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 ||
@@ -452,7 +465,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
int
-@@ -982,17 +1045,12 @@ show_interface_msg(struct imsg *imsg)
+@@ -982,17 +1048,12 @@ show_interface_msg(struct imsg *imsg)
printf("%-15s", k->flags & IFF_UP ? "UP" : "");
if ((ifms_type = ift2ifm(k->media_type)) != 0)
@@ -475,7 +488,7 @@ diff -u -p -r1.1.1.7 -r1.6
printf("\n");
break;
case IMSG_CTL_END:
-@@ -1011,7 +1069,7 @@ show_rib_summary_head(void)
+@@ -1011,7 +1072,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");
@@ -484,7 +497,7 @@ diff -u -p -r1.1.1.7 -r1.6
"gateway", "lpref", "med", "aspath origin");
}
-@@ -1085,7 +1143,7 @@ show_rib_summary_msg(struct imsg *imsg)
+@@ -1085,7 +1146,7 @@ show_rib_summary_msg(struct imsg *imsg)
memcpy(&rib, imsg->data, sizeof(rib));
print_prefix(&rib.prefix, rib.prefixlen, rib.flags);
@@ -493,7 +506,7 @@ diff -u -p -r1.1.1.7 -r1.6
printf(" %5u %5u ", rib.local_pref, rib.med);
-@@ -1190,7 +1248,7 @@ show_rib_detail_msg(struct imsg *imsg, i
+@@ -1190,7 +1251,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",
@@ -502,7 +515,7 @@ diff -u -p -r1.1.1.7 -r1.6
break;
case ATTR_ORIGINATOR_ID:
memcpy(&id, data, sizeof(id));
-@@ -1236,22 +1294,27 @@ fmt_mem(int64_t num)
+@@ -1236,22 +1297,27 @@ fmt_mem(int64_t num)
return (buf);
}
@@ -537,7 +550,7 @@ diff -u -p -r1.1.1.7 -r1.6
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)
+@@ -1272,9 +1338,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));
@@ -548,7 +561,7 @@ diff -u -p -r1.1.1.7 -r1.6
stats.prefix_cnt * sizeof(struct prefix) +
stats.rib_cnt * sizeof(struct rib_entry) +
stats.path_cnt * sizeof(struct rde_aspath) +
-@@ -1328,30 +1389,6 @@ show_community(u_char *data, u_int16_t l
+@@ -1328,30 +1392,6 @@ show_community(u_char *data, u_int16_t l
}
}
@@ -579,7 +592,7 @@ diff -u -p -r1.1.1.7 -r1.6
void
show_ext_community(u_char *data, u_int16_t len)
{
-@@ -1372,24 +1409,25 @@ show_ext_community(u_char *data, u_int16
+@@ -1372,24 +1412,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));
diff --git a/net/openbgpd/files/patch-bgpctl_parser.c b/net/openbgpd/files/patch-bgpctl_parser.c
index dd0ae874e3df..5efa4ce8cd49 100644
--- a/net/openbgpd/files/patch-bgpctl_parser.c
+++ b/net/openbgpd/files/patch-bgpctl_parser.c
@@ -2,13 +2,13 @@ Index: bgpctl/parser.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpctl/parser.c,v
retrieving revision 1.1.1.6
-retrieving revision 1.4
-diff -u -p -r1.1.1.6 -r1.4
+retrieving revision 1.5
+diff -u -p -r1.1.1.6 -r1.5
--- 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
++++ bgpctl/parser.c 10 Apr 2010 12:17:18 -0000 1.5
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: parser.c,v 1.61 2010/03/08 17:02:19 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -52,15 +52,7 @@ diff -u -p -r1.1.1.6 -r1.4
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
+@@ -404,15 +416,22 @@ match_token(int *argc, char **argv[], co
case FAMILY:
if (word == NULL)
break;
@@ -87,7 +79,7 @@ diff -u -p -r1.1.1.6 -r1.4
}
break;
case ADDRESS:
-@@ -584,7 +604,7 @@ show_valid_args(const struct token table
+@@ -584,7 +603,7 @@ show_valid_args(const struct token table
fprintf(stderr, " <pftable>\n");
break;
case FAMILY:
@@ -96,7 +88,7 @@ diff -u -p -r1.1.1.6 -r1.4
break;
case GETOPT:
fprintf(stderr, " <options>\n");
-@@ -608,7 +628,7 @@ parse_addr(const char *word, struct bgpd
+@@ -608,7 +627,7 @@ parse_addr(const char *word, struct bgpd
bzero(&ina, sizeof(ina));
if (inet_net_pton(AF_INET, word, &ina, sizeof(ina)) != -1) {
@@ -105,7 +97,7 @@ diff -u -p -r1.1.1.6 -r1.4
addr->v4 = ina;
return (1);
}
-@@ -618,13 +638,7 @@ parse_addr(const char *word, struct bgpd
+@@ -618,13 +637,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) {
@@ -120,7 +112,7 @@ diff -u -p -r1.1.1.6 -r1.4
freeaddrinfo(r);
return (1);
}
-@@ -663,15 +677,15 @@ parse_prefix(const char *word, struct bg
+@@ -663,15 +676,15 @@ parse_prefix(const char *word, struct bg
if (parse_addr(word, addr) == 0)
return (0);
@@ -139,7 +131,7 @@ diff -u -p -r1.1.1.6 -r1.4
if (mask == -1)
mask = 128;
inet6applymask(&addr->v6, &addr->v6, mask);
-@@ -706,7 +720,7 @@ parse_asnum(const char *word, u_int32_t
+@@ -706,7 +719,7 @@ parse_asnum(const char *word, u_int32_t
if (errstr)
errx(1, "AS number is %s: %s", errstr, word);
} else {
@@ -148,7 +140,7 @@ diff -u -p -r1.1.1.6 -r1.4
if (errstr)
errx(1, "AS number is %s: %s", errstr, word);
}
-@@ -882,8 +896,14 @@ bgpctl_getopt(int *argc, char **argv[],
+@@ -882,8 +895,14 @@ bgpctl_getopt(int *argc, char **argv[],
int ch;
optind = optreset = 1;
diff --git a/net/openbgpd/files/patch-bgpd_bgpd.c b/net/openbgpd/files/patch-bgpd_bgpd.c
index 520f82348b10..788b053a2d48 100644
--- a/net/openbgpd/files/patch-bgpd_bgpd.c
+++ b/net/openbgpd/files/patch-bgpd_bgpd.c
@@ -2,45 +2,57 @@ Index: bgpd/bgpd.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.1.1.8
-diff -u -p -r1.1.1.7 -r1.1.1.8
+retrieving revision 1.1.1.9
+diff -u -p -r1.1.1.7 -r1.1.1.9
--- 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
++++ bgpd/bgpd.c 10 Apr 2010 12:13:04 -0000 1.1.1.9
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: bgpd.c,v 1.156 2010/03/29 09:09:25 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
-@@ -101,15 +101,11 @@ int
+@@ -42,7 +42,7 @@ int main(int, char *[]);
+ int check_child(pid_t, const char *);
+ int send_filterset(struct imsgbuf *, struct filter_set_head *);
+ int reconfigure(char *, struct bgpd_config *, struct mrt_head *,
+- struct peer **, struct filter_head *);
++ struct peer **);
+ int dispatch_imsg(struct imsgbuf *, int);
+
+ int rfd = -1;
+@@ -101,15 +101,10 @@ 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 filter_head *rules_l;
- struct network *net;
- struct filter_rule *r;
++ struct peer *peer_l, *p;
struct mrt *m;
struct listen_addr *la;
- struct rde_rib *rr;
struct pollfd pfd[POLL_MAX];
pid_t io_pid = 0, rde_pid = 0, pid;
char *conffile;
-@@ -129,9 +125,8 @@ main(int argc, char *argv[])
- err(1, NULL);
+@@ -125,13 +120,8 @@ main(int argc, char *argv[])
+ log_init(1); /* log to stderr until daemonized */
+
+- if ((rules_l = calloc(1, sizeof(struct filter_head))) == NULL)
+- err(1, NULL);
+-
bzero(&conf, sizeof(conf));
-- LIST_INIT(&mrt_l);
+ LIST_INIT(&mrt_l);
- TAILQ_INIT(&net_l);
- TAILQ_INIT(rules_l);
-+ LIST_INIT(&mrt_l);
+- TAILQ_INIT(rules_l);
peer_l = NULL;
conf.csock = SOCKET_NAME;
-@@ -158,6 +153,7 @@ main(int argc, char *argv[])
+@@ -158,6 +148,7 @@ main(int argc, char *argv[])
if (conf.opts & BGPD_OPT_VERBOSE)
conf.opts |= BGPD_OPT_VERBOSE2;
conf.opts |= BGPD_OPT_VERBOSE;
@@ -48,7 +60,7 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
break;
case 'r':
conf.rcsock = optarg;
-@@ -176,12 +172,15 @@ main(int argc, char *argv[])
+@@ -176,14 +167,16 @@ main(int argc, char *argv[])
if (argc > 0)
usage();
@@ -58,18 +70,20 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
- }
-
if (conf.opts & BGPD_OPT_NOACTION) {
-+ struct network_head net_l;
-+ TAILQ_INIT(&net_l);
++ struct network_head net_l;
++ struct filter_head rules_l;
++
+ if (parse_config(conffile, &conf, &mrt_l, &peer_l, &net_l,
-+ rules_l)) {
-+ free(rules_l);
++ &rules_l))
+ exit(1);
-+ }
+
if (conf.opts & BGPD_OPT_VERBOSE)
- print_config(&conf, &ribnames, &net_l, peer_l, rules_l,
+- print_config(&conf, &ribnames, &net_l, peer_l, rules_l,
++ print_config(&conf, &ribnames, &net_l, peer_l, &rules_l,
&mrt_l);
-@@ -225,13 +224,10 @@ main(int argc, char *argv[])
+ else
+ fprintf(stderr, "configuration OK\n");
+@@ -225,13 +218,10 @@ main(int argc, char *argv[])
session_socket_blockmode(pipe_s2r_c[0], BM_NONBLOCK);
session_socket_blockmode(pipe_s2r_c[1], BM_NONBLOCK);
@@ -86,11 +100,11 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
setproctitle("parent");
-@@ -254,33 +250,13 @@ main(int argc, char *argv[])
+@@ -254,33 +244,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);
++ quit = reconfigure(conffile, &conf, &mrt_l, &peer_l);
if ((rfd = kr_init(!(conf.flags & BGPD_FLAG_NO_FIB_UPDATE),
conf.rtableid)) == -1)
quit = 1;
@@ -121,7 +135,17 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
while (quit == 0) {
bzero(pfd, sizeof(pfd));
pfd[PFD_PIPE_SESSION].fd = ibuf_se->fd;
-@@ -389,11 +365,12 @@ main(int argc, char *argv[])
+@@ -336,8 +306,7 @@ main(int argc, char *argv[])
+
+ reconfig = 0;
+ log_info("rereading config");
+- switch (reconfigure(conffile, &conf, &mrt_l, &peer_l,
+- rules_l)) {
++ switch (reconfigure(conffile, &conf, &mrt_l, &peer_l)) {
+ case -1: /* fatal error */
+ quit = 1;
+ break;
+@@ -389,13 +358,13 @@ main(int argc, char *argv[])
LIST_REMOVE(m, entry);
free(m);
}
@@ -137,10 +161,27 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
+ free(la);
+ }
- free(rules_l);
+- 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)) {
+ control_cleanup(conf.rcsock);
+ carp_demote_shutdown();
+@@ -452,18 +421,23 @@ send_filterset(struct imsgbuf *i, struct
+
+ int
+ reconfigure(char *conffile, struct bgpd_config *conf, struct mrt_head *mrt_l,
+- struct peer **peer_l, struct filter_head *rules_l)
++ struct peer **peer_l)
+ {
+ struct network_head net_l;
++ struct filter_head rules_l;
+ struct network *n;
+ struct peer *p;
+ struct filter_rule *r;
+ struct listen_addr *la;
+ struct rde_rib *rr;
+
+- if (parse_config(conffile, conf, mrt_l, peer_l, &net_l, rules_l)) {
++ if (parse_config(conffile, conf, mrt_l, peer_l, &net_l, &rules_l)) {
log_warnx("config file %s has errors, not reloading",
conffile);
+ while ((rr = SIMPLEQ_FIRST(&ribnames))) {
@@ -150,7 +191,23 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
return (1);
}
-@@ -550,8 +531,8 @@ int
+@@ -525,13 +499,13 @@ reconfigure(char *conffile, struct bgpd_
+ return (-1);
+
+ /* filters for the RDE */
+- while ((r = TAILQ_FIRST(rules_l)) != NULL) {
++ while ((r = TAILQ_FIRST(&rules_l)) != NULL) {
+ if (imsg_compose(ibuf_rde, IMSG_RECONF_FILTER, 0, 0, -1,
+ r, sizeof(struct filter_rule)) == -1)
+ return (-1);
+ if (send_filterset(ibuf_rde, &r->set) == -1)
+ return (-1);
+- TAILQ_REMOVE(rules_l, r, entry);
++ TAILQ_REMOVE(&rules_l, r, entry);
+ filterset_free(&r->set);
+ free(r);
+ }
+@@ -550,8 +524,8 @@ int
dispatch_imsg(struct imsgbuf *ibuf, int idx)
{
struct imsg imsg;
@@ -161,7 +218,7 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
if ((n = imsg_read(ibuf)) == -1)
return (-1);
-@@ -692,6 +673,11 @@ dispatch_imsg(struct imsgbuf *ibuf, int
+@@ -692,6 +666,11 @@ dispatch_imsg(struct imsgbuf *ibuf, int
carp_demote_set(msg->demote_group, msg->level);
}
break;
@@ -173,7 +230,7 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
default:
break;
}
-@@ -707,7 +693,7 @@ send_nexthop_update(struct kroute_nextho
+@@ -707,7 +686,7 @@ send_nexthop_update(struct kroute_nextho
{
char *gw = NULL;
@@ -182,7 +239,7 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
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
+@@ -717,7 +696,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" : "",
@@ -191,7 +248,7 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
free(gw);
-@@ -758,12 +744,12 @@ bgpd_redistribute(int type, struct krout
+@@ -758,17 +737,16 @@ bgpd_redistribute(int type, struct krout
fatalx("bgpd_redistribute: unable to redistribute v4 and v6"
"together");
if (kr != NULL) {
@@ -206,3 +263,8 @@ diff -u -p -r1.1.1.7 -r1.1.1.8
memcpy(&net.prefix.v6, &kr6->prefix, sizeof(struct in6_addr));
net.prefixlen = kr6->prefixlen;
}
+
+-
+ if (imsg_compose(ibuf_rde, type, 0, 0, -1, &net,
+ sizeof(struct network_config)) == -1)
+ return (-1);
diff --git a/net/openbgpd/files/patch-bgpd_bgpd.conf.5 b/net/openbgpd/files/patch-bgpd_bgpd.conf.5
index b1ccbec4a8f2..3c658e499a18 100644
--- a/net/openbgpd/files/patch-bgpd_bgpd.conf.5
+++ b/net/openbgpd/files/patch-bgpd_bgpd.conf.5
@@ -2,13 +2,13 @@ Index: bgpd/bgpd.conf.5
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.conf.5,v
retrieving revision 1.1.1.7
-retrieving revision 1.6
-diff -u -p -r1.1.1.7 -r1.6
+retrieving revision 1.7
+diff -u -p -r1.1.1.7 -r1.7
--- 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
++++ bgpd/bgpd.conf.5 10 Apr 2010 12:16:23 -0000 1.7
@@ -1,4 +1,4 @@
-.\" $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 $
++.\" $OpenBSD: bgpd.conf.5,v 1.104 2010/03/05 15:25:00 claudio Exp $
.\"
.\" Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
.\" Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -17,7 +17,7 @@ diff -u -p -r1.1.1.7 -r1.6
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: June 7 2009 $
-+.Dd $Mdocdate: November 26 2009 $
++.Dd $Mdocdate: December 16 2009 $
.Dt BGPD.CONF 5
.Os
.Sh NAME
@@ -141,7 +141,39 @@ diff -u -p -r1.1.1.7 -r1.6
Bind the neighbor to the specified RIB.
.Pp
.It Ic route-reflector Op Ar address
-@@ -1028,6 +1068,12 @@ matches a rule which has the
+@@ -917,6 +957,31 @@ may be set to
+ which is expanded to the current neighbor remote AS number.
+ .Pp
+ .It Xo
++.Ic ext-community
++.Ar subtype Ar as-number Ns Li : Ns Ar local
++.Xc
++.It Xo
++.Ic ext-community
++.Ar subtype Ar IP Ns Li : Ns Ar local
++.Xc
++.It Xo
++.Ic ext-community
++.Ar subtype Ar numvalue
++.Xc
++This rule applies only to
++.Em UPDATES
++where the
++.Em extended community
++path attribute is present and matches.
++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.
++See also the
++.Sx ATTRIBUTE SET
++section for further information about the encoding.
++.Pp
++.It Xo
+ .Pq Ic from Ns \&| Ns Ic to
+ .Ar peer
+ .Xc
+@@ -1028,6 +1093,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
@@ -154,7 +186,7 @@ diff -u -p -r1.1.1.7 -r1.6
.It Ic set Ar attribute ...
All matching rules can set the
.Em AS path attributes
-@@ -1079,6 +1125,48 @@ Alternately, well-known communities may
+@@ -1079,6 +1150,48 @@ Alternately, well-known communities may
or
.Ic NO_PEER .
.Pp
@@ -203,7 +235,7 @@ diff -u -p -r1.1.1.7 -r1.6
.It Ic localpref Ar number
Set the
.Em LOCAL_PREF
-@@ -1108,6 +1196,20 @@ otherwise it will be set to
+@@ -1108,6 +1221,20 @@ otherwise it will be set to
.Ar number .
.Pp
.It Xo
@@ -224,7 +256,7 @@ diff -u -p -r1.1.1.7 -r1.6
.Ic nexthop
.Sm off
.Po Ar address \*(Ba
-@@ -1181,8 +1283,8 @@ For prefixes with equally long paths, th
+@@ -1181,8 +1308,8 @@ For prefixes with equally long paths, th
is selected.
.El
.Sh FILES
diff --git a/net/openbgpd/files/patch-bgpd_bgpd.h b/net/openbgpd/files/patch-bgpd_bgpd.h
index 89f2e5115d14..d522bad36b14 100644
--- a/net/openbgpd/files/patch-bgpd_bgpd.h
+++ b/net/openbgpd/files/patch-bgpd_bgpd.h
@@ -2,13 +2,13 @@ Index: bgpd/bgpd.h
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/bgpd.h,v
retrieving revision 1.1.1.8
-retrieving revision 1.10
-diff -u -p -r1.1.1.8 -r1.10
+retrieving revision 1.11
+diff -u -p -r1.1.1.8 -r1.11
--- 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
++++ bgpd/bgpd.h 10 Apr 2010 12:16:23 -0000 1.11
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: bgpd.h,v 1.255 2010/04/06 13:25:08 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -150,7 +150,24 @@ diff -u -p -r1.1.1.8 -r1.10
IMSG_NETWORK_ADD,
IMSG_NETWORK_REMOVE,
IMSG_NETWORK_FLUSH,
-@@ -423,8 +483,7 @@ struct kif {
+@@ -400,14 +460,12 @@ struct kroute6 {
+ };
+
+ struct kroute_nexthop {
+- union {
+- struct kroute kr4;
+- struct kroute6 kr6;
+- } kr;
+ struct bgpd_addr nexthop;
+ struct bgpd_addr gateway;
++ struct bgpd_addr net;
+ u_int8_t valid;
+ u_int8_t connected;
++ u_int8_t netlen;
+ };
+
+ struct kif {
+@@ -423,8 +481,7 @@ struct kif {
struct session_up {
struct bgpd_addr local_addr;
struct bgpd_addr remote_addr;
@@ -160,7 +177,7 @@ diff -u -p -r1.1.1.8 -r1.10
u_int32_t remote_bgpid;
u_int16_t short_as;
};
-@@ -437,8 +496,13 @@ struct pftable_msg {
+@@ -437,8 +494,13 @@ struct pftable_msg {
struct ctl_show_nexthop {
struct bgpd_addr addr;
@@ -175,11 +192,12 @@ diff -u -p -r1.1.1.8 -r1.10
};
struct ctl_neighbor {
-@@ -508,6 +572,27 @@ struct filter_community {
+@@ -508,6 +570,28 @@ struct filter_community {
int type;
};
+struct filter_extcommunity {
++ u_int16_t flags;
+ u_int8_t type;
+ u_int8_t subtype; /* if extended type */
+ union {
@@ -203,7 +221,7 @@ diff -u -p -r1.1.1.8 -r1.10
struct ctl_show_rib_request {
char rib[PEER_DESCR_LEN];
struct ctl_neighbor neighbor;
-@@ -518,8 +603,8 @@ struct ctl_show_rib_request {
+@@ -518,8 +602,8 @@ struct ctl_show_rib_request {
pid_t pid;
u_int16_t flags;
enum imsg_type type;
@@ -213,12 +231,13 @@ diff -u -p -r1.1.1.8 -r1.10
};
enum filter_actions {
-@@ -585,6 +670,27 @@ struct filter_peers {
+@@ -585,6 +669,28 @@ 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
++#define EXT_COMMUNITY_FLAG_VALID 0x01
+
+struct ext_comm_pairs {
+ u_int8_t type;
@@ -241,7 +260,7 @@ diff -u -p -r1.1.1.8 -r1.10
struct filter_prefix {
-@@ -594,7 +700,7 @@ struct filter_prefix {
+@@ -594,16 +700,17 @@ struct filter_prefix {
struct filter_prefixlen {
enum comp_ops op;
@@ -250,7 +269,21 @@ diff -u -p -r1.1.1.8 -r1.10
u_int8_t len_min;
u_int8_t len_max;
};
-@@ -635,10 +741,13 @@ enum action_types {
+
+ struct filter_match {
+- struct filter_prefix prefix;
+- struct filter_prefixlen prefixlen;
+- struct filter_as as;
+- struct filter_community community;
++ struct filter_prefix prefix;
++ struct filter_prefixlen prefixlen;
++ struct filter_as as;
++ struct filter_community community;
++ struct filter_extcommunity ext_community;
+ };
+
+ TAILQ_HEAD(filter_head, filter_rule);
+@@ -635,10 +742,13 @@ enum action_types {
ACTION_SET_NEXTHOP_SELF,
ACTION_SET_COMMUNITY,
ACTION_DEL_COMMUNITY,
@@ -265,7 +298,7 @@ diff -u -p -r1.1.1.8 -r1.10
};
struct filter_set {
-@@ -650,23 +759,31 @@ struct filter_set {
+@@ -650,23 +760,31 @@ struct filter_set {
int32_t relative;
struct bgpd_addr nexthop;
struct filter_community community;
@@ -302,7 +335,7 @@ diff -u -p -r1.1.1.8 -r1.10
int64_t nexthop_cnt;
int64_t aspath_cnt;
int64_t aspath_size;
-@@ -677,28 +794,17 @@ struct rde_memstats {
+@@ -677,28 +795,17 @@ struct rde_memstats {
int64_t attr_dcnt;
};
@@ -342,7 +375,7 @@ diff -u -p -r1.1.1.8 -r1.10
/* prototypes */
/* bgpd.c */
-@@ -709,6 +815,7 @@ int bgpd_filternexthop(struct kroute *
+@@ -709,6 +816,7 @@ int bgpd_filternexthop(struct kroute *
/* log.c */
void log_init(int);
@@ -350,10 +383,11 @@ diff -u -p -r1.1.1.8 -r1.10
void vlog(int, const char *, va_list);
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
+@@ -779,11 +887,20 @@ 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_rd(u_int64_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);
diff --git a/net/openbgpd/files/patch-bgpd_imsg.c b/net/openbgpd/files/patch-bgpd_imsg.c
index 3bc2bb9a90b0..0cd9ad061d24 100644
--- a/net/openbgpd/files/patch-bgpd_imsg.c
+++ b/net/openbgpd/files/patch-bgpd_imsg.c
@@ -2,16 +2,25 @@ Index: bgpd/imsg.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/imsg.c,v
retrieving revision 1.1.1.6
-retrieving revision 1.1.1.7
-diff -u -p -r1.1.1.6 -r1.1.1.7
+retrieving revision 1.1.1.8
+diff -u -p -r1.1.1.6 -r1.1.1.8
--- 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
++++ bgpd/imsg.c 10 Apr 2010 12:13:04 -0000 1.1.1.8
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: imsg.c,v 1.49 2010/04/07 18:09:39 nicm Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+@@ -79,7 +79,7 @@ imsg_read(struct imsgbuf *ibuf)
+ cmsg->cmsg_type == SCM_RIGHTS) {
+ fd = (*(int *)CMSG_DATA(cmsg));
+ if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) {
+- /* XXX: this return can leak */
++ close(fd);
+ return (-1);
+ }
+ ifd->fd = fd;
@@ -263,6 +263,9 @@ imsg_flush(struct imsgbuf *ibuf)
void
imsg_clear(struct imsgbuf *ibuf)
diff --git a/net/openbgpd/files/patch-bgpd_kroute.c b/net/openbgpd/files/patch-bgpd_kroute.c
index abf246d0a986..08bb5eacbf50 100644
--- a/net/openbgpd/files/patch-bgpd_kroute.c
+++ b/net/openbgpd/files/patch-bgpd_kroute.c
@@ -2,17 +2,17 @@ Index: bgpd/kroute.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/kroute.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.8
-diff -u -p -r1.1.1.7 -r1.8
+retrieving revision 1.9
+diff -u -p -r1.1.1.7 -r1.9
--- bgpd/kroute.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
-+++ bgpd/kroute.c 2 Mar 2010 05:48:19 -0000 1.8
++++ bgpd/kroute.c 10 Apr 2010 12:16:23 -0000 1.9
@@ -1,4 +1,4 @@
-/* $OpenBSD: kroute.c,v 1.169 2009/06/25 15:54:22 claudio Exp $ */
-+/* $OpenBSD: kroute.c,v 1.173 2009/12/01 14:28:05 claudio Exp $ */
++/* $OpenBSD: kroute.c,v 1.176 2010/04/06 13:25:08 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
-@@ -463,21 +463,21 @@ kr_nexthop_add(struct bgpd_addr *addr)
+@@ -463,25 +463,30 @@ kr_nexthop_add(struct bgpd_addr *addr)
bzero(&nh, sizeof(nh));
memcpy(&nh.nexthop, addr, sizeof(nh.nexthop));
nh.valid = 1;
@@ -26,8 +26,11 @@ diff -u -p -r1.1.1.7 -r1.8
nh.gateway.v4.s_addr =
k->r.nexthop.s_addr;
}
- memcpy(&nh.kr.kr4, &k->r, sizeof(nh.kr.kr4));
+- memcpy(&nh.kr.kr4, &k->r, sizeof(nh.kr.kr4));
- } else if (h->kroute != NULL && addr->af == AF_INET6) {
++ nh.net.aid = AID_INET;
++ nh.net.v4.s_addr = k->r.prefix.s_addr;
++ nh.netlen = k->r.prefixlen;
+ } else if (h->kroute != NULL && addr->aid == AID_INET6) {
k6 = h->kroute;
nh.connected = k6->r.flags & F_CONNECTED;
@@ -38,7 +41,15 @@ diff -u -p -r1.1.1.7 -r1.8
memcpy(&nh.gateway.v6, &k6->r.nexthop,
sizeof(struct in6_addr));
}
-@@ -563,14 +563,14 @@ kr_show_route(struct imsg *imsg)
+- memcpy(&nh.kr.kr6, &k6->r, sizeof(nh.kr.kr6));
++ nh.net.aid = AID_INET6;
++ memcpy(&nh.net.v6, &k6->r.nexthop,
++ sizeof(struct in6_addr));
++ nh.netlen = k6->r.prefixlen;
+ }
+
+ send_nexthop_update(&nh);
+@@ -563,14 +568,14 @@ kr_show_route(struct imsg *imsg)
}
addr = imsg->data;
kr = NULL;
@@ -56,7 +67,7 @@ diff -u -p -r1.1.1.7 -r1.8
kr6 = kroute6_match(&addr->v6, 1);
if (kr6 != NULL)
send_imsg_session(IMSG_CTL_KROUTE6,
-@@ -583,15 +583,21 @@ kr_show_route(struct imsg *imsg)
+@@ -583,15 +588,21 @@ kr_show_route(struct imsg *imsg)
bzero(&snh, sizeof(snh));
memcpy(&snh.addr, &h->nexthop, sizeof(snh.addr));
if (h->kroute != NULL) {
@@ -81,7 +92,7 @@ diff -u -p -r1.1.1.7 -r1.8
ifindex = kr6->r.ifindex;
break;
}
-@@ -846,26 +852,28 @@ kroute6_compare(struct kroute6_node *a,
+@@ -846,26 +857,28 @@ kroute6_compare(struct kroute6_node *a,
int
knexthop_compare(struct knexthop_node *a, struct knexthop_node *b)
{
@@ -126,7 +137,7 @@ diff -u -p -r1.1.1.7 -r1.8
}
return (0);
-@@ -945,7 +953,7 @@ kroute_insert(struct kroute_node *kr)
+@@ -945,7 +958,7 @@ kroute_insert(struct kroute_node *kr)
mask = prefixlen2mask(kr->r.prefixlen);
ina = ntohl(kr->r.prefix.s_addr);
RB_FOREACH(h, knexthop_tree, &knt)
@@ -135,7 +146,7 @@ diff -u -p -r1.1.1.7 -r1.8
(ntohl(h->nexthop.v4.s_addr) & mask) == ina)
knexthop_validate(h);
-@@ -1065,7 +1073,7 @@ kroute6_matchgw(struct kroute6_node *kr,
+@@ -1065,7 +1078,7 @@ kroute6_matchgw(struct kroute6_node *kr,
memcpy(&nexthop, &sa_in6->sin6_addr, sizeof(nexthop));
while (kr) {
@@ -144,7 +155,7 @@ diff -u -p -r1.1.1.7 -r1.8
return (kr);
kr = kr->next;
}
-@@ -1091,7 +1099,7 @@ kroute6_insert(struct kroute6_node *kr)
+@@ -1091,7 +1104,7 @@ kroute6_insert(struct kroute6_node *kr)
if (kr->r.flags & F_KERNEL) {
inet6applymask(&ina, &kr->r.prefix, kr->r.prefixlen);
RB_FOREACH(h, knexthop_tree, &knt)
@@ -153,7 +164,7 @@ diff -u -p -r1.1.1.7 -r1.8
inet6applymask(&inb, &h->nexthop.v6,
kr->r.prefixlen);
if (memcmp(&ina, &inb, sizeof(ina)) == 0)
-@@ -1184,6 +1192,7 @@ knexthop_find(struct bgpd_addr *addr)
+@@ -1184,6 +1197,7 @@ knexthop_find(struct bgpd_addr *addr)
{
struct knexthop_node s;
@@ -161,7 +172,7 @@ diff -u -p -r1.1.1.7 -r1.8
memcpy(&s.nexthop, addr, sizeof(s.nexthop));
return (RB_FIND(knexthop_tree, &knt, &s));
-@@ -1480,17 +1489,17 @@ knexthop_validate(struct knexthop_node *
+@@ -1480,17 +1494,17 @@ knexthop_validate(struct knexthop_node *
struct kroute_nexthop n;
int was_valid = 0;
@@ -183,16 +194,20 @@ diff -u -p -r1.1.1.7 -r1.8
if ((kr = kroute_match(kn->nexthop.v4.s_addr, 0)) == NULL) {
if (was_valid)
send_nexthop_update(&n);
-@@ -1500,7 +1509,7 @@ knexthop_validate(struct knexthop_node *
+@@ -1500,8 +1514,10 @@ knexthop_validate(struct knexthop_node *
n.connected = kr->r.flags & F_CONNECTED;
if ((n.gateway.v4.s_addr =
kr->r.nexthop.s_addr) != 0)
- n.gateway.af = AF_INET;
+- memcpy(&n.kr.kr4, &kr->r, sizeof(n.kr.kr4));
+ n.gateway.aid = AID_INET;
- memcpy(&n.kr.kr4, &kr->r, sizeof(n.kr.kr4));
++ n.net.aid = AID_INET;
++ n.net.v4.s_addr = kr->r.prefix.s_addr;
++ n.netlen = kr->r.prefixlen;
send_nexthop_update(&n);
} else /* down */
-@@ -1511,7 +1520,7 @@ knexthop_validate(struct knexthop_node *
+ if (was_valid)
+@@ -1511,7 +1527,7 @@ knexthop_validate(struct knexthop_node *
kr->r.flags |= F_NEXTHOP;
}
break;
@@ -201,7 +216,7 @@ diff -u -p -r1.1.1.7 -r1.8
if ((kr6 = kroute6_match(&kn->nexthop.v6, 0)) == NULL) {
if (was_valid)
send_nexthop_update(&n);
-@@ -1521,7 +1530,7 @@ knexthop_validate(struct knexthop_node *
+@@ -1521,11 +1537,14 @@ knexthop_validate(struct knexthop_node *
n.connected = kr6->r.flags & F_CONNECTED;
if (memcmp(&kr6->r.nexthop, &in6addr_any,
sizeof(struct in6_addr)) != 0) {
@@ -210,7 +225,15 @@ diff -u -p -r1.1.1.7 -r1.8
memcpy(&n.gateway.v6, &kr6->r.nexthop,
sizeof(struct in6_addr));
}
-@@ -1551,23 +1560,23 @@ knexthop_track(void *krn)
+- memcpy(&n.kr.kr6, &kr6->r, sizeof(n.kr.kr6));
++ n.net.aid = AID_INET6;
++ memcpy(&n.net.v6, &kr6->r.nexthop,
++ sizeof(struct in6_addr));
++ n.netlen = kr6->r.prefixlen;
+ send_nexthop_update(&n);
+ } else /* down */
+ if (was_valid)
+@@ -1551,27 +1570,32 @@ knexthop_track(void *krn)
bzero(&n, sizeof(n));
memcpy(&n.nexthop, &kn->nexthop, sizeof(n.nexthop));
@@ -224,8 +247,11 @@ diff -u -p -r1.1.1.7 -r1.8
if ((n.gateway.v4.s_addr =
kr->r.nexthop.s_addr) != 0)
- n.gateway.af = AF_INET;
+- memcpy(&n.kr.kr4, &kr->r, sizeof(n.kr.kr4));
+ n.gateway.aid = AID_INET;
- memcpy(&n.kr.kr4, &kr->r, sizeof(n.kr.kr4));
++ n.net.aid = AID_INET;
++ n.net.v4.s_addr = kr->r.prefix.s_addr;
++ n.netlen = kr->r.prefixlen;
break;
- case AF_INET6:
+ case AID_INET6:
@@ -239,7 +265,15 @@ diff -u -p -r1.1.1.7 -r1.8
memcpy(&n.gateway.v6, &kr6->r.nexthop,
sizeof(struct in6_addr));
}
-@@ -1645,12 +1654,12 @@ kroute_detach_nexthop(struct knexthop_no
+- memcpy(&n.kr.kr6, &kr6->r, sizeof(n.kr.kr6));
++ n.net.aid = AID_INET6;
++ memcpy(&n.net.v6, &kr6->r.nexthop,
++ sizeof(struct in6_addr));
++ n.netlen = kr6->r.prefixlen;
+ break;
+ }
+ send_nexthop_update(&n);
+@@ -1645,12 +1669,12 @@ kroute_detach_nexthop(struct knexthop_no
; /* nothing */
if (s == NULL) {
@@ -255,7 +289,7 @@ diff -u -p -r1.1.1.7 -r1.8
k6 = kn->kroute;
k6->r.flags &= ~F_NEXTHOP;
break;
-@@ -1675,7 +1684,7 @@ protect_lo(void)
+@@ -1675,7 +1699,7 @@ protect_lo(void)
log_warn("protect_lo");
return (-1);
}
@@ -264,7 +298,7 @@ diff -u -p -r1.1.1.7 -r1.8
kr->r.prefixlen = 8;
kr->r.flags = F_KERNEL|F_CONNECTED;
-@@ -1689,7 +1698,7 @@ protect_lo(void)
+@@ -1689,7 +1713,7 @@ protect_lo(void)
}
memcpy(&kr6->r.prefix, &in6addr_loopback, sizeof(kr6->r.prefix));
kr6->r.prefixlen = 128;
@@ -273,7 +307,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (RB_INSERT(kroute6_tree, &krt6, kr6) != NULL)
free(kr6); /* kernel route already there, no problem */
-@@ -1788,7 +1797,7 @@ prefixlen2mask6(u_int8_t prefixlen)
+@@ -1788,7 +1812,7 @@ prefixlen2mask6(u_int8_t prefixlen)
}
#define ROUNDUP(a) \
@@ -282,16 +316,22 @@ diff -u -p -r1.1.1.7 -r1.8
void
get_rtaddrs(int addrs, struct sockaddr *sa, struct sockaddr **rti_info)
-@@ -1849,7 +1858,7 @@ if_change(u_short ifindex, int flags, st
+@@ -1849,10 +1873,11 @@ if_change(u_short ifindex, int flags, st
nh.connected = 1;
if ((nh.gateway.v4.s_addr =
kkr->kr->r.nexthop.s_addr) != 0)
- nh.gateway.af = AF_INET;
+ nh.gateway.aid = AID_INET;
}
- memcpy(&nh.kr.kr4, &kkr->kr->r,
- sizeof(nh.kr.kr4));
-@@ -1873,7 +1882,7 @@ if_change(u_short ifindex, int flags, st
+- memcpy(&nh.kr.kr4, &kkr->kr->r,
+- sizeof(nh.kr.kr4));
++ nh.net.aid = AID_INET;
++ nh.net.v4.s_addr = kkr->kr->r.prefix.s_addr;
++ nh.netlen = kkr->kr->r.prefixlen;
+ send_nexthop_update(&nh);
+ }
+ }
+@@ -1873,14 +1898,16 @@ if_change(u_short ifindex, int flags, st
if (memcmp(&kkr6->kr->r.nexthop,
&in6addr_any, sizeof(struct
in6_addr))) {
@@ -300,7 +340,18 @@ diff -u -p -r1.1.1.7 -r1.8
memcpy(&nh.gateway.v6,
&kkr6->kr->r.nexthop,
sizeof(struct in6_addr));
-@@ -1924,7 +1933,9 @@ send_rtmsg(int fd, int action, struct kr
+ }
+ }
+- memcpy(&nh.kr.kr6, &kkr6->kr->r,
+- sizeof(nh.kr.kr6));
++ nh.net.aid = AID_INET6;
++ memcpy(&nh.net.v6, &kkr6->kr->r.nexthop,
++ sizeof(struct in6_addr));
++ nh.netlen = kkr6->kr->r.prefixlen;
+ send_nexthop_update(&nh);
+ }
+ }
+@@ -1924,7 +1951,9 @@ send_rtmsg(int fd, int action, struct kr
struct sockaddr_in prefix;
struct sockaddr_in nexthop;
struct sockaddr_in mask;
@@ -310,7 +361,7 @@ diff -u -p -r1.1.1.7 -r1.8
int iovcnt = 0;
if (kr_state.fib_sync == 0)
-@@ -1934,8 +1945,13 @@ send_rtmsg(int fd, int action, struct kr
+@@ -1934,8 +1963,13 @@ send_rtmsg(int fd, int action, struct kr
bzero(&hdr, sizeof(hdr));
hdr.rtm_version = RTM_VERSION;
hdr.rtm_type = action;
@@ -324,7 +375,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (kroute->flags & F_BLACKHOLE)
hdr.rtm_flags |= RTF_BLACKHOLE;
if (kroute->flags & F_REJECT)
-@@ -1984,6 +2000,7 @@ send_rtmsg(int fd, int action, struct kr
+@@ -1984,6 +2018,7 @@ send_rtmsg(int fd, int action, struct kr
iov[iovcnt].iov_base = &mask;
iov[iovcnt++].iov_len = sizeof(mask);
@@ -332,7 +383,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (kroute->labelid) {
bzero(&label, sizeof(label));
label.sr_len = sizeof(label);
-@@ -1996,6 +2013,7 @@ send_rtmsg(int fd, int action, struct kr
+@@ -1996,6 +2031,7 @@ send_rtmsg(int fd, int action, struct kr
iov[iovcnt].iov_base = &label;
iov[iovcnt++].iov_len = sizeof(label);
}
@@ -340,7 +391,7 @@ diff -u -p -r1.1.1.7 -r1.8
retry:
if (writev(fd, iov, iovcnt) == -1) {
-@@ -2037,7 +2055,9 @@ send_rt6msg(int fd, int action, struct k
+@@ -2037,7 +2073,9 @@ send_rt6msg(int fd, int action, struct k
struct sockaddr_in6 addr;
char pad[sizeof(long)];
} prefix, nexthop, mask;
@@ -350,7 +401,7 @@ diff -u -p -r1.1.1.7 -r1.8
int iovcnt = 0;
if (kr_state.fib_sync == 0)
-@@ -2047,7 +2067,10 @@ send_rt6msg(int fd, int action, struct k
+@@ -2047,7 +2085,10 @@ send_rt6msg(int fd, int action, struct k
bzero(&hdr, sizeof(hdr));
hdr.rtm_version = RTM_VERSION;
hdr.rtm_type = action;
@@ -361,7 +412,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (kroute->flags & F_BLACKHOLE)
hdr.rtm_flags |= RTF_BLACKHOLE;
if (kroute->flags & F_REJECT)
-@@ -2100,6 +2123,7 @@ send_rt6msg(int fd, int action, struct k
+@@ -2100,6 +2141,7 @@ send_rt6msg(int fd, int action, struct k
iov[iovcnt].iov_base = &mask;
iov[iovcnt++].iov_len = ROUNDUP(sizeof(struct sockaddr_in6));
@@ -369,7 +420,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (kroute->labelid) {
bzero(&label, sizeof(label));
label.sr_len = sizeof(label);
-@@ -2112,6 +2136,7 @@ send_rt6msg(int fd, int action, struct k
+@@ -2112,6 +2154,7 @@ send_rt6msg(int fd, int action, struct k
iov[iovcnt].iov_base = &label;
iov[iovcnt++].iov_len = sizeof(label);
}
@@ -377,7 +428,7 @@ diff -u -p -r1.1.1.7 -r1.8
retry:
if (writev(fd, iov, iovcnt) == -1) {
-@@ -2147,8 +2172,8 @@ retry:
+@@ -2147,8 +2190,8 @@ retry:
int
fetchtable(u_int rtableid, int connected_only)
{
@@ -388,7 +439,7 @@ diff -u -p -r1.1.1.7 -r1.8
char *buf, *next, *lim;
struct rt_msghdr *rtm;
struct sockaddr *sa, *gw, *rti_info[RTAX_MAX];
-@@ -2163,9 +2188,8 @@ fetchtable(u_int rtableid, int connected
+@@ -2163,9 +2206,8 @@ fetchtable(u_int rtableid, int connected
mib[3] = 0;
mib[4] = NET_RT_DUMP;
mib[5] = 0;
@@ -399,7 +450,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (rtableid != 0 && errno == EINVAL) /* table nonexistent */
return (0);
log_warn("sysctl");
-@@ -2175,7 +2199,7 @@ fetchtable(u_int rtableid, int connected
+@@ -2175,7 +2217,7 @@ fetchtable(u_int rtableid, int connected
log_warn("fetchtable");
return (-1);
}
@@ -408,7 +459,7 @@ diff -u -p -r1.1.1.7 -r1.8
log_warn("sysctl");
free(buf);
return (-1);
-@@ -2186,7 +2210,11 @@ fetchtable(u_int rtableid, int connected
+@@ -2186,7 +2228,11 @@ fetchtable(u_int rtableid, int connected
rtm = (struct rt_msghdr *)next;
if (rtm->rtm_version != RTM_VERSION)
continue;
@@ -420,7 +471,7 @@ diff -u -p -r1.1.1.7 -r1.8
get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
if ((sa = rti_info[RTAX_DST]) == NULL)
-@@ -2205,7 +2233,11 @@ fetchtable(u_int rtableid, int connected
+@@ -2205,7 +2251,11 @@ fetchtable(u_int rtableid, int connected
}
kr->r.flags = F_KERNEL;
@@ -432,7 +483,7 @@ diff -u -p -r1.1.1.7 -r1.8
kr->r.ifindex = rtm->rtm_index;
kr->r.prefix.s_addr =
((struct sockaddr_in *)sa)->sin_addr.s_addr;
-@@ -2223,8 +2255,12 @@ fetchtable(u_int rtableid, int connected
+@@ -2223,8 +2273,12 @@ fetchtable(u_int rtableid, int connected
break;
kr->r.prefixlen =
mask2prefixlen(sa_in->sin_addr.s_addr);
@@ -446,7 +497,7 @@ diff -u -p -r1.1.1.7 -r1.8
else
kr->r.prefixlen =
prefixlen_classful(kr->r.prefix.s_addr);
-@@ -2238,7 +2274,11 @@ fetchtable(u_int rtableid, int connected
+@@ -2238,7 +2292,11 @@ fetchtable(u_int rtableid, int connected
}
kr6->r.flags = F_KERNEL;
@@ -458,7 +509,7 @@ diff -u -p -r1.1.1.7 -r1.8
kr6->r.ifindex = rtm->rtm_index;
memcpy(&kr6->r.prefix,
&((struct sockaddr_in6 *)sa)->sin6_addr,
-@@ -2257,8 +2297,12 @@ fetchtable(u_int rtableid, int connected
+@@ -2257,8 +2315,12 @@ fetchtable(u_int rtableid, int connected
if (sa_in6->sin6_len == 0)
break;
kr6->r.prefixlen = mask2prefixlen6(sa_in6);
@@ -472,7 +523,7 @@ diff -u -p -r1.1.1.7 -r1.8
else
fatalx("INET6 route without netmask");
break;
-@@ -2290,7 +2334,12 @@ fetchtable(u_int rtableid, int connected
+@@ -2290,7 +2352,12 @@ fetchtable(u_int rtableid, int connected
}
if (sa->sa_family == AF_INET) {
@@ -485,7 +536,7 @@ diff -u -p -r1.1.1.7 -r1.8
send_rtmsg(kr_state.fd, RTM_DELETE, &kr->r);
free(kr);
} else if (connected_only &&
-@@ -2299,7 +2348,12 @@ fetchtable(u_int rtableid, int connected
+@@ -2299,7 +2366,12 @@ fetchtable(u_int rtableid, int connected
else
kroute_insert(kr);
} else if (sa->sa_family == AF_INET6) {
@@ -498,7 +549,7 @@ diff -u -p -r1.1.1.7 -r1.8
send_rt6msg(kr_state.fd, RTM_DELETE, &kr6->r);
free(kr6);
} else if (connected_only &&
-@@ -2418,7 +2472,11 @@ dispatch_rtmsg(void)
+@@ -2418,7 +2490,11 @@ dispatch_rtmsg(void)
case RTM_ADD:
case RTM_CHANGE:
case RTM_DELETE:
@@ -510,7 +561,7 @@ diff -u -p -r1.1.1.7 -r1.8
get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
if (rtm->rtm_pid == kr_state.pid) /* cause by us */
-@@ -2431,12 +2489,14 @@ dispatch_rtmsg(void)
+@@ -2431,12 +2507,14 @@ dispatch_rtmsg(void)
continue;
connected_only = 0;
@@ -525,7 +576,7 @@ diff -u -p -r1.1.1.7 -r1.8
if (dispatch_rtmsg_addr(rtm, rti_info,
connected_only) == -1)
-@@ -2494,31 +2554,44 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
+@@ -2494,31 +2572,44 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
mpath = 1;
#endif
@@ -574,7 +625,7 @@ diff -u -p -r1.1.1.7 -r1.8
else
fatalx("in6 net addr without netmask");
break;
-@@ -2537,8 +2610,8 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
+@@ -2537,8 +2628,8 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
}
if (rtm->rtm_type == RTM_DELETE) {
@@ -585,7 +636,7 @@ diff -u -p -r1.1.1.7 -r1.8
sa_in = (struct sockaddr_in *)sa;
if ((kr = kroute_find(prefix.v4.s_addr,
prefixlen, prio)) == NULL)
-@@ -2557,7 +2630,7 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
+@@ -2557,7 +2648,7 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
if (kroute_remove(kr) == -1)
return (-1);
break;
@@ -594,7 +645,7 @@ diff -u -p -r1.1.1.7 -r1.8
sa_in6 = (struct sockaddr_in6 *)sa;
if ((kr6 = kroute6_find(&prefix.v6, prefixlen,
prio)) == NULL)
-@@ -2590,8 +2663,8 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
+@@ -2590,8 +2681,8 @@ dispatch_rtmsg_addr(struct rt_msghdr *rt
return (0);
}
@@ -605,7 +656,7 @@ diff -u -p -r1.1.1.7 -r1.8
sa_in = (struct sockaddr_in *)sa;
if ((kr = kroute_find(prefix.v4.s_addr, prefixlen,
prio)) != NULL) {
-@@ -2654,7 +2727,7 @@ add4:
+@@ -2654,7 +2745,7 @@ add4:
kroute_insert(kr);
}
break;
diff --git a/net/openbgpd/files/patch-bgpd_parse.y b/net/openbgpd/files/patch-bgpd_parse.y
index 4f60625dae3a..fd81af9709ae 100644
--- a/net/openbgpd/files/patch-bgpd_parse.y
+++ b/net/openbgpd/files/patch-bgpd_parse.y
@@ -2,13 +2,13 @@ Index: bgpd/parse.y
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/parse.y,v
retrieving revision 1.1.1.8
-retrieving revision 1.7
-diff -u -p -r1.1.1.8 -r1.7
+retrieving revision 1.8
+diff -u -p -r1.1.1.8 -r1.8
--- bgpd/parse.y 14 Feb 2010 20:19:57 -0000 1.1.1.8
-+++ bgpd/parse.y 4 Feb 2010 16:22:23 -0000 1.7
++++ bgpd/parse.y 10 Apr 2010 12:16:23 -0000 1.8
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.231 2009/06/06 01:10:29 claudio Exp $ */
-+/* $OpenBSD: parse.y,v 1.248 2010/01/13 06:02:37 claudio Exp $ */
++/* $OpenBSD: parse.y,v 1.250 2010/03/31 18:53:23 claudio Exp $ */
/*
* Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -149,7 +149,26 @@ diff -u -p -r1.1.1.8 -r1.7
free($3);
YYERROR;
}
-@@ -575,11 +565,16 @@ conf_main : AS as4number {
+@@ -459,18 +449,6 @@ conf_main : AS as4number {
+ }
+ free($4);
+ }
+- | NETWORK STATIC filter_set {
+- /* keep for compatibility till after next release */
+- conf->flags |= BGPD_FLAG_REDIST_STATIC;
+- move_filterset($3, &conf->staticset);
+- free($3);
+- }
+- | NETWORK CONNECTED filter_set {
+- /* keep for compatibility till after next release */
+- conf->flags |= BGPD_FLAG_REDIST_CONNECTED;
+- move_filterset($3, &conf->connectset);
+- free($3);
+- }
+ | DUMP STRING STRING optnumber {
+ int action;
+
+@@ -575,11 +553,16 @@ conf_main : AS as4number {
free($4);
}
| RTABLE NUMBER {
@@ -166,7 +185,7 @@ diff -u -p -r1.1.1.8 -r1.7
}
| CONNECTRETRY NUMBER {
if ($2 > USHRT_MAX || $2 < 1) {
-@@ -635,11 +630,11 @@ address : STRING {
+@@ -635,11 +618,11 @@ address : STRING {
}
free($1);
@@ -181,7 +200,7 @@ diff -u -p -r1.1.1.8 -r1.7
YYERROR;
}
}
-@@ -686,7 +681,7 @@ prefix : STRING '/' NUMBER {
+@@ -686,7 +669,7 @@ prefix : STRING '/' NUMBER {
addrspec : address {
memcpy(&$$.prefix, &$1, sizeof(struct bgpd_addr));
@@ -190,7 +209,7 @@ diff -u -p -r1.1.1.8 -r1.7
$$.len = 32;
else
$$.len = 128;
-@@ -710,9 +705,13 @@ neighbor : { curpeer = new_peer(); }
+@@ -710,9 +693,13 @@ neighbor : { curpeer = new_peer(); }
memcpy(&curpeer->conf.remote_addr, &$3.prefix,
sizeof(curpeer->conf.remote_addr));
curpeer->conf.remote_masklen = $3.len;
@@ -206,7 +225,7 @@ diff -u -p -r1.1.1.8 -r1.7
if (get_id(curpeer)) {
yyerror("get_id failed");
YYERROR;
-@@ -802,6 +801,17 @@ peeropts : REMOTEAS as4number {
+@@ -802,6 +789,17 @@ peeropts : REMOTEAS as4number {
}
free($2);
}
@@ -224,7 +243,7 @@ diff -u -p -r1.1.1.8 -r1.7
| LOCALADDR address {
memcpy(&curpeer->conf.local_addr, &$2,
sizeof(curpeer->conf.local_addr));
-@@ -852,13 +862,17 @@ peeropts : REMOTEAS as4number {
+@@ -852,13 +850,17 @@ peeropts : REMOTEAS as4number {
curpeer->conf.min_holdtime = $3;
}
| ANNOUNCE family STRING {
@@ -247,7 +266,7 @@ diff -u -p -r1.1.1.8 -r1.7
yyerror("unknown/unsupported SAFI \"%s\"",
$3);
free($3);
-@@ -866,25 +880,31 @@ peeropts : REMOTEAS as4number {
+@@ -866,25 +868,31 @@ peeropts : REMOTEAS as4number {
}
free($3);
@@ -289,7 +308,7 @@ diff -u -p -r1.1.1.8 -r1.7
curpeer->conf.announce_type = ANNOUNCE_NONE;
else if (!strcmp($2, "all"))
curpeer->conf.announce_type = ANNOUNCE_ALL;
-@@ -1083,7 +1103,7 @@ peeropts : REMOTEAS as4number {
+@@ -1083,7 +1091,7 @@ peeropts : REMOTEAS as4number {
curpeer->conf.reflector_client = 1;
}
| REFLECTOR address {
@@ -298,7 +317,7 @@ diff -u -p -r1.1.1.8 -r1.7
yyerror("route reflector cluster-id must be "
"an IPv4 address");
YYERROR;
-@@ -1336,12 +1356,12 @@ filter_prefix_l : filter_prefix { $$
+@@ -1336,12 +1344,12 @@ filter_prefix_l : filter_prefix { $$
;
filter_prefix : prefix {
@@ -313,7 +332,7 @@ diff -u -p -r1.1.1.8 -r1.7
if (($$ = calloc(1, sizeof(struct filter_prefix_l))) ==
NULL)
fatal(NULL);
-@@ -1437,18 +1457,18 @@ filter_elm : filter_prefix_h {
+@@ -1437,18 +1445,18 @@ filter_elm : filter_prefix_h {
fmopts.prefix_l = $1;
}
| PREFIXLEN prefixlenop {
@@ -335,7 +354,7 @@ diff -u -p -r1.1.1.8 -r1.7
}
| filter_as_h {
if (fmopts.as_l != NULL) {
-@@ -1463,26 +1483,25 @@ filter_elm : filter_prefix_h {
+@@ -1463,26 +1471,43 @@ filter_elm : filter_prefix_h {
free($2);
YYERROR;
}
@@ -347,6 +366,24 @@ diff -u -p -r1.1.1.8 -r1.7
}
free($2);
}
++ | EXTCOMMUNITY STRING STRING {
++ if (fmopts.m.ext_community.flags &
++ EXT_COMMUNITY_FLAG_VALID) {
++ yyerror("\"ext-community\" already specified");
++ free($2);
++ free($3);
++ YYERROR;
++ }
++
++ if (parseextcommunity(&fmopts.m.ext_community,
++ $2, $3) == -1) {
++ free($2);
++ free($3);
++ YYERROR;
++ }
++ free($2);
++ free($3);
++ }
| IPV4 {
- if (fmopts.af) {
+ if (fmopts.aid) {
@@ -367,7 +404,7 @@ diff -u -p -r1.1.1.8 -r1.7
}
;
-@@ -1782,8 +1801,7 @@ filter_set_opt : LOCALPREF NUMBER {
+@@ -1782,8 +1807,7 @@ filter_set_opt : LOCALPREF NUMBER {
else
$$->type = ACTION_SET_COMMUNITY;
@@ -377,7 +414,7 @@ diff -u -p -r1.1.1.8 -r1.7
free($3);
free($$);
YYERROR;
-@@ -1796,40 +1814,62 @@ filter_set_opt : LOCALPREF NUMBER {
+@@ -1796,40 +1820,62 @@ filter_set_opt : LOCALPREF NUMBER {
free($$);
YYERROR;
}
@@ -460,7 +497,7 @@ diff -u -p -r1.1.1.8 -r1.7
;
%%
-@@ -1873,6 +1913,7 @@ lookup(char *s)
+@@ -1873,6 +1919,7 @@ lookup(char *s)
{ "allow", ALLOW},
{ "announce", ANNOUNCE},
{ "any", ANY},
@@ -468,7 +505,7 @@ diff -u -p -r1.1.1.8 -r1.7
{ "blackhole", BLACKHOLE},
{ "capabilities", CAPABILITIES},
{ "community", COMMUNITY},
-@@ -1889,6 +1930,7 @@ lookup(char *s)
+@@ -1889,6 +1936,7 @@ lookup(char *s)
{ "enforce", ENFORCE},
{ "esp", ESP},
{ "evaluate", EVALUATE},
@@ -476,7 +513,7 @@ diff -u -p -r1.1.1.8 -r1.7
{ "fib-update", FIBUPDATE},
{ "from", FROM},
{ "group", GROUP},
-@@ -1899,6 +1941,9 @@ lookup(char *s)
+@@ -1899,6 +1947,9 @@ lookup(char *s)
{ "include", INCLUDE},
{ "inet", IPV4},
{ "inet6", IPV6},
@@ -486,7 +523,7 @@ diff -u -p -r1.1.1.8 -r1.7
{ "ipsec", IPSEC},
{ "key", KEY},
{ "listen", LISTEN},
-@@ -1918,6 +1963,7 @@ lookup(char *s)
+@@ -1918,6 +1969,7 @@ lookup(char *s)
{ "nexthop", NEXTHOP},
{ "no-modify", NOMODIFY},
{ "on", ON},
@@ -494,7 +531,7 @@ diff -u -p -r1.1.1.8 -r1.7
{ "out", OUT},
{ "passive", PASSIVE},
{ "password", PASSWORD},
-@@ -1930,6 +1976,7 @@ lookup(char *s)
+@@ -1930,6 +1982,7 @@ lookup(char *s)
{ "qualify", QUALIFY},
{ "quick", QUICK},
{ "rde", RDE},
@@ -502,7 +539,7 @@ diff -u -p -r1.1.1.8 -r1.7
{ "reject", REJECT},
{ "remote-as", REMOTEAS},
{ "restart", RESTART},
-@@ -2135,6 +2182,26 @@ top:
+@@ -2135,6 +2188,26 @@ top:
if (yylval.v.string == NULL)
fatal("yylex: strdup");
return (STRING);
@@ -529,7 +566,7 @@ diff -u -p -r1.1.1.8 -r1.7
}
#define allowed_to_end_number(x) \
-@@ -2505,27 +2572,27 @@ getcommunity(char *s)
+@@ -2505,27 +2578,27 @@ getcommunity(char *s)
}
int
@@ -567,7 +604,7 @@ diff -u -p -r1.1.1.8 -r1.7
return (0);
}
-@@ -2537,23 +2604,175 @@ parsecommunity(char *s, int *as, int *ty
+@@ -2537,23 +2610,176 @@ parsecommunity(char *s, int *as, int *ty
if ((i = getcommunity(s)) == COMMUNITY_ERROR)
return (-1);
@@ -730,6 +767,7 @@ diff -u -p -r1.1.1.8 -r1.7
+ if (iana[i].type == type && iana[i].subtype == subtype) {
+ if (iana[i].transitive)
+ c->type |= EXT_COMMUNITY_TRANSITIVE;
++ c->flags |= EXT_COMMUNITY_FLAG_VALID;
+ return (0);
+ }
+ }
@@ -746,7 +784,7 @@ diff -u -p -r1.1.1.8 -r1.7
if ((p = calloc(1, sizeof(struct peer))) == NULL)
fatal("new_peer");
-@@ -2564,11 +2783,11 @@ alloc_peer(void)
+@@ -2564,11 +2790,11 @@ alloc_peer(void)
p->conf.distance = 1;
p->conf.announce_type = ANNOUNCE_UNDEF;
p->conf.announce_capa = 1;
@@ -761,7 +799,7 @@ diff -u -p -r1.1.1.8 -r1.7
p->conf.local_as = conf->as;
p->conf.local_short_as = conf->short_as;
p->conf.softreconfig_in = 1;
-@@ -2592,6 +2811,9 @@ new_peer(void)
+@@ -2592,6 +2818,9 @@ new_peer(void)
if (strlcpy(p->conf.descr, curgroup->conf.descr,
sizeof(p->conf.descr)) >= sizeof(p->conf.descr))
fatalx("new_peer descr strlcpy");
@@ -771,7 +809,7 @@ diff -u -p -r1.1.1.8 -r1.7
p->conf.groupid = curgroup->conf.id;
p->conf.local_as = curgroup->conf.local_as;
p->conf.local_short_as = curgroup->conf.local_short_as;
-@@ -2715,7 +2937,7 @@ get_id(struct peer *newpeer)
+@@ -2715,7 +2944,7 @@ get_id(struct peer *newpeer)
struct peer *p;
for (p = peer_l_old; p != NULL; p = p->next)
@@ -780,7 +818,7 @@ diff -u -p -r1.1.1.8 -r1.7
if (!memcmp(&p->conf.remote_addr,
&newpeer->conf.remote_addr,
sizeof(p->conf.remote_addr))) {
-@@ -2856,9 +3078,11 @@ str2key(char *s, char *dest, size_t max_
+@@ -2856,9 +3085,11 @@ str2key(char *s, char *dest, size_t max_
int
neighbor_consistent(struct peer *p)
{
@@ -794,7 +832,7 @@ diff -u -p -r1.1.1.8 -r1.7
yyerror("local-address and neighbor address "
"must be of the same address family");
return (-1);
-@@ -2869,7 +3093,7 @@ neighbor_consistent(struct peer *p)
+@@ -2869,7 +3100,7 @@ neighbor_consistent(struct peer *p)
p->conf.auth.method == AUTH_IPSEC_IKE_AH ||
p->conf.auth.method == AUTH_IPSEC_MANUAL_ESP ||
p->conf.auth.method == AUTH_IPSEC_MANUAL_AH) &&
@@ -803,7 +841,7 @@ diff -u -p -r1.1.1.8 -r1.7
yyerror("neighbors with any form of IPsec configured "
"need local-address to be specified");
return (-1);
-@@ -2889,10 +3113,6 @@ neighbor_consistent(struct peer *p)
+@@ -2889,10 +3120,6 @@ neighbor_consistent(struct peer *p)
return (-1);
}
@@ -814,7 +852,7 @@ diff -u -p -r1.1.1.8 -r1.7
/* set default values if they where undefined */
p->conf.ebgp = (p->conf.remote_as != conf->as);
if (p->conf.announce_type == ANNOUNCE_UNDEF)
-@@ -2909,6 +3129,11 @@ neighbor_consistent(struct peer *p)
+@@ -2909,6 +3136,11 @@ neighbor_consistent(struct peer *p)
return (-1);
}
@@ -826,7 +864,7 @@ diff -u -p -r1.1.1.8 -r1.7
return (0);
}
-@@ -2927,6 +3152,11 @@ merge_filterset(struct filter_set_head *
+@@ -2927,6 +3159,11 @@ merge_filterset(struct filter_set_head *
yyerror("community is already set");
else if (s->type == ACTION_DEL_COMMUNITY)
yyerror("community will already be deleted");
@@ -838,7 +876,7 @@ diff -u -p -r1.1.1.8 -r1.7
else
yyerror("redefining set parameter %s",
filterset_name(s->type));
-@@ -2953,9 +3183,18 @@ merge_filterset(struct filter_set_head *
+@@ -2953,9 +3190,18 @@ merge_filterset(struct filter_set_head *
return (0);
}
break;
diff --git a/net/openbgpd/files/patch-bgpd_printconf.c b/net/openbgpd/files/patch-bgpd_printconf.c
index 58cfb9a75c70..ee5be19032af 100644
--- a/net/openbgpd/files/patch-bgpd_printconf.c
+++ b/net/openbgpd/files/patch-bgpd_printconf.c
@@ -2,13 +2,13 @@ Index: bgpd/printconf.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/printconf.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.6
-diff -u -p -r1.1.1.7 -r1.6
+retrieving revision 1.7
+diff -u -p -r1.1.1.7 -r1.7
--- 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
++++ bgpd/printconf.c 10 Apr 2010 12:16:23 -0000 1.7
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: printconf.c,v 1.79 2010/03/05 15:25:00 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -48,23 +48,23 @@ diff -u -p -r1.1.1.7 -r1.6
+{
+ switch (c->type & EXT_COMMUNITY_VALUE) {
+ case EXT_COMMUNITY_TWO_AS:
-+ printf("%s %i:%i", log_ext_subtype(c->subtype),
++ 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),
++ 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),
++ 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),
++ 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);
++ printf("0x%x 0x%llx ", c->type, c->data.ext_opaq);
+ break;
+ }
+}
@@ -86,7 +86,7 @@ diff -u -p -r1.1.1.7 -r1.6
print_set(struct filter_set_head *set)
{
struct filter_set *s;
-@@ -161,11 +205,25 @@ print_set(struct filter_set_head *set)
+@@ -161,11 +205,23 @@ print_set(struct filter_set_head *set)
case ACTION_RTLABEL:
printf("rtlabel %s ", s->action.rtlabel);
break;
@@ -102,17 +102,24 @@ diff -u -p -r1.1.1.7 -r1.6
+ 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
+@@ -236,7 +292,7 @@ print_mainconf(struct bgpd_config *conf)
+ print_set(&conf->connectset6);
+ printf("\n");
+ }
+- if (conf->flags & BGPD_FLAG_REDIST_STATIC) {
++ if (conf->flags & BGPD_FLAG_REDIST6_STATIC) {
+ printf("network inet6 static");
+ if (!TAILQ_EMPTY(&conf->staticset6))
+ printf(" ");
+@@ -263,8 +319,8 @@ print_peer(struct peer_config *p, struct
char *method;
struct in_addr ina;
@@ -123,7 +130,7 @@ diff -u -p -r1.1.1.7 -r1.6
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
+@@ -281,7 +337,7 @@ print_peer(struct peer_config *p, struct
printf("%s\tmultihop %u\n", c, p->distance);
if (p->passive)
printf("%s\tpassive\n", c);
@@ -132,7 +139,7 @@ diff -u -p -r1.1.1.7 -r1.6
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
+@@ -295,6 +351,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);
@@ -145,7 +152,7 @@ diff -u -p -r1.1.1.7 -r1.6
if (p->announce_type == ANNOUNCE_SELF)
printf("%s\tannounce self\n", c);
else if (p->announce_type == ANNOUNCE_NONE)
-@@ -324,6 +388,10 @@ print_peer(struct peer_config *p, struct
+@@ -324,6 +386,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);
@@ -156,7 +163,7 @@ diff -u -p -r1.1.1.7 -r1.6
if (p->auth.method == AUTH_MD5SIG)
printf("%s\ttcp md5sig\n", c);
-@@ -354,8 +422,7 @@ print_peer(struct peer_config *p, struct
+@@ -354,8 +420,7 @@ print_peer(struct peer_config *p, struct
if (p->ttlsec)
printf("%s\tttl-security yes\n", c);
@@ -166,7 +173,7 @@ diff -u -p -r1.1.1.7 -r1.6
if (p->softreconfig_in == 1)
printf("%s\tsoftreconfig in yes\n", c);
-@@ -399,17 +466,14 @@ print_enc_alg(u_int8_t alg)
+@@ -399,17 +464,14 @@ print_enc_alg(u_int8_t alg)
}
}
@@ -191,7 +198,7 @@ diff -u -p -r1.1.1.7 -r1.6
}
void
-@@ -455,14 +519,14 @@ print_rule(struct peer *peer_l, struct f
+@@ -455,14 +517,14 @@ print_rule(struct peer *peer_l, struct f
} else
printf("any ");
@@ -210,3 +217,14 @@ diff -u -p -r1.1.1.7 -r1.6
printf("inet6 ");
}
+@@ -497,6 +559,10 @@ print_rule(struct peer *peer_l, struct f
+ print_community(r->match.community.as,
+ r->match.community.type);
+ }
++ if (r->match.ext_community.flags & EXT_COMMUNITY_FLAG_VALID) {
++ printf("ext-community ");
++ print_extcommunity(&r->match.ext_community);
++ }
+
+ print_set(&r->set);
+
diff --git a/net/openbgpd/files/patch-bgpd_rde.c b/net/openbgpd/files/patch-bgpd_rde.c
index 7a2e01710e95..55e10012aa47 100644
--- a/net/openbgpd/files/patch-bgpd_rde.c
+++ b/net/openbgpd/files/patch-bgpd_rde.c
@@ -2,13 +2,13 @@ Index: bgpd/rde.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde.c,v
retrieving revision 1.1.1.8
-retrieving revision 1.8
-diff -u -p -r1.1.1.8 -r1.8
+retrieving revision 1.9
+diff -u -p -r1.1.1.8 -r1.9
--- bgpd/rde.c 14 Feb 2010 20:19:57 -0000 1.1.1.8
-+++ bgpd/rde.c 14 Feb 2010 19:53:36 -0000 1.8
++++ bgpd/rde.c 10 Apr 2010 12:16:23 -0000 1.9
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.264 2009/06/29 12:22:16 claudio Exp $ */
-+/* $OpenBSD: rde.c,v 1.284 2010/01/13 06:02:37 claudio Exp $ */
++/* $OpenBSD: rde.c,v 1.290 2010/03/30 15:43:30 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -307,6 +307,27 @@ diff -u -p -r1.1.1.8 -r1.8
default:
break;
}
+@@ -587,7 +568,7 @@ rde_dispatch_imsg_parent(struct imsgbuf
+ fatal(NULL);
+ memcpy(nconf, imsg.data, sizeof(struct bgpd_config));
+ for (rid = 0; rid < rib_size; rid++)
+- ribs[rid].state = RIB_DELETE;
++ ribs[rid].state = RECONF_DELETE;
+ break;
+ case IMSG_NETWORK_ADD:
+ memcpy(&netconf_p, imsg.data, sizeof(netconf_p));
+@@ -615,9 +596,9 @@ rde_dispatch_imsg_parent(struct imsgbuf
+ memcpy(&rn, imsg.data, sizeof(rn));
+ rid = rib_find(rn.name);
+ if (rid == RIB_FAILED)
+- rib_new(-1, rn.name, rn.flags);
++ rib_new(rn.name, rn.flags);
+ else
+- ribs[rid].state = RIB_ACTIVE;
++ ribs[rid].state = RECONF_KEEP;
+ break;
+ case IMSG_RECONF_FILTER:
+ if (imsg.hdr.len - IMSG_HEADER_SIZE !=
@@ -644,9 +625,17 @@ rde_dispatch_imsg_parent(struct imsgbuf
nconf->flags &= ~BGPD_FLAG_NO_EVALUATE;
}
@@ -332,9 +353,9 @@ diff -u -p -r1.1.1.8 -r1.8
- /* XXX this needs rework anyway */
+ /* bring ribs in sync before softreconfig dance */
+ for (rid = 0; rid < rib_size; rid++) {
-+ if (ribs[rid].state == RIB_DELETE)
++ if (ribs[rid].state == RECONF_DELETE)
+ rib_free(&ribs[rid]);
-+ else if (ribs[rid].state == RIB_NEW)
++ else if (ribs[rid].state == RECONF_REINIT)
+ rib_dump(&ribs[0],
+ rde_softreconfig_load, &ribs[rid],
+ AID_UNSPEC);
@@ -349,7 +370,7 @@ diff -u -p -r1.1.1.8 -r1.8
int i;
- for (i = 1; i < rib_size; i++)
+ for (i = 1; i < rib_size; i++) {
-+ if (ribs[i].state == RIB_NEW)
++ if (ribs[i].state == RECONF_REINIT)
+ /* already synced by _load */
+ continue;
rib_dump(&ribs[i], rde_softreconfig_out,
@@ -1159,7 +1180,7 @@ diff -u -p -r1.1.1.8 -r1.8
for (i = 1; i < rib_size; i++) {
+ /* only active ribs need a softreconfig rerun */
-+ if (ribs[i].state != RIB_ACTIVE)
++ if (ribs[i].state != RECONF_KEEP)
+ continue;
+
/* check if prefix changed */
@@ -1495,7 +1516,7 @@ diff -u -p -r1.1.1.8 -r1.8
asp->flags |= F_ANN_DYNAMIC;
- rde_apply_set(asp, &nc->attrset, nc->prefix.af, peerself, peerself);
-+ rde_apply_set(asp, &nc->attrset, aid2af(nc->prefix.aid), peerself, peerself);
++ rde_apply_set(asp, &nc->attrset, nc->prefix.aid, peerself, peerself);
for (i = 1; i < rib_size; i++)
path_update(&ribs[i], peerself, asp, &nc->prefix,
nc->prefixlen);
diff --git a/net/openbgpd/files/patch-bgpd_rde.h b/net/openbgpd/files/patch-bgpd_rde.h
index 479725479263..a19b053cac1d 100644
--- a/net/openbgpd/files/patch-bgpd_rde.h
+++ b/net/openbgpd/files/patch-bgpd_rde.h
@@ -2,13 +2,13 @@ Index: bgpd/rde.h
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde.h,v
retrieving revision 1.1.1.8
-retrieving revision 1.1.1.9
-diff -u -p -r1.1.1.8 -r1.1.1.9
+retrieving revision 1.1.1.10
+diff -u -p -r1.1.1.8 -r1.1.1.10
--- 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
++++ bgpd/rde.h 10 Apr 2010 12:13:05 -0000 1.1.1.10
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: rde.h,v 1.133 2010/03/29 09:24:07 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
@@ -89,15 +89,25 @@ diff -u -p -r1.1.1.8 -r1.1.1.9
};
struct rib_entry {
-@@ -264,6 +275,7 @@ struct rib_entry {
+@@ -262,16 +273,10 @@ struct rib_entry {
+ u_int16_t flags;
+ };
- enum rib_state {
- RIB_NONE,
-+ RIB_NEW,
- RIB_ACTIVE,
- RIB_DELETE
+-enum rib_state {
+- RIB_NONE,
+- RIB_ACTIVE,
+- RIB_DELETE
+-};
+-
+ struct rib {
+ char name[PEER_DESCR_LEN];
+ struct rib_tree rib;
+- enum rib_state state;
++ enum reconf_action state;
+ u_int16_t flags;
+ u_int16_t id;
};
-@@ -342,9 +354,13 @@ int aspath_loopfree(struct aspath *, u
+@@ -342,21 +347,29 @@ 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);
@@ -105,14 +115,23 @@ diff -u -p -r1.1.1.8 -r1.1.1.9
+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_match(struct rde_aspath *,
++ struct filter_extcommunity *, u_int16_t);
+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);
++int community_ext_conv(struct filter_extcommunity *, u_int16_t,
++ u_int64_t *);
/* rde_rib.c */
extern u_int16_t rib_size;
-@@ -356,7 +372,7 @@ void rib_free(struct rib *);
+ extern struct rib *ribs;
+
+-u_int16_t rib_new(int, char *, u_int16_t);
++u_int16_t rib_new(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 *),
@@ -121,7 +140,7 @@ diff -u -p -r1.1.1.8 -r1.1.1.9
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
+@@ -395,7 +408,7 @@ void prefix_network_clean(struct rde_p
void nexthop_init(u_int32_t);
void nexthop_shutdown(void);
void nexthop_modify(struct rde_aspath *, struct bgpd_addr *,
@@ -130,7 +149,7 @@ diff -u -p -r1.1.1.8 -r1.1.1.9
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
+@@ -415,12 +428,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 *,
@@ -149,7 +168,7 @@ diff -u -p -r1.1.1.8 -r1.1.1.9
/* rde_prefix.c */
#define pt_empty(pt) ((pt)->refcnt == 0)
-@@ -452,8 +471,7 @@ enum filter_actions rde_filter(u_int16_t
+@@ -452,8 +468,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 *,
diff --git a/net/openbgpd/files/patch-bgpd_rde_attr.c b/net/openbgpd/files/patch-bgpd_rde_attr.c
index 7aa74567837d..f62d59f083f0 100644
--- a/net/openbgpd/files/patch-bgpd_rde_attr.c
+++ b/net/openbgpd/files/patch-bgpd_rde_attr.c
@@ -2,13 +2,13 @@ Index: bgpd/rde_attr.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_attr.c,v
retrieving revision 1.1.1.6
-retrieving revision 1.4
-diff -u -p -r1.1.1.6 -r1.4
+retrieving revision 1.5
+diff -u -p -r1.1.1.6 -r1.5
--- 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
++++ bgpd/rde_attr.c 10 Apr 2010 12:16:23 -0000 1.5
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: rde_attr.c,v 1.83 2010/03/29 09:24:07 claudio Exp $ */
/*
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
@@ -34,7 +34,7 @@ diff -u -p -r1.1.1.6 -r1.4
#include "bgpd.h"
#include "rde.h"
-@@ -971,13 +978,26 @@ aspath_match(struct aspath *a, enum as_s
+@@ -971,15 +978,26 @@ aspath_match(struct aspath *a, enum as_s
return (0);
}
@@ -42,7 +42,7 @@ diff -u -p -r1.1.1.6 -r1.4
+ * Functions handling communities and extended communities.
+ */
+
-+int community_ext_conv(struct filter_extcommunity *, u_int16_t, u_int64_t *);
++int community_ext_matchone(struct filter_extcommunity *, u_int16_t, u_int64_t);
+
int
-community_match(void *data, u_int16_t len, int as, int type)
@@ -59,13 +59,14 @@ diff -u -p -r1.1.1.6 -r1.4
+ if (a == NULL)
+ /* no communities, no match */
+ return (0);
-+
-+ len = a->len / 4;
-+ p = a->data;
- for (; len > 0; len--) {
+- for (; len > 0; len--) {
++ p = a->data;
++ for (len = a->len / 4; len > 0; len--) {
eas = *p++;
-@@ -1000,7 +1020,6 @@ community_set(struct rde_aspath *asp, in
+ eas <<= 8;
+ eas |= *p++;
+@@ -1000,7 +1018,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;
@@ -73,7 +74,7 @@ diff -u -p -r1.1.1.6 -r1.4
attr = attr_optget(asp, ATTR_COMMUNITIES);
if (attr != NULL) {
-@@ -1017,7 +1036,7 @@ community_set(struct rde_aspath *asp, in
+@@ -1017,7 +1034,7 @@ community_set(struct rde_aspath *asp, in
p += 4;
}
@@ -82,7 +83,7 @@ diff -u -p -r1.1.1.6 -r1.4
/* overflow */
return (0);
-@@ -1032,11 +1051,10 @@ community_set(struct rde_aspath *asp, in
+@@ -1032,11 +1049,10 @@ community_set(struct rde_aspath *asp, in
if (attr != NULL) {
memcpy(p + 4, attr->data, attr->len);
f = attr->flags;
@@ -95,7 +96,7 @@ diff -u -p -r1.1.1.6 -r1.4
free(p);
return (1);
-@@ -1049,7 +1067,7 @@ community_delete(struct rde_aspath *asp,
+@@ -1049,7 +1065,7 @@ community_delete(struct rde_aspath *asp,
u_int8_t *p, *n;
u_int16_t l, len = 0;
u_int16_t eas, etype;
@@ -104,7 +105,7 @@ diff -u -p -r1.1.1.6 -r1.4
attr = attr_optget(asp, ATTR_COMMUNITIES);
if (attr == NULL)
-@@ -1100,10 +1118,146 @@ community_delete(struct rde_aspath *asp,
+@@ -1100,10 +1116,250 @@ community_delete(struct rde_aspath *asp,
}
f = attr->flags;
@@ -117,6 +118,31 @@ diff -u -p -r1.1.1.6 -r1.4
+}
+
+int
++community_ext_match(struct rde_aspath *asp, struct filter_extcommunity *c,
++ u_int16_t neighas)
++{
++ struct attr *attr;
++ u_int8_t *p;
++ u_int64_t ec;
++ u_int16_t len;
++
++ attr = attr_optget(asp, ATTR_EXT_COMMUNITIES);
++ if (attr == NULL)
++ /* no communities, no match */
++ return (0);
++
++ p = attr->data;
++ for (len = attr->len / sizeof(ec); len > 0; len--) {
++ memcpy(&ec, p, sizeof(ec));
++ if (community_ext_matchone(c, neighas, ec))
++ return (1);
++ p += sizeof(ec);
++ }
++
++ return (0);
++}
++
++int
+community_ext_set(struct rde_aspath *asp, struct filter_extcommunity *c,
+ u_int16_t neighas)
+{
@@ -132,7 +158,7 @@ diff -u -p -r1.1.1.6 -r1.4
+ attr = attr_optget(asp, ATTR_EXT_COMMUNITIES);
+ if (attr != NULL) {
+ p = attr->data;
-+ ncommunities = attr->len / 8; /* 64bit per ext-community */
++ ncommunities = attr->len / sizeof(community);
+ }
+
+ /* first check if the community is not already set */
@@ -253,3 +279,82 @@ diff -u -p -r1.1.1.6 -r1.4
+
+ return (0);
+}
++
++int
++community_ext_matchone(struct filter_extcommunity *c, u_int16_t neighas,
++ u_int64_t community)
++{
++ u_int64_t com, mask;
++ u_int32_t ip;
++
++ community = betoh64(community);
++
++ com = (u_int64_t)c->type << 56;
++ mask = 0xffULL << 56;
++ if ((com & mask) != (community & mask))
++ return (0);
++
++ switch (c->type & EXT_COMMUNITY_VALUE) {
++ case EXT_COMMUNITY_TWO_AS:
++ case EXT_COMMUNITY_IPV4:
++ case EXT_COMMUNITY_FOUR_AS:
++ case EXT_COMMUNITY_OPAQUE:
++ com = (u_int64_t)c->subtype << 48;
++ mask = 0xffULL << 48;
++ if ((com & mask) != (community & mask))
++ return (0);
++ break;
++ default:
++ com = c->data.ext_opaq & 0xffffffffffffffULL;
++ mask = 0xffffffffffffffULL;
++ if ((com & mask) == (community & mask))
++ return (1);
++ return (0);
++ }
++
++
++ switch (c->type & EXT_COMMUNITY_VALUE) {
++ case EXT_COMMUNITY_TWO_AS:
++ com = (u_int64_t)c->data.ext_as.as << 32;
++ mask = 0xffffULL << 32;
++ if ((com & mask) != (community & mask))
++ return (0);
++
++ com = c->data.ext_as.val;
++ mask = 0xffffffffULL;
++ if ((com & mask) == (community & mask))
++ return (1);
++ break;
++ case EXT_COMMUNITY_IPV4:
++ ip = ntohl(c->data.ext_ip.addr.s_addr);
++ com = (u_int64_t)ip << 16;
++ mask = 0xffffffff0000ULL;
++ if ((com & mask) != (community & mask))
++ return (0);
++
++ com = c->data.ext_ip.val;
++ mask = 0xffff;
++ if ((com & mask) == (community & mask))
++ return (1);
++ break;
++ case EXT_COMMUNITY_FOUR_AS:
++ com = (u_int64_t)c->data.ext_as4.as4 << 16;
++ mask = 0xffffffffULL << 16;
++ if ((com & mask) != (community & mask))
++ return (0);
++
++ com = c->data.ext_as4.val;
++ mask = 0xffff;
++ if ((com & mask) == (community & mask))
++ return (1);
++ break;
++ case EXT_COMMUNITY_OPAQUE:
++ com = c->data.ext_opaq & EXT_COMMUNITY_OPAQUE_MAX;
++ mask = EXT_COMMUNITY_OPAQUE_MAX;
++ if ((com & mask) == (community & mask))
++ return (1);
++ break;
++ }
++
++ return (0);
++}
diff --git a/net/openbgpd/files/patch-bgpd_rde_filter.c b/net/openbgpd/files/patch-bgpd_rde_filter.c
index a19d044bb451..e3cd6712b9f6 100644
--- a/net/openbgpd/files/patch-bgpd_rde_filter.c
+++ b/net/openbgpd/files/patch-bgpd_rde_filter.c
@@ -2,13 +2,13 @@ Index: bgpd/rde_filter.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_filter.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.5
-diff -u -p -r1.1.1.7 -r1.5
+retrieving revision 1.6
+diff -u -p -r1.1.1.7 -r1.6
--- 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
++++ bgpd/rde_filter.c 10 Apr 2010 12:16:23 -0000 1.6
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: rde_filter.c,v 1.62 2010/03/05 15:25:00 claudio Exp $ */
/*
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
@@ -71,7 +71,7 @@ diff -u -p -r1.1.1.7 -r1.5
}
}
}
-@@ -281,12 +299,12 @@ rde_filter_match(struct filter_rule *f,
+@@ -281,12 +299,17 @@ rde_filter_match(struct filter_rule *f,
break;
}
@@ -79,6 +79,11 @@ diff -u -p -r1.1.1.7 -r1.5
+ if (community_match(asp, as, type) == 0)
return (0);
}
++ if (asp != NULL &&
++ (f->match.ext_community.flags & EXT_COMMUNITY_FLAG_VALID))
++ if (community_ext_match(asp, &f->match.ext_community,
++ peer->conf.remote_as) == 0)
++ return (0);
- if (f->match.prefix.addr.af != 0) {
- if (f->match.prefix.addr.af != prefix->af)
@@ -87,7 +92,7 @@ diff -u -p -r1.1.1.7 -r1.5
/* don't use IPv4 rules for IPv6 and vice versa */
return (0);
-@@ -322,7 +340,7 @@ rde_filter_match(struct filter_rule *f,
+@@ -322,7 +345,7 @@ rde_filter_match(struct filter_rule *f,
} else if (f->match.prefixlen.op != OP_NONE) {
/* only prefixlen without a prefix */
@@ -96,7 +101,7 @@ diff -u -p -r1.1.1.7 -r1.5
/* don't use IPv4 rules for IPv6 and vice versa */
return (0);
-@@ -356,19 +374,6 @@ rde_filter_match(struct filter_rule *f,
+@@ -356,19 +379,6 @@ rde_filter_match(struct filter_rule *f,
}
int
@@ -116,7 +121,7 @@ diff -u -p -r1.1.1.7 -r1.5
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
+@@ -476,6 +486,12 @@ filterset_cmp(struct filter_set *a, stru
return (a->action.community.type - b->action.community.type);
}
@@ -129,7 +134,7 @@ diff -u -p -r1.1.1.7 -r1.5
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
+@@ -483,7 +499,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.
*/
@@ -138,7 +143,7 @@ diff -u -p -r1.1.1.7 -r1.5
}
/* equal */
-@@ -574,6 +585,19 @@ filterset_equal(struct filter_set_head *
+@@ -574,6 +590,19 @@ filterset_equal(struct filter_set_head *
if (strcmp(as, bs) == 0)
continue;
break;
@@ -158,7 +163,7 @@ diff -u -p -r1.1.1.7 -r1.5
}
/* compare failed */
return (0);
-@@ -616,7 +640,14 @@ filterset_name(enum action_types type)
+@@ -616,7 +645,14 @@ filterset_name(enum action_types type)
case ACTION_RTLABEL:
case ACTION_RTLABEL_ID:
return ("rtlabel");
diff --git a/net/openbgpd/files/patch-bgpd_rde_prefix.c b/net/openbgpd/files/patch-bgpd_rde_prefix.c
index 7df1c4ee65e0..a2612312ffcc 100644
--- a/net/openbgpd/files/patch-bgpd_rde_prefix.c
+++ b/net/openbgpd/files/patch-bgpd_rde_prefix.c
@@ -2,13 +2,13 @@ Index: bgpd/rde_prefix.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_prefix.c,v
retrieving revision 1.1.1.6
-retrieving revision 1.4
-diff -u -p -r1.1.1.6 -r1.4
+retrieving revision 1.5
+diff -u -p -r1.1.1.6 -r1.5
--- 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
++++ bgpd/rde_prefix.c 10 Apr 2010 12:16:23 -0000 1.5
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: rde_prefix.c,v 1.32 2010/03/26 15:41:04 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -123,7 +123,7 @@ diff -u -p -r1.1.1.6 -r1.4
}
struct pt_entry *
-@@ -131,34 +155,9 @@ struct pt_entry *
+@@ -131,39 +155,12 @@ struct pt_entry *
pt_add(struct bgpd_addr *prefix, int prefixlen)
{
struct pt_entry *p = NULL;
@@ -155,13 +155,20 @@ diff -u -p -r1.1.1.6 -r1.4
- default:
- fatalx("pt_add: unknown af");
- }
-+
+
+- if (RB_INSERT(pt_tree, &pttable, p) != NULL) {
+- log_warnx("pt_add: insert failed");
+- return (NULL);
+- }
+ p = pt_fill(prefix, prefixlen);
+ p = pt_alloc(p);
++
++ if (RB_INSERT(pt_tree, &pttable, p) != NULL)
++ fatalx("pt_add: insert failed");
- if (RB_INSERT(pt_tree, &pttable, p) != NULL) {
- log_warnx("pt_add: insert failed");
-@@ -183,13 +182,14 @@ struct pt_entry *
+ return (p);
+ }
+@@ -183,13 +180,14 @@ struct pt_entry *
pt_lookup(struct bgpd_addr *addr)
{
struct pt_entry *p;
@@ -180,7 +187,7 @@ diff -u -p -r1.1.1.6 -r1.4
i = 128;
break;
default:
-@@ -206,17 +206,18 @@ pt_lookup(struct bgpd_addr *addr)
+@@ -206,17 +204,18 @@ pt_lookup(struct bgpd_addr *addr)
int
pt_prefix_cmp(const struct pt_entry *a, const struct pt_entry *b)
{
@@ -206,7 +213,7 @@ diff -u -p -r1.1.1.6 -r1.4
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,
+@@ -228,7 +227,7 @@ pt_prefix_cmp(const struct pt_entry *a,
if (a4->prefixlen < b4->prefixlen)
return (-1);
return (0);
@@ -215,7 +222,7 @@ diff -u -p -r1.1.1.6 -r1.4
a6 = (const struct pt_entry6 *)a;
b6 = (const struct pt_entry6 *)b;
-@@ -242,49 +243,49 @@ pt_prefix_cmp(const struct pt_entry *a,
+@@ -242,49 +241,49 @@ pt_prefix_cmp(const struct pt_entry *a,
if (a6->prefixlen > b6->prefixlen)
return (1);
return (0);
diff --git a/net/openbgpd/files/patch-bgpd_rde_rib.c b/net/openbgpd/files/patch-bgpd_rde_rib.c
index 369b44477475..edea241a977e 100644
--- a/net/openbgpd/files/patch-bgpd_rde_rib.c
+++ b/net/openbgpd/files/patch-bgpd_rde_rib.c
@@ -2,13 +2,13 @@ Index: bgpd/rde_rib.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/rde_rib.c,v
retrieving revision 1.1.1.7
-retrieving revision 1.5
-diff -u -p -r1.1.1.7 -r1.5
+retrieving revision 1.6
+diff -u -p -r1.1.1.7 -r1.6
--- bgpd/rde_rib.c 14 Feb 2010 20:19:57 -0000 1.1.1.7
-+++ bgpd/rde_rib.c 4 Feb 2010 16:22:23 -0000 1.5
++++ bgpd/rde_rib.c 10 Apr 2010 12:16:23 -0000 1.6
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde_rib.c,v 1.116 2009/06/29 14:13:48 claudio Exp $ */
-+/* $OpenBSD: rde_rib.c,v 1.120 2010/01/13 06:02:37 claudio Exp $ */
++/* $OpenBSD: rde_rib.c,v 1.125 2010/04/07 09:44:11 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -24,16 +24,38 @@ diff -u -p -r1.1.1.7 -r1.5
#include <stdlib.h>
#include <string.h>
-@@ -78,7 +82,7 @@ rib_new(int id, char *name, u_int16_t fl
+@@ -50,16 +54,15 @@ RB_GENERATE(rib_tree, rib_entry, rib_e,
+
+ /* RIB specific functions */
+ u_int16_t
+-rib_new(int id, char *name, u_int16_t flags)
++rib_new(char *name, u_int16_t flags)
+ {
+ struct rib *xribs;
+ size_t newsize;
++ u_int16_t id;
+
+- if (id < 0) {
+- for (id = 0; id < rib_size; id++) {
+- if (*ribs[id].name == '\0')
+- break;
+- }
++ for (id = 0; id < rib_size; id++) {
++ if (*ribs[id].name == '\0')
++ break;
+ }
+
+ if (id == RIB_FAILED)
+@@ -78,7 +81,7 @@ rib_new(int id, char *name, u_int16_t fl
bzero(&ribs[id], sizeof(struct rib));
strlcpy(ribs[id].name, name, sizeof(ribs[id].name));
RB_INIT(&ribs[id].rib);
- ribs[id].state = RIB_ACTIVE;
-+ ribs[id].state = RIB_NEW;
++ ribs[id].state = RECONF_REINIT;
ribs[id].id = id;
ribs[id].flags = flags;
-@@ -173,15 +177,16 @@ rib_lookup(struct rib *rib, struct bgpd_
+@@ -173,15 +176,16 @@ rib_lookup(struct rib *rib, struct bgpd_
struct rib_entry *re;
int i;
@@ -53,7 +75,7 @@ diff -u -p -r1.1.1.7 -r1.5
for (i = 128; i >= 0; i--) {
re = rib_get(rib, addr, i);
if (re != NULL)
-@@ -254,7 +259,7 @@ rib_empty(struct rib_entry *re)
+@@ -254,7 +258,7 @@ rib_empty(struct rib_entry *re)
void
rib_dump(struct rib *rib, void (*upcall)(struct rib_entry *, void *),
@@ -62,7 +84,7 @@ diff -u -p -r1.1.1.7 -r1.5
{
struct rib_context *ctx;
-@@ -263,7 +268,7 @@ rib_dump(struct rib *rib, void (*upcall)
+@@ -263,7 +267,7 @@ rib_dump(struct rib *rib, void (*upcall)
ctx->ctx_rib = rib;
ctx->ctx_upcall = upcall;
ctx->ctx_arg = arg;
@@ -71,7 +93,7 @@ diff -u -p -r1.1.1.7 -r1.5
rib_dump_r(ctx);
}
-@@ -280,7 +285,8 @@ rib_dump_r(struct rib_context *ctx)
+@@ -280,7 +284,8 @@ rib_dump_r(struct rib_context *ctx)
re = rib_restart(ctx);
for (i = 0; re != NULL; re = RB_NEXT(rib_tree, unused, re)) {
@@ -81,7 +103,16 @@ diff -u -p -r1.1.1.7 -r1.5
continue;
if (ctx->ctx_count && i++ >= ctx->ctx_count &&
(re->flags & F_RIB_ENTRYLOCK) == 0) {
-@@ -632,11 +638,11 @@ prefix_compare(const struct bgpd_addr *a
+@@ -308,7 +313,7 @@ rib_restart(struct rib_context *ctx)
+ re->flags &= ~F_RIB_ENTRYLOCK;
+
+ /* find first non empty element */
+- while (rib_empty(re))
++ while (re && rib_empty(re))
+ re = RB_NEXT(rib_tree, unused, re);
+
+ /* free the previously locked rib element if empty */
+@@ -632,11 +637,11 @@ prefix_compare(const struct bgpd_addr *a
int i;
u_int8_t m;
@@ -97,7 +128,7 @@ diff -u -p -r1.1.1.7 -r1.5
if (prefixlen > 32)
fatalx("prefix_cmp: bad IPv4 prefixlen");
mask = htonl(prefixlen2mask(prefixlen));
-@@ -645,7 +651,7 @@ prefix_compare(const struct bgpd_addr *a
+@@ -645,7 +650,7 @@ prefix_compare(const struct bgpd_addr *a
if (aa != ba)
return (aa - ba);
return (0);
@@ -106,7 +137,7 @@ diff -u -p -r1.1.1.7 -r1.5
if (prefixlen > 128)
fatalx("prefix_cmp: bad IPv6 prefixlen");
for (i = 0; i < prefixlen / 8; i++)
-@@ -660,6 +666,24 @@ prefix_compare(const struct bgpd_addr *a
+@@ -660,6 +665,24 @@ prefix_compare(const struct bgpd_addr *a
(b->v6.s6_addr[prefixlen / 8] & m));
}
return (0);
@@ -131,7 +162,7 @@ diff -u -p -r1.1.1.7 -r1.5
default:
fatalx("prefix_cmp: unknown af");
}
-@@ -806,16 +830,33 @@ prefix_write(u_char *buf, int len, struc
+@@ -806,16 +829,33 @@ prefix_write(u_char *buf, int len, struc
{
int totlen;
@@ -172,28 +203,47 @@ diff -u -p -r1.1.1.7 -r1.5
}
/*
-@@ -1088,15 +1129,15 @@ nexthop_update(struct kroute_nexthop *ms
+@@ -1070,10 +1110,6 @@ nexthop_update(struct kroute_nexthop *ms
+ return;
+ }
+
+- if (nexthop_delete(nh))
+- /* nexthop no longer used */
+- return;
+-
+ oldstate = nh->state;
+ if (msg->valid)
+ nh->state = NEXTHOP_REACH;
+@@ -1088,21 +1124,13 @@ nexthop_update(struct kroute_nexthop *ms
memcpy(&nh->true_nexthop, &msg->gateway,
sizeof(nh->true_nexthop));
- switch (msg->nexthop.af) {
- case AF_INET:
-+ switch (msg->nexthop.aid) {
-+ case AID_INET:
- nh->nexthop_netlen = msg->kr.kr4.prefixlen;
+- nh->nexthop_netlen = msg->kr.kr4.prefixlen;
- nh->nexthop_net.af = AF_INET;
-+ nh->nexthop_net.aid = AID_INET;
- nh->nexthop_net.v4.s_addr = msg->kr.kr4.prefix.s_addr;
- break;
+- nh->nexthop_net.v4.s_addr = msg->kr.kr4.prefix.s_addr;
+- break;
- case AF_INET6:
-+ case AID_INET6:
- nh->nexthop_netlen = msg->kr.kr6.prefixlen;
+- nh->nexthop_netlen = msg->kr.kr6.prefixlen;
- nh->nexthop_net.af = AF_INET6;
-+ nh->nexthop_net.aid = AID_INET6;
- memcpy(&nh->nexthop_net.v6, &msg->kr.kr6.prefix,
- sizeof(struct in6_addr));
- break;
-@@ -1118,7 +1159,7 @@ nexthop_update(struct kroute_nexthop *ms
+- memcpy(&nh->nexthop_net.v6, &msg->kr.kr6.prefix,
+- sizeof(struct in6_addr));
+- break;
+- default:
+- fatalx("nexthop_update: unknown af");
+- }
++ memcpy(&nh->nexthop_net, &msg->net,
++ sizeof(nh->nexthop_net));
++ nh->nexthop_netlen = msg->netlen;
++
++ if (nexthop_delete(nh))
++ /* nexthop no longer used */
++ return;
+
+ if (rde_noevaluate())
+ /*
+@@ -1118,7 +1146,7 @@ nexthop_update(struct kroute_nexthop *ms
void
nexthop_modify(struct rde_aspath *asp, struct bgpd_addr *nexthop,
@@ -202,7 +252,7 @@ diff -u -p -r1.1.1.7 -r1.5
{
struct nexthop *nh;
-@@ -1138,7 +1179,7 @@ nexthop_modify(struct rde_aspath *asp, s
+@@ -1138,7 +1166,7 @@ nexthop_modify(struct rde_aspath *asp, s
asp->flags |= F_NEXTHOP_SELF;
return;
}
@@ -211,7 +261,7 @@ diff -u -p -r1.1.1.7 -r1.5
return;
nh = nexthop_get(nexthop);
-@@ -1233,17 +1274,17 @@ nexthop_compare(struct nexthop *na, stru
+@@ -1233,17 +1261,17 @@ nexthop_compare(struct nexthop *na, stru
a = &na->exit_nexthop;
b = &nb->exit_nexthop;
@@ -234,7 +284,7 @@ diff -u -p -r1.1.1.7 -r1.5
return (memcmp(&a->v6, &b->v6, sizeof(struct in6_addr)));
default:
fatalx("nexthop_cmp: unknown af");
-@@ -1269,14 +1310,14 @@ nexthop_hash(struct bgpd_addr *nexthop)
+@@ -1269,14 +1297,14 @@ nexthop_hash(struct bgpd_addr *nexthop)
{
u_int32_t h = 0;
diff --git a/net/openbgpd/files/patch-bgpd_util.c b/net/openbgpd/files/patch-bgpd_util.c
index 4503f07a196b..88c95a8423d8 100644
--- a/net/openbgpd/files/patch-bgpd_util.c
+++ b/net/openbgpd/files/patch-bgpd_util.c
@@ -2,13 +2,13 @@ Index: bgpd/util.c
===================================================================
RCS file: /home/cvs/private/hrs/openbgpd/bgpd/util.c,v
retrieving revision 1.1.1.6
-retrieving revision 1.4
-diff -u -p -r1.1.1.6 -r1.4
+retrieving revision 1.5
+diff -u -p -r1.1.1.6 -r1.5
--- 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
++++ bgpd/util.c 10 Apr 2010 12:16:23 -0000 1.5
@@ -1,4 +1,4 @@
-/* $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 $ */
++/* $OpenBSD: util.c,v 1.11 2010/03/29 09:04:43 claudio Exp $ */
/*
* Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
@@ -22,9 +22,11 @@ diff -u -p -r1.1.1.6 -r1.4
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
-@@ -33,10 +36,20 @@ log_addr(const struct bgpd_addr *addr)
+@@ -32,11 +35,24 @@ const char *
+ log_addr(const struct bgpd_addr *addr)
{
static char buf[48];
++ char tbuf[16];
- if (inet_ntop(addr->af, &addr->ba, buf, sizeof(buf)) == NULL)
- return ("?");
@@ -37,20 +39,54 @@ diff -u -p -r1.1.1.6 -r1.4
+ return ("?");
+ return (buf);
+ case AID_VPN_IPv4:
-+ if (inet_ntop(AF_INET, &addr->vpn4.addr, buf,
-+ sizeof(buf)) == NULL)
++ if (inet_ntop(AF_INET, &addr->vpn4.addr, tbuf,
++ sizeof(tbuf)) == NULL)
+ return ("?");
++ snprintf(buf, sizeof(buf), "%s %s", log_rd(addr->vpn4.rd),
++ tbuf);
return (buf);
+ }
+ return ("???");
}
const char *
-@@ -90,6 +103,32 @@ log_as(u_int32_t as)
+@@ -90,6 +106,64 @@ log_as(u_int32_t as)
return (buf);
}
-+/* XXX this function does not check if the type/subtype combo is
++const char *
++log_rd(u_int64_t rd)
++{
++ static char buf[32];
++ struct in_addr addr;
++ u_int32_t u32;
++ u_int16_t u16;
++
++ rd = betoh64(rd);
++ switch (rd >> 48) {
++ case EXT_COMMUNITY_TWO_AS:
++ u32 = rd & 0xffffffff;
++ u16 = (rd >> 32) & 0xffff;
++ snprintf(buf, sizeof(buf), "rd %i:%i", u16, u32);
++ break;
++ case EXT_COMMUNITY_FOUR_AS:
++ u32 = (rd >> 16) & 0xffffffff;
++ u16 = rd & 0xffff;
++ snprintf(buf, sizeof(buf), "rd %s:%i", log_as(u32), u16);
++ break;
++ case EXT_COMMUNITY_IPV4:
++ u32 = (rd >> 16) & 0xffffffff;
++ u16 = rd & 0xffff;
++ addr.s_addr = htonl(u32);
++ snprintf(buf, sizeof(buf), "rd %s:%i", inet_ntoa(addr), u16);
++ break;
++ default:
++ return ("rd ?");
++ }
++ return (buf);
++}
++
++/* NOTE: this function does not check if the type/subtype combo is
+ * actually valid. */
+const char *
+log_ext_subtype(u_int8_t subtype)
@@ -79,7 +115,7 @@ diff -u -p -r1.1.1.6 -r1.4
int
aspath_snprint(char *buf, size_t size, void *data, u_int16_t len)
{
-@@ -276,3 +315,115 @@ inet6applymask(struct in6_addr *dest, co
+@@ -276,3 +350,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];
}