-
released this
2026-07-15 08:46:25 +00:00 | 0 commits to master since this releaseThe "Plan 160 / nlink 0.25" arc. Adopts nlink
0.21 → 0.25— four minor versions of upstream correctness work, taken clean — and turns the new declarative/ergonomic APIs into three long-standing "pending" closeouts, plus two observability wins and the free upstream shaping/firewall correctness fixes.Highlights
- WireGuard is fully declarative. The imperative device pre-create loop is gone;
WireguardConfig::ensure_devicesbootstraps the link insideapply_stack_for_nodebefore theNetworkConfigapply so tunnel addresses land on an existing interface. Closes feedback item #3 against 0.19. - Rate limits reconcile instead of rebuild.
RateLimiter::reconcilereplaces the destructive delete-root-qdisc-then-rebuild — zero kernel calls when unchanged, no packet-drop window on edit. Closes Plan 158g. - Typed
del_*_if_existsteardown.clear_impairment, mgmt teardown, andapply_difflink/route removal drop the hand-rolledQdiscNotFoundmatching andlet _ = del_*swallowing. - Deploy self-heals a stale namespace marker. The pre-create guard uses
namespace::is_namespace(a live-nsfs check) and clears a stale/var/run/netns/<name>marker left by an unclean shutdown, so a crashed deploy re-deploys without a manualdestroy --orphans. watchshows per-rule nftables counters.NewRuledrift lines render the typed(packets, bytes)counter viaRuleInfo::counter().- Per-process TCP bandwidth in live metrics. The backend collector dumps each node's TCP sockets (
Connection<SockDiag>), tracks goodput with a per-nodeSocketRateTracker, and attributes flows viaSocketOwnerMap. Top flows ride on the newNodeMetrics.socketsfield and render in themetricsstream.
Free upstream fixes now in effect
- Traffic shaping is now correct — nlink 0.25's psched/HTB/TBF tick fixes (#191–#218); every
RateLimiter/PerPeerImpairershape was previously mis-programmed by 15–125×. - Firewall rules install in declared order (#195, the reversed insertion is fixed);
rejectreally rejects (#205); impairment flower filters match IPv6/ARP/VLAN (#201).
⚠️ Breaking —
apply --check --jsonschema v3The v1
diff,layered_summary, andlayered_summary_deprecatedfields — deprecated in 0.6.0 for a one-release window — are removed. Branch onschema_version == 3and read the typednetwork/nftablesmaps. The human-readableapply --checkoutput is unchanged.Migration notes for 0.6.0 → 0.7.0
- Shaping numbers change — to the correct value. Impairment RTT/loss and rate-limit caps on existing labs now match what the topology declares. Re-check any hand-tuned burst you set to compensate for the old behaviour.
- Firewall rule order is now honored. If a lab "worked" by accident under the old reversed insertion, its policy changes.
See
CHANGELOG.mdfor the full record.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- WireGuard is fully declarative. The imperative device pre-create loop is gone;