diff --git a/device/device.go b/device/device.go index 7717494..91654c6 100644 --- a/device/device.go +++ b/device/device.go @@ -44,6 +44,7 @@ type Device struct { netlinkCancel *rwcancel.RWCancel port uint16 // listening port fwmark uint32 // mark value (0 = disabled) + brokenRoaming bool } staticIdentity struct { diff --git a/device/mobilequirks.go b/device/mobilequirks.go index f27d9d7..680f5c7 100644 --- a/device/mobilequirks.go +++ b/device/mobilequirks.go @@ -5,7 +5,10 @@ package device +// DisableSomeRoamingForBrokenMobileSemantics should ideally be called before peers are created, +// though it will try to deal with it, and race maybe, if called after. func (device *Device) DisableSomeRoamingForBrokenMobileSemantics() { + device.net.brokenRoaming = true device.peers.RLock() for _, peer := range device.peers.keyMap { peer.Lock() diff --git a/device/uapi.go b/device/uapi.go index 019249d..e33355d 100644 --- a/device/uapi.go +++ b/device/uapi.go @@ -261,6 +261,7 @@ func (peer *ipcSetPeer) handlePostConfig() { if peer.Peer == nil { return } + peer.disableRoaming = peer.device.net.brokenRoaming && peer.endpoint != nil if !peer.dummy && peer.device.isUp() { peer.Start() if peer.pkaOn {