diff options
author | 2008-12-07 16:37:04 +0000 | |
---|---|---|
committer | 2008-12-07 16:37:04 +0000 | |
commit | 8dbd5f67bed2afdfd2fe3724ed27e4cea4cfb687 (patch) | |
tree | c2ac020e27e0ccf5fe73e9dea4fb177e017da7ba | |
parent | Simplify queue_record_incoming_envelope. (diff) | |
download | wireguard-openbsd-8dbd5f67bed2afdfd2fe3724ed27e4cea4cfb687.tar.xz wireguard-openbsd-8dbd5f67bed2afdfd2fe3724ed27e4cea4cfb687.zip |
Kill src_node structure. It is mostly redundant with rt_node and
adds unneeded complexity. Move any stuff to rt_node structure.
-rw-r--r-- | usr.sbin/dvmrpd/dvmrpd.h | 3 | ||||
-rw-r--r-- | usr.sbin/dvmrpd/parse.y | 3 | ||||
-rw-r--r-- | usr.sbin/dvmrpd/rde.h | 29 | ||||
-rw-r--r-- | usr.sbin/dvmrpd/rde_srt.c | 236 |
4 files changed, 89 insertions, 182 deletions
diff --git a/usr.sbin/dvmrpd/dvmrpd.h b/usr.sbin/dvmrpd/dvmrpd.h index d8f107b9825..3321d7f5c1f 100644 --- a/usr.sbin/dvmrpd/dvmrpd.h +++ b/usr.sbin/dvmrpd/dvmrpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dvmrpd.h,v 1.10 2008/12/02 13:42:44 michele Exp $ */ +/* $OpenBSD: dvmrpd.h,v 1.11 2008/12/07 16:37:04 michele Exp $ */ /* * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org> @@ -265,7 +265,6 @@ struct dvmrpd_conf { #define DVMRPD_OPT_NOACTION 0x00000004 int maxdepth; LIST_HEAD(, iface) iface_list; - struct src_head src_list; int dvmrp_socket; int mroute_socket; int flags; diff --git a/usr.sbin/dvmrpd/parse.y b/usr.sbin/dvmrpd/parse.y index 9101beb9b0c..f603d06672b 100644 --- a/usr.sbin/dvmrpd/parse.y +++ b/usr.sbin/dvmrpd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.17 2008/10/17 14:32:47 henning Exp $ */ +/* $OpenBSD: parse.y,v 1.18 2008/12/07 16:37:04 michele Exp $ */ /* * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org> @@ -739,7 +739,6 @@ parse_config(char *filename, int opts) gettimeofday(&now, NULL); conf->gen_id = now.tv_sec; conf->opts = opts; - RB_INIT(&conf->src_list); yyparse(); errors = file->errors; diff --git a/usr.sbin/dvmrpd/rde.h b/usr.sbin/dvmrpd/rde.h index e47a6d2cc4a..364aa1aa64b 100644 --- a/usr.sbin/dvmrpd/rde.h +++ b/usr.sbin/dvmrpd/rde.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.h,v 1.6 2008/12/02 13:42:44 michele Exp $ */ +/* $OpenBSD: rde.h,v 1.7 2008/12/07 16:37:04 michele Exp $ */ /* * Copyright (c) 2005, 2006 Esben Norby <norby@openbsd.org> @@ -26,6 +26,11 @@ #include <event.h> #include <limits.h> +struct adv_rtr { + struct in_addr addr; + u_int32_t metric; +}; + struct rt_node { RB_ENTRY(rt_node) entry; struct event expiration_timer; @@ -36,6 +41,9 @@ struct rt_node { u_int32_t cost; u_int32_t old_cost; /* used when in hold-down */ u_short ifindex; /* learned from this iface */ + struct adv_rtr adv_rtr[MAXVIFS]; + u_int16_t ds_cnt[MAXVIFS]; + LIST_HEAD(, ds_nbr) ds_list; time_t uptime; u_int8_t flags; u_int8_t prefixlen; @@ -62,25 +70,12 @@ struct rde_nbr { struct iface *iface; }; -struct ds { - LIST_ENTRY(ds) entry; +/* downstream neighbor per source */ +struct ds_nbr { + LIST_ENTRY(ds_nbr) entry; struct in_addr addr; }; -struct adv_rtr { - struct in_addr addr; - u_int32_t metric; -}; - -struct src_node { - RB_ENTRY(src_node) entry; - struct in_addr origin; - struct in_addr mask; - struct adv_rtr adv_rtr[MAXVIFS]; - u_int16_t ds_cnt[MAXVIFS]; - LIST_HEAD(, ds) ds_list; -}; - /* rde.c */ pid_t rde(struct dvmrpd_conf *, int [2], int [2], int [2]); int rde_imsg_compose_parent(int, pid_t, void *, u_int16_t); diff --git a/usr.sbin/dvmrpd/rde_srt.c b/usr.sbin/dvmrpd/rde_srt.c index 73ec6483ff1..f714dc98e91 100644 --- a/usr.sbin/dvmrpd/rde_srt.c +++ b/usr.sbin/dvmrpd/rde_srt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_srt.c,v 1.11 2008/12/02 13:42:44 michele Exp $ */ +/* $OpenBSD: rde_srt.c,v 1.12 2008/12/07 16:37:04 michele Exp $ */ /* * Copyright (c) 2005, 2006 Esben Norby <norby@openbsd.org> @@ -43,22 +43,17 @@ void rt_start_holddown_timer(struct rt_node *); void srt_set_upstream(struct rt_node *, u_int32_t); /* Designated forwarder */ -void srt_set_forwarder_self(struct src_node *, struct iface *, - struct rt_node *); -void srt_update_ds_forwarders(struct src_node *, struct rt_node *, - struct iface *, u_int32_t); -void srt_current_forwarder(struct src_node *, struct rt_node *, - struct iface *, u_int32_t, u_int32_t); - -/* Downstrean neighbor */ -void srt_add_ds(struct src_node *, struct rt_node *, u_int32_t, - u_int32_t); -struct ds *srt_find_ds(struct src_node *, u_int32_t); -void srt_delete_ds(struct src_node *, struct rt_node *, struct ds *, +void srt_set_forwarder_self(struct rt_node *, struct iface *); +void srt_update_ds_forwarders(struct rt_node *, struct iface *, + u_int32_t); +void srt_current_forwarder(struct rt_node *, struct iface *, + u_int32_t, u_int32_t); + +/* Downstream neighbors */ +void srt_add_ds(struct rt_node *, u_int32_t, u_int32_t); +struct ds_nbr *srt_find_ds(struct rt_node *, u_int32_t); +void srt_delete_ds(struct rt_node *, struct ds_nbr *, struct iface *); -struct src_node *srt_find_src(in_addr_t, in_addr_t); -struct src_node *srt_add_src(struct in_addr, struct in_addr, u_int32_t); -void srt_delete_src(struct src_node *); /* Flash updates */ void flash_update(struct rt_node *); @@ -68,8 +63,6 @@ RB_HEAD(rt_tree, rt_node) rt; RB_PROTOTYPE(rt_tree, rt_node, entry, rt_compare) RB_GENERATE(rt_tree, rt_node, entry, rt_compare) -RB_GENERATE(src_head, src_node, entry, src_compare); - extern struct dvmrpd_conf *rdeconf; /* timers */ @@ -111,15 +104,10 @@ void rt_holddown_timer(int fd, short event, void *arg) { struct rt_node *rn = arg; - struct src_node *src; log_debug("rt_holddown_timer: route %s/%d", inet_ntoa(rn->prefix), rn->prefixlen); - /* remove route entry */ - src = srt_find_src(rn->prefix.s_addr, prefixlen2mask(rn->prefixlen)); - srt_delete_src(src); - rt_remove(rn); } @@ -162,20 +150,6 @@ rt_compare(struct rt_node *a, struct rt_node *b) return (0); } -int -src_compare(struct src_node *a, struct src_node *b) -{ - if (ntohl(a->origin.s_addr) < ntohl(b->origin.s_addr)) - return (-1); - if (ntohl(a->origin.s_addr) > ntohl(b->origin.s_addr)) - return (1); - if (ntohl(a->mask.s_addr) < ntohl(b->mask.s_addr)) - return (-1); - if (ntohl(a->mask.s_addr) > ntohl(b->mask.s_addr)) - return (1); - return (0); -} - struct rt_node * rt_find(in_addr_t prefix, u_int8_t prefixlen) { @@ -205,8 +179,14 @@ rr_new_rt(struct route_report *rr, u_int32_t adj_metric, int connected) rn->cost = adj_metric; rn->ifindex = rr->ifindex; - for (i = 0; i < MAXVIFS; i++) + for (i = 0; i < MAXVIFS; i++) { rn->ttls[i] = 0; + rn->ds_cnt[i] = 0; + rn->adv_rtr[i].addr.s_addr = 0; + rn->adv_rtr[i].metric = 0; + } + + LIST_INIT(&rn->ds_list); rn->flags = F_DVMRPD_INSERTED; rn->connected = connected; @@ -233,12 +213,19 @@ rt_insert(struct rt_node *r) int rt_remove(struct rt_node *r) { + struct ds_nbr *ds_nbr; + if (RB_REMOVE(rt_tree, &rt, r) == NULL) { log_warnx("rt_remove failed for %s/%u", inet_ntoa(r->prefix), r->prefixlen); return (-1); } + LIST_FOREACH(ds_nbr, &r->ds_list, entry) { + LIST_REMOVE(ds_nbr, entry); + free(ds_nbr); + } + free(r); return (0); } @@ -330,8 +317,7 @@ srt_check_route(struct route_report *rr, int connected) { struct rt_node *rn; struct iface *iface; - struct src_node *src; - struct ds *ds_nbr; + struct ds_nbr *ds_nbr; u_int32_t adj_metric; u_int32_t nbr_ip, nbr_report, ifindex; @@ -359,7 +345,6 @@ srt_check_route(struct route_report *rr, int connected) if (adj_metric < INFINITY_METRIC) { rn = rr_new_rt(rr, adj_metric, connected); rt_insert(rn); - src = srt_add_src(rr->net, rr->mask, adj_metric); } return (0); } @@ -371,15 +356,12 @@ srt_check_route(struct route_report *rr, int connected) nbr_ip = rn->nexthop.s_addr; nbr_report = rr->nexthop.s_addr; - if ((src = srt_find_src(rr->net.s_addr, rr->mask.s_addr)) == NULL) - fatal("srt_check_route"); - if (rr->metric < INFINITY_METRIC) { /* If it is our current nexthop it cannot be a * downstream router */ if (nbr_ip != nbr_report) - if ((ds_nbr = srt_find_ds(src, nbr_report))) - srt_delete_ds(src, rn, ds_nbr, iface); + if ((ds_nbr = srt_find_ds(rn, nbr_report))) + srt_delete_ds(rn, ds_nbr, iface); if (adj_metric > rn->cost) { if (nbr_ip == nbr_report) { @@ -396,7 +378,7 @@ srt_check_route(struct route_report *rr, int connected) /* We have a new best route to source, update the * designated forwarders on downstream interfaces to * reflect the new metric */ - srt_update_ds_forwarders(src, rn, iface, nbr_report); + srt_update_ds_forwarders(rn, iface, nbr_report); } else { if (nbr_report < nbr_ip) { rn->nexthop.s_addr = nbr_report; @@ -409,86 +391,85 @@ srt_check_route(struct route_report *rr, int connected) } /* Update forwarder of current interface if necessary and * refresh the route */ - srt_current_forwarder(src, rn, iface, rr->metric, nbr_report); + srt_current_forwarder(rn, iface, rr->metric, nbr_report); rt_update(rn); } else if (rr->metric == INFINITY_METRIC) { - if (nbr_report == src->adv_rtr[ifindex].addr.s_addr) - srt_set_forwarder_self(src, iface, rn); + if (nbr_report == rn->adv_rtr[ifindex].addr.s_addr) + srt_set_forwarder_self(rn, iface); infinity: if (nbr_ip == nbr_report) { if (rn->cost < INFINITY_METRIC) rt_start_holddown_timer(rn); } else - if ((ds_nbr = srt_find_ds(src, nbr_report))) - srt_delete_ds(src, rn, ds_nbr, iface); + if ((ds_nbr = srt_find_ds(rn, nbr_report))) + srt_delete_ds(rn, ds_nbr, iface); } else if (INFINITY_METRIC < rr->metric && rr->metric < 2 * INFINITY_METRIC) { /* Neighbor is reporting his dependency for this source */ - if (nbr_report == src->adv_rtr[ifindex].addr.s_addr) - srt_set_forwarder_self(src, iface, rn); + if (nbr_report == rn->adv_rtr[ifindex].addr.s_addr) + srt_set_forwarder_self(rn, iface); if (rn->ifindex == ifindex) goto infinity; else - if (srt_find_ds(src, nbr_report) == NULL) - srt_add_ds(src, rn, nbr_report, ifindex); + if (srt_find_ds(rn, nbr_report) == NULL) + srt_add_ds(rn, nbr_report, ifindex); } return (0); } void -srt_current_forwarder(struct src_node *src_node, struct rt_node *rn, - struct iface *iface, u_int32_t metric, u_int32_t nbr_report) +srt_current_forwarder(struct rt_node *rn, struct iface *iface, + u_int32_t metric, u_int32_t nbr_report) { /* If it is our designated forwarder */ - if (nbr_report == src_node->adv_rtr[iface->ifindex].addr.s_addr) { + if (nbr_report == rn->adv_rtr[iface->ifindex].addr.s_addr) { if (metric > rn->cost || (metric == rn->cost && iface->addr.s_addr < nbr_report)) { - src_node->adv_rtr[iface->ifindex].addr.s_addr = + rn->adv_rtr[iface->ifindex].addr.s_addr = iface->addr.s_addr; - src_node->adv_rtr[iface->ifindex].metric = rn->cost; + rn->adv_rtr[iface->ifindex].metric = rn->cost; /* XXX: check if there are groups with this source */ if (group_list_empty(iface)) rn->ttls[iface->ifindex] = 1; } - } else if (metric < src_node->adv_rtr[iface->ifindex].metric || - (metric == src_node->adv_rtr[iface->ifindex].metric && - nbr_report < src_node->adv_rtr[iface->ifindex].addr.s_addr)) { - if (src_node->adv_rtr[iface->ifindex].addr.s_addr == - iface->addr.s_addr && !src_node->ds_cnt[iface->ifindex]) + } else if (metric < rn->adv_rtr[iface->ifindex].metric || + (metric == rn->adv_rtr[iface->ifindex].metric && + nbr_report < rn->adv_rtr[iface->ifindex].addr.s_addr)) { + if (rn->adv_rtr[iface->ifindex].addr.s_addr == + iface->addr.s_addr && !rn->ds_cnt[iface->ifindex]) rn->ttls[iface->ifindex] = 0; - src_node->adv_rtr[iface->ifindex].addr.s_addr = nbr_report; - src_node->adv_rtr[iface->ifindex].metric = metric; + rn->adv_rtr[iface->ifindex].addr.s_addr = nbr_report; + rn->adv_rtr[iface->ifindex].metric = metric; } } void -srt_update_ds_forwarders(struct src_node *src_node, struct rt_node *rn, - struct iface *iface, u_int32_t nbr_report) +srt_update_ds_forwarders(struct rt_node *rn, struct iface *iface, + u_int32_t nbr_report) { struct iface *ifa; int i; for (i = 0; i < MAXVIFS; i++) { - if (src_node->adv_rtr[i].addr.s_addr && - (rn->cost < src_node->adv_rtr[i].metric || - (rn->cost == src_node->adv_rtr[i].metric && + if (rn->adv_rtr[i].addr.s_addr && + (rn->cost < rn->adv_rtr[i].metric || + (rn->cost == rn->adv_rtr[i].metric && iface->addr.s_addr < nbr_report))) { ifa = if_find_index(i); - srt_set_forwarder_self(src_node, ifa, rn); + srt_set_forwarder_self(rn, ifa); } } } void -srt_set_forwarder_self(struct src_node *src, struct iface *iface, - struct rt_node *rn) +srt_set_forwarder_self(struct rt_node *rn, struct iface *iface) { - src->adv_rtr[iface->ifindex].addr.s_addr = iface->addr.s_addr; - src->adv_rtr[iface->ifindex].metric = rn->cost; + rn->adv_rtr[iface->ifindex].addr.s_addr = iface->addr.s_addr; + rn->adv_rtr[iface->ifindex].metric = rn->cost; /* XXX: check if there are groups with this source */ if (group_list_empty(iface)) @@ -505,27 +486,26 @@ srt_set_upstream(struct rt_node *rn, u_int32_t ifindex) } void -srt_add_ds(struct src_node *src_node, struct rt_node *rn, u_int32_t nbr_report, - u_int32_t ifindex) +srt_add_ds(struct rt_node *rn, u_int32_t nbr_report, u_int32_t ifindex) { - struct ds *ds_nbr; + struct ds_nbr *ds_nbr; - if ((ds_nbr = malloc(sizeof(struct ds))) == NULL) + if ((ds_nbr = malloc(sizeof(struct ds_nbr))) == NULL) fatal("srt_add_ds"); ds_nbr->addr.s_addr = nbr_report; - LIST_INSERT_HEAD(&src_node->ds_list, ds_nbr, entry); - src_node->ds_cnt[ifindex]++; + LIST_INSERT_HEAD(&rn->ds_list, ds_nbr, entry); + rn->ds_cnt[ifindex]++; rn->ttls[ifindex] = 1; } -struct ds * -srt_find_ds(struct src_node *src_node, u_int32_t nbr_report) +struct ds_nbr * +srt_find_ds(struct rt_node *rn, u_int32_t nbr_report) { - struct ds *ds_nbr; + struct ds_nbr *ds_nbr; - LIST_FOREACH(ds_nbr, &src_node->ds_list, entry) + LIST_FOREACH(ds_nbr, &rn->ds_list, entry) if (ds_nbr->addr.s_addr == nbr_report) return (ds_nbr); @@ -533,93 +513,27 @@ srt_find_ds(struct src_node *src_node, u_int32_t nbr_report) } void -srt_delete_ds(struct src_node *src_node, struct rt_node *rn, struct ds *ds_nbr, - struct iface *iface) +srt_delete_ds(struct rt_node *rn, struct ds_nbr *ds_nbr, struct iface *iface) { LIST_REMOVE(ds_nbr, entry); free(ds_nbr); - src_node->ds_cnt[iface->ifindex]--; + rn->ds_cnt[iface->ifindex]--; /* XXX: check if there are group with this source */ - if (!src_node->ds_cnt[iface->ifindex] && group_list_empty(iface)) + if (!rn->ds_cnt[iface->ifindex] && group_list_empty(iface)) rn->ttls[iface->ifindex] = 0; } -struct src_node * -srt_find_src(in_addr_t net, in_addr_t mask) -{ - struct src_node *src_node; - - RB_FOREACH(src_node, src_head, &rdeconf->src_list) - if (src_node->origin.s_addr == net && - src_node->mask.s_addr == mask) - return (src_node); - - return (NULL); -} - -struct src_node * -srt_add_src(struct in_addr net, struct in_addr mask, u_int32_t adj_metric) -{ - struct src_node *src_node; - struct iface *iface; - u_int32_t i; - - if ((src_node = malloc(sizeof(struct src_node))) == NULL) - fatal("srt_add_src"); - - src_node->origin.s_addr = net.s_addr; - src_node->mask.s_addr = mask.s_addr; - - for (i = 0; i < MAXVIFS; i++) { - bzero(&src_node->adv_rtr[i], sizeof(struct adv_rtr)); - src_node->ds_cnt[i] = 0; - } - - LIST_FOREACH(iface, &rdeconf->iface_list, entry) { - src_node->adv_rtr[iface->ifindex].addr.s_addr = - iface->addr.s_addr; - src_node->adv_rtr[iface->ifindex].metric = adj_metric; - } - - LIST_INIT(&src_node->ds_list); - RB_INSERT(src_head, &rdeconf->src_list, src_node); - - return (src_node); -} - -void -srt_delete_src(struct src_node *src_node) -{ - struct ds *ds_nbr; - - if (src_node == NULL) - return; - - LIST_FOREACH(ds_nbr, &src_node->ds_list, entry) { - LIST_REMOVE(ds_nbr, entry); - free(ds_nbr); - } - - RB_REMOVE(src_head, &rdeconf->src_list, src_node); - free(src_node); -} - void srt_expire_nbr(struct in_addr addr, struct iface *iface) { - struct src_node *src_node; - struct ds *ds; + struct ds_nbr *ds; struct rt_node *rn; - RB_FOREACH(src_node, src_head, &rdeconf->src_list) { - rn = rt_find(src_node->origin.s_addr, - mask2prefixlen(src_node->mask.s_addr)); - if (rn == NULL) - fatalx("srt_expires_nbr: route not found"); - ds = srt_find_ds(src_node, addr.s_addr); + RB_FOREACH(rn, rt_tree, &rt) { + ds = srt_find_ds(rn, addr.s_addr); if (ds) - srt_delete_ds(src_node, rn, ds, iface); + srt_delete_ds(rn, ds, iface); } } |