Text:StaticMessage("Unable to connect to the Tailscale coordination server to synchronize the state of your tailnet. Peer reachability might degrade over time."),
Text:StaticMessage("Unable to connect to the Tailscale coordination server to synchronize the state of your tailnet. Peer reachability might degrade over time."),
// 8 minutes reflects a maximum maintenance window for the coordination server.
// 8 minutes reflects a maximum maintenance window for the coordination server.
TimeToVisible:8*time.Minute,
TimeToVisible:8*time.Minute,
@ -119,10 +120,20 @@ var noDERPHomeWarnable = Register(&Warnable{
// noDERPConnectionWarnable is a Warnable that warns the user that Tailscale couldn't connect to a specific DERP server.
// noDERPConnectionWarnable is a Warnable that warns the user that Tailscale couldn't connect to a specific DERP server.
varnoDERPConnectionWarnable=Register(&Warnable{
varnoDERPConnectionWarnable=Register(&Warnable{
Code:"no-derp-connection",
Code:"no-derp-connection",
Title:"Relay server unavailable",
Title:"Relay server unavailable",
Severity:SeverityMedium,
Severity:SeverityMedium,
DependsOn:[]*Warnable{NetworkStatusWarnable},
DependsOn:[]*Warnable{
NetworkStatusWarnable,
// Technically noDERPConnectionWarnable could be used to warn about
// failure to connect to a specific DERP server (e.g. your home is derp1
// but you're trying to connect to a peer's derp4 and are unable) but as
// of 2024-09-25 we only use this for connecting to your home DERP, so
// we depend on noDERPHomeWarnable which is the ability to figure out
// what your DERP home even is.
noDERPHomeWarnable,
},
Text:func(argsArgs)string{
Text:func(argsArgs)string{
ifn:=args[ArgDERPRegionName];n!=""{
ifn:=args[ArgDERPRegionName];n!=""{
returnfmt.Sprintf("Tailscale could not connect to the '%s' relay server. Your Internet connection might be down, or the server might be temporarily unavailable.",n)
returnfmt.Sprintf("Tailscale could not connect to the '%s' relay server. Your Internet connection might be down, or the server might be temporarily unavailable.",n)
@ -134,12 +145,17 @@ var noDERPConnectionWarnable = Register(&Warnable{
TimeToVisible:10*time.Second,
TimeToVisible:10*time.Second,
})
})
// derpTimeoutWarnable is a Warnable that warns the user that Tailscale hasn't heard from the home DERP region for a while.
// derpTimeoutWarnable is a Warnable that warns the user that Tailscale hasn't
// heard from the home DERP region for a while.
varderpTimeoutWarnable=Register(&Warnable{
varderpTimeoutWarnable=Register(&Warnable{
Code:"derp-timed-out",
Code:"derp-timed-out",
Title:"Relay server timed out",
Title:"Relay server timed out",
Severity:SeverityMedium,
Severity:SeverityMedium,
DependsOn:[]*Warnable{NetworkStatusWarnable},
DependsOn:[]*Warnable{
NetworkStatusWarnable,
noDERPConnectionWarnable,// don't warn about it being stalled if we're not connected
noDERPHomeWarnable,// same reason as noDERPConnectionWarnable's dependency
},
Text:func(argsArgs)string{
Text:func(argsArgs)string{
ifn:=args[ArgDERPRegionName];n!=""{
ifn:=args[ArgDERPRegionName];n!=""{
returnfmt.Sprintf("Tailscale hasn't heard from the '%s' relay server in %v. The server might be temporarily unavailable, or your Internet connection might be down.",n,args[ArgDuration])
returnfmt.Sprintf("Tailscale hasn't heard from the '%s' relay server in %v. The server might be temporarily unavailable, or your Internet connection might be down.",n,args[ArgDuration])
@ -163,9 +179,9 @@ var derpRegionErrorWarnable = Register(&Warnable{
// noUDP4BindWarnable is a Warnable that warns the user that Tailscale couldn't listen for incoming UDP connections.
// noUDP4BindWarnable is a Warnable that warns the user that Tailscale couldn't listen for incoming UDP connections.