Week of 2026-01-19
A big architecture week: Ze split into a hub process and a BGP child process, gained live config reload, and got a documented plugin SDK.
π§© Process architecture
Ze now starts as a hub/orchestrator process (ze config.conf) that forks BGP as a separate child process, coordinating startup with plugins over a multi-stage handshake (declare, configure, negotiate capabilities, register, ready). Config can be reloaded live with SIGHUP: the reactor re-parses the file, diffs peers, and adds or removes sessions without a restart.
π Plugin SDK
A new SDK and developer guide (protocol details, YANG schema authoring, verify/apply handlers, command registration, testing) makes it possible to write BGP plugins outside the core tree, with a working example included. Plugins now declare a load priority so verify/apply runs in a predictable order across plugins.
π§° Config validation
Configuration is validated against YANG schemas (peer, peer-group, route-map, prefix-list, plugin config), with range and pattern constraints checked before anything is applied. The config editor validates as you type (debounced, with an error count in the status bar) and enforces RFC 4271's hold-time rule (0 or 3+ seconds), blocking commit while errors remain. Unsaved edits now persist between editor sessions.
π§© Config syntax
BGP configuration is now wrapped in a bgp {} block, with template inheritance for peer groups, laying groundwork for other protocols to sit alongside BGP in the same config file.
π οΈ CLI
Daemon and peer commands moved under a bgp namespace (bgp daemon, bgp peer <selector>) for a more consistent command surface, alongside new RIB introspection and event-subscription commands.
π Fixes
- VPN routes carrying an SRv6 Prefix-SID were silently dropping the attribute; it's included correctly now
- JSON output places next-hop consistently across all NLRI families (FlowSpec had it in a different spot than everything else)