Skip to content

bgp rib

Thomas Mangin edited this page Apr 21, 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 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