{"id":47135132,"url":"https://github.com/lance0/rustbgpd","last_synced_at":"2026-05-17T22:03:35.301Z","repository":{"id":344031710,"uuid":"1168515827","full_name":"lance0/rustbgpd","owner":"lance0","description":"An API-first BGP daemon in Rust for programmable route-server and control-plane use cases","archived":false,"fork":false,"pushed_at":"2026-05-15T21:53:49.000Z","size":4691,"stargazers_count":47,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-15T22:31:35.664Z","etag":null,"topics":["bgp","bgp-daemon","bmp","flowspec","grpc","mrt","network-automation","networking","route-server","routing","rpki","rust","sdn"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lance0.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"lance0"}},"created_at":"2026-02-27T13:35:52.000Z","updated_at":"2026-05-15T21:33:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lance0/rustbgpd","commit_stats":null,"previous_names":["lance0/rustbgpd"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/lance0/rustbgpd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lance0%2Frustbgpd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lance0%2Frustbgpd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lance0%2Frustbgpd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lance0%2Frustbgpd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lance0","download_url":"https://codeload.github.com/lance0/rustbgpd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lance0%2Frustbgpd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33157233,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bgp","bgp-daemon","bmp","flowspec","grpc","mrt","network-automation","networking","route-server","routing","rpki","rust","sdn"],"created_at":"2026-03-12T21:21:46.987Z","updated_at":"2026-05-17T22:03:35.293Z","avatar_url":"https://github.com/lance0.png","language":"Rust","funding_links":["https://ko-fi.com/lance0"],"categories":[],"sub_categories":[],"readme":"# rustbgpd\n\n[![Build](https://github.com/lance0/rustbgpd/actions/workflows/ci.yml/badge.svg)](https://github.com/lance0/rustbgpd/actions/workflows/ci.yml)\n[![Rust](https://img.shields.io/badge/rust-1.92+-orange.svg)](https://www.rust-lang.org)\n[![License](https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg)](LICENSE-MIT)\n\nAn API-first BGP daemon in Rust, built for programmable route-server and\ncontrol-plane use cases. gRPC is the primary interface for all peer lifecycle,\nrouting, and policy operations. The config file bootstraps initial state; after\nstartup, gRPC owns the truth. No restarts to add peers, change policy, or\ninject routes.\n\n**Status: public alpha.** Feature-complete for the initial route-server and\ncontrol-plane target. Dual-stack BGP/MP-BGP, Add-Path, GR/LLGR, RPKI/RTR,\nASPA path verification, FlowSpec, BMP, MRT, and full gRPC/CLI management\nare implemented. Default-off Linux FIB integration exists for RFC 7999\ndiscard routes and configured unicast FIB tables; broader router features\nremain future work. Validated with a workspace test suite, fuzz targets,\nand 42 automated interop scripts — primarily against FRR 10.3.1, plus\nGoBGP 4.3.0 and StayRTR-backed RTR coverage; BIRD 2.0.12 has documented\nM0 containerlab validation. Sixteen interop tests run on every PR; the\nremaining scripts and privileged kernel dataplane smokes are local /\nmanual gates for runtime or kernel reasons.\n\n\u003e **Alpha expectations:** The config format and gRPC API are not yet frozen.\n\u003e Breaking changes are possible between minor versions. The daemon runs on\n\u003e Linux (the primary target); other platforms are not tested. See\n\u003e [Project Status](#project-status) for details.\n\n## Why rustbgpd\n\n- **API-first control plane** -- full gRPC control surface across 9 services plus a thin CLI (`rustbgpctl`) with colored tables, dynamic column alignment, and human-readable uptimes. Dynamic peer management, route injection, policy CRUD, peer groups, EVPN instance queries, streaming events, and daemon control without restarts.\n- **Explicit architecture** -- pure FSM with no I/O, single-owner RIB with no locks, bounded channels between tasks. No `Arc\u003cRwLock\u003e` on routing state. See [ARCHITECTURE.md](ARCHITECTURE.md).\n- **Dual-stack and modern protocol support** -- MP-BGP, Add-Path, Extended Next Hop, Extended Messages, GR/LLGR/Notification GR, Route Refresh/Enhanced Route Refresh, FlowSpec, Route Reflector, large and extended communities.\n- **Operational visibility** -- Prometheus metrics, BMP export to collectors, MRT TABLE_DUMP_V2 snapshots, birdwatcher-compatible looking glass REST API, structured JSON logging, per-peer counters, best-path explain.\n- **Evidence-driven correctness** -- fuzz targets on the wire decoder, property tests on the FSM, automated containerlab interop primarily against FRR plus GoBGP / StayRTR and documented BIRD coverage, extensive workspace tests, architecture decision records for every protocol and design choice.\n- **Reusable wire codec** -- `rustbgpd-wire` has zero internal dependencies and is independently publishable. Anyone building BGP tooling in Rust can use it without the daemon.\n\n## Good fit\n\n- **DDoS mitigation platforms** — FlowSpec + RTBH route injection from automation\n- **Hosting provider prefix management** — API-driven customer prefix announcements\n- **Internet exchange route servers** — transparent mode, Add-Path, RPKI, per-member policy\n- **SDN / network automation controllers** — programmable BGP control plane\n- **Route collectors and looking glasses** — structured data via gRPC, MRT, BMP, birdwatcher-compatible REST API\n- **Lab and test environments** — clean API, structured logs, containerlab interop\n\nSee [docs/USE_CASES.md](docs/USE_CASES.md) for detailed deployment scenarios with\narchitecture diagrams, example configs, and API workflows.\n\n## Not the best fit today\n\n- Full general-purpose router deployments expecting default-on,\n  fully policy-guarded FIB integration\n- Full production EVPN **VTEP** deployments — rustbgpd now ships the\n  Route Reflector role plus a bidirectional single-homed L2VNI VTEP\n  alpha path: declarative `[[evpn_instances]]` (Gate 7a), remote-MAC\n  FDB programming (Gate 7b), local-MAC Type 2 origination + Type 3\n  IMET per L2VNI (Gate 7b+1), MAC-with-IP Type 2 origination via\n  ARP/ND suppression (Gate 7b+2 — requires `bridge neigh_suppress on`),\n  sub-second mobility convergence (Gate 7c), and opt-in Gate 8/8b\n  multi-homing alpha support. Gate 9 slice 6 symmetric\n  Interface-less IRB is end-to-end live: PR A wires\n  per-IP-VRF kernel route observation + local Type 5\n  origination gated on readiness; PR B wires remote Type 5\n  import + L3 FIB programming (kernel route, L3 neighbor,\n  L3VXLAN FDB) through a transactional ownership model with\n  value-aware drift detection and four-phase apply ordering.\n  M39 self-hosted kernel-dataplane CI validates the bidirectional\n  IRB datapath against FRR 10.3.1. Aliasing dataplane ECMP via\n  FDB nexthop groups (ADR-0059, slices 1-4) ships as the\n  receive-side ECMP path for multi-homed Type 2; M40 self-hosted\n  containerlab smoke validates it against FRR EVPN-MH 10.3.1.\n  Production-default multi-homing enforcement after the soak remains ahead\n- VPNv4 / VPNv6 overlays\n- Environments that need the breadth of FRR's multi-decade feature surface\n- Operators who want a CLI-first operational model\n\nSee [docs/COMPARISON.md](docs/COMPARISON.md) for a detailed feature comparison\nwith FRR, BIRD, GoBGP, and OpenBGPd.\n\n## Try it (60 seconds)\n\nThe fastest way to see rustbgpd in action. Spins up the daemon with an FRR\npeer that advertises sample IPv4 and IPv6 prefixes — no real routers needed.\n\n```bash\ncd examples/docker-compose\ndocker compose up -d\n```\n\nOnce both containers are running (a few seconds):\n\n```bash\n# See the FRR peer come up\ndocker compose exec rustbgpd rustbgpctl -s http://127.0.0.1:50051 neighbor\n\n# Browse the RIB\ndocker compose exec rustbgpd rustbgpctl -s http://127.0.0.1:50051 rib\n\n# Live TUI dashboard — sessions, prefix counts, message rates\ndocker compose exec rustbgpd rustbgpctl -s http://127.0.0.1:50051 top\n```\n\n![rustbgpctl top — live TUI dashboard](docs/images/tui-screenshot.png)\n\nPress `q` to exit the TUI. When you're done: `docker compose down`.\n\n## Install\n\n### From source\n\n```bash\n# Prerequisites: Rust 1.92+, protobuf-compiler\nsudo apt-get install -y protobuf-compiler   # Debian/Ubuntu\ncargo build --workspace --release\n\n# Binaries are at target/release/rustbgpd and target/release/rustbgpctl\n```\n\n### Docker\n\n```bash\ndocker build -t rustbgpd .\n```\n\n## Quick start (bare metal)\n\nFor running rustbgpd on a real host with real peers.\n\n### 1. Configure\n\n```bash\n# Copy and edit the minimal example\ncp examples/minimal/config.toml config.toml\n$EDITOR config.toml   # set your ASN, router ID, and peer address\n```\n\nThe minimal example sets `runtime_state_dir` to a user-writable path and\nincludes `prometheus_addr` for metrics. For a route-server deployment, start\nfrom `examples/route-server/config.toml` instead. Full reference:\n[docs/CONFIGURATION.md](docs/CONFIGURATION.md).\n\n### 2. Validate and run\n\n```bash\n# Validate config without starting the daemon\n./target/release/rustbgpd --check config.toml\n\n# Preview what a config reload (SIGHUP) would change\n./target/release/rustbgpd --diff new-config.toml config.toml\n\n# Start the daemon\n./target/release/rustbgpd config.toml\n```\n\n### 3. Verify\n\n```bash\n# The minimal example uses /tmp/rustbgpd as state dir, so point the CLI there:\nexport RUSTBGPD_ADDR=unix:///tmp/rustbgpd/grpc.sock\n\nrustbgpctl health\nrustbgpctl neighbor\nrustbgpctl rib\nrustbgpctl top       # live TUI dashboard\n```\n\nIn production with the systemd unit, the default UDS path\n(`/var/lib/rustbgpd/grpc.sock`) matches the CLI default — no env var needed.\n\n### 4. Operate\n\n```bash\n# Add a peer at runtime (persisted to config file automatically)\nrustbgpctl neighbor 10.0.0.5 add --asn 65005\n\n# Explain why a route was selected as best\nrustbgpctl rib --prefix 10.0.0.0/24 --explain\n\n# Reload config after editing the file\nkill -HUP $(pidof rustbgpd)\n\n# Graceful shutdown (writes GR marker, notifies peers)\nrustbgpctl shutdown\n\n# Enable shell completions (bash example)\nrustbgpctl completions bash \u003e /etc/bash_completion.d/rustbgpctl\n# Or use pre-generated: examples/completions/\n```\n\ngRPC defaults to a local Unix domain socket. For remote access, configure\nnative mTLS on the TCP listener (`tls_cert_file` / `tls_key_file` /\n`tls_client_ca_file` — all three required together; partial config is\nrejected at load time and there is no TLS-without-mTLS half-mode). An\nEnvoy proxy front-end is also a valid pattern for multi-host fan-out;\nsee [`examples/envoy-mtls/`](examples/envoy-mtls/) and\n[docs/SECURITY.md](docs/SECURITY.md).\n\n### Docker (standalone)\n\n```bash\ndocker run -d --name rustbgpd \\\n  -v $(pwd)/config.toml:/etc/rustbgpd/config.toml:ro \\\n  -v rustbgpd-state:/var/lib/rustbgpd \\\n  -p 179:179 -p 9179:9179 \\\n  rustbgpd\n```\n\nOr use systemd with [`examples/systemd/rustbgpd.service`](examples/systemd/rustbgpd.service).\n\n## gRPC API\n\nNine services cover the full operational surface:\n\n| Service | RPCs | Purpose |\n|---------|------|---------|\n| `GlobalService` | `GetGlobal`, `SetGlobal` | Daemon identity and configuration |\n| `NeighborService` | `AddNeighbor`, `DeleteNeighbor`, `ListNeighbors`, `GetNeighborState`, `EnableNeighbor`, `DisableNeighbor`, `SoftResetIn`, `AddDynamicNeighbor`, `DeleteDynamicNeighbor`, `ListDynamicNeighbors` | Peer lifecycle, inbound soft reset, and dynamic-range admin |\n| `PolicyService` | `ListPolicies`, `GetPolicy`, `SetPolicy`, `DeletePolicy`, `List/Get/Set/DeleteNeighborSet`, `Get*Chain`, `Set*Chain`, `Clear*Chain` | Named policy CRUD, neighbor sets, and global/per-neighbor chain attachment |\n| `PeerGroupService` | `ListPeerGroups`, `GetPeerGroup`, `SetPeerGroup`, `DeletePeerGroup`, `SetNeighborPeerGroup`, `ClearNeighborPeerGroup` | Peer-group CRUD and neighbor membership assignment |\n| `RibService` | `ListReceivedRoutes`, `ListBestRoutes`, `ListAdvertisedRoutes`, `ExplainAdvertisedRoute`, `ExplainBestPath`, `ListFlowSpecRoutes`, `ListEvpnRoutes`, `ListBlackholeDiscards`, `ListRouteEvents`, `WatchRoutes` | RIB queries (incl. EVPN), BLACKHOLE discard status, explain, recent route-event history with per-prefix drilldown, and streaming |\n| `EventService` | `WatchEvents`, `ListSessionEvents`, `ListPolicyEvents` | Unified live stream for route, session lifecycle, BGP NOTIFICATION metadata, policy mutation, and FIB / BLACKHOLE dataplane status-row summary events, with `stream_lagged` warnings for bounded-source backpressure; plus bounded after-the-fact session-lifecycle and policy-mutation history. Per-route / per-MAC EVPN dataplane categories remain follow-up work |\n| `InjectionService` | `AddPath`, `DeletePath`, `AddFlowSpec`, `DeleteFlowSpec`, `AddEvpnRoute`, `DeleteEvpnRoute` | Programmatic route, FlowSpec, and EVPN injection |\n| `ControlService` | `GetHealth`, `GetMetrics`, `Shutdown`, `TriggerMrtDump` | Health, metrics, lifecycle, MRT dumps |\n| `EvpnService` | `ListEvpnInstances`, `ListEvpnNexthops`, `ListIpVrfs`, `GetIpVrf` | Local EVPN VTEP instance state, ADR-0059 FDB-nexthop ownership, and Gate 9 IP-VRF readiness / route counters |\n\n```bash\n# Stream route changes in real time over the default UDS listener\ngrpcurl -plaintext -unix /var/lib/rustbgpd/grpc.sock \\\n  -import-path . -proto proto/rustbgpd.proto \\\n  rustbgpd.v1.RibService/WatchRoutes\n```\n\nFull API reference: [docs/API.md](docs/API.md)\n\n## Design choices\n\nrustbgpd is intentionally built around:\n\n- **gRPC-driven control** instead of a large interactive CLI surface\n- **A pure FSM crate** with no I/O -- `(State, Event) -\u003e (State, Vec\u003cAction\u003e)`\n- **Single-owner routing state** instead of shared mutable state across tasks\n- **Bounded channels** for all inter-task communication -- backpressure, not locks\n- **Explicit protocol feature boundaries** with ADRs and test-backed development\n\nDesigned around an API-first operating model similar to GoBGP, with a smaller\nand more explicit internal architecture.\n\n## Deployment examples\n\n| Example | Description |\n|---------|-------------|\n| [`examples/docker-compose/`](examples/docker-compose/) | Quick-start with Docker Compose — rustbgpd + FRR peer with sample routes |\n| [`examples/minimal/`](examples/minimal/) | Smallest working config — single eBGP peer |\n| [`examples/route-server/`](examples/route-server/) | IXP route server with RPKI, Add-Path, policy chains |\n| [`examples/ddos-mitigation/`](examples/ddos-mitigation/) | FlowSpec + RTBH for automated DDoS mitigation |\n| [`examples/hosting-provider/`](examples/hosting-provider/) | iBGP route injector for customer prefix management |\n| [`examples/linux-edge-fib/`](examples/linux-edge-fib/) | Linux edge host with explicit ADR-0061 `[[fib_tables]]` unicast FIB programming |\n| [`examples/route-collector/`](examples/route-collector/) | Passive collector with MRT dumps and BMP export |\n| [`examples/rr-evpn-fabric/`](examples/rr-evpn-fabric/) | EVPN Route Reflector for a VXLAN-EVPN DC fabric (RFC 7432, RR role) |\n| [`examples/evpn-vtep-leaf/`](examples/evpn-vtep-leaf/) | Leaf VTEP with local `[[evpn_instances]]` declarations (Gate 7a foundation) |\n| [`examples/envoy-mtls/`](examples/envoy-mtls/) | Remote gRPC access via Envoy mTLS proxy |\n| [`examples/systemd/`](examples/systemd/) | systemd unit file with security hardening |\n\n## Security posture\n\n- **Default listener:** Unix domain socket at `/var/lib/rustbgpd/grpc.sock` — local-only, no TCP exposure\n- **Optional read-only listeners:** expose monitoring/query RPCs without exposing mutating control RPCs\n- **Remote access:** native gRPC mTLS on the TCP listener (`tls_cert_file` / `tls_key_file` / `tls_client_ca_file`), or an Envoy mTLS proxy front-end for multi-host fan-out — never plaintext TCP off-host\n- **Network controls:** put gRPC on a management VLAN/interface and firewall it to known hosts\n\n## Testing and correctness\n\n| Evidence | Details |\n|----------|---------|\n| Workspace tests | Unit, integration, and property tests (`cargo test --workspace`) |\n| Wire fuzzing | libFuzzer harnesses on message and attribute decoders, CI smoke + nightly extended |\n| Interop suites | 42 automated interop scripts, primarily against FRR 10.3.1 plus GoBGP 4.3.0 and StayRTR-backed RTR coverage; BIRD 2.0.12 has documented M0 containerlab validation. Sixteen interop tests are gated on every PR; privileged / longer kernel smokes run locally. |\n| Protocol coverage | RFC 4271 FSM + UPDATE validation, MP-BGP, GR/LLGR, Add-Path, FlowSpec, RPKI, ASPA, Extended Messages, Extended Next Hop, Route Refresh/ERR, RFC 7999 BLACKHOLE receiver scoping + opt-in FIB discard, ADR-0061 configured-table unicast Linux FIB programming, RFC 8326 Graceful Shutdown |\n| Architecture decisions | ADRs documenting every protocol and design choice ([docs/adr/](docs/adr/)) |\n\n```bash\n# Run interop tests\ncontainerlab deploy -t tests/interop/m4-frr.clab.yml\nbash tests/interop/scripts/test-m4-frr.sh\n```\n\nSee [docs/INTEROP.md](docs/INTEROP.md) for full procedures and results.\n\n## Current limitations\n\n- Linux FIB integration is opt-in and scoped: RFC 7999 BLACKHOLE\n  discard routes and configured `[[fib_tables]]` unicast route\n  installation are available, with per-peer / peer-group allow-lists\n  and per-table route-count caps for the general FIB path. The general\n  FIB actor persists exact owned-state receipts for crash-restart\n  recovery without adopting `RTPROT_BGP` by protocol alone. Full router\n  parity still needs broader redistribution policy and non-BGP\n  route-manager scope\n- EVPN (RFC 7432) is supported in **Route Reflector role plus the Gate 7a/7b/7b+1/7b+2/7c bidirectional VTEP alpha path, with Gate 8/8b multi-homing alpha and Gate 9 slice 6 symmetric Interface-less IRB end-to-end** (ADR-0052, ADR-0054, ADR-0055, ADR-0056, ADR-0057, ADR-0058). RR reflection covers all 5 RFC 7432 / RFC 9136 route types (Type 1–5) end-to-end against FRR. Controller injection via gRPC (`AddEvpnRoute` / `DeleteEvpnRoute`) is currently scoped to Types 2 and 3. Gate 7a ships the declarative half: `[[evpn_instances]]` TOML schema + `EvpnService.ListEvpnInstances` gRPC + `rustbgpctl evpn instances`, all in the domain-only `crates/evpn` crate. Gate 7b adds the level-triggered Linux dataplane reconciler in `crates/evpn-linux`: remote-MAC FDB programming over rtnetlink (single combined `NTF_SELF | NTF_MASTER | NTF_EXT_LEARNED` `RTM_NEWNEIGH` per `(VNI, MAC)`), structural foreign-entry preservation, per-op-fingerprint permanent-failure suppression, errno-based classifier, and a 5 s shutdown drain wired into coordinated daemon shutdown. Gate 7b+1 closes the upward loop: kernel-learned local MACs become MAC-only Type 2 originations with RFC 7432 §15.1 mobility sequencing, one Type 3 IMET per L2VNI carries a PMSI Tunnel attribute for ingress-replication BUM, and `advertise_svi_mac = true` originates a Type 2 for the bridge's own MAC (RFC 9135 §6.1) on instance-Ready. Gate 7b+2 closes the MAC+IP path: with `bridge link set ... neigh_suppress on`, ARP/ND-snooped `(IP, MAC)` bindings on the bridge's neighbour table drive MAC+IP Type 2 origination under the FRR-style replace model (one Type 2 per MAC at any time — `IpAdded` upgrades from MAC-only to MAC+IP, last `IpRemoved` downgrades back). Gate 7c switches the originator from a 5 s `QueryEvpnRoutes` poll to a push-notified RIB broadcast for sub-second mobility convergence; the 5 s poll stays as a `Lagged` / cold-start backstop. ADR-0056 adds operator-facing `sticky_macs` config. Gate 8/8b adds alpha multi-homing execution: DF election, Type 1/4 origination, opt-in BUM suppression, ESI-aware Type 2 origination, aliasing projection, and receive-side mass-withdraw filtering. Gate 9 (ADR-0058) lands symmetric Interface-less IRB end-to-end: `[[evpn_ip_vrfs]]` TOML schema with VRF / L3VXLAN device + Router MAC binding, pure-logic Type 5 origination + projection helpers, the IP-VRF readiness probe, Linux rtnetlink dumps for VRF / L3VXLAN inventory, a `Dataplane::probe_ip_vrfs` trait surface that the reconcile actor calls every pass, `DataplaneReport.ip_vrf_status` carrying the per-VRF verdict, `ListIpVrfs` / `GetIpVrf` gRPC + `rustbgpctl evpn vrfs` CLI surface, slice 6 PR A's per-IP-VRF kernel route observation + local Type 5 origination (gated on readiness, with a level-triggered diff loop), and slice 6 PR B's remote Type 5 import + L3 FIB programming through a transactional `L3OwnedState` model that programs kernel route + L3 neighbor + L3VXLAN FDB atomically with value-aware drift detection (Router MAC / next-hop transition under the same prefix triggers an atomic `.replace()`), Router MAC conflict detection, four-phase apply ordering (route-remove → resolution-add → route-add → resolution-remove), and foreign-state preservation. M39 protected self-hosted kernel-dataplane smoke validates the bidirectional IRB datapath against FRR 10.3.1. ADR-0059 ships aliasing dataplane ECMP via FDB nexthop groups in four slices on the receive path: slice 1 portable intent (`RemoteMacEntry::alias_group_key`), slice 2 raw-netlink `NDA_NH_ID` / `NHA_FDB` primitive, slice 3a state types + apply primitive with the CVE-2025-39851 guard, slice 3b reconcile coordinator + Pass 1b diff + startup NHID adoption + actor-level FDB-NHG test coverage, and slice 4 M40 protected self-hosted kernel-dataplane smoke against FRR EVPN-MH 10.3.1 (16/16 PASS first-shot). Duplicate-MAC remote-route processing / dataplane loop-protection, production-default multi-homing enforcement after a clean soak, full overlay-index IRB semantics (RFC 9135 overlay-index model), VLAN-aware bridges, and bridge / VXLAN netdev creation remain follow-up work\n- No VPNv4 / VPNv6 or Confederation support\n- No TCP-AO (RFC 5925) — TCP MD5 and GTSM are supported\n- Published benchmarks: bgperf2 covers IPv4 unicast at 10 peers × 1k, 2 peers × 10k, and 2 peers × 100k prefixes; the in-tree `bench/evpn-load` M33 scale gate covers 50,000 reflected Type 2 routes with 60 s of 1,000-rps churn (5.1 s initial convergence, post-churn distinct-key count exact). Gate-specific 24h soak harnesses now ship in-tree under `tests/soak/`: a Gate 8b BUM-state harness and a Gate 9 slice 6 24h Type 5 churn harness, both with post-mortems under `docs/soak-*.md`. Continuous / multi-day soak automation outside those gates remains future work (see [docs/BENCHMARKS.md](docs/BENCHMARKS.md))\n\n## Project status\n\n**Alpha — suitable for lab, IX route-server pilots, and programmable\ncontrol-plane deployments where you are comfortable with an evolving API.**\n\n| Dimension | Current state |\n|-----------|---------------|\n| **Target use case** | IXP route servers, programmable BGP control planes, lab/test environments |\n| **Maturity** | Public alpha (v0.22.0) |\n| **Supported OS** | Linux (primary target). Requires `CAP_NET_BIND_SERVICE` for port 179. |\n| **Runtime** | Rust 1.92+ (workspace MSRV — Tokio rolling-6-month policy), single binary, no external dependencies except optional RPKI/BMP/MRT backends |\n| **Config stability** | TOML format may change between minor versions; migrations documented in CHANGELOG |\n| **API stability** | gRPC proto may add fields/RPCs; breaking changes documented in CHANGELOG |\n| **Not yet supported** | EVPN duplicate-MAC remote-route processing / dataplane loop-protection / production-default multi-homing enforcement / RFC 9135 overlay-index IRB, VPNv4/v6, Confederation, TCP-AO |\n| **Tests** | Workspace test suite, fuzz targets, 42 automated interop scripts primarily against FRR plus GoBGP / StayRTR / documented BIRD coverage, and an in-tree EVPN load generator (16 interop tests gated on every PR; privileged kernel dataplane smokes run locally) |\n\n## Documentation\n\n| Document | Content |\n|----------|---------|\n| [docs/USE_CASES.md](docs/USE_CASES.md) | Deployment scenarios: DDoS, hosting, IX, SDN, collector |\n| [ARCHITECTURE.md](ARCHITECTURE.md) | Crate graph, runtime model, ownership, data flow |\n| [docs/DESIGN.md](docs/DESIGN.md) | Tradeoffs, protocol scope, rationale |\n| [docs/API.md](docs/API.md) | gRPC API reference with examples for every RPC |\n| [docs/CONFIGURATION.md](docs/CONFIGURATION.md) | Config reference and examples |\n| [docs/OPERATIONS.md](docs/OPERATIONS.md) | Running in production: reload, upgrade, failure modes, debugging |\n| [docs/SECURITY.md](docs/SECURITY.md) | Security posture, firewall guidance, deployment tiers |\n| [docs/BENCHMARKS.md](docs/BENCHMARKS.md) | Wire codec and RIB performance numbers, scaling analysis |\n| [docs/COMPARISON.md](docs/COMPARISON.md) | Feature comparison with FRR, BIRD, GoBGP, OpenBGPd |\n| [docs/INTEROP.md](docs/INTEROP.md) | Interop test coverage and results |\n| [docs/evpn-enablement.md](docs/evpn-enablement.md) | EVPN Phase 1-9 gate ladder: what each gate unlocks, work per gate, priority |\n| [docs/evpn-vtep-troubleshooting.md](docs/evpn-vtep-troubleshooting.md) | EVPN VTEP alpha troubleshooting runbook |\n| [docs/gobgp-parity.md](docs/gobgp-parity.md) | rustbgpd vs GoBGP feature parity by use case |\n| [docs/adr/](docs/adr/) | Architecture decision records (59 ADRs) |\n| [docs/RELEASE_CHECKLIST.md](docs/RELEASE_CHECKLIST.md) | Pre-release smoke matrix and release steps |\n| [ROADMAP.md](ROADMAP.md) | Remaining gaps and planned work |\n| [CHANGELOG.md](CHANGELOG.md) | Release history |\n| [CONTRIBUTING.md](CONTRIBUTING.md) | Development setup, code style, PR process |\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or \u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttp://opensource.org/licenses/MIT\u003e)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flance0%2Frustbgpd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flance0%2Frustbgpd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flance0%2Frustbgpd/lists"}