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 what it actually does (forward-all Route Server semantics, not Route Reflector client/non-client selection); rs status/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).