]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: Break up rpki prefix revalidation by bgp structure
authorDonald Sharp <sharpd@nvidia.com>
Tue, 8 Nov 2022 13:10:49 +0000 (08:10 -0500)
committerDonald Sharp <sharpd@nvidia.com>
Tue, 8 Nov 2022 13:11:52 +0000 (08:11 -0500)
RPKI revalidation is an possibly expensive operation.  Break up
revalidation on a prefix basis by the `struct bgp` pointer.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
bgpd/bgp_rpki.c
bgpd/bgpd.c
bgpd/bgpd.h

index a132e8af21589a226511f74531d43b07ece7202c..d85bb93609a4e3353cc12b3e32dbfb04f0bff68d 100644 (file)
@@ -387,6 +387,36 @@ static void pfx_record_to_prefix(struct pfx_record *record,
        }
 }
 
+struct rpki_revalidate_prefix {
+       struct bgp *bgp;
+       struct prefix prefix;
+       afi_t afi;
+       safi_t safi;
+};
+
+static void rpki_revalidate_prefix(struct thread *thread)
+{
+       struct rpki_revalidate_prefix *rrp = THREAD_ARG(thread);
+       struct bgp_dest *match, *node;
+
+       match = bgp_table_subtree_lookup(rrp->bgp->rib[rrp->afi][rrp->safi],
+                                        &rrp->prefix);
+       node = match;
+
+       while (node) {
+               if (bgp_dest_has_bgp_path_info_data(node)) {
+                       revalidate_bgp_node(node, rrp->afi, rrp->safi);
+               }
+
+               node = bgp_route_next_until(node, match);
+       }
+
+       if (match)
+               bgp_dest_unlock_node(match);
+
+       XFREE(MTYPE_BGP_RPKI_REVALIDATE, rrp);
+}
+
 static void bgpd_sync_callback(struct thread *thread)
 {
        struct bgp *bgp;
@@ -423,26 +453,18 @@ static void bgpd_sync_callback(struct thread *thread)
 
                for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
                        struct bgp_table *table = bgp->rib[afi][safi];
+                       struct rpki_revalidate_prefix *rrp;
 
                        if (!table)
                                continue;
 
-                       struct bgp_dest *match;
-                       struct bgp_dest *node;
-
-                       match = bgp_table_subtree_lookup(table, &prefix);
-                       node = match;
-
-                       while (node) {
-                               if (bgp_dest_has_bgp_path_info_data(node)) {
-                                       revalidate_bgp_node(node, afi, safi);
-                               }
-
-                               node = bgp_route_next_until(node, match);
-                       }
-
-                       if (match)
-                               bgp_dest_unlock_node(match);
+                       rrp = XCALLOC(MTYPE_BGP_RPKI_REVALIDATE, sizeof(*rrp));
+                       rrp->bgp = bgp;
+                       rrp->prefix = prefix;
+                       rrp->afi = afi;
+                       rrp->safi = safi;
+                       thread_add_event(bm->master, rpki_revalidate_prefix,
+                                        rrp, 0, &bgp->t_revalidate[afi][safi]);
                }
        }
 }
index ab90e35f015e86a07805382e06b37b778375e382..6ad1cf2c06f150c05f88d672ce555ff8db90b378 100644 (file)
@@ -3645,6 +3645,9 @@ int bgp_delete(struct bgp *bgp)
 
        hook_call(bgp_inst_delete, bgp);
 
+       FOREACH_AFI_SAFI (afi, safi)
+               THREAD_OFF(bgp->t_revalidate[afi][safi]);
+
        THREAD_OFF(bgp->t_condition_check);
        THREAD_OFF(bgp->t_startup);
        THREAD_OFF(bgp->t_maxmed_onstartup);
index e9c6487eee10f5df815ba2f9073b3d440243971f..b3fce07344959683a317b54db56f82a88eb132a3 100644 (file)
@@ -470,6 +470,8 @@ struct bgp {
        /* BGP update delay on startup */
        struct thread *t_update_delay;
        struct thread *t_establish_wait;
+       struct thread *t_revalidate[AFI_MAX][SAFI_MAX];
+
        uint8_t update_delay_over;
        uint8_t main_zebra_update_hold;
        uint8_t main_peers_update_hold;