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.
π°οΈ 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).