diff --git a/device/mobilequirks.go b/device/mobilequirks.go new file mode 100644 index 0000000..fc0b386 --- /dev/null +++ b/device/mobilequirks.go @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2020 WireGuard LLC. All Rights Reserved. + */ + +package device + +func (device *Device) DisableSomeRoamingForBrokenMobileSemantics() { + device.peers.RLock() + for _, peer := range device.peers.keyMap { + peer.Lock() + defer peer.Unlock() + peer.disableRoaming = peer.endpoint != nil + } + device.peers.RUnlock() +} \ No newline at end of file diff --git a/device/peer.go b/device/peer.go index d13acd9..8cb0dc2 100644 --- a/device/peer.go +++ b/device/peer.go @@ -28,6 +28,7 @@ type Peer struct { device *Device endpoint conn.Endpoint persistentKeepaliveInterval uint16 + disableRoaming bool // These fields are accessed with atomic operations, which must be // 64-bit aligned even on 32-bit platforms. Go guarantees that an @@ -290,10 +291,9 @@ func (peer *Peer) Stop() { peer.ZeroAndFlushAll() } -var RoamingDisabled bool func (peer *Peer) SetEndpointFromPacket(endpoint conn.Endpoint) { - if RoamingDisabled { + if peer.disableRoaming { return } peer.Lock()