From 7f1f93144781d73886ddcf7b4ddfadf09e50e14e Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 8 Nov 2022 08:10:49 -0500 Subject: [PATCH] bgpd: Break up rpki prefix revalidation by bgp structure RPKI revalidation is an possibly expensive operation. Break up revalidation on a prefix basis by the `struct bgp` pointer. Signed-off-by: Donald Sharp --- bgpd/bgp_rpki.c | 54 ++++++++++++++++++++++++++++++++++--------------- bgpd/bgpd.c | 3 +++ bgpd/bgpd.h | 2 ++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c index a132e8af21..d85bb93609 100644 --- a/bgpd/bgp_rpki.c +++ b/bgpd/bgp_rpki.c @@ -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]); } } } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index ab90e35f01..6ad1cf2c06 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -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); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index e9c6487eee..b3fce07344 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -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; -- 2.39.5