Records of significant architectural decisions made during rustbgpd development. Each record captures the context, decision, and consequences so future contributors understand why, not just what.
| ADR | Title | Status | Date |
|---|---|---|---|
| 0001 | Typed + raw hybrid model for path attributes | Accepted | 2026-02-27 |
| 0002 | Inherent methods, not traits, for codec API | Accepted | 2026-02-27 |
| 0003 | NOTIFICATION subcodes as constants, not enums | Accepted | 2026-02-27 |
| 0004 | Proptest for property-based testing | Accepted | 2026-02-27 |
| 0005 | Pure state machine FSM with no Result return | Accepted | 2026-02-27 |
| 0006 | validate_open returns Result<NegotiatedSession, NotificationMessage> | Accepted | 2026-02-27 |
| 0007 | Explicit Prometheus registry, not global default | Accepted | 2026-02-27 |
| 0008 | Single tokio task per peer for M0 | Accepted | 2026-02-27 |
| 0009 | Iterative action loop to avoid async recursion | Accepted | 2026-02-27 |
| 0010 | Minimal TCP metrics server, no HTTP framework | Accepted | 2026-02-27 |
| 0011 | Unknown variant for NOTIFICATION error codes | Accepted | 2026-02-27 |
| 0012 | Separate structural decode from semantic validation for UPDATEs | Accepted | 2026-02-27 |
| 0013 | Single-task RIB manager with channel-based ownership | Accepted | 2026-02-27 |
| 0014 | Best-path comparison as standalone function with deterministic MED | Accepted | 2026-02-27 |
| 0015 | Adj-RIB-Out inside RibManager with per-peer outbound channels | Accepted | 2026-02-27 |
| 0016 | socket2 for TCP MD5 and GTSM socket options | Accepted | 2026-02-27 |
| 0017 | PeerManager — channel-based single-task ownership | Accepted | 2026-02-27 |
| 0018 | Broadcast channel for WatchRoutes streaming | Accepted | 2026-02-27 |
| 0019 | Inbound TCP listener for passive peering | Accepted | 2026-02-27 |
| 0020 | GlobalService, ControlService, and coordinated shutdown | Accepted | 2026-02-27 |
| 0021 | TCP collision detection via PeerManager coordination | Accepted | 2026-02-28 |
| 0022 | gRPC server supervision — unexpected exit triggers shutdown | Accepted | 2026-02-28 |
| 0023 | Prefix enum and AFI-agnostic RIB for MP-BGP | Accepted | 2026-02-28 |
| 0024 | Graceful Restart — Receiving Speaker (RFC 4724) | Accepted | 2026-03-01 |
| 0025 | Extended Communities (RFC 4360) | Accepted | 2026-03-01 |
| 0026 | Extended Community Policy Matching | Accepted | 2026-03-01 |
| 0027 | Route Refresh (RFC 2918) | Accepted | 2026-03-02 |
| 0028 | Standard Community Policy Matching (RFC 1997) | Accepted | 2026-03-02 |
| 0029 | Route Reflector (RFC 4456) | Accepted | 2026-03-02 |
| 0030 | Policy Actions and AS_PATH Regex | Accepted | 2026-03-02 |
| 0031 | Large Communities (RFC 8092) | Accepted | 2026-03-02 |
| 0032 | Extended Messages (RFC 8654) | Accepted | 2026-03-02 |
| 0033 | Add-Path (RFC 7911) | Accepted | 2026-03-02 |
| 0034 | RPKI Origin Validation (RFC 6811 + RFC 8210) | Accepted | 2026-03-03 |
| 0035 | FlowSpec (RFC 8955 / RFC 8956) | Accepted | 2026-03-03 |
| 0036 | Policy Chaining + Named Policies | Accepted | 2026-03-04 |
| 0037 | Extended Next Hop Encoding (RFC 8950) | Accepted | 2026-03-04 |
| 0038 | Enhanced Route Refresh (RFC 7313) | Accepted | 2026-03-04 |
| 0039 | Transparent Route Server Mode | Accepted | 2026-03-04 |
| 0040 | Graceful Restart — Minimal Restarting Speaker Mode | Accepted | 2026-03-04 |
| 0041 | BMP Exporter (RFC 7854) | Accepted | 2026-03-04 |
| 0042 | Long-Lived Graceful Restart (RFC 9494) | Accepted | 2026-03-05 |
| 0043 | Config Persistence and SIGHUP Reload | Accepted | 2026-03-05 |
| 0044 | MRT Dump Export (RFC 6396) | Accepted | 2026-03-05 |
| 0045 | Private AS Removal | Accepted | 2026-03-05 |
| 0046 | Notification GR (RFC 8538) | Accepted | 2026-03-05 |
| 0047 | gRPC Security Hardening | Accepted | 2026-03-06 |
| 0048 | RIB Memory Optimizations | Accepted | 2026-03-08 |
| 0049 | ASPA Upstream Path Verification | Accepted | 2026-03-13 |
| 0050 | EVPN Route Reflector (RFC 7432 Phase 1) | Accepted | 2026-04-23 |
| 0051 | Per-peer outbound writer task | Accepted | 2026-04-27 |
| 0052 | EVPN VTEP Foundation — Local EVI/VNI Domain Model | Accepted | 2026-05-01 |
| 0053 | RFC 8326 BGP Graceful Shutdown | Accepted | 2026-05-04 |
| 0054 | EVPN Linux Dataplane Boundary | Accepted | 2026-05-04 |
| 0055 | EVPN Local-MAC Origination Boundary | Accepted | 2026-05-06 |
| 0056 | EVPN sticky-MAC operator config | Accepted | 2026-05-08 |
| 0057 | EVPN Gate 8 — observable DF election without forwarding enforcement | Accepted | 2026-05-09 |
| 0058 | EVPN Gate 9 — symmetric IRB, L3VNI, Type 5 dataplane | Accepted | 2026-05-10 |
| 0059 | EVPN aliasing dataplane via FDB nexthop groups | Accepted | 2026-05-12 |
| 0060 | RFC 7999 BLACKHOLE receiver scoping and opt-in FIB discard | Accepted | 2026-05-13 |
| 0061 | Opt-in unicast Linux FIB integration | Accepted | 2026-05-14 |
| 0062 | TCP-AO foundation | Accepted | 2026-05-16 |
| 0063 | EVPN runtime instance mutation semantics | Accepted | 2026-05-17 |
| 0064 | gRPC per-method authorization | Accepted | 2026-05-18 |
| 0064-annex | gRPC management-plane threat model (ADR-0064 annex) | Current | 2026-07-26 |
| 0065 | EVPN VXLAN local-bias split-horizon (spike-gated) | Accepted | 2026-05-22 |
| 0066 | Unicast multipath / ECMP FIB install | Accepted | 2026-05-24 |
| 0067 | Single-hop asynchronous BFD for BGP | Accepted | 2026-05-24 |
| 0068 | Weighted (unequal-cost) multipath via Link Bandwidth | Accepted | 2026-05-24 |
| 0069 | BGP unnumbered and IPv6 link-local peering | Accepted | 2026-05-25 |
| 0070 | gNMI / OpenConfig telemetry and Set adapter | Accepted | 2026-05-25 |
| 0071 | BGP Roles and Only-to-Customer (RFC 9234) | Accepted | 2026-05-26 |
| 0072 | Durable event history (local outbox) | Accepted | 2026-05-26 |
| 0073 | Import policy explain via per-session decision cache | Accepted | 2026-05-28 |
| 0074 | Runtime FIB-table CRUD authorization tier | Accepted | 2026-06-01 |
| 0075 | Receive-side Address-Prefix Outbound Route Filtering (ORF) | Accepted | 2026-06-03 |
| 0076 | Config transaction model foundation | Accepted | 2026-06-03 |
| 0077 | MPLS, VPN, and BGP-LS address-family boundary | Accepted | 2026-06-08 |
| 0078 | Inbound transport→RIB backpressure — block, never drop | Accepted | 2026-06-10 |
| 0079 | Kernel-state crash-restart reconciliation via adoption sweeps | Accepted | 2026-06-10 |
| 0080 | Cancellation-shielded runtime mutation applies | Accepted | 2026-06-10 |
| 0081 | Atomic peer-group session reshapes on the targeted RPC path | Accepted | 2026-06-10 |
| 0082 | NDA_PROTOCOL ownership stamping for EVPN FDB/neighbor state | Accepted | 2026-06-10 |
| 0083 | EVPN single-active backup-path pre-install | Accepted | 2026-06-11 |
| 0084 | Runtime Ethernet Segment drain | Accepted | 2026-06-12 |
| 0085 | Ethernet Segment interface binding — link-driven drain and same-ESI local bias | Accepted | 2026-06-12 |
| 0086 | Peer-group field edits reach live dynamic sessions via post-persist graceful reset | Accepted | 2026-06-12 |
| 0087 | Native GW-IP overlay-index Type 5 origination (RFC 9136) | Accepted | 2026-06-12 |
| 0088 | EVPN VLAN-aware bridge and managed netdev boundary | Accepted | 2026-06-15 |
| 0089 | EVPN VNI-per-BD VLAN-aware bridge support | Accepted | 2026-06-15 |
| 0090 | All-active ESI overlay-index Type 5 receive | Accepted | 2026-06-17 |
| 0091 | rustbgpd-managed netdev creation | Accepted | 2026-06-19 |
| 0092 | EVPN VLAN-Aware Bundle service (non-zero Ethernet Tag) | Accepted | 2026-06-19 |
| 0093 | VLAN MAC+IP attribution via FDB correlation on raw bridge ifindexes | Proposed | 2026-06-19 |
| 0094 | EVPN VXLAN all-active BUM filtering via kernel l2_miss (revisits ADR-0065) | Accepted (negative result) | 2026-06-29 |
| 0095 | Optimal Route Reflection via BGP-LS-sourced SPF (RFC 9107) | Accepted | 2026-07-02 |
| 0096 | A typed, compiled policy language (.rpol) |
Accepted | 2026-07-02 |
| 0097 | BMP monitoring — the trio, BMPv4 framing, and path marking | Accepted | 2026-07-03 |
| 0098 | RIB-level update groups — shared outbound staging | Accepted | 2026-07-03 |
| 0099 | Update groups v2 — per-family keying and RT-aware VPN emit | Accepted | 2026-07-03 |
| 0100 | Parallelizing the RibManager (research blueprint) | Proposed | 2026-07-03 |
| 0101 | IXP route-server profile — per-client best-path (RFC 7947 §2.3.2) | Accepted | 2026-07-03 |
| 0102 | EVPN origination acknowledgement-awareness (Type 1/2/4) | Accepted | 2026-07-09 |
| 0103 | rpol execution model, purity contract, and evaluation budgets | Accepted | 2026-07-09 |
| 0104 | Shutdown warm-checkpoint publication without boot restore | Accepted | 2026-07-13 |
| 0105 | Grouped export-policy transition transaction | Accepted | 2026-07-14 |
| 0106 | Warm checkpoint restore under planned-restart GR | Proposed | 2026-07-14 |
| 0107 | Route-server NEXT_HOP ownership | Accepted | 2026-07-15 |
| 0108 | Independent per-family maximum-prefix limits | Accepted | 2026-07-16 |
| 0109 | Encode-once wire sharing for update-group fanout | Accepted | 2026-07-16 |
| 0110 | IRR/PeeringDB-driven filtering pipeline — ride arouteserver, defer native ingestion | Proposed | 2026-07-17 |
| 0111 | Actor-owned authoritative export-policy replacement continuation | Rejected (borrow-free Gate 1 NO-GO) | 2026-07-20 |
| 0112 | Opt-in RFC 8212 explicit-policy enforcement for eBGP | Accepted — fully shipped | 2026-07-21 |
| 0113 | Per-peer outbound unicast prefix limits | Accepted — released in v0.61.0 | 2026-07-21 |
| 0114 | RFC 6793 AS4 path migration across legacy peers | Accepted | 2026-07-21 |
| 0115 | Lean daemon build flavors | Accepted (no additional flavor) | 2026-07-22 |
| 0116 | RFC 9857 SR Policy state in BGP-LS | Accepted (feature implementation demand-gated) | 2026-07-22 |
| 0117 | Authenticated single-hop BFD | Accepted (implementation NO-GO; evidence-gated) | 2026-07-22 |
New ADRs should follow this format:
# ADR-NNNN: Title
**Status:** Proposed | Accepted | Deprecated | Superseded by ADR-XXXX
**Date:** YYYY-MM-DD
## Context
What is the issue or question being addressed?
## Decision
What was decided?
## Consequences
What are the results — positive, negative, and neutral?