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>
27 lines
493 B
Protocol Buffer Text Format
27 lines
493 B
Protocol Buffer Text Format
router_id: "10.0.0.1"
|
|
local_asn: 65000
|
|
listen_endpoints {
|
|
address: "127.0.0.1"
|
|
port: 179
|
|
}
|
|
listen_endpoints {
|
|
address: "::1"
|
|
port: 179
|
|
}
|
|
peers {
|
|
name: "lab-r1"
|
|
endpoint { address: "127.0.0.1" port: 1791 }
|
|
remote_asn: 65001
|
|
hold_time_seconds: 30
|
|
}
|
|
connect_retry_seconds: 5
|
|
local_route_policy {
|
|
allowed_prefixes: "10.100.0.0/16"
|
|
allowed_prefixes: "2001:db8:100::/48"
|
|
max_routes_per_owner: 4
|
|
}
|
|
http_endpoint {
|
|
address: "127.0.0.1"
|
|
port: 8080
|
|
}
|