# Ferrix BGP 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 daemon establishes BGP sessions with configured neighbors, evaluates received routes against import policy, validates them with the RPKI (route origin validation and ASPA), selects the best path for each prefix, and, on Linux, installs it in the kernel. It advertises the routes that it originates and, to neighbors configured for it, the best paths learned from other neighbors, as BGP roles (RFC 9234) and communities permit. Ferrix has not been deployed in a production network. ### Unsupported Features - Per-client best path selection for route servers, and ADD-PATH for advertised routes - TCP-AO, TCP MD5, and GTSM - Long-Lived Graceful Restart, BFD, and configuration changes without a restart - Recursive resolution of next hops that are not directly connected ### Layout | Crate | What is in it | |-------|---------------| | `crates/primitives` | Prefixes, address families, parsing helpers | | `crates/packet` | The wire format: messages, attributes, capabilities | | `crates/rib` | The routing table, best route selection, the journal of changes | | `crates/rpki` | The RTR client; origin validation and ASPA path verification | | `crates/fib` | The best routes in the Linux kernel, over netlink | | `crates/server` | Sessions, the state machine, policy, configuration | | `crates/web` | The status page, HTTP API and metrics | | `crates/integration-tests` | A test server and test peers, and the tests that run the daemon end to end | | `crates/bench` | Benchmarks at the scale of the Internet routing table | | `bin/bgp` | The daemon | ## Documentation The documentation is a website built from [`docs/`](docs/) with [Zola](https://www.getzola.org): ``` zola --root docs serve # http://127.0.0.1:1111 ``` - [Overview](docs/content/docs/getting-started/introduction.md), [installation](docs/content/docs/getting-started/installation.md) and [quick start](docs/content/docs/getting-started/quick-start.md) - User guide: [BGP neighbors](docs/content/docs/guides/peers.md), [import policy](docs/content/docs/guides/import-policy.md), [BGP roles](docs/content/docs/guides/roles.md), [RPKI](docs/content/docs/guides/rpki.md), [kernel route installation](docs/content/docs/guides/kernel.md), [route advertisement](docs/content/docs/guides/passing-routes-on.md), [graceful restart](docs/content/docs/guides/graceful-restart.md), [configuration examples](docs/content/docs/guides/examples.md) - [Deployment](docs/content/docs/operations/deployment.md) and [monitoring](docs/content/docs/operations/monitoring.md) - Reference: [configuration](docs/content/docs/reference/configuration.md), [command line](docs/content/docs/reference/command-line.md), [HTTP API](docs/content/docs/reference/http-api.md), [metrics](docs/content/docs/reference/metrics.md), [supported standards](docs/content/docs/reference/rfcs.md) - [Architecture](docs/content/docs/development/architecture.md), [testing](docs/content/docs/development/testing.md) and [contributing](docs/content/docs/development/contributing.md) ## Development CI runs these on every push, and fails on any warning: ``` cargo fmt --all -- --check cargo clippy --workspace --all-targets -- -D warnings cargo test --workspace RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --document-private-items zola --root docs build ``` It also runs the tests that need a real Linux kernel (`scripts/kernel-tests.sh`) and the lab with FRR, BIRD and Routinator (`scripts/interop/lab.sh`); `scripts/linux-vm.sh` runs either from macOS. 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`.