ipn/ipnlocal: add wireguard session state metrics + publish on IPN bus

Updates #19989
Updates tailscale/corp#42874

Change-Id: I843ed95bc7b0f5cd38ba1467332c6b022901e254
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2026-06-15 11:41:18 -07:00
committed by Brad Fitzpatrick
parent ae743642d9
commit 6596d237a3
11 changed files with 602 additions and 10 deletions
+24
View File
@@ -21,6 +21,7 @@ import (
"github.com/gaissmai/bart"
"github.com/tailscale/wireguard-go/device"
"github.com/tailscale/wireguard-go/tun"
"go4.org/mem"
"tailscale.com/control/controlknobs"
"tailscale.com/drive"
"tailscale.com/envknob"
@@ -726,6 +727,29 @@ func (e *userspaceEngine) SetPeerByIPPacketFunc(fn func(netip.Addr) (_ key.NodeP
})
}
func (e *userspaceEngine) SetPeerSessionStateFunc(fn func(key.NodePublic, PeerWireGuardState)) {
e.wgdev.SetSessionStateFunc(func(pk device.NoisePublicKey, state device.PeerSessionState) {
if fn != nil {
fn(key.NodePublicFromRaw32(mem.B(pk[:])), peerWireGuardStateFromDevice(state))
}
})
}
func peerWireGuardStateFromDevice(state device.PeerSessionState) PeerWireGuardState {
switch state {
case device.PeerSessionNone:
return PeerWireGuardStateNone
case device.PeerSessionHandshake:
return PeerWireGuardStateHandshake
case device.PeerSessionEstablished:
return PeerWireGuardStateEstablished
case device.PeerSessionExpired:
return PeerWireGuardStateExpired
default:
panic(fmt.Sprintf("unexpected wireguard-go PeerSessionState %d", state))
}
}
// hasOverlap checks if there is a IPPrefix which is common amongst the two
// provided slices.
func hasOverlap(aips, rips views.Slice[netip.Prefix]) bool {