Files
ferrix/docs/RFCs.md
Rayhaan JaufeerallyandClaude Fable 5.1 af76ecb345 fix: leave sessions politely on shutdown; answer ROUTE-REFRESH
Against a production BIRD router, restarting ferrix was followed by
several refused connection attempts before the session came back.

- The daemon had no signal handling: Ctrl-C killed the process and the
  peer only ever saw a dead TCP connection. On SIGINT or SIGTERM it now
  sends Cease / Administrative Shutdown (RFC 4486) to every established
  peer, waits up to two seconds for the sessions to close, and stops the
  dialers from reconnecting meanwhile. A NOTIFICATION queued for a session
  ends that session once sent.
- ROUTE-REFRESH was parsed and ignored. A peer sends it when its import
  policy changes (e.g. after `birdc configure`), expecting our routes
  again so the new policy can be applied. The session now reports the
  request and the advertiser re-sends every local route to that peer. The
  request also appears in the event stream and the status page log.

Tests: a refresh request in real wire format re-sends all routes and keeps
the session up; shutdown delivers the Cease to every peer and closes the
sessions. Verified with the real binary: SIGINT, peer logs the Cease.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-20 17:51:04 +02:00

5.7 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.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 ❌