Preparing to peer with a production BIRD router turned up two problems. - packet: most Capability::from_wire arms returned the per-capability buffer (always empty by then) instead of the bytes following the capability. The list parser then saw an empty remainder and silently dropped every later capability. Any OPEN listing extended message, role, graceful restart, add-path, enhanced route refresh, LLGR, extended next hop or an unknown capability before the 4-octet ASN capability lost the ASN, so the peer appeared as AS_TRANS (23456) and a configured remote_asn was refused with Bad Peer AS. BIRD and FRR both do this. Single-capability round-trip tests could not catch it; new tests parse every capability with another following it, and a full BIRD capability list. - server: advertise MultiProtocol IPv6 unicast alongside IPv4. Without it a peer will not accept the IPv6 routes we originate via MP_REACH_NLRI. - Interop test: byte-for-byte BIRD 2 OPEN is accepted with the right ASN, and an IPv6 End-of-RIB neither drops the session nor creates a route. - docs/lab/prod: BIRD config for an announce-only ferrix neighbour (strict /48 import filter, community scrubbing, unreachable next hop, import limit, export none, passive) and the matching ferrix config. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
5.6 KiB
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.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 routes) | ❌ |
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 | ❌ |