Another day another cleanup. This diff moves rde_send_kroute() out of rde_generate_update() and back into prefix_evaluate(). rde_generate_update() should only track the RIBs. rde_generate_update() is mainly called from prefix_evaluate(). The only other caller is in rde_softreconfig_sync_reeval() to clear a RIB that switched to F_RIB_NOEVALUATE. In this case the reload code already flushed the FIB earlier so no need to call rde_send_kroute().
While there cleanup some more code. Don't need an extra bgpd addr just use the kr.prefix in the pt_getaddr call. Skip setting flags and rtlabel for IMSG_KROUTE_DELETE, only the prefix & prefixlen are needed there. Also cache the rib in prefix_evaluate() to skip some extra function calls. -- :wq Claudio Index: rde.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v retrieving revision 1.539 diff -u -p -r1.539 rde.c --- rde.c 2 Mar 2022 14:44:46 -0000 1.539 +++ rde.c 3 Mar 2022 11:16:03 -0000 @@ -2912,9 +2912,7 @@ void rde_send_kroute(struct rib *rib, struct prefix *new, struct prefix *old) { struct kroute_full kr; - struct bgpd_addr addr; struct prefix *p; - struct rde_aspath *asp; struct l3vpn *vpn; enum imsg_type type; @@ -2934,21 +2932,21 @@ rde_send_kroute(struct rib *rib, struct p = new; } - asp = prefix_aspath(p); - pt_getaddr(p->pt, &addr); bzero(&kr, sizeof(kr)); - memcpy(&kr.prefix, &addr, sizeof(kr.prefix)); + pt_getaddr(p->pt, &kr.prefix); kr.prefixlen = p->pt->prefixlen; - if (prefix_nhflags(p) == NEXTHOP_REJECT) - kr.flags |= F_REJECT; - if (prefix_nhflags(p) == NEXTHOP_BLACKHOLE) - kr.flags |= F_BLACKHOLE; - if (type == IMSG_KROUTE_CHANGE) + if (type == IMSG_KROUTE_CHANGE) { + if (prefix_nhflags(p) == NEXTHOP_REJECT) + kr.flags |= F_REJECT; + if (prefix_nhflags(p) == NEXTHOP_BLACKHOLE) + kr.flags |= F_BLACKHOLE; memcpy(&kr.nexthop, &prefix_nexthop(p)->true_nexthop, sizeof(kr.nexthop)); - strlcpy(kr.label, rtlabel_id2name(asp->rtlabelid), sizeof(kr.label)); + strlcpy(kr.label, rtlabel_id2name(prefix_aspath(p)->rtlabelid), + sizeof(kr.label)); + } - switch (addr.aid) { + switch (kr.prefix.aid) { case AID_VPN_IPv4: case AID_VPN_IPv6: if (!(rib->flags & F_RIB_LOCAL)) @@ -3026,9 +3024,6 @@ rde_generate_updates(struct rib *rib, st */ if (old == NULL && new == NULL) return; - - if (!eval_all && (rib->flags & F_RIB_NOFIB) == 0) - rde_send_kroute(rib, new, old); if (new) aid = new->pt->aid; Index: rde_decide.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde_decide.c,v retrieving revision 1.88 diff -u -p -r1.88 rde_decide.c --- rde_decide.c 1 Mar 2022 09:46:22 -0000 1.88 +++ rde_decide.c 3 Mar 2022 11:17:32 -0000 @@ -454,8 +454,10 @@ void prefix_evaluate(struct rib_entry *re, struct prefix *new, struct prefix *old) { struct prefix *xp; + struct rib *rib; - if (re_rib(re)->flags & F_RIB_NOEVALUATE) { + rib = re_rib(re); + if (rib->flags & F_RIB_NOEVALUATE) { /* decision process is turned off */ if (old != NULL) LIST_REMOVE(old, entry.list.rib); @@ -468,7 +470,7 @@ prefix_evaluate(struct rib_entry *re, st * active. Clean up now to ensure that the RIB * is consistant. */ - rde_generate_updates(re_rib(re), NULL, re->active, 0); + rde_generate_updates(rib, NULL, re->active, 0); re->active = NULL; } return; @@ -494,7 +496,9 @@ prefix_evaluate(struct rib_entry *re, st * but remember that xp may be NULL aka ineligible. * Additional decision may be made by the called functions. */ - rde_generate_updates(re_rib(re), xp, re->active, 0); + rde_generate_updates(rib, xp, re->active, 0); + if ((rib->flags & F_RIB_NOFIB) == 0) + rde_send_kroute(rib, xp, re->active); re->active = xp; return; } @@ -506,5 +510,5 @@ prefix_evaluate(struct rib_entry *re, st */ if (rde_evaluate_all()) if ((new != NULL && prefix_eligible(new)) || old != NULL) - rde_generate_updates(re_rib(re), re->active, NULL, 1); + rde_generate_updates(rib, re->active, NULL, 1); }