From f818cdd9631cdbe5b433aadb3af8ceab22f58c50 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Fri, 21 Dec 2018 17:32:44 +0530 Subject: NE: Update listen port only when first interface changes When handling network path changes, change the listen port only when the first interface has changed. Signed-off-by: Roopesh Chander --- .../PacketTunnelProvider.swift | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift') diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index f678ca7..8d71f0b 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -81,17 +81,32 @@ class PacketTunnelProvider: NEPacketTunnelProvider { var handle: Int32 = -1 + func interfaceDescription(_ interface: NWInterface?) -> String { + if let interface = interface { + return "\(interface.name) (\(interface.type))" + } else { + return "None" + } + } + networkMonitor = NWPathMonitor() + var previousPrimaryNetworkPathInterface = networkMonitor?.currentPath.availableInterfaces.first + wg_log(.debug, message: "Network path primary interface: \(interfaceDescription(previousPrimaryNetworkPathInterface))") networkMonitor?.pathUpdateHandler = { path in guard handle >= 0 else { return } if path.status == .satisfied { wg_log(.debug, message: "Network change detected, re-establishing sockets and IPs: \(path.availableInterfaces)") - let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(currentListenPort: wgGetListenPort(handle)) + let primaryNetworkPathInterface = path.availableInterfaces.first + wg_log(.debug, message: "Network path primary interface: \(interfaceDescription(primaryNetworkPathInterface))") + let shouldIncludeListenPort = previousPrimaryNetworkPathInterface != primaryNetworkPathInterface + let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(shouldIncludeListenPort: shouldIncludeListenPort, currentListenPort: wgGetListenPort(handle)) let err = withStringsAsGoStrings(endpointString, call: { return wgSetConfig(handle, $0.0) }) if err == -EADDRINUSE { - let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(currentListenPort: 0) + // We expect this to happen only if shouldIncludeListenPort is true + let endpointString = packetTunnelSettingsGenerator.endpointUapiConfiguration(shouldIncludeListenPort: shouldIncludeListenPort, currentListenPort: 0) _ = withStringsAsGoStrings(endpointString, call: { return wgSetConfig(handle, $0.0) }) } + previousPrimaryNetworkPathInterface = primaryNetworkPathInterface } } networkMonitor?.start(queue: DispatchQueue(label: "NetworkMonitor")) -- cgit v1.2.3-59-g8ed1b