diff options
author | Roopesh Chander <roop@roopc.net> | 2018-10-29 06:00:31 +0530 |
---|---|---|
committer | Roopesh Chander <roop@roopc.net> | 2018-10-29 06:19:50 +0530 |
commit | b7aaae7513a29e4082fc5e607ea514387a066408 (patch) | |
tree | 77a93c6cb03c64e556900f4bf4f7fefdddc4c9be /WireGuard/WireGuard/VPN/TunnelsManager.swift | |
parent | VPN: Cache DNS resolutions while the app is in memory (diff) | |
download | wireguard-apple-b7aaae7513a29e4082fc5e607ea514387a066408.tar.xz wireguard-apple-b7aaae7513a29e4082fc5e607ea514387a066408.zip |
VPN: If we don't have to make a DNS request, we shouldn't enter that status
Signed-off-by: Roopesh Chander <roop@roopc.net>
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) + } + } + } } } |