On Fri, Dec 28, 2018 at 05:21:02PM +0100, Denis Fondras wrote: > int > +krVPN6_change(struct ktable *kt, struct kroute_full *kl, u_int8_t fib_prio) > +{ > + struct kroute6_node *kr6; > + struct in6_addr lo6 = IN6ADDR_LOOPBACK_INIT; > + int action = RTM_ADD; > + u_int32_t mplslabel = 0; > + u_int16_t labelid; > + > + if ((kr6 = kroute6_find(kt, &kl->prefix.vpn6.addr, kl->prefixlen, > + fib_prio)) != NULL) > + action = RTM_CHANGE; Can this be moved below the conditional returns or does kroute6_find() have side effects? `actions' is not used until much later.
> + /* nexthop to loopback -> ignore silently */ > + if (IN6_IS_ADDR_LOOPBACK(&kl->nexthop.v6)) > + return (0); > + > + /* only single MPLS label are supported for now */ > + if (kl->prefix.vpn6.labellen != 3) { > + log_warnx("%s: %s/%u has not a single label", __func__, > + log_addr(&kl->prefix), kl->prefixlen); > + return (0); > + } Here. > + mplslabel = (kl->prefix.vpn6.labelstack[0] << 24) | > + (kl->prefix.vpn6.labelstack[1] << 16) | > + (kl->prefix.vpn6.labelstack[2] << 8); > + mplslabel = htonl(mplslabel); > + > + /* for blackhole and reject routes nexthop needs to be ::1 */ > + if (kl->flags & (F_BLACKHOLE|F_REJECT)) > + bcopy(&lo6, &kl->nexthop.v6, sizeof(kl->nexthop.v6)); > + > + labelid = rtlabel_name2id(kl->label); Or even here right before it's used. `kr6' is not used above. > + if (action == RTM_ADD) {