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
+33
View File
@@ -13,6 +13,7 @@ import (
"sync"
"testing"
"github.com/tailscale/wireguard-go/device"
"go4.org/mem"
"tailscale.com/cmd/testwrapper/flakytest"
"tailscale.com/control/controlknobs"
@@ -35,6 +36,38 @@ import (
"tailscale.com/wgengine/wgcfg"
)
func TestPeerWireGuardStateValuesMatchWireguardGo(t *testing.T) {
const unknownPeerSessionState device.PeerSessionState = 255
tests := []struct {
name string
wg device.PeerSessionState
want PeerWireGuardState
}{
{"none", device.PeerSessionNone, PeerWireGuardStateNone},
{"handshake", device.PeerSessionHandshake, PeerWireGuardStateHandshake},
{"established", device.PeerSessionEstablished, PeerWireGuardStateEstablished},
{"expired", device.PeerSessionExpired, PeerWireGuardStateExpired},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := peerWireGuardStateFromDevice(tt.wg); got != tt.want {
t.Fatalf("converted state = %v; want %v", got, tt.want)
}
if got, want := uint8(tt.wg), uint8(tt.want); got != want {
t.Fatalf("wireguard-go const = %v; want %v", got, want)
}
})
}
defer func() {
if recover() == nil {
t.Fatal("expected panic for unknown wireguard-go state")
}
}()
_ = peerWireGuardStateFromDevice(unknownPeerSessionState)
}
func nodeViews(v []*tailcfg.Node) []tailcfg.NodeView {
nv := make([]tailcfg.NodeView, len(v))
for i, n := range v {