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