diff options
| author | James Tucker <james@tailscale.com> | 2024-07-12 15:11:17 -0700 |
|---|---|---|
| committer | James Tucker <james@tailscale.com> | 2024-07-12 15:11:17 -0700 |
| commit | 74cf11c4a2ce92b9fa1330c5d3d1124183a96cbf (patch) | |
| tree | f7ab27eaca9f30e9dc07bb147b07213ad20536b5 | |
| parent | 114d1caf55777efae653935be88404ccdc92c2da (diff) | |
| download | tailscale-raggi/derp-route-optimization.tar.xz tailscale-raggi/derp-route-optimization.zip | |
wgengine/magicsock: remove DERP routes on peer gone even if there's a conn changeraggi/derp-route-optimization
The derp client connection pointer address is not related at all to
whether a peer is present on a DERP. If the peer is not present at that
DERP, the route should be removed unconditionally regardless of
connection state.
Updates tailscale/support-escalations#48
Signed-off-by: James Tucker <james@tailscale.com>
| -rw-r--r-- | wgengine/magicsock/derp.go | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/wgengine/magicsock/derp.go b/wgengine/magicsock/derp.go index c1486bc80..bf5cfbd43 100644 --- a/wgengine/magicsock/derp.go +++ b/wgengine/magicsock/derp.go @@ -63,11 +63,10 @@ type derpRoute struct { } // removeDerpPeerRoute removes a DERP route entry previously added by addDerpPeerRoute. -func (c *Conn) removeDerpPeerRoute(peer key.NodePublic, derpID int, dc *derphttp.Client) { +func (c *Conn) removeDerpPeerRoute(peer key.NodePublic, derpID int) { c.mu.Lock() defer c.mu.Unlock() - r2 := derpRoute{derpID, dc} - if r, ok := c.derpRoute[peer]; ok && r == r2 { + if r, ok := c.derpRoute[peer]; ok && r.derpID == derpID { delete(c.derpRoute, peer) } } @@ -553,7 +552,7 @@ func (c *Conn) runDerpReader(ctx context.Context, derpFakeAddr netip.AddrPort, d // Forget that all these peers have routes. for peer := range peerPresent { delete(peerPresent, peer) - c.removeDerpPeerRoute(peer, regionID, dc) + c.removeDerpPeerRoute(peer, regionID) } if err == derphttp.ErrClientClosed { return @@ -649,7 +648,7 @@ func (c *Conn) runDerpReader(ctx context.Context, derpFakeAddr netip.AddrPort, d c.logf("[unexpected] magicsock: derp-%d peer %s gone, reason %v, removing route", regionID, key.NodePublic(m.Peer).ShortString(), m.Reason) } - c.removeDerpPeerRoute(key.NodePublic(m.Peer), regionID, dc) + c.removeDerpPeerRoute(key.NodePublic(m.Peer), regionID) continue default: // Ignore. |
