summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2024-01-09 15:27:54 +0100
committerEmīls <emils@mullvad.net>2024-01-09 15:27:54 +0100
commitbe2a670fbce5a58058c7bff93292eb4c7398031c (patch)
tree30657f53c2ed12141e84002614504bbd7471acb1
parentb27f3d59c38db69a171b62cabf4078ea881d9cf2 (diff)
downloadmullvadvpn-ios-boring-tun-friday-hack.tar.xz
mullvadvpn-ios-boring-tun-friday-hack.zip
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift6
-rw-r--r--ios/PacketTunnel/WireGuardAdapter/AbstractTun.swift47
-rw-r--r--ios/abstract-tun/src/ios/mod.rs5
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;
}
});