diff options
| author | Bug Magnet <marco.nikic@mullvad.net> | 2025-02-20 10:42:14 +0100 |
|---|---|---|
| committer | Bug Magnet <marco.nikic@mullvad.net> | 2025-02-21 13:39:47 +0100 |
| commit | 3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f (patch) | |
| tree | a32a80bd555727073562978fb11d093a5dfa227d /ios/PacketTunnel | |
| parent | 28a43fbd0a9eb44eae21c1787fbf8766cd2771a3 (diff) | |
| download | mullvadvpn-3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f.tar.xz mullvadvpn-3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f.zip | |
Improve PacketTunnelPathObserver
Diffstat (limited to 'ios/PacketTunnel')
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift | 54 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift | 2 |
2 files changed, 29 insertions, 27 deletions
diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift index 327bcf2042..97066add3d 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift @@ -7,48 +7,50 @@ // import Combine +import MullvadLogging +import MullvadTypes +import Network import NetworkExtension import PacketTunnelCore -final class PacketTunnelPathObserver: DefaultPathObserverProtocol, @unchecked Sendable { - private weak var packetTunnelProvider: NEPacketTunnelProvider? - private let stateLock = NSLock() - private var pathUpdatePublisher: AnyCancellable? +final class PacketTunnelPathObserver: DefaultPathObserverProtocol, Sendable { private let eventQueue: DispatchQueue + private let pathMonitor: NWPathMonitor + nonisolated(unsafe) let logger = Logger(label: "PacketTunnelPathObserver") + private let stateLock = NSLock() - init(packetTunnelProvider: NEPacketTunnelProvider, eventQueue: DispatchQueue) { - self.packetTunnelProvider = packetTunnelProvider - self.eventQueue = eventQueue + nonisolated(unsafe) private var started = false + + public var currentPathStatus: Network.NWPath.Status { + stateLock.withLock { + pathMonitor.currentPath.status + } } - var defaultPath: NetworkPath? { - return packetTunnelProvider?.defaultPath + init(eventQueue: DispatchQueue) { + self.eventQueue = eventQueue + + pathMonitor = NWPathMonitor(prohibitedInterfaceTypes: [.other]) } - func start(_ body: @escaping @Sendable (NetworkPath) -> Void) { + func start(_ body: @escaping @Sendable (Network.NWPath.Status) -> Void) { stateLock.withLock { - pathUpdatePublisher?.cancel() + guard started == false else { return } + defer { started = true } + pathMonitor.pathUpdateHandler = { updatedPath in + body(updatedPath.status) + } - // Normally packet tunnel provider should exist throughout the network extension lifetime. - pathUpdatePublisher = packetTunnelProvider?.publisher(for: \.defaultPath) - .removeDuplicates(by: { oldPath, newPath in - oldPath?.status == newPath?.status - }) - .throttle(for: .seconds(2), scheduler: eventQueue, latest: true) - .sink { change in - if let change { - body(change) - } - } + pathMonitor.start(queue: eventQueue) } } func stop() { stateLock.withLock { - pathUpdatePublisher?.cancel() - pathUpdatePublisher = nil + guard started == true else { return } + defer { started = false } + pathMonitor.pathUpdateHandler = nil + pathMonitor.cancel() } } } - -extension NetworkExtension.NWPath: NetworkPath {} diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift index 5ce1d92eff..93520bd97b 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift @@ -91,7 +91,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable { timings: PacketTunnelActorTimings(), tunnelAdapter: adapter, tunnelMonitor: tunnelMonitor, - defaultPathObserver: PacketTunnelPathObserver(packetTunnelProvider: self, eventQueue: internalQueue), + defaultPathObserver: PacketTunnelPathObserver(eventQueue: internalQueue), blockedStateErrorMapper: BlockedStateErrorMapper(), relaySelector: relaySelector, settingsReader: TunnelSettingsManager(settingsReader: SettingsReader()) { [weak self] settings in |
