On Tue, Dec 27, 2016 at 02:55:08PM +0100, Jeremie Courreges-Anglas wrote: > > struct rroute has ben removed from ospfd some time ago. struct kroute > takes an additional 'metric' field. >
Reads good. OK claudio@ > > 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 > -- :wq Claudio