1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-20 00:21:35 +00:00

Update to 4.7.20100410.

This commit is contained in:
Hiroki Sato 2010-04-10 12:26:08 +00:00
parent 448f9afa68
commit b513219508
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=252520
17 changed files with 814 additions and 322 deletions

View File

@ -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

View File

@ -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));

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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 {
enum rib_state {
RIB_NONE,
+ RIB_NEW,
RIB_ACTIVE,
RIB_DELETE
@@ -262,16 +273,10 @@ struct rib_entry {
u_int16_t flags;
};
@@ -342,9 +354,13 @@ int aspath_loopfree(struct aspath *, u
-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,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 *,

View File

@ -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);
+}

View File

@ -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");

View File

@ -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);

View File

@ -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;

View File

@ -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];
}