From 9eb405a0191976da96d7b2e4fa48d5242a0b5fde Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 7 Jun 2026 19:54:35 +0000 Subject: [PATCH] [client] Gate RemovePeer call on kernel mode in UDPListener In userspace bind mode, the WireGuard-go patch triggers SendStagedPackets automatically via IpcSet/handlePostConfig when the peer endpoint is updated, so RemovePeer is not needed. Only call RemovePeer for kernel mode where the kernel WireGuard implementation requires it to force a new handshake. --- client/internal/lazyconn/activity/listener_udp.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/internal/lazyconn/activity/listener_udp.go b/client/internal/lazyconn/activity/listener_udp.go index e0b09be6c..dc74ab8e6 100644 --- a/client/internal/lazyconn/activity/listener_udp.go +++ b/client/internal/lazyconn/activity/listener_udp.go @@ -67,8 +67,10 @@ func (d *UDPListener) ReadPackets() { } d.peerCfg.Log.Debugf("removing lazy endpoint: %s", d.endpoint.String()) - if err := d.wgIface.RemovePeer(d.peerCfg.PublicKey); err != nil { - d.peerCfg.Log.Errorf("failed to remove endpoint: %s", err) + if !d.wgIface.IsUserspaceBind() { + if err := d.wgIface.RemovePeer(d.peerCfg.PublicKey); err != nil { + d.peerCfg.Log.Errorf("failed to remove endpoint: %s", err) + } } // Ignore close error as it may return "use of closed network connection" if already closed.