wgengine: periodically poll engine status for logging side effect
Fixes tailscale/corp#1560
packetSendRecheckWireguardThreshold = 1 * time.Minute
)
+// statusPollInterval is how often we ask wireguard-go for its engine
+// status (as long as there's activity). See docs on its use below.
+const statusPollInterval = 1 * time.Minute
+
type userspaceEngine struct {
logf logger.Logf
wgLogger *wglog.Logger //a wireguard-go logging wrapper
@@ -108,6 +112,7 @@ type userspaceEngine struct {
sentActivityAt map[netaddr.IP]*int64 // value is atomic int64 of unixtime
destIPActivityFuncs map[netaddr.IP]func()
statusBufioReader *bufio.Reader // reusable for UAPI
+ lastStatusPollTime time.Time // last time we polled the engine status
mu sync.Mutex // guards following; see lock order comment below
netMap *netmap.NetworkMap // or nil
@@ -708,6 +713,18 @@ func (e *userspaceEngine) noteReceiveActivity(dk tailcfg.DiscoKey) {
now := e.timeNow()
e.recvActivityAt[dk] = now
+ // As long as there's activity, periodically poll the engine to get
+ // stats for the far away side effect of
+ // ipn/ipnlocal.LocalBackend.parseWgStatusLocked to log activity, for
+ // use in various admin dashboards.
+ // This particularly matters on platforms without a connected GUI, as
+ // the GUIs generally poll this enough to cause that logging. But
+ // tailscaled alone did not, hence this.
+ if e.lastStatusPollTime.IsZero() || now.Sub(e.lastStatusPollTime) >= statusPollInterval {
+ e.lastStatusPollTime = now
+ go e.RequestStatus()
+ }
+
// If the last activity time jumped a bunch (say, at least
// half the idle timeout) then see if we need to reprogram
// Wireguard. This could probably be just
