AFI and SAFI were closed enums, so a family without a variant could not be represented at all, and the set of negotiated families was a struct with one bool per family. Supporting another family meant touching both. - `Afi`, `Safi` and `AfiSafi` in bgp-primitives are newtypes over the wire numbers, with constants and names for the common families. Capabilities and MP_REACH/MP_UNREACH use them, so any family a peer names is read as what it is. The special case that turned a capability for an unlisted family into an unknown capability is gone. - `FamilySet` is a set of `AfiSafi`. What we can exchange routes for is the explicit `family::SUPPORTED` list; only those are offered in our OPEN. - `AddressFamilyId` stays as the IP version of a prefix. - NLRI is still a list of IP prefixes. MP_REACH/MP_UNREACH for a family whose NLRI is something else (labelled, VPN, EVPN, ...) is refused rather than misread as prefixes, which is what happened before for the SAFIs the old enum listed. Bug found on the way: the reserved octet in MP_REACH_NLRI was skipped only for IPv6, so an IPv4 MP_REACH_NLRI was parsed with an extra 0.0.0.0/0 route that the peer never sent. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
BGP
The bgp crate is an implementation of the Border Gateway Protocol, which is used to exchange routing and control plane information between Autonomous Systems.
The aim of this project is to provide a modern, high performance, secure, programmatic and customizable software package that can be useful to network operators, researchers, and people interested in Internet.
Current status.
The project is currently being rewritten from scratch to be more modular and maintainable, as well as to fix deeper issues with the previous implementation.
⚠️ Warning: This is currently a work in progress and not ready for use.
🛣️ Roadmap to v1.0
We aim for the 1.0 release to be functional and stable to operate peering sessions, and to install routes in the Linux Kernel.
- ☐ Implement basic parsers for the fundamental types required
- ✅ Path Attributes from RFC4271
- ✅ Open message
- ✅ Capabilities from RFC4271
- ✅ Update message
- ☐ Notification message
- ✅ Implement scaffolding required to start and configure a server
- ✅ Implement connection logic to establish sessions with peers (passive and active)
- ✅ Routes originated from the configuration, with communities, announced to all peers
- ✅ Read-only HTTP API, status page and Prometheus metrics
- ☐ Implement an efficient data structure for storing prefixes (e.g. Poptrie)
- ☐ Filtering for peer RIB in / out
- ☐ Main / auxiliary RIBs for exchanging routes between peers
Development
CI runs these three on every push, and fails on any warning:
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
Lints are configured once, under [workspace.lints] in the root Cargo.toml.
unsafe code is forbidden throughout.
License
Apache License 2.0; see LICENSE.