Hello Maxime, On Wed, 17 Jun 2026 at 10:24, Maxime Leroy <[email protected]> wrote: > > trie_modify() maintained rsvd_tbl8s by computing a depth_diff from the > current RIB topology at both ADD and DEL. The two values diverge when > the RIB changes between an ADD and its later DEL (a covering parent > added or removed), so rsvd_tbl8s eventually wraps to UINT32_MAX and > rejects all subsequent /25+ ADDs with -ENOSPC. A zebra-kill / > reconverge cycle on a live BGP router reproduces it. > > The fix computes the reservation from the RIB node shape: > count_empty_levels() returns the number of byte boundaries between the > prefix and its covering parent that no other prefix occupies > (has_children + parent depth), in O(1). It is the count of tbl8 levels > the current route set needs, so ADD/DEL accounting stays consistent and > cannot drift. > > Patch 1 is the minimal self-contained fix (Fixes: + Cc: stable). > Patches 2-3 add the reproducer and extended regression tests. > > Validated on a live BGP router (grout + FRR, 128 IPv6 prefixes): > RSVD_TBL8 returned to its pre-cycle value (70) after a zebra-kill / > reconverge cycle. > > Maxime Leroy (3): > fib6: fix tbl8 reservation drift in trie > test/fib6: add reproducer for tbl8 reservation drift > test/fib6: extended drift test cases > > app/test/test_fib6.c | 335 ++++++++++++++++++++++++++++++++++++++++ > lib/fib/trie.c | 83 +++++----- > lib/rib/rib6_internal.h | 22 +++ > lib/rib/rte_rib6.c | 15 ++ > 4 files changed, 415 insertions(+), 40 deletions(-) > create mode 100644 lib/rib/rib6_internal.h > > --- > v2: > * Compute the empty-level count directly from the RIB node > (rte_rib6_node_has_children + rte_rib6_get_parent, O(1)) instead of > the v1 multi-level supernet scan over byte boundaries. > * Drop v1 patches 4-5 (valid_descendants counter + single-descent > helper): no longer needed, the node-based count is already O(1), so > rte_rib6 needs no new per-node accounting field. > > v1: > * Keep rsvd_tbl8s; recompute it via topology-stable empty-supernet > count (dir24_8 pattern at 13 levels) instead of RIB-derived > depth_diff. > * Drop RFC patch 3/3 (no longer needed). > * Add extended regression tests. > * Add patches 4-5: RIB valid_descendants + single-descent helper > (optional perf optimization; not for stable). > * Production-validated on a live BGP router. > > -- > 2.43.0 >
Series applied, thanks. -- David Marchand

