Phase 4 of the teaching demo: the daemon now brings up its own sessions. - New dialer task per configured peer: connect with a timeout, run the same FSM as the passive side, back off exponentially (from connect_retry_seconds, capped at two minutes) and retry forever. Stays idle while a session with the same remote IP and ASN already exists. - The peer's OPEN must carry the configured ASN, otherwise the session is refused with a Bad Peer AS notification. Inbound connections from a configured peer's address get the same check plus the configured name and hold time. - SessionRegistry tracks configured peers and their dial state (Idle / Connecting / Backoff with last error and retry time). - /api/peers merges configured peers with live sessions so the page shows peers that are down, why, and when the next attempt is; unconfigured inbound sessions are listed after them. - fake_peer gains --listen so it can stand in for a router the daemon dials. - Integration tests: dial and establish, reconnect after the peer closes, wrong ASN refused, inbound from a configured address checked and named. Not implemented: RFC 4271 §6.8 collision detection; a real router on the other end resolves the rare race by closing one connection. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
5.3 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 (router-ID comparison) | ❌ |
| §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 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 | ❌ |