aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard/VPN/TunnelsManager.swift
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2018-10-29 06:00:31 +0530
committerRoopesh Chander <roop@roopc.net>2018-10-29 06:19:50 +0530
commitb7aaae7513a29e4082fc5e607ea514387a066408 (patch)
tree77a93c6cb03c64e556900f4bf4f7fefdddc4c9be /WireGuard/WireGuard/VPN/TunnelsManager.swift
parentVPN: Cache DNS resolutions while the app is in memory (diff)
downloadwireguard-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.swift42
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)
+ }
+ }
+ }
}
}