Routes were announced and withdrawn through an HTTP form, each tagged with a free-text owner and checked against an allow-list and a per-owner limit. That was the lab's interface, not a router's. Routes now come from 'originate' entries in the configuration file and are in the local RIB before any session starts. The local RIB holds one route per prefix with no notion of owners or policy. local_route_policy is gone from the configuration. The HTTP API keeps its GET endpoints (status, config, peers, originated and received routes, events, metrics). The announce, withdraw, wire-bytes and well-known-community endpoints are removed, and the status page loses the announce form, the community presets and the byte decoder. Community text parsing moves from the web crate to bgp-packet so the configuration can use it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
95 lines
3.2 KiB
Protocol Buffer
95 lines
3.2 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package bgp.server;
|
|
|
|
// Top level BGP Server configuration.
|
|
message BgpConfig {
|
|
// The router ID, written as a dotted-quad IPv4 address (e.g. "192.0.2.1").
|
|
// Required even on IPv6-only routers per RFC 4271.
|
|
string router_id = 1;
|
|
|
|
// The local 4-byte AS number (RFC 6793).
|
|
uint32 local_asn = 2;
|
|
|
|
// Endpoints to accept incoming BGP connections on.
|
|
// Defaults to 0.0.0.0:179 and [::]:179 when empty.
|
|
repeated TcpEndpoint listen_endpoints = 3;
|
|
|
|
// Peers configured on this server.
|
|
repeated Peer peers = 4;
|
|
|
|
// Routes this router originates and announces to every peer.
|
|
repeated OriginatedRoute originate = 5;
|
|
|
|
// Where to serve the HTTP API, status page and metrics. The port is
|
|
// required. Unset disables the HTTP server.
|
|
TcpEndpoint http_endpoint = 6;
|
|
|
|
// Initial delay between attempts to connect to a configured peer, in
|
|
// seconds. Doubles after each failure up to two minutes. Defaults to 5.
|
|
uint32 connect_retry_seconds = 7;
|
|
|
|
// Connection collisions (RFC 4271 §6.8) against a session that is already
|
|
// Established are, by default, resolved by closing the new connection.
|
|
// When true they are resolved like any other collision: the connection
|
|
// initiated by the higher BGP Identifier survives, and a second connection
|
|
// opened by the same side replaces the first. This lets a peer that
|
|
// restarted take over from a session we have not yet noticed is dead,
|
|
// instead of being refused until the hold timer expires.
|
|
bool collision_detect_established_state = 8;
|
|
}
|
|
|
|
// A route originated by this router. It is announced with an AS_PATH of the
|
|
// local AS and, on each session, that session's local address as next hop.
|
|
message OriginatedRoute {
|
|
// The prefix in CIDR notation, e.g. "192.0.2.0/24" or "2001:db8::/32".
|
|
string prefix = 1;
|
|
|
|
// ORIGIN attribute: "IGP" (the default), "EGP" or "INCOMPLETE".
|
|
string origin = 2;
|
|
|
|
// Extra copies of the local AS to prepend to the AS_PATH. At most 16.
|
|
uint32 as_path_prepend = 3;
|
|
|
|
// MULTI_EXIT_DISC. Left out of the announcement when unset.
|
|
optional uint32 med = 4;
|
|
|
|
// Standard communities (RFC 1997): "ASN:VALUE", or a well-known name such
|
|
// as "NO_EXPORT".
|
|
repeated string communities = 5;
|
|
|
|
// Large communities (RFC 8092): "GLOBAL:LOCAL1:LOCAL2".
|
|
repeated string large_communities = 6;
|
|
}
|
|
|
|
// An IP address and port pair.
|
|
message TcpEndpoint {
|
|
// IP address (V4 or V6).
|
|
string address = 1;
|
|
// TCP port. Defaults to 179 for BGP when unset.
|
|
uint32 port = 2;
|
|
}
|
|
|
|
// Configuration of a BGP peer.
|
|
message Peer {
|
|
// Human-readable name for logging and diagnostics.
|
|
string name = 1;
|
|
|
|
// Address and port to connect to for this peer.
|
|
TcpEndpoint endpoint = 2;
|
|
|
|
// The peer's 4-byte AS number (RFC 6793).
|
|
uint32 remote_asn = 3;
|
|
|
|
// Hold time to advertise in the OPEN message, in seconds (RFC 4271 §4.2).
|
|
// Must be 0 or >= 3. Defaults to 90 when unset.
|
|
uint32 hold_time_seconds = 4;
|
|
|
|
// Source IP address for connections we open to this peer. It is also the
|
|
// next hop of the routes we send it. Required when the peer identifies us
|
|
// by address and the host has several, e.g. when both speakers run on the
|
|
// same machine. Must be the same address family as the endpoint. Unset
|
|
// lets the operating system choose.
|
|
string local_address = 5;
|
|
}
|