The work of the speaker-cleanup branch as one commit; the branch keeps the step-by-step history. Sessions - The state machine is a pure function from events to actions, driven by one task per connection. Idle, Connect and Active belong to a dialer that keeps configured peers up with backoff. - Capabilities are negotiated: address families, four-octet AS numbers with AS_TRANS and AS4_PATH, route refresh, ADD-PATH per family and direction. - Collision detection per RFC 4271 section 6.8, by address and identifier. - Connections are taken only from configured peers, a few per address. - A panic in a session is contained and answered with a Cease; a core task that stops shuts the server down with a Cease to every peer. - Writes that make no progress are given up (RFC 9687). Codec - Malformed UPDATEs are handled as RFC 7606 says: treat-as-withdraw, attribute discard, or session reset, with the NOTIFICATION to send. - Address families are open types; any can be named and ignored. - Prefixes are fixed-size values, normalised, with path identifiers. - Lengths are filled in after writing; one definition of each type code. - Property tests and fuzz targets for every decoder. Routing table - Adj-RIBs-In and Loc-RIB in one sharded table that sessions write to directly. Routes are sixteen bytes; attribute sets are interned in wire form. Best-path selection per RFC 4271 section 9.1.2.2 with deterministic MED. - A journal per shard lets followers read changes at their own pace; one that falls behind is resynchronised. - On a RIPE RIS dump of 148 peers and 39.3M routes: loaded in 2.0 s on 12 cores, about 52 bytes a route. Announcing - Originated routes come from the configuration. Each session has its own exporter with an Adj-RIB-Out, so a slow peer delays only itself. - Routes to a peer in our own AS have an empty path and a LOCAL_PREF. Operations - HTTP status page, JSON API, event stream and Prometheus metrics. - Benchmarks on synthetic and real tables. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
175 lines
5.7 KiB
Markdown
175 lines
5.7 KiB
Markdown
# RFCs
|
|
|
|
Tracks which RFCs are implemented, partially implemented, or only represented
|
|
in the wire format layer.
|
|
|
|
**Legend**
|
|
- ✅ Implemented — functional end-to-end
|
|
- 🟡 Wire format only — parsed and serialised correctly, but not yet acted on
|
|
- ❌ Not implemented
|
|
|
|
---
|
|
|
|
## Core BGP
|
|
|
|
### RFC 4271 — A Border Gateway Protocol 4 (BGP-4)
|
|
https://datatracker.ietf.org/doc/html/rfc4271
|
|
|
|
The base protocol specification.
|
|
|
|
| Section | Description | Status |
|
|
|---------|-------------|--------|
|
|
| §4.1 | Message framing (marker, length, type) | ✅ |
|
|
| §4.2 | OPEN message | ✅ |
|
|
| §4.3 | UPDATE message (path attributes, NLRI, withdrawn routes) | ✅ |
|
|
| §4.4 | KEEPALIVE message | ✅ |
|
|
| §4.5 | NOTIFICATION message (all error codes and subcodes) | ✅ |
|
|
| §8 | FSM — passive (inbound) side: OpenSent → OpenConfirm → Established | ✅ |
|
|
| §8 | FSM — active (outbound) side: dial configured peers, exponential retry | ✅ |
|
|
| §6.2 | Bad Peer AS check against configured ASN | ✅ |
|
|
| §6.7 / RFC 4486 | Cease / Administrative Shutdown sent to every peer on SIGINT or SIGTERM | ✅ |
|
|
| §6.8 | Connection collision detection (BGP Identifier comparison, Cease / Connection Collision Resolution) | ✅ |
|
|
| §8.1.1 | Optional `CollisionDetectEstablishedState` (`collision_detect_established_state`) | ✅ |
|
|
| §6.2 | Bad BGP Identifier check (peer using our identifier, or 0.0.0.0) | ✅ |
|
|
| §9 | Decision process / best-path selection | ❌ |
|
|
| §9 | Adj-RIB-In (per-peer table of received routes) | ✅ |
|
|
| §9 | Locally originated routes, advertised to all established peers | ✅ |
|
|
| §9 | Loc-RIB / Adj-RIB-Out for routes learned from peers (re-advertisement) | ❌ |
|
|
| §9.2 | Hold timer reset on any received message (not only KEEPALIVE) | ✅ |
|
|
|
|
---
|
|
|
|
## Capability and Session Extensions
|
|
|
|
### RFC 6793 — BGP Support for Four-Octet Autonomous System (AS) Number Space
|
|
https://datatracker.ietf.org/doc/html/rfc6793
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `AS_TRANS` (23456) sentinel | ✅ |
|
|
| `FourByteAsn` capability advertisement and parsing | ✅ |
|
|
| 4-byte AS_PATH segment encoding/decoding via `ParserContext` | ✅ |
|
|
| 4-byte ASN negotiation in FSM | ✅ |
|
|
|
|
### RFC 9072 — Extended Optional Parameters Length for BGP OPEN Message
|
|
https://datatracker.ietf.org/doc/html/rfc9072
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| Parsing extended-length OPEN (0xFF sentinel) | ✅ |
|
|
| Serialising extended-length OPEN when options exceed 255 bytes | ✅ |
|
|
|
|
### RFC 2918 — Route Refresh Capability for BGP-4
|
|
https://datatracker.ietf.org/doc/html/rfc2918
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `RouteRefresh` capability advertisement | ✅ |
|
|
| `ROUTE-REFRESH` message type (5) framing | ✅ |
|
|
| AFI/SAFI payload parsing | ❌ |
|
|
| Acting on received ROUTE-REFRESH (re-advertising all local routes, regardless of the AFI/SAFI asked for) | ✅ |
|
|
|
|
### RFC 7313 — Enhanced Route Refresh Capability for BGP-4
|
|
https://datatracker.ietf.org/doc/html/rfc7313
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `EnhancedRouteRefresh` capability wire format | 🟡 |
|
|
|
|
### RFC 4724 — Graceful Restart Mechanism for BGP
|
|
https://datatracker.ietf.org/doc/html/rfc4724
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `GracefulRestart` capability wire format | 🟡 |
|
|
| Restart state and forwarding preserved across sessions | ❌ |
|
|
|
|
### RFC 9494 — Long-Lived Graceful Restart for BGP
|
|
https://datatracker.ietf.org/doc/html/rfc9494
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `LongLivedGracefulRestart` capability wire format | 🟡 |
|
|
|
|
### RFC 8654 — Extended Message Support for BGP
|
|
https://datatracker.ietf.org/doc/html/rfc8654
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `ExtendedMessage` capability wire format | 🟡 |
|
|
| Raising `BGP_MAX_MSG_LEN` to 65535 when negotiated | ❌ |
|
|
|
|
---
|
|
|
|
## Multiprotocol and NLRI
|
|
|
|
### RFC 2858 — Multiprotocol Extensions for BGP-4
|
|
https://datatracker.ietf.org/doc/html/rfc2858
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `MultiProtocol` capability advertisement (IPv4 and IPv6 unicast) | ✅ |
|
|
| `MP_REACH_NLRI` path attribute (parse, serialise) | ✅ |
|
|
| `MP_UNREACH_NLRI` path attribute (parse, serialise) | ✅ |
|
|
| IPv4 and IPv6 next-hop encoding | ✅ |
|
|
|
|
### RFC 8950 — Advertising IPv4 Network Layer Reachability Information (NLRI) with an IPv6 Next Hop
|
|
https://datatracker.ietf.org/doc/html/rfc8950
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `ExtendedNextHop` capability wire format | 🟡 |
|
|
|
|
---
|
|
|
|
## Path Attributes and Communities
|
|
|
|
### RFC 1997 — BGP Communities Attribute
|
|
https://datatracker.ietf.org/doc/html/rfc1997
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `COMMUNITIES` path attribute (parse, serialise) | ✅ |
|
|
| Attach to locally originated routes | ✅ |
|
|
|
|
### RFC 4360 — BGP Extended Communities Attribute
|
|
https://datatracker.ietf.org/doc/html/rfc4360
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `EXTENDED_COMMUNITIES` path attribute (parse, serialise) | ✅ |
|
|
| AS-specific, IPv4-address-specific, opaque, route-target, route-origin subtypes | ✅ |
|
|
|
|
### RFC 8092 — BGP Large Communities Attribute
|
|
https://datatracker.ietf.org/doc/html/rfc8092
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `LARGE_COMMUNITIES` path attribute (parse, serialise) | ✅ |
|
|
| Attach to locally originated routes | ✅ |
|
|
|
|
---
|
|
|
|
## Other Capabilities (Wire Format Only)
|
|
|
|
The following capabilities are parsed and serialised correctly but have no
|
|
functional behaviour implemented beyond that.
|
|
|
|
| RFC | Capability | Status |
|
|
|-----|-----------|--------|
|
|
| RFC 5291 | Outbound Route Filtering (ORF) | 🟡 |
|
|
| RFC 7911 | ADD-PATH | 🟡 |
|
|
| RFC 8205 | BGPsec | 🟡 |
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
### RFC 9687 — BGP Send Hold Timer
|
|
https://datatracker.ietf.org/doc/html/rfc9687
|
|
|
|
| Feature | Status |
|
|
|---------|--------|
|
|
| `SendHoldTimer` error code (8) defined | ✅ |
|
|
| Send hold timer enforcement | ❌ |
|