On Fri, Dec 28, 2018 at 06:08:16PM +0100, Klemens Nanni wrote: > 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) {
Yes, we can, it may save a few cycles. Here is a diff to update the current revision (I updated my MPLS diff with similar change). Index: kroute.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/kroute.c,v retrieving revision 1.226 diff -u -p -r1.226 kroute.c --- kroute.c 6 Dec 2018 13:04:40 -0000 1.226 +++ kroute.c 28 Dec 2018 18:46:07 -0000 @@ -487,10 +487,6 @@ kr4_change(struct ktable *kt, struct kro int action = RTM_ADD; u_int16_t labelid; - if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen, - fib_prio)) != NULL) - action = RTM_CHANGE; - /* for blackhole and reject routes nexthop needs to be 127.0.0.1 */ if (kl->flags & (F_BLACKHOLE|F_REJECT)) kl->nexthop.v4.s_addr = htonl(INADDR_LOOPBACK); @@ -501,6 +497,10 @@ kr4_change(struct ktable *kt, struct kro labelid = rtlabel_name2id(kl->label); + if ((kr = kroute_find(kt, kl->prefix.v4.s_addr, kl->prefixlen, + fib_prio)) != NULL) + action = RTM_CHANGE; + if (action == RTM_ADD) { if ((kr = calloc(1, sizeof(struct kroute_node))) == NULL) { log_warn("%s", __func__); @@ -545,10 +545,6 @@ kr6_change(struct ktable *kt, struct kro int action = RTM_ADD; u_int16_t labelid; - if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen, fib_prio)) != - NULL) - action = RTM_CHANGE; - /* 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)); @@ -558,6 +554,10 @@ kr6_change(struct ktable *kt, struct kro labelid = rtlabel_name2id(kl->label); + if ((kr6 = kroute6_find(kt, &kl->prefix.v6, kl->prefixlen, fib_prio)) != + NULL) + action = RTM_CHANGE; + if (action == RTM_ADD) { if ((kr6 = calloc(1, sizeof(struct kroute6_node))) == NULL) { log_warn("%s", __func__); @@ -604,10 +604,6 @@ krVPN4_change(struct ktable *kt, struct u_int32_t mplslabel = 0; u_int16_t labelid; - if ((kr = kroute_find(kt, kl->prefix.vpn4.addr.s_addr, kl->prefixlen, - fib_prio)) != NULL) - action = RTM_CHANGE; - /* nexthop within 127/8 -> ignore silently */ if ((kl->nexthop.v4.s_addr & htonl(IN_CLASSA_NET)) == htonl(INADDR_LOOPBACK & IN_CLASSA_NET)) @@ -629,6 +625,10 @@ krVPN4_change(struct ktable *kt, struct /* for blackhole and reject routes nexthop needs to be 127.0.0.1 */ if (kl->flags & (F_BLACKHOLE|F_REJECT)) kl->nexthop.v4.s_addr = htonl(INADDR_LOOPBACK); + + if ((kr = kroute_find(kt, kl->prefix.vpn4.addr.s_addr, kl->prefixlen, + fib_prio)) != NULL) + action = RTM_CHANGE; if (action == RTM_ADD) { if ((kr = calloc(1, sizeof(struct kroute_node))) == NULL) {