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>
58 lines
2.2 KiB
Markdown
58 lines
2.2 KiB
Markdown
# 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.
|
|
|
|
`cargo test` includes property tests: generated messages must survive being
|
|
written and read back, and no input, however damaged, may make a parser
|
|
panic. They take about a second; for a longer hunt:
|
|
|
|
```
|
|
PROPTEST_CASES=1000000 cargo test --release -p bgp-packet --test properties
|
|
```
|
|
|
|
Coverage-guided fuzz targets for the same parsers are in `fuzz/`; see
|
|
`fuzz/README.md`. CI runs each of them for a minute.
|
|
|
|
## License
|
|
|
|
Apache License 2.0; see `LICENSE`.
|