diff options
author | 2018-12-11 16:59:15 -0600 | |
---|---|---|
committer | 2018-12-11 16:59:15 -0600 | |
commit | 9bc7e58487086f381a548ca7a3479dca377bc2e6 (patch) | |
tree | ce9cad35f36acb8d403bf7e53bd47d7a82e889eb /WireGuard/WireGuardNetworkExtension | |
parent | Added an (unfinished) NWPathMonitor implementation for reconnecting on network changes (diff) | |
download | wireguard-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>
Diffstat (limited to 'WireGuard/WireGuardNetworkExtension')
-rw-r--r-- | WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift | 38 | ||||
-rw-r--r-- | WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift | 4 |
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") |