withdraw p50
0.00s
re-announce
0.00s

steel withdraw · orange re-announce

rustbgpd

A BGP route server and route reflector in Rust.

Animated topology of a BGP flapstorm. A steel withdrawal wave, then a Ferris-orange re-announce flood. Withdraw p50 0.47 seconds. Re-announce 0.55 seconds. Press R or use Replay to run it again.

W

Wire

Field reports. Not receipts.

All of the wire →

00

IXP Manager

verified IXP Manager 7.4 Bird's Eye API compatibility with documented BIRD-internal divergences.

Pinned IXP Manager v7.4.0 consumer journeys against BIRD 2.0.12 + Bird's Eye 2.1.0. Fail-closed allow-list; remaining divergences are named under Honesty. [source contract]

Route views match the pinned oracle's field shapes. Protocol and export lookups use its longest-match behavior; fallback scans stay within the queried address family and have a separate route-scan bound. An incomplete scan returns HTTP 403 instead of evaluating a partial view.

01

Cold convergence

700 clients × 400,400 routes, same host, same harness. Time for all 700 sessions to reach Established, then for every observer to hold the full base table. rustbgpd v0.75.0 and OpenBGPD 9.3 ran on one host in the same night, 2026-10-04 to 2026-10-05, three runs each with the daemon order alternated. The BIRD 3.3.2 row is dated: it was measured the night before, 2026-10-03 to 2026-10-04, against rustbgpd v0.74.0. BIRD 3.3.3, released 2026-10-01, is not yet measured.

rustbgpd

Established
0.8 s
Base-table delivery
2.8 s

BIRD 3.3.2 (dated)

Established
15.2–17.8 s
Base-table delivery
67.3–70.1 s

OpenBGPD 9.3

Established
88.6–182.5 s
Base-table delivery
325.2–417.8 s

Six legs per daemon (S2 + S3 × three runs). [source receipt]

02

Flapstorm propagation

700 clients × 400,400 routes, same host, same harness. 50 members hard-close simultaneously; 650 survivors observe 28,600 withdrawn prefixes. The 50 reconnect and re-announce. rustbgpd v0.75.0 and OpenBGPD 9.3 ran on one host in the same night, 2026-10-04 to 2026-10-05, three runs each with the daemon order alternated. The BIRD 3.3.2 row is dated: it was measured the night before, 2026-10-03 to 2026-10-04, against rustbgpd v0.74.0. BIRD 3.3.3, released 2026-10-01, is not yet measured.

rustbgpd

Withdraw p50
0.20–0.26 s
Re-announce p50
0.29–0.33 s

BIRD 3.3.2 (dated)

Withdraw p50
0.68–0.99 s
Re-announce p50
3.27–4.06 s

OpenBGPD 9.3

Withdraw p50
8.45–9.71 s
Re-announce p50
17.55–18.06 s

The re-announce clock starts only after all 50 sessions re-reach Established, so it measures re-delivery fan-out (~18.6M NLRI), not reconnect pacing. [source receipt]

02b — policy reload

Policy reload

700 clients × 400,400 routes, same host, same harness. SIGHUP policy reload stall and completion — not the IRR filter refresh below. rustbgpd v0.75.0 and OpenBGPD 9.3 ran on one host in the same night, 2026-10-04 to 2026-10-05, three runs each with the daemon order alternated. The BIRD 3.3.2 row is dated: it was measured the night before, 2026-10-03 to 2026-10-04, against rustbgpd v0.74.0. BIRD 3.3.3, released 2026-10-01, is not yet measured.

rustbgpd

Stall p50
0.157–0.196 s
Stall worst
0.378 s
Completion p50
0.75–0.91 s
Completion worst
0.97 s

BIRD 3.3.2 (dated)

Stall p50
1.767–2.531 s
Stall worst
9.285 s
Completion p50
89.1–103.6 s
Completion worst
118.2 s

OpenBGPD 9.3

Stall p50
0.193–0.212 s
Stall worst
0.268 s
Completion p50
201.9–208.0 s
Completion worst
208.1 s

Stall = the longest gap between UPDATE arrivals at a member while the reload is in flight. Completion = every member verifiably holds the full new-policy table. The three reload paths are not the same amount of work: SIGHUP re-parses only rustbgpd’s policy files, birdc configure re-parses BIRD’s entire config and re-evaluates its filters, and bgpctl reload re-parses and soft-reconfigures OpenBGPD’s RDE. Each is that daemon’s documented route-server reload. [source receipt]

IRR-scale filter reload

320 members × 183,040 prefixes, 0/10/50% received-view overlap. rustbgpd v0.75.0, BIRD 3.3.2 and OpenBGPD 9.3 in the same night, 2026-10-04 to 2026-10-05, three cross-daemon roots per overlap. BIRD 3.3.3, released 2026-10-01, is not yet measured. Every row 320/320 sessions. RSS is raw process-tree; daemon and container defaults differ, so it is not a ranked comparison.

rustbgpd

Completion p50
0.584–0.801 s
Sampler RSS peak
~0.6–0.7 GiB

BIRD 3.3.2

