Files
ferrix/docs/RFCs.md
T
Rayhaan JaufeerallyandClaude Fable 5.1 160e28690a fix: capability list parsing; advertise IPv6 unicast; BIRD peering config
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>
2026-09-19 15:57:23 +02:00

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 ❌