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; // Limits on routes originated locally (e.g. via the demo UI). LocalRoutePolicy local_route_policy = 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; // Watch for pings (ICMPv6 echo requests) sent to the lab prefixes and show // them on the status page. Unset disables it. PingMonitor ping_monitor = 9; } // Shows who is pinging addresses that this host answers for. // // The host must already own the addresses, e.g. through an AnyIP route // ("ip -6 route add local 2001:db8::/40 dev lo"); the kernel keeps answering // the pings and we only receive a copy. Opening the raw ICMPv6 socket this // needs takes CAP_NET_RAW on Linux. IPv6 only. message PingMonitor { // Only pings to destinations inside these prefixes are shown. Defaults to // the IPv6 prefixes in local_route_policy.allowed_prefixes. repeated string prefixes = 1; } // Limits on locally originated routes. message LocalRoutePolicy { // A locally originated route is accepted only if it is covered by one of // these prefixes, written in CIDR notation (e.g. "10.100.0.0/16"). // Empty means any prefix may be announced. repeated string allowed_prefixes = 1; // Maximum number of routes a single owner may announce. 0 means unlimited. uint32 max_routes_per_owner = 2; } // 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; }