struct rroute has ben removed from ospfd some time ago. struct kroute takes an additional 'metric' field.
Index: kroute.c =================================================================== RCS file: /d/cvs/src/usr.sbin/ospf6d/kroute.c,v retrieving revision 1.49 diff -u -p -r1.49 kroute.c --- kroute.c 22 Dec 2016 23:01:58 -0000 1.49 +++ kroute.c 27 Dec 2016 13:45:35 -0000 @@ -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, /* 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, 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 * 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)); } } Index: ospf6d.h =================================================================== RCS file: /d/cvs/src/usr.sbin/ospf6d/ospf6d.h,v retrieving revision 1.30 diff -u -p -r1.30 ospf6d.h --- ospf6d.h 2 Sep 2016 14:06:35 -0000 1.30 +++ ospf6d.h 27 Dec 2016 13:45:35 -0000 @@ -390,16 +390,12 @@ 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; u_short ifindex; u_int8_t prefixlen; -}; - -struct rroute { - struct kroute kr; - u_int32_t metric; }; /* name2id */ Index: rde.c =================================================================== RCS file: /d/cvs/src/usr.sbin/ospf6d/rde.c,v retrieving revision 1.68 diff -u -p -r1.68 rde.c --- rde.c 3 Sep 2016 10:25:36 -0000 1.68 +++ rde.c 27 Dec 2016 13:45:35 -0000 @@ -59,11 +59,11 @@ int rde_req_list_exists(struct rde_nbr 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, 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, 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, } 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_int1 */ 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_int1 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_int1 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; -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE