diff --git a/WireGuard/WireGuardNetworkExtension/DNSResolver.swift b/WireGuard/WireGuardNetworkExtension/DNSResolver.swift index f7a8f5b..16b7909 100644 --- a/WireGuard/WireGuardNetworkExtension/DNSResolver.swift +++ b/WireGuard/WireGuardNetworkExtension/DNSResolver.swift @@ -107,6 +107,7 @@ class DNSResolver { extension Endpoint { func withReresolvedIP() -> Endpoint { + #if os(iOS) var ret = self let hostname: String switch host { @@ -148,5 +149,10 @@ extension Endpoint { wg_log(.debug, message: "DNS64: mapped \(host) to itself.") } return ret + #elseif os(macOS) + return self + #else + #error("Unimplemented") + #endif } } diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index cfc3aed..7c84491 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -30,6 +30,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } configureLogger() + #if os(macOS) + wgEnableRoaming(true) + #endif wg_log(.info, message: "Starting tunnel from the " + (activationAttemptId == nil ? "OS directly, rather than the app" : "app")) @@ -114,9 +117,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } private func pathUpdate(path: Network.NWPath) { - guard let handle = handle, let packetTunnelSettingsGenerator = packetTunnelSettingsGenerator else { return } + guard let handle = handle else { return } wg_log(.debug, message: "Network change detected with \(path.status) route and interface order \(path.availableInterfaces)") - _ = packetTunnelSettingsGenerator.endpointUapiConfiguration().withGoString { return wgSetConfig(handle, $0) } + #if os(iOS) + if let packetTunnelSettingsGenerator = packetTunnelSettingsGenerator { + _ = packetTunnelSettingsGenerator.endpointUapiConfiguration().withGoString { return wgSetConfig(handle, $0) } + } + #endif var interfaces = path.availableInterfaces if let ifname = ifname { interfaces = interfaces.filter { $0.name != ifname } diff --git a/wireguard-go-bridge/src/api-ios.go b/wireguard-go-bridge/src/api-ios.go index 94a2cd0..ace83d9 100644 --- a/wireguard-go-bridge/src/api-ios.go +++ b/wireguard-go-bridge/src/api-ios.go @@ -68,6 +68,11 @@ func init() { }() } +//export wgEnableRoaming +func wgEnableRoaming(enabled bool) { + roamingDisabled = !enabled +} + //export wgSetLogger func wgSetLogger(loggerFn uintptr) { loggerFunc = unsafe.Pointer(loggerFn) diff --git a/wireguard-go-bridge/wireguard.h b/wireguard-go-bridge/wireguard.h index 500f138..b264a2e 100644 --- a/wireguard-go-bridge/wireguard.h +++ b/wireguard-go-bridge/wireguard.h @@ -8,9 +8,11 @@ #include #include +#include typedef struct { const char *p; size_t n; } gostring_t; typedef void(*logger_fn_t)(int level, const char *msg); +extern void wgEnableRoaming(bool enabled); extern void wgSetLogger(logger_fn_t logger_fn); extern int wgTurnOn(gostring_t settings, int32_t tun_fd); extern void wgTurnOff(int handle);