TunnelsManager: Reintroduce waiting for another tunnel to deactivate
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
parent
642b627d27
commit
f9239dae75
|
@ -258,9 +258,17 @@ class TunnelsManager {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let alreadyWaitingTunnel = tunnels.first(where: { $0.status == .waiting }) {
|
||||||
|
alreadyWaitingTunnel.status = .inactive
|
||||||
|
}
|
||||||
|
|
||||||
if let tunnelInOperation = tunnels.first(where: { $0.status != .inactive }) {
|
if let tunnelInOperation = tunnels.first(where: { $0.status != .inactive }) {
|
||||||
self.activationDelegate?.tunnelActivationAttemptFailed(tunnel: tunnel, error: .anotherTunnelIsOperational(otherTunnelName: tunnelInOperation.name))
|
wg_log(.info, message: "Tunnel '\(tunnel.name)' waiting for deactivation of '\(tunnelInOperation.name)'")
|
||||||
// FIXME: Switches in the UI won't be reset, but we'll be reintroducing waiting, so that's fine
|
tunnel.status = .waiting
|
||||||
|
assert(tunnelInOperation.status != .inactive)
|
||||||
|
if tunnelInOperation.status != .deactivating {
|
||||||
|
startDeactivation(of: tunnelInOperation)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,6 +277,7 @@ class TunnelsManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
func startDeactivation(of tunnel: TunnelContainer) {
|
func startDeactivation(of tunnel: TunnelContainer) {
|
||||||
|
tunnel.isAttemptingActivation = false
|
||||||
if tunnel.status == .inactive || tunnel.status == .deactivating {
|
if tunnel.status == .inactive || tunnel.status == .deactivating {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -312,6 +321,13 @@ class TunnelsManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
tunnel.refreshStatus()
|
tunnel.refreshStatus()
|
||||||
|
|
||||||
|
// In case some other tunnel is waiting for this tunnel to get deactivated
|
||||||
|
if session.status == .disconnected || session.status == .invalid {
|
||||||
|
if let waitingTunnel = self.tunnels.first(where: { $0.status == .waiting }) {
|
||||||
|
waitingTunnel.startActivation(activationDelegate: self.activationDelegate)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +373,7 @@ class TunnelContainer: NSObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func startActivation(activationDelegate: TunnelsManagerActivationDelegate?) {
|
fileprivate func startActivation(activationDelegate: TunnelsManagerActivationDelegate?) {
|
||||||
assert(status == .inactive || status == .restarting)
|
assert(status == .inactive || status == .restarting || status == .waiting)
|
||||||
|
|
||||||
guard let tunnelConfiguration = tunnelConfiguration() else { fatalError() }
|
guard let tunnelConfiguration = tunnelConfiguration() else { fatalError() }
|
||||||
|
|
||||||
|
@ -446,6 +462,7 @@ class TunnelContainer: NSObject {
|
||||||
case reasserting // Not a possible state at present
|
case reasserting // Not a possible state at present
|
||||||
|
|
||||||
case restarting // Restarting tunnel (done after saving modifications to an active tunnel)
|
case restarting // Restarting tunnel (done after saving modifications to an active tunnel)
|
||||||
|
case waiting // Waiting for another tunnel to be brought down
|
||||||
|
|
||||||
init(from systemStatus: NEVPNStatus) {
|
init(from systemStatus: NEVPNStatus) {
|
||||||
switch systemStatus {
|
switch systemStatus {
|
||||||
|
@ -474,6 +491,7 @@ extension TunnelStatus: CustomDebugStringConvertible {
|
||||||
case .deactivating: return "deactivating"
|
case .deactivating: return "deactivating"
|
||||||
case .reasserting: return "reasserting"
|
case .reasserting: return "reasserting"
|
||||||
case .restarting: return "restarting"
|
case .restarting: return "restarting"
|
||||||
|
case .waiting: return "waiting"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,6 +270,8 @@ private class StatusCell: UITableViewCell {
|
||||||
text = "Reactivating"
|
text = "Reactivating"
|
||||||
case .restarting:
|
case .restarting:
|
||||||
text = "Restarting"
|
text = "Restarting"
|
||||||
|
case .waiting:
|
||||||
|
text = "Waiting"
|
||||||
}
|
}
|
||||||
textLabel?.text = text
|
textLabel?.text = text
|
||||||
DispatchQueue.main.async { [weak statusSwitch] in
|
DispatchQueue.main.async { [weak statusSwitch] in
|
||||||
|
|
Loading…
Reference in New Issue