From 09d7a5229ae026f004eb38295679bb9c044d2da7 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Sat, 22 Dec 2018 18:59:23 +0530 Subject: On-Demand: Add support for macOS-specific values Signed-off-by: Roopesh Chander --- .../WireGuard/Tunnel/ActivateOnDemandSetting.swift | 38 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'WireGuard/WireGuard/Tunnel') diff --git a/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift b/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift index ffc0624..c89cce3 100644 --- a/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift +++ b/WireGuard/WireGuard/Tunnel/ActivateOnDemandSetting.swift @@ -10,9 +10,14 @@ struct ActivateOnDemandSetting { enum ActivateOnDemandOption { case none // Valid only when isActivateOnDemandEnabled is false - case useOnDemandOverWiFiOrCellular case useOnDemandOverWiFiOnly + #if os(iOS) + case useOnDemandOverWiFiOrCellular case useOnDemandOverCellularOnly + #elseif os(OSX) + case useOnDemandOverWiFiOrEthernet + case useOnDemandOverEthernetOnly + #endif } extension ActivateOnDemandSetting { @@ -24,6 +29,7 @@ extension ActivateOnDemandSetting { switch activateOnDemandOption { case .none: rules = nil + #if os(iOS) case .useOnDemandOverWiFiOrCellular: rules = [connectRule] case .useOnDemandOverWiFiOnly: @@ -34,12 +40,33 @@ extension ActivateOnDemandSetting { connectRule.interfaceTypeMatch = .cellular disconnectRule.interfaceTypeMatch = .wiFi rules = [connectRule, disconnectRule] + #elseif os(OSX) + case .useOnDemandOverWiFiOrEthernet: + rules = [connectRule] + case .useOnDemandOverWiFiOnly: + connectRule.interfaceTypeMatch = .wiFi + disconnectRule.interfaceTypeMatch = .ethernet + rules = [connectRule, disconnectRule] + case .useOnDemandOverEthernetOnly: + connectRule.interfaceTypeMatch = .ethernet + disconnectRule.interfaceTypeMatch = .wiFi + rules = [connectRule, disconnectRule] + #endif } tunnelProviderManager.onDemandRules = rules } init(from tunnelProviderManager: NETunnelProviderManager) { let rules = tunnelProviderManager.onDemandRules ?? [] + #if os(iOS) + let otherInterfaceType: NEOnDemandRuleInterfaceType = .cellular + let useWiFiOrOtherOption: ActivateOnDemandOption = .useOnDemandOverWiFiOrCellular + let useOtherOnlyOption: ActivateOnDemandOption = .useOnDemandOverCellularOnly + #elseif os(OSX) + let otherInterfaceType: NEOnDemandRuleInterfaceType = .ethernet + let useWiFiOrOtherOption: ActivateOnDemandOption = .useOnDemandOverWiFiOrEthernet + let useOtherOnlyOption: ActivateOnDemandOption = .useOnDemandOverEthernetOnly + #endif let activateOnDemandOption: ActivateOnDemandOption switch rules.count { case 0: @@ -47,20 +74,21 @@ extension ActivateOnDemandSetting { case 1: let rule = rules[0] precondition(rule.action == .connect) - activateOnDemandOption = .useOnDemandOverWiFiOrCellular + activateOnDemandOption = useWiFiOrOtherOption case 2: let connectRule = rules.first(where: { $0.action == .connect })! let disconnectRule = rules.first(where: { $0.action == .disconnect })! - if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == .cellular { + if connectRule.interfaceTypeMatch == .wiFi && disconnectRule.interfaceTypeMatch == otherInterfaceType { activateOnDemandOption = .useOnDemandOverWiFiOnly - } else if connectRule.interfaceTypeMatch == .cellular && disconnectRule.interfaceTypeMatch == .wiFi { - activateOnDemandOption = .useOnDemandOverCellularOnly + } else if connectRule.interfaceTypeMatch == otherInterfaceType && disconnectRule.interfaceTypeMatch == .wiFi { + activateOnDemandOption = useOtherOnlyOption } else { fatalError("Unexpected onDemandRules set on tunnel provider manager") } default: fatalError("Unexpected number of onDemandRules set on tunnel provider manager") } + self.activateOnDemandOption = activateOnDemandOption if activateOnDemandOption == .none { isActivateOnDemandEnabled = false -- cgit v1.2.3-59-g8ed1b