summaryrefslogtreecommitdiffhomepage
path: root/ios/PacketTunnel
diff options
context:
space:
mode:
authorBug Magnet <marco.nikic@mullvad.net>2025-02-20 10:42:14 +0100
committerBug Magnet <marco.nikic@mullvad.net>2025-02-21 13:39:47 +0100
commit3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f (patch)
treea32a80bd555727073562978fb11d093a5dfa227d /ios/PacketTunnel
parent28a43fbd0a9eb44eae21c1787fbf8766cd2771a3 (diff)
downloadmullvadvpn-3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f.tar.xz
mullvadvpn-3a2e118eba4fcfb51b32cb3ea99cf712887fdc8f.zip
Improve PacketTunnelPathObserver
Diffstat (limited to 'ios/PacketTunnel')
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelPathObserver.swift54
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift2
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