diff options
Diffstat (limited to 'WireGuard/WireGuard/VPN/TunnelsManager.swift')
-rw-r--r-- | WireGuard/WireGuard/VPN/TunnelsManager.swift | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/WireGuard/WireGuard/VPN/TunnelsManager.swift b/WireGuard/WireGuard/VPN/TunnelsManager.swift index 76d5c05..1210d7e 100644 --- a/WireGuard/WireGuard/VPN/TunnelsManager.swift +++ b/WireGuard/WireGuard/VPN/TunnelsManager.swift @@ -261,19 +261,9 @@ class TunnelContainer: NSObject { let endpoints = tunnelConfiguration.peers.map { $0.endpoint } let dnsResolver = DNSResolver(endpoints: endpoints) assert(self.dnsResolver == nil) - self.dnsResolver = dnsResolver - status = .resolvingEndpointDomains - dnsResolver.resolve { [weak self] endpoints in - guard let s = self else { return } - assert(s.status == .resolvingEndpointDomains) - s.dnsResolver = nil - guard let endpoints = endpoints else { - completionHandler(TunnelsManagerError.dnsResolutionFailed) - s.status = .inactive - return - } - s.tunnelProvider.loadFromPreferences { [weak s] (error) in - guard let s = s else { return } + if let endpoints = dnsResolver.resolveWithoutNetworkRequests() { + self.tunnelProvider.loadFromPreferences { [weak self] (error) in + guard let s = self else { return } s.startObservingTunnelStatus() let session = (s.tunnelProvider.connection as! NETunnelProviderSession) do { @@ -285,6 +275,32 @@ class TunnelContainer: NSObject { completionHandler(error) } } + } else { + self.dnsResolver = dnsResolver + status = .resolvingEndpointDomains + dnsResolver.resolve { [weak self] endpoints in + guard let s = self else { return } + assert(s.status == .resolvingEndpointDomains) + s.dnsResolver = nil + guard let endpoints = endpoints else { + completionHandler(TunnelsManagerError.dnsResolutionFailed) + s.status = .inactive + return + } + s.tunnelProvider.loadFromPreferences { [weak s] (error) in + guard let s = s else { return } + s.startObservingTunnelStatus() + let session = (s.tunnelProvider.connection as! NETunnelProviderSession) + do { + let tunnelOptions = PacketTunnelOptionsGenerator.generateOptions( + from: tunnelConfiguration, withResolvedEndpoints: endpoints) + try session.startTunnel(options: tunnelOptions) + } catch (let error) { + os_log("Failed to activate tunnel: %{public}@", log: OSLog.default, type: .debug, "\(error)") + completionHandler(error) + } + } + } } } |