Files
Rayhaan JaufeerallyandClaude Fable 5.1 321af51e4b Add an interoperability lab with FRR, BIRD and Routinator
scripts/interop/lab.sh runs the daemon against FRR, BIRD and Routinator,
each in a network namespace on one exchange LAN, and checks what every
side ends up with: sessions and routes over IPv4 and IPv6 with their
attributes, four-octet AS numbers, ADD-PATH, RFC 9234 roles and Only to
Customer, RTR version 2 and invalid routes, route refresh, session resets,
killed peers, a cut wire, the daemon stopped and killed, a table of a
million routes and a restart under it, role mismatch and the prefix limit.
All of it passes against FRR 10.5.1, BIRD 2.18 and Routinator 0.15.2.

scripts/interop/real-rpki.sh checks the RTR client against a Routinator
with the real RPKI: 713,258 IPv4 and 187,479 IPv6 VRPs and 3,379 ASPAs,
the same numbers on both sides.

What the lab found, fixed here:

- A daemon restarted with its routes in the kernel removed them all at
  once, its table being empty until the peers had sent theirs again, and
  then put them back: no forwarding meanwhile. Routes of an earlier run
  are now kept for `stale_seconds` (120 by default) and only those nobody
  announced again are removed. A restart under a million routes takes
  1.1 s to be in step, with nothing removed.
- FRR ends a session it loses to a collision with a state machine error
  without a subcode, which was shown as "error code 5 subcode 0".

CI gets a job that runs the lab.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 17:44:49 +02:00

36 lines
1.6 KiB
Bash
Executable File

#!/bin/sh
# Runs a command in a Linux virtual machine with this repository mounted
# at the same path: for the tests that need a Linux kernel, from a machine
# that is not one. Without arguments it runs scripts/kernel-tests.sh.
#
# scripts/linux-vm.sh the kernel tests
# scripts/linux-vm.sh cargo test the whole test suite, on Linux
# scripts/linux-vm.sh scripts/interop/lab.sh the lab with FRR and BIRD
# scripts/linux-vm.sh bash a shell
#
# The machine is made on first use with Lima (https://lima-vm.io; on macOS
# `brew install lima`): Ubuntu, with a Rust toolchain. It sees the
# repository read-only and builds into a directory of its own.
# `limactl stop ferrix` stops it and `limactl delete ferrix` removes it.
set -eu
vm=ferrix
repository="$(cd "$(dirname "$0")/.." && pwd)"
command -v limactl >/dev/null || { echo "limactl not found: install Lima first" >&2; exit 1; }
if ! limactl list --quiet | grep -qx "$vm"; then
limactl start --name="$vm" --cpus=8 --memory=8 --disk=30 --tty=false template://ubuntu-lts
limactl shell "$vm" bash -c '
set -eu
sudo apt-get update -qq
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq build-essential iproute2 iputils-ping curl
curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal -q
'
elif [ "$(limactl list --format '{{.Status}}' "$vm")" != Running ]; then
limactl start "$vm"
fi
[ $# -gt 0 ] || set -- scripts/kernel-tests.sh
limactl shell --workdir "$repository" "$vm" \
bash -lc 'export CARGO_TARGET_DIR="$HOME/target"; exec "$@"' -- "$@"