# 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`.