summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@kvadrat.se>2024-09-25 13:43:59 +0200
committerJon Petersson <jon.petersson@kvadrat.se>2024-10-02 14:51:42 +0200
commit9af680aedfb159d9f0bc52f00556504f7efc0b99 (patch)
tree72bfb3c22b694924cf1d7c4a840e5d18c94497a0
parent4fc7824eef0a9765f73e4aafa0ae9f1c297122d6 (diff)
downloadmullvadvpn-9af680aedfb159d9f0bc52f00556504f7efc0b99.tar.xz
mullvadvpn-9af680aedfb159d9f0bc52f00556504f7efc0b99.zip
Add smart routing to daita settings data
-rw-r--r--ios/MullvadREST/Relay/RelayPicking.swift4
-rw-r--r--ios/MullvadSettings/DAITASettings.swift34
-rw-r--r--ios/MullvadVPN/Coordinators/LocationCoordinator.swift2
-rw-r--r--ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift2
-rw-r--r--ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift2
-rw-r--r--ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift4
-rw-r--r--ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInteractor.swift2
-rw-r--r--ios/MullvadVPNTests/MullvadREST/Relay/MultihopDecisionFlowTests.swift2
-rw-r--r--ios/MullvadVPNTests/MullvadREST/Relay/RelayPickingTests.swift6
-rw-r--r--ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorWrapperTests.swift12
-rw-r--r--ios/MullvadVPNTests/MullvadSettings/TunnelSettingsUpdateTests.swift2
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActor+PostQuantum.swift2
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActor.swift8
13 files changed, 54 insertions, 28 deletions
diff --git a/ios/MullvadREST/Relay/RelayPicking.swift b/ios/MullvadREST/Relay/RelayPicking.swift
index 15ae2ee90c..4d752d3707 100644
--- a/ios/MullvadREST/Relay/RelayPicking.swift
+++ b/ios/MullvadREST/Relay/RelayPicking.swift
@@ -49,7 +49,7 @@ struct SinglehopPicker: RelayPicking {
by: constraints.exitLocations,
in: relays,
filterConstraint: constraints.filter,
- daitaEnabled: daitaSettings.state.isEnabled
+ daitaEnabled: daitaSettings.daitaState.isEnabled
)
} catch let error as NoRelaysSatisfyingConstraintsError where error.reason == .noDaitaRelaysFound {
#if DEBUG
@@ -83,7 +83,7 @@ struct MultihopPicker: RelayPicking {
by: constraints.entryLocations,
in: relays,
filterConstraint: constraints.filter,
- daitaEnabled: daitaSettings.state.isEnabled
+ daitaEnabled: daitaSettings.daitaState.isEnabled
)
let exitCandidates = try RelaySelector.WireGuard.findCandidates(
diff --git a/ios/MullvadSettings/DAITASettings.swift b/ios/MullvadSettings/DAITASettings.swift
index ca946b6891..9e0a0f1fb7 100644
--- a/ios/MullvadSettings/DAITASettings.swift
+++ b/ios/MullvadSettings/DAITASettings.swift
@@ -18,15 +18,41 @@ public enum DAITAState: Codable {
}
}
-/// Selected relay is incompatible with Daita, either through singlehop or multihop.
+/// Whether smart routing is enabled
+public enum SmartRoutingState: Codable {
+ case on
+ case off
+
+ public var isEnabled: Bool {
+ self == .on
+ }
+}
+
+/// Selected relay is incompatible with DAITA, either through singlehop or multihop.
public enum DAITASettingsCompatibilityError {
case singlehop, multihop
}
public struct DAITASettings: Codable, Equatable {
- public let state: DAITAState
+ @available(*, deprecated, renamed: "daitaState")
+ public let state: DAITAState = .off
+
+ public let daitaState: DAITAState
+ public let smartRoutingState: SmartRoutingState
+
+ public init(daitaState: DAITAState = .off, smartRoutingState: SmartRoutingState = .off) {
+ self.daitaState = daitaState
+ self.smartRoutingState = smartRoutingState
+ }
+
+ public init(from decoder: any Decoder) throws {
+ let container = try decoder.container(keyedBy: CodingKeys.self)
+
+ daitaState = try container.decodeIfPresent(DAITAState.self, forKey: .daitaState)
+ ?? container.decodeIfPresent(DAITAState.self, forKey: .state)
+ ?? .off
- public init(state: DAITAState = .off) {
- self.state = state
+ smartRoutingState = try container.decodeIfPresent(SmartRoutingState.self, forKey: .smartRoutingState)
+ ?? .off
}
}
diff --git a/ios/MullvadVPN/Coordinators/LocationCoordinator.swift b/ios/MullvadVPN/Coordinators/LocationCoordinator.swift
index 2f5b9f6472..7bf540debc 100644
--- a/ios/MullvadVPN/Coordinators/LocationCoordinator.swift
+++ b/ios/MullvadVPN/Coordinators/LocationCoordinator.swift
@@ -62,7 +62,7 @@ class LocationCoordinator: Coordinator, Presentable, Presenting {
customListRepository: customListRepository,
constraints: tunnelManager.settings.relayConstraints,
multihopEnabled: tunnelManager.settings.tunnelMultihopState.isEnabled,
- daitaEnabled: tunnelManager.settings.daita.state.isEnabled,
+ daitaEnabled: tunnelManager.settings.daita.daitaState.isEnabled,
startContext: startContext
)
locationViewControllerWrapper.delegate = self
diff --git a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
index 561039f1a0..3dd21b1351 100644
--- a/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
+++ b/ios/MullvadVPN/SimulatorTunnelProvider/SimulatorTunnelProviderHost.swift
@@ -182,7 +182,7 @@ final class SimulatorTunnelProviderHost: SimulatorTunnelProviderDelegate {
remotePort: selectedRelays.entry?.endpoint.ipv4Relay.port ?? selectedRelays.exit.endpoint.ipv4Relay
.port,
isPostQuantum: settings.tunnelQuantumResistance.isEnabled,
- isDaitaEnabled: settings.daita.state.isEnabled
+ isDaitaEnabled: settings.daita.daitaState.isEnabled
)
)
} catch {
diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
index eb2ece3a13..c6b712061c 100644
--- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
+++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
@@ -93,7 +93,7 @@ class StartTunnelOperation: ResultOperation<Void> {
tunnelStatus.state = .connecting(
selectedRelays,
isPostQuantum: interactor.settings.tunnelQuantumResistance.isEnabled,
- isDaita: interactor.settings.daita.state.isEnabled
+ isDaita: interactor.settings.daita.daitaState.isEnabled
)
}
diff --git a/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift b/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift
index 42f1c29afc..996e340dc4 100644
--- a/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift
+++ b/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsCellFactory.swift
@@ -216,7 +216,7 @@ final class VPNSettingsCellFactory: CellFactoryProtocol {
comment: ""
)
cell.accessibilityIdentifier = item.accessibilityIdentifier
- cell.setOn(viewModel.daitaSettings.state.isEnabled, animated: false)
+ cell.setOn(viewModel.daitaSettings.daitaState.isEnabled, animated: false)
cell.infoButtonHandler = { [weak self] in
self?.delegate?.showInfo(for: .daita)
@@ -224,7 +224,7 @@ final class VPNSettingsCellFactory: CellFactoryProtocol {
cell.action = { [weak self] isEnabled in
let state: DAITAState = isEnabled ? .on : .off
- self?.delegate?.switchDaitaState(DAITASettings(state: state))
+ self?.delegate?.switchDaitaState(DAITASettings(daitaState: state))
}
case .multihopSwitch:
diff --git a/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInteractor.swift b/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInteractor.swift
index c7a5749ce2..8857c46493 100644
--- a/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInteractor.swift
+++ b/ios/MullvadVPN/View controllers/VPNSettings/VPNSettingsInteractor.swift
@@ -53,7 +53,7 @@ final class VPNSettingsInteractor {
}
func evaluateDaitaSettingsCompatibility(_ settings: DAITASettings) -> DAITASettingsCompatibilityError? {
- guard settings.state.isEnabled else { return nil }
+ guard settings.daitaState.isEnabled else { return nil }
var tunnelSettings = tunnelSettings
tunnelSettings.daita = settings
diff --git a/ios/MullvadVPNTests/MullvadREST/Relay/MultihopDecisionFlowTests.swift b/ios/MullvadVPNTests/MullvadREST/Relay/MultihopDecisionFlowTests.swift
index 190593778f..7f004ad5a9 100644
--- a/ios/MullvadVPNTests/MullvadREST/Relay/MultihopDecisionFlowTests.swift
+++ b/ios/MullvadVPNTests/MullvadREST/Relay/MultihopDecisionFlowTests.swift
@@ -120,7 +120,7 @@ extension MultihopDecisionFlowTests {
return MultihopPicker(
constraints: constraints,
- daitaSettings: DAITASettings(state: .off),
+ daitaSettings: DAITASettings(daitaState: .off),
relays: sampleRelays,
connectionAttemptCount: 0
)
diff --git a/ios/MullvadVPNTests/MullvadREST/Relay/RelayPickingTests.swift b/ios/MullvadVPNTests/MullvadREST/Relay/RelayPickingTests.swift
index 9229d4ab8f..73d538ab1b 100644
--- a/ios/MullvadVPNTests/MullvadREST/Relay/RelayPickingTests.swift
+++ b/ios/MullvadVPNTests/MullvadREST/Relay/RelayPickingTests.swift
@@ -24,7 +24,7 @@ class RelayPickingTests: XCTestCase {
let picker = SinglehopPicker(
constraints: constraints,
- daitaSettings: DAITASettings(state: .off),
+ daitaSettings: DAITASettings(daitaState: .off),
relays: sampleRelays,
connectionAttemptCount: 0
)
@@ -43,7 +43,7 @@ class RelayPickingTests: XCTestCase {
let picker = MultihopPicker(
constraints: constraints,
- daitaSettings: DAITASettings(state: .off),
+ daitaSettings: DAITASettings(daitaState: .off),
relays: sampleRelays,
connectionAttemptCount: 0
)
@@ -62,7 +62,7 @@ class RelayPickingTests: XCTestCase {
let picker = MultihopPicker(
constraints: constraints,
- daitaSettings: DAITASettings(state: .off),
+ daitaSettings: DAITASettings(daitaState: .off),
relays: sampleRelays,
connectionAttemptCount: 0
)
diff --git a/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorWrapperTests.swift b/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorWrapperTests.swift
index beca599c5f..2bc33ca86e 100644
--- a/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorWrapperTests.swift
+++ b/ios/MullvadVPNTests/MullvadREST/Relay/RelaySelectorWrapperTests.swift
@@ -48,7 +48,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: singlehopWithoutDaitaConstraints,
tunnelMultihopState: .off,
- daita: DAITASettings(state: .off)
+ daita: DAITASettings(daitaState: .off)
)
let selectedRelays = try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0)
@@ -61,7 +61,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: multihopWithDaitaConstraints,
tunnelMultihopState: .on,
- daita: DAITASettings(state: .off)
+ daita: DAITASettings(daitaState: .off)
)
let selectedRelays = try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0)
@@ -74,7 +74,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: multihopWithDaitaConstraints,
tunnelMultihopState: .on,
- daita: DAITASettings(state: .on)
+ daita: DAITASettings(daitaState: .on)
)
XCTAssertNoThrow(try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0))
@@ -86,7 +86,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: multihopWithoutDaitaConstraints,
tunnelMultihopState: .on,
- daita: DAITASettings(state: .on)
+ daita: DAITASettings(daitaState: .on)
)
XCTAssertThrowsError(try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0))
@@ -98,7 +98,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: singlehopWithDaitaConstraints,
tunnelMultihopState: .off,
- daita: DAITASettings(state: .on)
+ daita: DAITASettings(daitaState: .on)
)
let selectedRelays = try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0)
@@ -113,7 +113,7 @@ class RelaySelectorWrapperTests: XCTestCase {
let settings = LatestTunnelSettings(
relayConstraints: singlehopWithoutDaitaConstraints,
tunnelMultihopState: .off,
- daita: DAITASettings(state: .on)
+ daita: DAITASettings(daitaState: .on)
)
let selectedRelays = try wrapper.selectRelays(tunnelSettings: settings, connectionAttemptCount: 0)
diff --git a/ios/MullvadVPNTests/MullvadSettings/TunnelSettingsUpdateTests.swift b/ios/MullvadVPNTests/MullvadSettings/TunnelSettingsUpdateTests.swift
index 824546e9e6..881372d2be 100644
--- a/ios/MullvadVPNTests/MullvadSettings/TunnelSettingsUpdateTests.swift
+++ b/ios/MullvadVPNTests/MullvadSettings/TunnelSettingsUpdateTests.swift
@@ -85,7 +85,7 @@ final class TunnelSettingsUpdateTests: XCTestCase {
func testApplyDAITA() {
// Given:
- let daitaSettings = DAITASettings(state: .on)
+ let daitaSettings = DAITASettings(daitaState: .on)
var settings = LatestTunnelSettings()
// When:
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActor+PostQuantum.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActor+PostQuantum.swift
index 3b3c5ad560..f35677c846 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActor+PostQuantum.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActor+PostQuantum.swift
@@ -65,7 +65,7 @@ extension PacketTunnelActor {
}
var daitaConfiguration: DaitaConfiguration?
- if settings.daita.state.isEnabled {
+ if settings.daita.daitaState.isEnabled {
let maybeNot = Maybenot()
daitaConfiguration = DaitaConfiguration(
machines: maybeNot.machines,
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
index 98dbeea262..6f6b0a02cd 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
@@ -259,7 +259,7 @@ extension PacketTunnelActor {
) async throws {
let settings: Settings = try settingsReader.read()
- if settings.quantumResistance.isEnabled || settings.daita.state.isEnabled {
+ if settings.quantumResistance.isEnabled || settings.daita.daitaState.isEnabled {
try await tryStartEphemeralPeerNegotiation(withSettings: settings, nextRelays: nextRelays, reason: reason)
} else {
try await tryStartConnection(withSettings: settings, nextRelays: nextRelays, reason: reason)
@@ -307,7 +307,7 @@ extension PacketTunnelActor {
}
var daitaConfiguration: DaitaConfiguration?
- if settings.daita.state.isEnabled {
+ if settings.daita.daitaState.isEnabled {
let maybeNot = Maybenot()
daitaConfiguration = DaitaConfiguration(
machines: maybeNot.machines,
@@ -417,7 +417,7 @@ extension PacketTunnelActor {
transportLayer: .udp,
remotePort: connectedRelay.endpoint.ipv4Relay.port,
isPostQuantum: settings.quantumResistance.isEnabled,
- isDaitaEnabled: settings.daita.state.isEnabled
+ isDaitaEnabled: settings.daita.daitaState.isEnabled
)
case .disconnecting, .disconnected:
return nil
@@ -460,7 +460,7 @@ extension PacketTunnelActor {
transportLayer: transportLayer,
remotePort: protocolObfuscator.remotePort,
isPostQuantum: settings.quantumResistance.isEnabled,
- isDaitaEnabled: settings.daita.state.isEnabled
+ isDaitaEnabled: settings.daita.daitaState.isEnabled
)
}