summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJames Tucker <james@tailscale.com>2024-07-12 15:11:17 -0700
committerJames Tucker <james@tailscale.com>2024-07-12 15:11:17 -0700
commit74cf11c4a2ce92b9fa1330c5d3d1124183a96cbf (patch)
treef7ab27eaca9f30e9dc07bb147b07213ad20536b5
parent114d1caf55777efae653935be88404ccdc92c2da (diff)
downloadtailscale-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.go9
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.