From 99f953ffae2a7560c9b4cea8707f7638eba0363a Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 12 Mar 2021 10:34:20 -0800 Subject: [PATCH] tailcfg, net/netcheck: let control mark "Avoid" bit on DERP regions So a region can be used if needed, but won't be STUN-probed or used as its home. This gives us another possible debugging mechanism for #1310, or can be used as a short-term measure against DERP flip-flops for people equidistant between regions if our hysteresis still isn't good enough. Signed-off-by: Brad Fitzpatrick --- net/netcheck/netcheck.go | 3 +++ tailcfg/derpmap.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/net/netcheck/netcheck.go b/net/netcheck/netcheck.go index db50aac6d..9398a1c2c 100644 --- a/net/netcheck/netcheck.go +++ b/net/netcheck/netcheck.go @@ -305,6 +305,9 @@ type probePlan map[string][]probe func sortRegions(dm *tailcfg.DERPMap, last *Report) (prev []*tailcfg.DERPRegion) { prev = make([]*tailcfg.DERPRegion, 0, len(dm.Regions)) for _, reg := range dm.Regions { + if reg.Avoid { + continue + } prev = append(prev, reg) } sort.Slice(prev, func(i, j int) bool { diff --git a/tailcfg/derpmap.go b/tailcfg/derpmap.go index 832358b91..5547a2ec8 100644 --- a/tailcfg/derpmap.go +++ b/tailcfg/derpmap.go @@ -55,6 +55,10 @@ type DERPRegion struct { // "San Francisco", "Singapore", "Frankfurt", etc. RegionName string + // Avoid is whether the client should avoid picking this as its home + // region. The region should only be used if a peer is there. + Avoid bool `json:",omitempty"` + // Nodes are the DERP nodes running in this region, in // priority order for the current client. Client TLS // connections should ideally only go to the first entry