]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
iOS: Hack to restart active tunnel after adding a new tunnel
authorRoopesh Chander <roop@roopc.net>
Sun, 24 Feb 2019 14:00:14 +0000 (19:30 +0530)
committerRoopesh Chander <roop@roopc.net>
Sun, 24 Feb 2019 14:00:14 +0000 (19:30 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard/Tunnel/TunnelsManager.swift

index ece1e721dd9487c77ee24433bfce57906fb54c03..e05bea9d5173ee24fa45b4908c826aa9342a3032 100644 (file)
@@ -115,6 +115,8 @@ class TunnelsManager {
 
         activateOnDemandSetting.apply(on: tunnelProviderManager)
 
+        let activeTunnel = tunnels.first { $0.status == .active || $0.status == .activating }
+
         tunnelProviderManager.saveToPreferences { [weak self] error in
             guard error == nil else {
                 wg_log(.error, message: "Add: Saving configuration failed: \(error!)")
@@ -125,6 +127,19 @@ class TunnelsManager {
 
             guard let self = self else { return }
 
+            #if os(iOS)
+            // HACK: In iOS, adding a tunnel causes deactivation of any currently active tunnel.
+            // This is an ugly hack to reactivate the tunnel that has been deactivated like that.
+            if let activeTunnel = activeTunnel {
+                if activeTunnel.status == .inactive || activeTunnel.status == .deactivating {
+                    self.startActivation(of: activeTunnel)
+                }
+                if activeTunnel.status == .active || activeTunnel.status == .activating {
+                    activeTunnel.status = .restarting
+                }
+            }
+            #endif
+
             let tunnel = TunnelContainer(tunnel: tunnelProviderManager)
             self.tunnels.append(tunnel)
             self.tunnels.sort { $0.name < $1.name }
@@ -440,7 +455,7 @@ class TunnelContainer: NSObject {
     }
 
     func refreshStatus() {
-        if (status == .restarting) && (tunnelProvider.connection.status == .disconnected || tunnelProvider.connection.status == .disconnecting) {
+        if status == .restarting {
             return
         }
         status = TunnelStatus(from: tunnelProvider.connection.status)