|
|
|
|
@ -37,6 +37,7 @@ var ( |
|
|
|
|
ipnState string |
|
|
|
|
ipnWantRunning bool |
|
|
|
|
anyInterfaceUp = true // until told otherwise
|
|
|
|
|
udp4Unbound bool |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// Subsystem is the name of a subsystem whose health can be monitored.
|
|
|
|
|
@ -47,7 +48,7 @@ const ( |
|
|
|
|
// the system, rather than one particular subsystem.
|
|
|
|
|
SysOverall = Subsystem("overall") |
|
|
|
|
|
|
|
|
|
// SysRouter is the name the wgengine/router subsystem.
|
|
|
|
|
// SysRouter is the name of the wgengine/router subsystem.
|
|
|
|
|
SysRouter = Subsystem("router") |
|
|
|
|
|
|
|
|
|
// SysDNS is the name of the net/dns subsystem.
|
|
|
|
|
@ -214,6 +215,14 @@ func SetAnyInterfaceUp(up bool) { |
|
|
|
|
selfCheckLocked() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// SetUDP4Unbound sets whether the udp4 bind failed completely.
|
|
|
|
|
func SetUDP4Unbound(unbound bool) { |
|
|
|
|
mu.Lock() |
|
|
|
|
defer mu.Unlock() |
|
|
|
|
udp4Unbound = unbound |
|
|
|
|
selfCheckLocked() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func timerSelfCheck() { |
|
|
|
|
mu.Lock() |
|
|
|
|
defer mu.Unlock() |
|
|
|
|
@ -257,6 +266,9 @@ func overallErrorLocked() error { |
|
|
|
|
if d := now.Sub(derpRegionLastFrame[rid]).Round(time.Second); d > tooIdle { |
|
|
|
|
return fmt.Errorf("haven't heard from home DERP region %v in %v", rid, d) |
|
|
|
|
} |
|
|
|
|
if udp4Unbound { |
|
|
|
|
return errors.New("no udp4 bind") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: use
|
|
|
|
|
_ = inMapPollSince |
|
|
|
|
|