diff options
| author | Emīls <emils@mullvad.net> | 2024-01-09 15:27:54 +0100 |
|---|---|---|
| committer | Emīls <emils@mullvad.net> | 2024-01-09 15:27:54 +0100 |
| commit | be2a670fbce5a58058c7bff93292eb4c7398031c (patch) | |
| tree | 30657f53c2ed12141e84002614504bbd7471acb1 | |
| parent | b27f3d59c38db69a171b62cabf4078ea881d9cf2 (diff) | |
| download | mullvadvpn-ios-boring-tun-friday-hack.tar.xz mullvadvpn-ios-boring-tun-friday-hack.zip | |
Rebase doneios-boring-tun-friday-hack
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift | 6 | ||||
| -rw-r--r-- | ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift | 47 | ||||
| -rw-r--r-- | ios/abstract-tun/src/ios/mod.rs | 5 |
3 files changed, 40 insertions, 18 deletions
diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift index d3e2ac5246..573296d3e3 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift @@ -53,10 +53,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { ) super.init() - let ptr = Unmanaged.passUnretained(self).toOpaque() - test_udp_sesh(ptr) - - let adapter = WgAdapter(packetTunnelProvider: self) +// let adapter = WgAdapter(packetTunnelProvider: self) + let adapter = AbstractTunAdapter(queue: DispatchQueue(label: "com.mullvad.boringTun"), packetTunnel: self) let tunnelMonitor = TunnelMonitor( eventQueue: internalQueue, diff --git a/ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift b/ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift index 30adbed9c3..494509877f 100644 --- a/ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift +++ b/ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift @@ -15,12 +15,34 @@ import WireGuardKitC import WireGuardKitTypes // Wrapper class around AbstractTun to provide an interface similar to WireGuardAdapter. -class AbstractTunAdapter { +class AbstractTunAdapter: TunnelAdapterProtocol { private let abstractTun: AbstractTun private let queue: DispatchQueue - init(queue: DispatchQueue, packetTunnel: PacketTunnelProvider, logClosure: @escaping (String) -> Void) { + + init(queue: DispatchQueue, packetTunnel: PacketTunnelProvider) { self.queue = queue - abstractTun = AbstractTun(queue: queue, packetTunnel: packetTunnel, logClosure: logClosure) + abstractTun = AbstractTun(queue: queue, packetTunnel: packetTunnel) + } + + + func start(configuration: PacketTunnelCore.TunnelAdapterConfiguration) async throws { + return try await withCheckedThrowingContinuation { + continuation in + if case let .failure(error) = self.start(tunnelConfiguration: configuration) { + continuation.resume(throwing: error) + } else { + continuation.resume(returning: ()) + } + } + } + + func stop() async throws { + return await withCheckedContinuation { + continuation in + self.stop(completionHandler: {_ in + continuation.resume(returning: ()) + }) + } } public func start(tunnelConfiguration: TunnelAdapterConfiguration) -> Result<Void, AbstractTunError> { @@ -36,7 +58,6 @@ class AbstractTunAdapter { } public func stop(completionHandler: @escaping (WireGuardAdapterError?) -> Void) { -// abstractTun.stopOnQueue() abstractTun.stop() completionHandler(nil) } @@ -106,6 +127,14 @@ class AbstractTunAdapter { } } +extension AbstractTunAdapter: TunnelDeviceInfoProtocol { + func getStats() throws -> PacketTunnelCore.WgStats { + return self.stats() + } +} + + + class AbstractTun: NSObject { private var tunRef: OpaquePointer? private var dispatchQueue: DispatchQueue @@ -121,7 +150,6 @@ class AbstractTun: NSObject { private let tunQueue = DispatchQueue(label: "AbstractTun", qos: .userInitiated) private var wgTaskTimer: DispatchSourceTimer? - private let logClosure: (String) -> Void private var socketObservers: [UInt32: NSKeyValueObservation] = [:] @@ -134,12 +162,12 @@ class AbstractTun: NSObject { } } - init(queue: DispatchQueue, packetTunnel: PacketTunnelProvider, logClosure: @escaping (String) -> Void) { + init(queue: DispatchQueue, packetTunnel: PacketTunnelProvider) { dispatchQueue = queue packetTunnelProvider = packetTunnel - self.logClosure = logClosure } + deinit { self.stop() } @@ -163,7 +191,7 @@ class AbstractTun: NSObject { } func update(tunnelConfiguration: TunnelAdapterConfiguration) -> Result<Void, AbstractTunError> { - dispatchPrecondition(condition: .onQueue(dispatchQueue)) +// dispatchPrecondition(condition: .onQueue(dispatchQueue)) stop() bytesSent = 0 bytesReceived = 0 @@ -171,7 +199,7 @@ class AbstractTun: NSObject { } func start(tunnelConfig: TunnelAdapterConfiguration) -> Result<Void, AbstractTunError> { - dispatchPrecondition(condition: .onQueue(dispatchQueue)) +// dispatchPrecondition(condition: .onQueue(dispatchQueue)) wgTaskTimer = DispatchSource.makeTimerSource(queue: dispatchQueue) wgTaskTimer?.setEventHandler(handler: { @@ -414,6 +442,7 @@ class AbstractTun: NSObject { } } + func generateNetworkSettings(tunnelConfiguration: TunnelConfiguration) -> NEPacketTunnelNetworkSettings { /* iOS requires a tunnel endpoint, whereas in WireGuard it's valid for * a tunnel to have no endpoint, or for there to be many endpoints, in diff --git a/ios/abstract-tun/src/ios/mod.rs b/ios/abstract-tun/src/ios/mod.rs index 6f1d1d986e..95e3e10e94 100644 --- a/ios/abstract-tun/src/ios/mod.rs +++ b/ios/abstract-tun/src/ios/mod.rs @@ -207,10 +207,6 @@ pub extern "C" fn test_if_it_actually_works() -> u32 { return sum; } -extern "C" { - fn swift_log_crash() -> u32; -} - #[no_mangle] pub extern "C" fn test_udp_sesh(packet_tunnel: *const libc::c_void) { let rt = tokio::runtime::Runtime::new().expect("Failed to initialize the runtime"); @@ -229,7 +225,6 @@ pub extern "C" fn test_udp_sesh(packet_tunnel: *const libc::c_void) { rt.spawn(async move { while let Ok(data) = reader.recv().await { - unsafe { swift_log_crash() }; responder.send(data).await; } }); |
