From 034a1a12f7849276823546f369b00507dc8029ce Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 12 Dec 2018 00:45:50 +0100 Subject: Supply missing pieces of path change Signed-off-by: Jason A. Donenfeld --- .../PacketTunnelProvider.swift | 18 ++++++++++-------- .../PacketTunnelSettingsGenerator.swift | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'WireGuard') diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index 04e9637..f5f0296 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -95,16 +95,18 @@ class PacketTunnelProvider: NEPacketTunnelProvider { 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, message: "Network change detected, re-establishing sockets and IPs: \(path.availableInterfaces)") + let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(currentListenPort: wgGetListenPort(handle)) + let err = endpointString.withCString { + wgSetConfig(handle, gostring_t(p: $0, n: endpointString.utf8.count)) + } + if err == -EADDRINUSE { + let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(currentListenPort: 0) + _ = endpointString.withCString { + wgSetConfig(handle, 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")) diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift index 0eea95a..61e161e 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift @@ -15,8 +15,8 @@ class PacketTunnelSettingsGenerator { self.resolvedEndpoints = resolvedEndpoints } - func endpointUapiConfiguration() -> String { - var wgSettings = "listen_port=\(tunnelConfiguration.interface.listenPort ?? 0)\n" + func endpointUapiConfiguration(currentListenPort: UInt16) -> String { + var wgSettings = "listen_port=\(tunnelConfiguration.interface.listenPort ?? currentListenPort)\n" for (i, peer) in tunnelConfiguration.peers.enumerated() { wgSettings.append("public_key=\(peer.publicKey.hexEncodedString())\n") -- cgit v1.2.3-59-g8ed1b