diff options
| -rw-r--r-- | Cargo.lock | 21 | ||||
| m--------- | dist-assets/binaries | 0 | ||||
| -rw-r--r-- | ios/MullvadRustRuntime/GotaTun.swift | 5 | ||||
| -rw-r--r-- | ios/MullvadRustRuntime/include/mullvad_rust_runtime.h | 12 | ||||
| -rw-r--r-- | ios/PacketTunnel/WireGuardAdapter/GotaAdapter.swift | 22 | ||||
| -rw-r--r-- | mullvad-ios/src/gotatun/config.rs | 37 | ||||
| -rw-r--r-- | mullvad-ios/src/gotatun/mod.rs | 18 |
7 files changed, 51 insertions, 64 deletions
diff --git a/Cargo.lock b/Cargo.lock index a41ceaff5b..07d3d1d5ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2418,9 +2418,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" dependencies = [ "serde", ] @@ -5043,17 +5043,18 @@ dependencies = [ [[package]] name = "shadowsocks-service" -version = "1.20.4" +version = "1.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c0ce5a3a15e2688b7014c37ed3db33dc296d8b8fda36643c053882bf1d5f44" +checksum = "b94cc39b669a8e67f405bd1d386170b2aaac654c156837e76940958c1608c61b" dependencies = [ "arc-swap", - "async-trait", "byte_string", "byteorder", "bytes", "cfg-if", "futures", + "hickory-resolver", + "http", "http-body-util", "httparse", "hyper", @@ -5064,18 +5065,18 @@ dependencies = [ "libc", "log", "lru_time_cache", - "nix 0.29.0", - "once_cell", + "nix 0.30.1", "pin-project", - "rand 0.8.5", + "rand 0.9.2", "regex", "serde", "shadowsocks", "socket2 0.5.8", "spin", - "thiserror 1.0.59", + "thiserror 2.0.9", "tokio", - "windows-sys 0.59.0", + "trait-variant", + "windows-sys 0.60.2", ] [[package]] diff --git a/dist-assets/binaries b/dist-assets/binaries -Subproject ff0e3746c89a04314377cffeb52faaa976413a6 +Subproject 5e7ec28eebef237bb6b88daba2c68e6f857d4c0 diff --git a/ios/MullvadRustRuntime/GotaTun.swift b/ios/MullvadRustRuntime/GotaTun.swift index 683b4c19d0..a55cde660e 100644 --- a/ios/MullvadRustRuntime/GotaTun.swift +++ b/ios/MullvadRustRuntime/GotaTun.swift @@ -8,6 +8,7 @@ import Foundation import MullvadRustRuntimeProxy +import Network public class GotaTun { public enum Error: Swift.Error { @@ -49,11 +50,11 @@ public class GotaTunConfig { } public func addV4Addr(address: IPv4Address) { - + mullvad_ios_gotatun_config_set_private_ipv4(handle, "\(address)") } public func addV6Addr(address: IPv6Address) { - + mullvad_ios_gotatun_config_set_private_ipv6(handle, "\(address)") } private func preSharedKeyOr(_ key: Data?) -> Data? { diff --git a/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h b/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h index e463ce7f91..ad491d8eb7 100644 --- a/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h +++ b/ios/MullvadRustRuntime/include/mullvad_rust_runtime.h @@ -907,6 +907,18 @@ int32_t mullvad_ios_gotatun_config_set_exit(struct SwiftGotaTunConfiguration con /** * */ +int32_t mullvad_ios_gotatun_config_set_private_ipv4(struct SwiftGotaTunConfiguration config, + const char *ipv4); + +/** + * + */ +int32_t mullvad_ios_gotatun_config_set_private_ipv6(struct SwiftGotaTunConfiguration config, + const char *ipv6); + +/** + * + */ int32_t mullvad_ios_gotatun_config_set_entry(struct SwiftGotaTunConfiguration config, const uint8_t *local_private_key, const uint8_t *local_ephemeral_key, diff --git a/ios/PacketTunnel/WireGuardAdapter/GotaAdapter.swift b/ios/PacketTunnel/WireGuardAdapter/GotaAdapter.swift index d91a9f44fc..98b6245fe1 100644 --- a/ios/PacketTunnel/WireGuardAdapter/GotaAdapter.swift +++ b/ios/PacketTunnel/WireGuardAdapter/GotaAdapter.swift @@ -20,6 +20,10 @@ import WireGuardKitC // - DAITA public final class GotaAdapter: TunnelAdapterProtocol, TunnelDeviceInfoProtocol, Sendable { + public func apply(settings: PacketTunnelCore.TunnelInterfaceSettings) async throws { + try await self.provider.setTunnelNetworkSettings(settings.asTunnelSettings()) + } + public enum Error: Swift.Error { case noPeer @@ -81,8 +85,6 @@ public final class GotaAdapter: TunnelAdapterProtocol, TunnelDeviceInfoProtocol, public func start( configuration: PacketTunnelCore.TunnelAdapterConfiguration, daita: WireGuardKitTypes.DaitaConfiguration? ) async throws { - try await self.provider.setTunnelNetworkSettings(generateNetworkSettings(for: configuration)) - guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { throw Error.noFileDescriptor } @@ -108,11 +110,17 @@ public final class GotaAdapter: TunnelAdapterProtocol, TunnelDeviceInfoProtocol, publicKey: entryPeer.publicKey.rawValue, endpoint: entryPeer.endpoint.description) - if let v4Addr = exit.interfaceAddresses.first( - where: { $0.address is IPv4Address }) { - config.set + if let v4Addr = exit.interfaceAddresses.compactMap({ range in + range.address as? IPv4Address + }).first { + config.addV4Addr(address: v4Addr) } + if let v6Addr = exit.interfaceAddresses.compactMap({ range in + range.address as? IPv6Address + }).first { + config.addV6Addr(address: v6Addr) + } } @@ -130,10 +138,6 @@ public final class GotaAdapter: TunnelAdapterProtocol, TunnelDeviceInfoProtocol, exitConfiguration: PacketTunnelCore.TunnelAdapterConfiguration, daita: WireGuardKitTypes.DaitaConfiguration? ) async throws { - // TODO: Should `entryConfiguration` ever be nil here ? - try await self.provider.setTunnelNetworkSettings( - generateNetworkSettings(for: entryConfiguration ?? exitConfiguration)) - guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { throw Error.noFileDescriptor } diff --git a/mullvad-ios/src/gotatun/config.rs b/mullvad-ios/src/gotatun/config.rs index abe5737bb4..ddf99a4220 100644 --- a/mullvad-ios/src/gotatun/config.rs +++ b/mullvad-ios/src/gotatun/config.rs @@ -208,47 +208,30 @@ pub unsafe extern "C" fn mullvad_ios_gotatun_config_set_exit( #[unsafe(no_mangle)] pub unsafe extern "C" fn mullvad_ios_gotatun_config_set_private_ipv4( mut config: SwiftGotaTunConfiguration, - ipv4: *const u8, - peer_endpoint: *const c_char, -) -> i32 { - let cfg = unsafe { config.mut_config() }; -/// -#[unsafe(no_mangle)] -pub unsafe extern "C" fn mullvad_ios_gotatun_config_set_private_ipv4( - mut config: SwiftGotaTunConfiguration, - ipv4: *const u8, - peer_endpoint: *const c_char, + ipv4: *const c_char, ) -> i32 { let cfg = unsafe { config.mut_config() }; - let cstr = unsafe { CStr::from_ptr(ptr) }; - let Ok(s) = cstr.to_str() { - return ConfigStatus::InvalidArg; - } - - config.set_ipv4_addr(&s); -} - let cstr = unsafe { CStr::from_ptr(ptr) }; + let cstr = unsafe { CStr::from_ptr(ipv4) }; let Ok(s) = cstr.to_str() else { - return ConfigStatus::InvalidArg; - } + return ConfigStatus::InvalidArg as i32; + }; - config.set_ipv4_addr(&s); + cfg.set_ipv4_addr(&s) as i32 } /// #[unsafe(no_mangle)] pub unsafe extern "C" fn mullvad_ios_gotatun_config_set_private_ipv6( mut config: SwiftGotaTunConfiguration, - ipv4: *const u8, - peer_endpoint: *const c_char, + ipv6: *const c_char, ) -> i32 { let cfg = unsafe { config.mut_config() }; - let cstr = unsafe { CStr::from_ptr(ptr) }; + let cstr = unsafe { CStr::from_ptr(ipv6) }; let Ok(s) = cstr.to_str() else { - return ConfigStatus::InvalidArg; - } + return ConfigStatus::InvalidArg as i32; + }; - config.set_ipv6_addr(&s); + cfg.set_ipv6_addr(&s) as i32 } /// diff --git a/mullvad-ios/src/gotatun/mod.rs b/mullvad-ios/src/gotatun/mod.rs index b2dbd7df73..0e2e57ede8 100644 --- a/mullvad-ios/src/gotatun/mod.rs +++ b/mullvad-ios/src/gotatun/mod.rs @@ -103,23 +103,9 @@ impl GotaTun { let entry_peer = config.entry.as_ref().unwrap().get_peer(); let exit_peer = config.exit.as_ref().unwrap().get_peer(); - let source_v4 = entry_peer - .allowed_ip - .iter() - .find_map(|ip| match &ip.addr { - &IpAddr::V4(ipv4_addr) => Some(ipv4_addr), - IpAddr::V6(..) => None, - }) - .unwrap_or(Ipv4Addr::UNSPECIFIED); + let source_v4 = config.private_ip_v4.unwrap_or(Ipv4Addr::UNSPECIFIED); + let source_v6 = config.private_ip_v6.unwrap_or(Ipv6Addr::UNSPECIFIED); - let source_v6 = entry_peer - .allowed_ip - .iter() - .find_map(|ip| match &ip.addr { - &IpAddr::V6(ipv6_addr) => Some(ipv6_addr), - IpAddr::V4(..) => None, - }) - .unwrap_or(Ipv6Addr::UNSPECIFIED); let multihop_overhead = match exit_peer.endpoint.unwrap().ip() { IpAddr::V4(..) => Ipv4Header::LEN + UdpHeader::LEN + WgData::OVERHEAD, |
