Move rde_send_kroute() from rde_generate_updates() to prefix_evaluate().
authorclaudio <claudio@openbsd.org>
Thu, 3 Mar 2022 13:06:15 +0000 (13:06 +0000)
committerclaudio <claudio@openbsd.org>
Thu, 3 Mar 2022 13:06:15 +0000 (13:06 +0000)
rde_generate_updates() should only handle RIB updates and the logic
for rde_send_kroute() may change in the future.
Refactor code to simplify it a bit and make it clear that to delete a
prefix from the FIB only the prefix/len is needed.
OK tb@

usr.sbin/bgpd/rde.c
usr.sbin/bgpd/rde_decide.c

index 41d8372..eee5147 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rde.c,v 1.539 2022/03/02 14:44:46 claudio Exp $ */
+/*     $OpenBSD: rde.c,v 1.540 2022/03/03 13:06:15 claudio Exp $ */
 
 /*
  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -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 prefix *new, struct prefix *old)
                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))
@@ -3027,9 +3025,6 @@ rde_generate_updates(struct rib *rib, struct prefix *new, struct prefix *old,
        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;
        else
index 3a0f6eb..a28d981 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: rde_decide.c,v 1.88 2022/03/01 09:46:22 claudio Exp $ */
+/*     $OpenBSD: rde_decide.c,v 1.89 2022/03/03 13:06:15 claudio Exp $ */
 
 /*
  * Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -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, struct prefix *new, struct prefix *old)
                         * 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, struct prefix *new, struct prefix *old)
                 * 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, struct prefix *new, struct prefix *old)
         */
        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);
 }