From 0a84359d2ddd705e56d57651e3b2c43fcadfa2e2 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 | 6 ++++++ 2 files changed, 9 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..6abc63695 100644 --- a/tailcfg/derpmap.go +++ b/tailcfg/derpmap.go @@ -55,6 +55,12 @@ 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. + // Clients already using this region as their home should migrate + // away to a new region without Avoid set. + 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