A feature comparison of open-source BGP daemon implementations.
Disclaimer: This comparison was generated with AI assistance (partially based on rustbgpd's comparison) and is provided for informational purposes only. All listed projects are under active development and their capabilities change over time. Verify current features against each project's own documentation before making decisions. Corrections and updates are welcome via the issue tracker.
Last updated: 2026-03-25
| Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Language | Go | Rust | C | Go | Rust | C | Go | Python | C | C | Java |
| License | AGPL-3.0 | MIT | GPL-2.0+ | Apache-2.0 | Apache-2.0 | GPL-2.0 | Apache-2.0 | BSD-3-Clause | ISC | GPL-2.0+ | Free |
| Primary interface | CLI (ze) + SSH | gRPC | CLI (birdc) | gRPC | gRPC | CLI (vtysh) | gRPC | CLI + API | CLI (bgpctl) | CLI (birdc) | CLI (telnet/SSH) |
| First release | 2026 | 2026 | 2024 | 2018 | 2019 | 2017 | 2014 | 2010 | 2004 | 1998 | 2012 |
| Maturity | Pre-release | Pre-release | Production | Niche | Experimental | Production | Production | Production | Production | Production | Production |
| Multithreaded | Yes (goroutines) | Yes (tokio) | Yes | Yes (goroutines) | Yes (multi-core) | No | Yes (goroutines) | No | Yes (3-process) | No | Yes (per-peer) |
| Plugin architecture | Yes | No | No | No | No | No | No | No | No | No | No |
| YANG-modeled config | Yes | No | No | No | No | Partial | No | No | No | No | No |
| AFI/SAFI | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| IPv4 Unicast | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| IPv6 Unicast | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| IPv4 Multicast | Yes | No | Yes | No | No | Yes | Yes | No | No | Yes | Yes |
| IPv6 Multicast | Yes | No | Yes | No | No | Yes | Yes | No | No | Yes | Yes |
| IPv4 Labeled Unicast | Yes | No | No | No | No | Yes | Yes | Yes | No | No | Yes |
| IPv6 Labeled Unicast | Yes | No | No | No | No | Yes | Yes | Yes | No | No | Yes |
| VPNv4 (RFC 4364) | Yes | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| VPNv6 | Yes | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| L2VPN EVPN (RFC 7432) | Yes | No | Yes | No | No | Yes | Yes | Yes | No | Yes | Yes |
| L2VPN VPLS | Yes | No | No | No | No | No | Yes | Yes | No | No | Yes |
| IPv4 FlowSpec (RFC 8955) | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| IPv6 FlowSpec | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| VPN FlowSpec | Yes | No | No | No | No | No | Yes | No | No | No | Yes |
| BGP-LS (RFC 7752) | Decode (40 TLVs) | No | No | No | No | No | Yes | Decode | No | No | Yes |
| SR Policy | No | No | No | No | No | No | Yes | No | No | No | Partial |
| IPv4/IPv6 MUP | Yes | No | No | No | No | No | No | No | No | No | Yes |
| IPv4/IPv6 MVPN | Decode | No | No | No | No | No | No | No | No | No | Yes |
| IPv4 RTC (RFC 4684) | Decode | No | No | No | No | No | No | Yes | No | No | Yes |
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| RFC 4271 FSM | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| 4-byte ASN (RFC 6793) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Capability negotiation | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Route Refresh (RFC 2918) | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Enhanced Route Refresh (RFC 7313) | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | Yes |
| Graceful Restart (RFC 4724) | Yes | Yes | Yes | No | No | Yes | Yes | Partial | Yes | Yes | Yes |
| Long-Lived GR (RFC 9494) | Yes | Yes | Yes | No | No | Partial | Yes | No | No | Yes | Yes |
| Notification GR (RFC 8538) | Yes | Yes | No | No | No | No | Yes | No | Yes | No | No |
| Add-Path (RFC 7911) | Yes | Yes | Yes | Yes | Rx only | Yes | Yes | Yes | Yes | Yes | Yes |
| Extended Messages (RFC 8654) | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes | Yes |
| Extended Nexthop (RFC 8950) | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Route Reflector (RFC 4456) | Yes | Yes | Yes | Yes | No | Yes | Yes | No | Yes | Yes | Yes |
| Confederation (RFC 5065) | No | No | Yes | No | No | Yes | Yes | No | No | Yes | Yes |
| Admin Shutdown (RFC 8203) | Yes | Yes | Yes | Partial | No | Yes | Yes | Yes | Yes | Yes | Partial |
| BGP Roles (RFC 9234) | Yes | No | Yes | Yes | No | No | No | No | Yes | Yes | Partial |
| Prefix Limit (RFC 4486) | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | Yes |
Ze takes a programmable approach to policy: external plugin filters manipulate routes
via the redistribution {} config block using <plugin>:<filter> references.
Filters chain as piped transforms (accept/reject/modify) with delta-only output.
RFC-mandated checks run as default filters that can be selectively overridden.
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Prefix matching (ge/le) | No | Yes | Yes | Yes | Partial | Yes | Yes | No | Yes | Yes | Yes |
| AS-path regex | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | Yes |
| Standard communities | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
| Extended communities | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Large communities (RFC 8092) | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Community add/remove/replace | API | Yes | Yes | Yes | No | Yes | Yes | API | Yes | Yes | Yes |
| MED manipulation | API | Yes | Yes | Yes | No | Yes | Yes | API | Yes | Yes | Yes |
| LOCAL_PREF set | API | Yes | Yes | Yes | No | Yes | Yes | API | Yes | Yes | Yes |
| AS-path prepend | API | Yes | Yes | Yes | No | Yes | Yes | API | Yes | Yes | Yes |
| Next-hop set/self | API | Yes | Yes | Yes | No | Yes | Yes | API | Yes | Yes | Yes |
| RPKI validation match | Yes | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes | Yes |
| Neighbor/peer matching | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | Yes |
| Named policy definitions | Plugin | Yes | Yes | Yes | Partial | Yes | Yes | No | Yes | Yes | Yes |
| Policy chaining | Yes | Yes | Yes | Yes | No | Yes | Yes | No | Yes | Yes | Yes |
| Custom filter language | No | No | Yes | No | No | No | No | No | Yes | Yes | No |
| External process policy | Yes | No | No | No | No | No | No | Yes | No | No | No |
| Plugin-based policy | Yes | No | No | No | No | No | No | No | No | No | No |
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| TCP MD5 (RFC 2385) | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes |
| TCP-AO (RFC 5925) | No | No | No | No | No | No | No | No | No | No | No |
| GTSM / TTL Security | Yes | Yes | Yes | Partial | No | Yes | Yes | Yes | Yes | Yes | Yes |
| RPKI/RTR (RFC 6810/8210) | Yes | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes | Yes |
| ASPA verification | No | Yes | Yes | No | No | No | No | No | Yes | Yes | No |
| Private AS removal | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | Yes |
| Privilege separation | No | No | No | No | No | No | No | No | Yes | No | No |
| Memory-safe language | Yes | Yes | No | Yes | Yes | No | Yes | Yes | No | No | Yes |
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Prometheus metrics | Yes | Yes | No | Yes | No | Yes | Yes | No | No | No | No |
| Structured logging (JSON) | Yes | Yes | No | Yes | No | No | No | No | No | No | No |
| BMP (RFC 7854) | No | Yes | Yes | Yes | Partial | Yes | Yes | No | No | Yes | Yes |
| MRT dump (RFC 6396) | No | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes | Yes |
| Streaming route events | Yes | Yes | No | Yes | No | No | Yes | Yes | No | No | No |
| JSON event protocol | Yes | No | No | No | No | No | No | Yes | No | No | No |
| Built-in DNS resolver | Yes | No | No | No | No | No | No | No | No | No | No |
| Built-in PeeringDB/IRR/Cymru | Yes | No | No | No | No | No | No | No | No | No | No |
Unified operational reports (show warnings / show errors) |
Yes | No | Partial | No | No | Partial | No | No | Partial | Partial | Partial |
Most BGP daemons expose operational issues through a mix of per-command
output (show protocols all in BIRD, show bgp summary in FRR, counters
in OpenBGPd) rather than a single aggregated view. Ze provides a cross-
subsystem report bus: any subsystem can push warnings (state-based) or
errors (event-based) onto a single place, and ze show warnings /
ze show errors return the aggregate as structured JSON. The login
banner reads the same source, so nothing is silently hidden. See
docs/guide/operational-reports.md.
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| gRPC API | No | Yes | No | Yes | Yes | Partial | Yes | No | No | No | No |
| REST API | No | Partial | No | No | No | Partial | No | No | No | No | No |
| YANG model | Yes | No | No | No | No | Partial | No | No | No | No | No |
| CLI tool | Yes | Yes | Yes | Partial | No | Yes | Yes | Yes | Yes | Yes | Yes |
| CLI JSON output | Yes | Yes | No | No | No | Yes | Yes | Yes | Yes | No | No |
| Runtime route injection | Yes | Yes | No | No | Yes | No | Yes | Yes | No | No | Yes |
| Hot reconfiguration (no restart) | Yes | Yes | Yes | Partial | No | Yes | Yes | Yes | Yes | Yes | Yes |
| Embeddable library | No | No | No | Yes | No | No | Yes | No | No | No | No |
| Plugin SDK | Yes | No | No | No | No | No | No | No | No | No | No |
| External process protocol | Yes | No | No | No | No | No | No | Yes | No | No | No |
| SSH CLI access | Yes | No | No | No | No | No | No | No | No | No | Yes |
| Feature | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Config error diagnostics | Yes | Yes | No | Partial | No | No | No | No | No | No | Partial |
| Docker image | No | Yes | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes |
| Fuzz testing | Yes | Yes | No | Yes | No | No | No | No | No | No | No |
| Interop test suite | Yes | Yes | No | Partial | No | No | No | No | No | No | Yes |
| FIB/kernel integration | No | No | Yes | Yes | No | Yes | Yes | No | Yes | Yes | Yes |
| Route server mode | Yes | Yes | Yes | Yes | No | Yes | Yes | No | Yes | Yes | Yes |
| Dynamic neighbors | No | No | Yes | No | Yes | Yes | Yes | No | No | Yes | Yes |
| Looking glass | Yes | Yes | Yes | Yes | No | No | No | No | Yes | Yes | Yes |
| BFD integration | No | No | Yes | No | No | Yes | No | No | No | Yes | Yes |
| Modular subsystem loading | Yes | No | Partial | No | No | No | No | No | No | Partial | No |
| Chaos testing framework | Yes | No | No | No | No | No | No | No | No | No | No |
| Atomic commit workflow | Yes | No | No | No | No | No | No | No | No | No | No |
| Schema discovery (CLI) | Yes | No | No | No | No | No | No | No | No | No | No |
| Healthcheck tool | Yes | No | No | Partial | No | No | No | Yes | No | No | No |
| PeeringDB prefix integration | Yes | No | No | No | No | No | No | No | No | No | No |
| Propagation benchmark tool | Yes | No | No | No | No | No | No | No | No | No | No |
| Update groups | Auto | No | No | No | No | Explicit | No | No | No | No | No |
Update groups: Ze automatically groups peers by encoding context (ContextID) and builds each UPDATE once per group, fanning out the wire bytes to all members. No configuration needed. FRR requires explicit peer-group assignment for update group optimization. BIRD batches updates in its write loop but does not have a cross-peer build-sharing mechanism.
ExaBGP does not perform best-path selection -- it forwards all received routes to external processes and injects routes from them. It is a route injector/receiver, not a router.
| Step | Ze | rustbgpd | BIRD 3 | bio-rd | RustyBGP | FRR | GoBGP | ExaBGP | OpenBGPd | BIRD 2 | freeRtr |
|---|---|---|---|---|---|---|---|---|---|---|---|
| LOCAL_PREF | Yes | Yes | Yes | Yes | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| AS-path length | Yes | Yes | Yes | Yes | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| ORIGIN | Yes | Yes | Yes | Yes | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| MED | Yes | Yes | Yes | Yes | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| eBGP over iBGP | Yes | Yes | Yes | Yes | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| CLUSTER_LIST length | Yes | Yes | Yes | Yes | No | Yes | Yes | N/A | Yes | Yes | Yes |
| ORIGINATOR_ID | Yes | Yes | Yes | Yes | No | Yes | Yes | N/A | Yes | Yes | Yes |
| Stale route demotion (GR) | Yes | Yes | Yes | No | No | Yes | Yes | N/A | Yes | Yes | Yes |
| RPKI preference | Yes | Yes | Yes | No | Yes | Yes | Yes | N/A | Yes | Yes | Yes |
| AIGP | No | No | No | No | No | Yes | Yes | N/A | No | No | Yes |
| Multipath/ECMP | Partial | Partial | Yes | Yes | No | Yes | Yes | N/A | Yes | Yes | Yes |
Ze is a programmable BGP daemon and the successor to ExaBGP. It targets SDN, route injection,
monitoring, and route server use cases where external processes need to interact with BGP events.
A plugin architecture with YANG-modeled schemas allows extending the engine without modifying it.
Lazy-parsed wire format and pool-based attribute deduplication reduce memory overhead; when
encoding contexts match, UPDATEs are forwarded without re-parsing. Written in Go with an
estimated 10-15% overhead vs. C/Rust (not yet benchmarked at scale; see
Performance Trade-offs). ExaBGP configuration files can be
migrated via ze config migrate. Built-in RPKI validation, Prometheus metrics, and structured JSON
logging. The web UI automatically enriches displayed values using YANG-declared decorators
(e.g., AS numbers annotated with organization names via Team Cymru DNS).
No FIB integration or built-in policy language -- policy is implemented by plugins and
external processes via the JSON event and text command protocol.
ExaBGP is the automation specialist. It pioneered the external-process model where BGP events are delivered as JSON to stdin/stdout of user scripts in any language. Deployed worldwide for traffic engineering, DDoS mitigation, route injection, and SDN integration. Broad address family support. Single-threaded Python, no RIB, no best-path selection, no route reflection -- by design. It is a route injector and event source, not a router.
rustbgpd is an API-first BGP daemon targeting IX route server and SDN controller use cases. It trades address family breadth for modern operational tooling (gRPC, Prometheus, structured logging, TUI, config diagnostics) and memory safety guarantees.
bio-rd is a Go BGP library and daemon originating from DE-CIX. Designed as an embeddable library for building route servers and SDN controllers. Strong route server support with RFC 9234 (BGP Roles), BMP, and ECMP. IPv4/IPv6 unicast only -- no VPN, EVPN, FlowSpec, or other address families. No Graceful Restart or Route Refresh. gRPC API with streaming RIB observation. Used in production at IXPs. Apache-2.0 license.
RustyBGP is an experimental Rust BGP daemon by the GoBGP team (OSRG). It offers a GoBGP-compatible gRPC API and multi-core design with low memory usage. Explicitly described as "very basic BGP features" -- limited address family and policy support. Useful for research and multi-core experimentation, not yet production-ready.
FRR is the most feature-complete open-source routing suite, covering BGP plus OSPF, IS-IS, PIM, and more. Best choice when you need a full routing stack with broad AFI/SAFI coverage and kernel FIB integration.
BIRD 2/3 dominates IXP route server deployments. Best-in-class memory efficiency and a powerful filter language. BIRD 3 (stable Dec 2024) adds multithreading for 5000+ peer scale. Lacks a programmatic API -- management is CLI/config-file only.
GoBGP pioneered the API-first model with gRPC as its primary interface. Broadest AFI/SAFI coverage. Higher memory and CPU usage than C implementations at scale. Best as an SDN controller or route injector rather than a high-performance router.
OpenBGPd is security-focused with privilege separation and OpenBSD heritage. Deployed at major IXPs (LINX, Netnod). Lean, reliable, and standards-compliant with strong RFC coverage including BGP Roles and Extended Messages. No programmatic API beyond the CLI socket.
freeRtr is a comprehensive router OS written entirely in Java. It implements the full routing stack (BGP, OSPF, IS-IS, RIP, EIGRP, LDP, RSVP-TE, and more) with its own TCP/IP forwarding plane that can be backed by DPDK, XDP, or P4 dataplanes. Broadest AFI/SAFI coverage of any implementation in this table, including MUP, MVPN, RTC, and VPN FlowSpec. Full best-path selection with AIGP. Has BMP, MRT dumps, BFD, and SSH CLI access. Actively developed since 2012 with 4000+ functional test cases. No programmatic API (CLI-only), no YANG model, no structured logging. The own-stack design means Docker integration requires a raw socket bridge (rawInt.bin) between the container interface and freeRtr's virtual network layer.