Completion p50
12.926–14.810 s
Sampler RSS peak
~1.3–1.4 GiB

OpenBGPD 9.3

Completion p50
44.010–63.948 s
Sampler RSS peak
~1.2–1.5 GiB

rustbgpd was 3.3–3.8 s at this shape in the earlier grouped per-client-best receipt, and 67–69 s ungrouped before ADR-0126. [source receipt] [source receipt]

03

24-hour soak receipts

Both green, both archived in-repo. No control daemon ran alongside them.

Route-server shape

PASS

1,000 eBGP clients × 400,000 routes, 24 h

SIGHUP policy reloads
48
Max-prefix trip → timed-restart cycles
6
Late-window RSS slope
0.0724 MB/h
[source receipt]

Route-reflector shape

PASS

1,000 iBGP clients × 100,000 routes, 24 h

Churn cycles
5,486,092
Session flaps
0
Terminal reflected prefixes
99,900
Terminal parse errors
0
[source receipt]
04

Honesty

The receipts also include the losses.

OpenBGPD winsReload stall tail

At 700 × 400,400, OpenBGPD 9.3's worst single observer stalls 0.268 s vs rustbgpd v0.75.0's 0.378 s, and its stall p95 is 198–267 ms vs 217–365 ms. The stall p50 is close: rustbgpd's median is 177 ms vs 198 ms, about 10% lower, but the per-reload values overlap at the tails (157–196 ms vs 193–212 ms). At IRR scale with 50% received-view overlap, OpenBGPD's changed-observer gap p50 is also shorter, 377–517 ms vs 591–627 ms; at 0% and 10% the ranges overlap. [source receipt]

OpenBGPD winsFirst re-announced route after a member flap

OpenBGPD 9.3 delivers the first re-announced route to each survivor in 0.10–0.17 s p50 (median 0.13 s) vs rustbgpd's 0.16–0.17 s (median 0.17 s). It then needs 17.55–18.06 s to finish the re-announce, vs rustbgpd's 0.29–0.33 s. [source receipt]

Neither winsReload peak memory (cgroup)

At the S2 reload shape the cgroup peaks are about even: rustbgpd's own scope read 1,003 / 914 / 1,068 MiB and OpenBGPD 9.3's container 1,005 / 991 / 991 MiB, so OpenBGPD's median is 11 MiB lower and the ranges overlap. rustbgpd's cgroup peak sits 349–508 MiB above its 559–568 MiB VmHWM; the cgroup also charges socket buffers and page cache. Settled, rustbgpd reads 368–370 MiB vs OpenBGPD's 796–804 MiB at S2, and 376–384 MiB vs 823–836 MiB under flap churn. [source receipt]

BIRD winsPeak memory sample

Dated, from the 2026-10-03 night: BIRD 3.3.2 had the lower peak RSS sample at both matrix shapes, 407–414 MiB vs rustbgpd v0.74.0's 540–541 MiB at S2 and 332–377 MiB vs 511–544 MiB at S3. Settled RSS under flap churn (S3) was mixed run by run (BIRD 377/332/373 MiB, rustbgpd 376/376/375 MiB); at S2 rustbgpd settled lower, 369/373/370 MiB vs 407/412/414 MiB. BIRD did not run in the v0.75.0 matrix, and BIRD 3.3.3, released 2026-10-01, is not yet measured. [source receipt]

IXP Manager / Bird's Eye

The claim is scoped, not an unqualified Bird's Eye replacement. runtime_compatibility is true; a must_match divergence still re-blocks the flag. File-backed protocol aliases reload on SIGHUP; direct aliases stay startup-only. Product identity stays rustbgpd. Countdown timers and route-change counters stay unsupported; retained-reject namespace and retention metadata are extensions. Still named unsupported: defined-only reject-reason emission, a generic IXP Manager UI-filter policy engine, full-table counts, live hold/keepalive countdowns, and direct runtime alias reconfiguration. Config render and activation are the rs-config-render Foil path, not a Bird's Eye endpoint. 00 · [source contract]

rs-config-render publishes config.toml, policy/, and datasets/ as one immutable activation tree. If recover --apply stops on a later failure, it reports only the recovery steps that completed and keeps the nonzero result.

What this is and is not

  • Public alpha at v0.75.0. Not production-grade yet. The daemon is not on crates.io; only rustbgpd-wire, rustbgpd-fsm, and rustbgpd-rpki are published there. Pull ghcr.io/lance0/rustbgpd:0.75.0, take a release tarball, or build from a checkout (protobuf-compiler required).
  • Linux only. No FreeBSD, no Mac, no Windows.
  • EVPN is functional but outside the v1 compatibility promise.
  • Every receipt is currently self-generated — no external pilot yet.
  • OpenBGPD 9.3 has a smaller reload stall tail and an earlier first re-announced route after a member flap; the reload stall p50 is close, and reload peak memory by cgroup is about even. rustbgpd settles lower than OpenBGPD 9.3, which settled at 796–804 MiB at S2 and 823–836 MiB at S3. In the dated BIRD 3.3.2 rows, BIRD has the lower peak memory sample at both matrix shapes, and settled memory under flap churn is mixed.