From a201b89e4a14c7a886742437118923711c7d6dba Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 4 Jan 2022 14:59:11 -0800 Subject: [PATCH] wgengine/magicsock: reconnect to DERP when its definition changes Change-Id: I7c560feb9e4a6e155a35ec764a68354f19f694e4 Signed-off-by: Brad Fitzpatrick --- wgengine/magicsock/magicsock.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/wgengine/magicsock/magicsock.go b/wgengine/magicsock/magicsock.go index 5a143f7d4..02269ddc9 100644 --- a/wgengine/magicsock/magicsock.go +++ b/wgengine/magicsock/magicsock.go @@ -2252,12 +2252,31 @@ func (c *Conn) SetDERPMap(dm *tailcfg.DERPMap) { return } + old := c.derpMap c.derpMap = dm if dm == nil { c.closeAllDerpLocked("derp-disabled") return } + // Reconnect any DERP region that changed definitions. + if old != nil { + changes := false + for rid, oldDef := range old.Regions { + if reflect.DeepEqual(oldDef, dm.Regions[rid]) { + continue + } + changes = true + if rid == c.myDerp { + c.myDerp = 0 + } + c.closeDerpLocked(rid, "derp-region-redefined") + } + if changes { + c.logActiveDerpLocked() + } + } + go c.ReSTUN("derp-map-update") }