diff options
-rw-r--r-- | usr.sbin/ospf6d/kroute.c | 44 | ||||
-rw-r--r-- | usr.sbin/ospf6d/ospf6d.h | 8 | ||||
-rw-r--r-- | usr.sbin/ospf6d/rde.c | 67 |
3 files changed, 56 insertions, 63 deletions
diff --git a/usr.sbin/ospf6d/kroute.c b/usr.sbin/ospf6d/kroute.c index 3b5a6d0db76..091cd9aa3d0 100644 --- a/usr.sbin/ospf6d/kroute.c +++ b/usr.sbin/ospf6d/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.49 2016/12/22 23:01:58 jca Exp $ */ +/* $OpenBSD: kroute.c,v 1.50 2016/12/27 17:18:56 jca Exp $ */ /* * Copyright (c) 2004 Esben Norby <norby@openbsd.org> @@ -51,12 +51,12 @@ struct { struct kroute_node { RB_ENTRY(kroute_node) entry; - struct kroute r; struct kroute_node *next; + struct kroute r; }; void kr_redist_remove(struct kroute_node *, struct kroute_node *); -int kr_redist_eval(struct kroute *, struct rroute *); +int kr_redist_eval(struct kroute *, struct kroute *); void kr_redistribute(struct kroute_node *); int kroute_compare(struct kroute_node *, struct kroute_node *); @@ -344,7 +344,7 @@ kr_show_route(struct imsg *imsg) void kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn) { - struct rroute rr; + struct kroute *kr; /* was the route redistributed? */ if ((kn->r.flags & F_REDISTRIBUTED) == 0) @@ -352,8 +352,7 @@ kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn) /* remove redistributed flag */ kn->r.flags &= ~F_REDISTRIBUTED; - rr.kr = kn->r; - rr.metric = DEFAULT_REDIST_METRIC; /* some dummy value */ + kr = &kn->r; /* probably inform the RDE (check if no other path is redistributed) */ for (kn = kh; kn; kn = kn->next) @@ -361,12 +360,12 @@ kr_redist_remove(struct kroute_node *kh, struct kroute_node *kn) break; if (kn == NULL) - main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &rr, - sizeof(struct rroute)); + main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, kr, + sizeof(struct kroute)); } int -kr_redist_eval(struct kroute *kr, struct rroute *rr) +kr_redist_eval(struct kroute *kr, struct kroute *new_kr) { u_int32_t metric = 0; @@ -411,9 +410,9 @@ kr_redist_eval(struct kroute *kr, struct rroute *rr) * only one of all multipath routes can be redistributed so * redistribute the best one. */ - if (rr->metric > metric) { - rr->kr = *kr; - rr->metric = metric; + if (new_kr->metric > metric) { + *new_kr = *kr; + new_kr->metric = metric; } return (1); @@ -431,26 +430,25 @@ void kr_redistribute(struct kroute_node *kh) { struct kroute_node *kn; - struct rroute rr; + struct kroute kr; int redistribute = 0; - bzero(&rr, sizeof(rr)); - rr.metric = UINT_MAX; + bzero(&kr, sizeof(kr)); + kr.metric = UINT_MAX; for (kn = kh; kn; kn = kn->next) - if (kr_redist_eval(&kn->r, &rr)) + if (kr_redist_eval(&kn->r, &kr)) redistribute = 1; if (!redistribute) return; - if (rr.kr.flags & F_REDISTRIBUTED) { - main_imsg_compose_rde(IMSG_NETWORK_ADD, 0, &rr, - sizeof(struct rroute)); + if (kr.flags & F_REDISTRIBUTED) { + main_imsg_compose_rde(IMSG_NETWORK_ADD, 0, &kr, + sizeof(struct kroute)); } else { - rr.metric = DEFAULT_REDIST_METRIC; /* some dummy value */ - rr.kr = kh->r; - main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &rr, - sizeof(struct rroute)); + kr = kh->r; + main_imsg_compose_rde(IMSG_NETWORK_DEL, 0, &kr, + sizeof(struct kroute)); } } diff --git a/usr.sbin/ospf6d/ospf6d.h b/usr.sbin/ospf6d/ospf6d.h index cb3beccc7a1..f94debefa96 100644 --- a/usr.sbin/ospf6d/ospf6d.h +++ b/usr.sbin/ospf6d/ospf6d.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ospf6d.h,v 1.30 2016/09/02 14:06:35 benno Exp $ */ +/* $OpenBSD: ospf6d.h,v 1.31 2016/12/27 17:18:56 jca Exp $ */ /* * Copyright (c) 2004, 2007 Esben Norby <norby@openbsd.org> @@ -390,6 +390,7 @@ struct kroute { struct in6_addr prefix; struct in6_addr nexthop; u_int32_t ext_tag; + u_int32_t metric; unsigned int scope; /* scope of nexthop */ u_int16_t flags; u_int16_t rtlabel; @@ -397,11 +398,6 @@ struct kroute { u_int8_t prefixlen; }; -struct rroute { - struct kroute kr; - u_int32_t metric; -}; - /* name2id */ struct n2id_label { TAILQ_ENTRY(n2id_label) entry; diff --git a/usr.sbin/ospf6d/rde.c b/usr.sbin/ospf6d/rde.c index 61e6aff298e..dbf9548bcf4 100644 --- a/usr.sbin/ospf6d/rde.c +++ b/usr.sbin/ospf6d/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.68 2016/09/03 10:25:36 renato Exp $ */ +/* $OpenBSD: rde.c,v 1.69 2016/12/27 17:18:56 jca Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org> @@ -59,11 +59,11 @@ int rde_req_list_exists(struct rde_nbr *, struct lsa_hdr *); void rde_req_list_del(struct rde_nbr *, struct lsa_hdr *); void rde_req_list_free(struct rde_nbr *); -struct lsa *rde_asext_get(struct rroute *); -struct lsa *rde_asext_put(struct rroute *); +struct lsa *rde_asext_get(struct kroute *); +struct lsa *rde_asext_put(struct kroute *); int comp_asext(struct lsa *, struct lsa *); -struct lsa *orig_asext_lsa(struct rroute *, u_int16_t); +struct lsa *orig_asext_lsa(struct kroute *, u_int16_t); struct lsa *orig_sum_lsa(struct rt_node *, struct area *, u_int8_t, int); struct lsa *orig_intra_lsa_net(struct area *, struct iface *, struct vertex *); @@ -629,7 +629,6 @@ rde_dispatch_parent(int fd, short event, void *bula) struct iface_addr *ia, *nia; struct imsg imsg; struct kroute kr; - struct rroute rr; struct imsgev *iev = bula; struct imsgbuf *ibuf = &iev->ibuf; struct lsa *lsa; @@ -660,14 +659,14 @@ rde_dispatch_parent(int fd, short event, void *bula) switch (imsg.hdr.type) { case IMSG_NETWORK_ADD: - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(rr)) { + if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) { log_warnx("rde_dispatch_parent: " "wrong imsg len"); break; } - memcpy(&rr, imsg.data, sizeof(rr)); + memcpy(&kr, imsg.data, sizeof(kr)); - if ((lsa = rde_asext_get(&rr)) != NULL) { + if ((lsa = rde_asext_get(&kr)) != NULL) { v = lsa_find(NULL, lsa->hdr.type, lsa->hdr.ls_id, lsa->hdr.adv_rtr); @@ -675,14 +674,14 @@ rde_dispatch_parent(int fd, short event, void *bula) } break; case IMSG_NETWORK_DEL: - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(rr)) { + if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(kr)) { log_warnx("rde_dispatch_parent: " "wrong imsg len"); break; } - memcpy(&rr, imsg.data, sizeof(rr)); + memcpy(&kr, imsg.data, sizeof(kr)); - if ((lsa = rde_asext_put(&rr)) != NULL) { + if ((lsa = rde_asext_put(&kr)) != NULL) { v = lsa_find(NULL, lsa->hdr.type, lsa->hdr.ls_id, lsa->hdr.adv_rtr); @@ -1185,7 +1184,7 @@ rde_req_list_free(struct rde_nbr *nbr) * as-external LSA handling */ struct lsa * -rde_asext_get(struct rroute *rr) +rde_asext_get(struct kroute *kr) { struct area *area; struct iface *iface; @@ -1199,25 +1198,25 @@ rde_asext_get(struct rroute *rr) continue; inet6applymask(&addr, &ia->addr, - rr->kr.prefixlen); - if (!memcmp(&addr, &rr->kr.prefix, - sizeof(addr)) && rr->kr.prefixlen == + kr->prefixlen); + if (!memcmp(&addr, &kr->prefix, + sizeof(addr)) && kr->prefixlen == ia->prefixlen) { /* already announced as Prefix LSA */ log_debug("rde_asext_get: %s/%d is " "part of prefix LSA", - log_in6addr(&rr->kr.prefix), - rr->kr.prefixlen); + log_in6addr(&kr->prefix), + kr->prefixlen); return (NULL); } } /* update of seqnum is done by lsa_merge */ - return (orig_asext_lsa(rr, DEFAULT_AGE)); + return (orig_asext_lsa(kr, DEFAULT_AGE)); } struct lsa * -rde_asext_put(struct rroute *rr) +rde_asext_put(struct kroute *kr) { /* * just try to remove the LSA. If the prefix is announced as @@ -1225,7 +1224,7 @@ rde_asext_put(struct rroute *rr) */ /* remove by reflooding with MAX_AGE */ - return (orig_asext_lsa(rr, MAX_AGE)); + return (orig_asext_lsa(kr, MAX_AGE)); } /* @@ -1601,14 +1600,14 @@ comp_asext(struct lsa *a, struct lsa *b) } struct lsa * -orig_asext_lsa(struct rroute *rr, u_int16_t age) +orig_asext_lsa(struct kroute *kr, u_int16_t age) { struct lsa *lsa; u_int32_t ext_tag; u_int16_t len, ext_off; len = sizeof(struct lsa_hdr) + sizeof(struct lsa_asext) + - LSA_PREFIXSIZE(rr->kr.prefixlen); + LSA_PREFIXSIZE(kr->prefixlen); /* * nexthop -- on connected routes we are the nexthop, @@ -1618,14 +1617,14 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age) */ ext_off = len; - if (rr->kr.ext_tag) { + if (kr->ext_tag) { len += sizeof(ext_tag); } if ((lsa = calloc(1, len)) == NULL) fatal("orig_asext_lsa"); log_debug("orig_asext_lsa: %s/%d age %d", - log_in6addr(&rr->kr.prefix), rr->kr.prefixlen, age); + log_in6addr(&kr->prefix), kr->prefixlen, age); /* LSA header */ lsa->hdr.age = htons(age); @@ -1634,9 +1633,9 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age) lsa->hdr.seq_num = htonl(INIT_SEQ_NUM); lsa->hdr.len = htons(len); - lsa->data.asext.prefix.prefixlen = rr->kr.prefixlen; + lsa->data.asext.prefix.prefixlen = kr->prefixlen; memcpy((char *)lsa + sizeof(struct lsa_hdr) + sizeof(struct lsa_asext), - &rr->kr.prefix, LSA_PREFIXSIZE(rr->kr.prefixlen)); + &kr->prefix, LSA_PREFIXSIZE(kr->prefixlen)); lsa->hdr.ls_id = lsa_find_lsid(&asext_tree, lsa->hdr.type, lsa->hdr.adv_rtr, comp_asext, lsa); @@ -1650,22 +1649,22 @@ orig_asext_lsa(struct rroute *rr, u_int16_t age) v = lsa_find(NULL, lsa->hdr.type, lsa->hdr.ls_id, lsa->hdr.adv_rtr); if (v != NULL) { - rr->metric = ntohl(v->lsa->data.asext.metric); - if (rr->metric & LSA_ASEXT_T_FLAG) { + kr->metric = ntohl(v->lsa->data.asext.metric); + if (kr->metric & LSA_ASEXT_T_FLAG) { memcpy(&ext_tag, (char *)v->lsa + ext_off, sizeof(ext_tag)); - rr->kr.ext_tag = ntohl(ext_tag); + kr->ext_tag = ntohl(ext_tag); } - rr->metric &= LSA_METRIC_MASK; + kr->metric &= LSA_METRIC_MASK; } } - if (rr->kr.ext_tag) { - lsa->data.asext.metric = htonl(rr->metric | LSA_ASEXT_T_FLAG); - ext_tag = htonl(rr->kr.ext_tag); + if (kr->ext_tag) { + lsa->data.asext.metric = htonl(kr->metric | LSA_ASEXT_T_FLAG); + ext_tag = htonl(kr->ext_tag); memcpy((char *)lsa + ext_off, &ext_tag, sizeof(ext_tag)); } else { - lsa->data.asext.metric = htonl(rr->metric); + lsa->data.asext.metric = htonl(kr->metric); } lsa->hdr.ls_chksum = 0; |