Rework the speaker: sans-I/O FSM, sharded table, RFC 7606, ADD-PATH
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>
This commit is contained in:
1 parent
1ec60255ea
commit
630c175918
138 files changed
+21650
-2925
No files matched your search
+14
-4
@@ -25,9 +25,17 @@ The base protocol specification.
|
||||
| §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: Idle → Connect → Active | ❌ |
|
||||
| §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 | RIB (Adj-RIB-In, Loc-RIB, Adj-RIB-Out) | ❌ |
|
||||
| §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) | ✅ |
|
||||
|
||||
---
|
||||
|
||||
@@ -59,7 +67,7 @@ https://datatracker.ietf.org/doc/html/rfc2918
|
||||
| `RouteRefresh` capability advertisement | ✅ |
|
||||
| `ROUTE-REFRESH` message type (5) framing | ✅ |
|
||||
| AFI/SAFI payload parsing | ❌ |
|
||||
| Acting on received ROUTE-REFRESH (re-advertising routes) | ❌ |
|
||||
| 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
|
||||
@@ -100,7 +108,7 @@ https://datatracker.ietf.org/doc/html/rfc2858
|
||||
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| `MultiProtocol` capability advertisement (IPv4 unicast) | ✅ |
|
||||
| `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 | ✅ |
|
||||
@@ -122,6 +130,7 @@ 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
|
||||
@@ -137,6 +146,7 @@ https://datatracker.ietf.org/doc/html/rfc8092
|
||||
| Feature | Status |
|
||||
|---------|--------|
|
||||
| `LARGE_COMMUNITIES` path attribute (parse, serialise) | ✅ |
|
||||
| Attach to locally originated routes | ✅ |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user