Weekly update

Week of 2026-02-23

A route-server-focused week: reliability fixes for BGP Route Server under load, a new external plugin protocol option, and systematic config validation.

← All weekly updates

🛰️ Route Server (RFC 7947)

The route-server plugin is renamed from bgp-rr to bgp-rs to match forward-all Route Server semantics rather than Route Reflector client/non-client selection. rs status and rs peers commands replace the old rr names.

  • Reconnecting peers now get a targeted replay of just their own routes from a dedicated adj-rib-in plugin, instead of triggering a full ROUTE-REFRESH storm across every peer and family
  • Fixed several route-loss bugs under backpressure: an overflow buffer stops silent drops when a peer can't keep up, and per-entry cache acknowledgment prevents cumulative eviction from losing routes
  • Plugins can now declare dependencies on each other (route-server on adj-rib-in, for example), auto-loaded and validated at startup

🔌 Plugin protocol

External plugins can now speak a simple line-based text protocol instead of JSON-RPC for their startup handshake and event delivery, an easier path for writing plugins in languages other than Go.

🧩 Config validation

YANG config trees are now validated recursively against schema (enums, ranges, patterns, mandatory fields), with an extensible ze:validate mechanism for custom runtime checks.

🛠️ Under the hood

Event delivery, IPC framing, and TCP session reads got a round of allocation and syscall reduction: zero-alloc text formatting, batched IPC delivery, buffered TCP reads, and RPC calls without a goroutine per request.

📊 ze-chaos

The chaos-testing dashboard got a UX pass: live convergence charts, a peer health view, and clearer sync-state visibility (peers now show Established → Syncing → Up instead of jumping straight to Up).