Files
tailscale/client
James Tucker 60ad6a4c9b wgengine/magicsock,ipn,client/local,cmd/tailscale/cli: add active-endpoints debug introspection
Add a debug facility that reports, per peer, the active dataplane
endpoint state as seen by both magicsock and wireguard-go: magicsock's
bestAddr (including relay VNI), whether it is currently trusted, the
DERP fallback addr/home region, last send/recv (any and WireGuard-only)
activity, full-ping time, WireGuard-only/expired flags, and peer map
epAddr counts; plus whether a (lazily-created) wireguard-go peer
currently exists, the endpoint it currently holds (string form plus a
classification by concrete type: magicsock-managed vs other), and last
handshake time and rx/tx byte counters.

wireguard-go can end up holding a stale magicsock lazy endpoint as a
peer's TX endpoint, silently black-holing traffic (#20082). Debugging
that class of issue previously required manual log spelunking. This
surfaces the relevant state via a LocalAPI debug endpoint
(debug-active-endpoints), a c2n endpoint (/debug/active-endpoints), and
a CLI command (tailscale debug active-endpoints), so both humans and
tests can assert a client is in the expected dataplane state.

The wireguard-go side is read via device.LookupActivePeer and wgint
(which gains a mutex-guarded accessor for the peer's current
conn.Endpoint, layout-checked like its existing stats accessors)
rather than the UAPI text protocol, which we deliberately moved off of.
Endpoint classification is a type assertion via a new
magicsock.IsMagicsockEndpoint helper instead of string comparison.

Updates #20082

Change-Id: Id39cf6fa8255584d0316b44e0a18bf26dc2769a5
Signed-off-by: James Tucker <james@tailscale.com>
2026-06-11 02:30:52 +00:00
..