aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Kuck <eric@bluelinelabs.com>2018-12-11 16:59:15 -0600
committerEric Kuck <eric@bluelinelabs.com>2018-12-11 16:59:15 -0600
commit9bc7e58487086f381a548ca7a3479dca377bc2e6 (patch)
treece9cad35f36acb8d403bf7e53bd47d7a82e889eb
parentAdded an (unfinished) NWPathMonitor implementation for reconnecting on network changes (diff)
downloadwireguard-apple-9bc7e58487086f381a548ca7a3479dca377bc2e6.tar.xz
wireguard-apple-9bc7e58487086f381a548ca7a3479dca377bc2e6.zip
Fixed a potential race condition, better naming on PacketTunnelSettingsGenerator methods
Signed-off-by: Eric Kuck <eric@bluelinelabs.com>
-rw-r--r--WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift38
-rw-r--r--WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift4
2 files changed, 24 insertions, 18 deletions
diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift
index 1a51573..04e9637 100644
--- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift
+++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift
@@ -88,8 +88,28 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
return
}
- let wireguardSettings = packetTunnelSettingsGenerator.generateWireGuardSettings()
- let handle = connect(interfaceName: tunnelConfiguration.interface.name, settings: wireguardSettings, fd: fd)
+ let wireguardSettings = packetTunnelSettingsGenerator.uapiConfiguration()
+
+ var handle: Int32 = -1
+
+ networkMonitor = NWPathMonitor()
+ networkMonitor?.pathUpdateHandler = { path in
+ guard handle >= 0 else { return }
+
+ if path.status == .satisfied {
+ let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration()
+
+ let endpointGoString = endpointString.withCString {
+ gostring_t(p: $0, n: endpointString.utf8.count)
+ }
+
+ wg_log(.debug, staticMessage: "Network change detected, calling wgSetConfig")
+ wgSetConfig(handle, endpointGoString)
+ }
+ }
+ networkMonitor?.start(queue: DispatchQueue(label: "NetworkMonitor"))
+
+ handle = connect(interfaceName: tunnelConfiguration.interface.name, settings: wireguardSettings, fd: fd)
if handle < 0 {
wg_log(.error, staticMessage: "Starting tunnel failed: Could not start WireGuard")
@@ -113,20 +133,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
startTunnelCompletionHandler(nil /* No errors */)
}
}
-
- networkMonitor = NWPathMonitor()
- networkMonitor?.pathUpdateHandler = { path in
- if path.status == .satisfied {
- let endpointString = packetTunnelSettingsGenerator.endpointFromSettings()
-
- let endpointGoString = endpointString.withCString {
- gostring_t(p: $0, n: endpointString.utf8.count)
- }
-
- wgSetConfig(handle, endpointGoString)
- }
- }
- networkMonitor?.start(queue: DispatchQueue(label: "NetworkMonitor"))
}
/// Begin the process of stopping the tunnel.
diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift
index 906aea9..0eea95a 100644
--- a/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift
+++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift
@@ -15,7 +15,7 @@ class PacketTunnelSettingsGenerator {
self.resolvedEndpoints = resolvedEndpoints
}
- func endpointFromSettings() -> String {
+ func endpointUapiConfiguration() -> String {
var wgSettings = "listen_port=\(tunnelConfiguration.interface.listenPort ?? 0)\n"
for (i, peer) in tunnelConfiguration.peers.enumerated() {
@@ -29,7 +29,7 @@ class PacketTunnelSettingsGenerator {
return wgSettings
}
- func generateWireGuardSettings() -> String {
+ func uapiConfiguration() -> String {
var wgSettings = ""
let privateKey = tunnelConfiguration.interface.privateKey.hexEncodedString()
wgSettings.append("private_key=\(privateKey)\n")