]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
NE: Update listen port only when first interface changes
authorRoopesh Chander <roop@roopc.net>
Fri, 21 Dec 2018 12:02:44 +0000 (17:32 +0530)
committerRoopesh Chander <roop@roopc.net>
Fri, 21 Dec 2018 12:02:44 +0000 (17:32 +0530)
When handling network path changes, change the listen port
only when the first interface has changed.

Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift
WireGuard/WireGuardNetworkExtension/PacketTunnelSettingsGenerator.swift

index f678ca7afe2df128f698b79505d47a1c8fb3d592..8d71f0be0961320656a090cc64b4a2f45954843d 100644 (file)
@@ -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"))
index 7ee0acc49f20b52a77ec3fabd153626721c50533..888769d67480fa00a62e931877637cd03ba42f3a 100644 (file)
@@ -15,8 +15,16 @@ class PacketTunnelSettingsGenerator {
         self.resolvedEndpoints = resolvedEndpoints
     }
 
-    func endpointUapiConfiguration(currentListenPort: UInt16) -> String {
-        var wgSettings = "listen_port=\(tunnelConfiguration.interface.listenPort ?? currentListenPort)\n"
+    func endpointUapiConfiguration(shouldIncludeListenPort: Bool, currentListenPort: UInt16?) -> String {
+        var wgSettings = ""
+
+        if shouldIncludeListenPort {
+            if let tunnelListenPort = tunnelConfiguration.interface.listenPort {
+                wgSettings.append("listen_port=\(tunnelListenPort)\n")
+            } else if let currentListenPort = currentListenPort {
+                wgSettings.append("listen_port=\(currentListenPort)\n")
+            }
+        }
 
         for (index, peer) in tunnelConfiguration.peers.enumerated() {
             wgSettings.append("public_key=\(peer.publicKey.hexEncodedString())\n")