Skip to content

bgp rib

Thomas Mangin edited this page May 14, 2026 · 11 revisions

Pre-Alpha. This page describes behavior that may change.

The main BGP RIB store and best-path selection engine.

Category

Storage.

Configuration

Load the plugin and bind it to peers.

plugin {
    external rib { use bgp-rib; encoder json; }
}

bgp {
    peer upstream {
        connection { remote { ip 10.0.0.1; } }
        session    { asn { remote 65001; } }
        process rib { receive [ update state ]; send [ update ]; }
    }
}

receive [ update state ] lets the RIB see routes arriving and peer state changes. send [ update ] lets it send routes back out after best-path selection (when acting as a router) or forwarding (when paired with bgp-rs).

Behaviour

bgp-rib stores routes per prefix per family and runs RFC 4271 section 9.1.2 best-path selection when multiple paths exist for a prefix. N-way multipath is supported: when bgp/multipath is configured with maximum-paths and relax-as-path, multiple equal-cost paths are selected and installed. The output is fed to sysrib (unified Loc-RIB) for cross-protocol admin-distance selection and then to fib-kernel and/or fib-vpp for forwarding table installation. The best-path order is LOCAL_PREF, AS_PATH length, ORIGIN, MED (same neighbour AS only), eBGP over iBGP, IGP cost (not implemented), lowest router-id, lowest peer address.

The RIB uses a two-level ribInPool keyed by ProtocolID, enabling multi-source support. BGP peers and BMP-monitored peers store routes under separate ProtocolIDs, so best-path selection only iterates real BGP routes while BMP routes are visible through the looking glass without additional filtering.

Internally, the RIB uses BART (Binary Adaptive Radix Tree) storage with per-family NLRI split registry. Non-CIDR families (EVPN, FlowSpec, etc.) get an opaque-map backend. bestPathRecord is packed into uint64 with a shared cross-family interner for memory efficiency. The Loc-RIB shards by prefix hash and the peer-keyed map lock is split from the main RIB mutex to keep it off the hot path.

The plugin also handles the RIB half of Graceful Restart: holding stale routes during a peer restart, clearing them on EOR, and purging any that did not come back.

Route replay on reconnect

The plugin replays stored routes when a peer reconnects. A batch of fixes landed recently (three bugs in the sent-event path: dispatch routing by Direction instead of EventType, missing WireUpdate on sent events, and a format mismatch for text-codec routes). The sync is now event-driven rather than timer-driven, and the graceful-restart, LLGR, and refresh-on-reconnect test scenarios all pass reliably.

Metrics

Registered via ConfigureMetrics. Includes both route counts and attribute-pool statistics.

Metric Type Meaning
ze_rib_routes_in_total gauge Total Adj-RIB-In route count across all peers.
ze_rib_routes_out_total gauge Total Adj-RIB-Out route count across all peers.
ze_rib_routes_in{peer} gauge Adj-RIB-In route count per peer.
ze_rib_routes_out{peer} gauge Adj-RIB-Out route count per peer.
ze_rib_route_inserts_total{peer,family} counter Routes inserted into Adj-RIB-In.
ze_rib_route_withdrawals_total{peer,family} counter Routes withdrawn from Adj-RIB-In.
ze_attr_pool_intern_total{pool} gauge Total Intern() calls per attribute pool.
ze_attr_pool_dedup_hits_total{pool} gauge Intern() dedup hits per pool.
ze_attr_pool_slots_used{pool} gauge Active slots per pool.

See plugin metrics.

Interactions

  • bgp-gr depends on bgp-rib for the stale route handling.
  • bgp-persist snapshots the RIB to disk.
  • bgp-adj-rib-in feeds raw received updates into the RIB.
  • sysrib consumes best-path change events from the RIB.

Source

main/internal/component/bgp/plugins/rib/

Home

About

First Steps

Configuration

Operation

Interfaces

Plugins

Plugin Development

Chaos Testing

Blueprints

Development

Reference

Clone this wiki locally