New crate bgp-fib. It follows the routing table's best routes and keeps
the kernel's routing table the same, and learns the machine's interfaces
and addresses from the kernel, which is what says whether a next hop can
be reached.
- netlink: the rtnetlink messages used (routes, addresses, links, errors),
as bytes and back. No I/O; property tested and fuzzed.
- interfaces: what is directly reachable, and from which interface.
- plan: what to ask the kernel for, given the best routes and what the
kernel has. No I/O; tested against a model kernel.
- kernel (Linux only): the sockets and the task. Requests go in batches;
routes of ours found at startup are kept if still right and removed if
not; a change of interfaces has every route worked out again; a clean
stop removes our routes.
Only routes marked proto bgp with the configured table and metric are
ever touched. A best route is installed if its next hop is a neighbor;
next hops further away are not resolved through other routes yet, and
such prefixes are counted and shown instead.
Configured with `kernel { table metric }`; off by default. The daemon
needs CAP_NET_ADMIN and stops if the kernel refuses it. On shutdown it
closes sessions and then removes its routes.
/api/kernel and the status page show installed, unresolved and refused
counts, the last error and the interfaces; five bgp_kernel_* metrics.
Testing: scripts/kernel-tests.sh runs, in network namespaces of their
own and with only the capabilities the daemon needs, the installer
against `ip route`, the daemon with a peer, and two daemons that route
for each other with pings across over IPv4 and IPv6.
scripts/linux-vm.sh runs that, or anything else, in a Lima VM from
macOS. CI runs the kernel tests and fuzzes the netlink decoder.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
71 lines
1.2 KiB
TOML
71 lines
1.2 KiB
TOML
# Coverage-guided fuzz targets, run with cargo-fuzz on a nightly toolchain.
|
|
# See README.md in this directory.
|
|
[package]
|
|
name = "bgp-fuzz"
|
|
version = "0.0.0"
|
|
edition = "2024"
|
|
license = "Apache-2.0"
|
|
publish = false
|
|
|
|
[package.metadata]
|
|
cargo-fuzz = true
|
|
|
|
# Not part of the main workspace: libfuzzer needs nightly, the workspace
|
|
# builds on stable.
|
|
[workspace]
|
|
|
|
[dependencies]
|
|
bgp-packet = { path = "../crates/packet" }
|
|
bgp-primitives = { path = "../crates/primitives" }
|
|
bgp-fib = { path = "../crates/fib" }
|
|
bgp-rpki = { path = "../crates/rpki" }
|
|
bgp-server = { path = "../crates/server" }
|
|
bytes = "1.10.1"
|
|
libfuzzer-sys = "0.4"
|
|
protobuf = "3.7.2"
|
|
|
|
[lib]
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "message"
|
|
path = "fuzz_targets/message.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|
|
|
|
[[bin]]
|
|
name = "message_body"
|
|
path = "fuzz_targets/message_body.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|
|
|
|
[[bin]]
|
|
name = "prefix_text"
|
|
path = "fuzz_targets/prefix_text.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|
|
|
|
[[bin]]
|
|
name = "config"
|
|
path = "fuzz_targets/config.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|
|
|
|
[[bin]]
|
|
name = "rtr"
|
|
path = "fuzz_targets/rtr.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|
|
|
|
[[bin]]
|
|
name = "netlink"
|
|
path = "fuzz_targets/netlink.rs"
|
|
test = false
|
|
doc = false
|
|
bench = false
|