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:
parent
448f9afa68
commit
b513219508
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=252520
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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 *,
|
||||
|
@ -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);
|
||||
+}
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user