Skip to content

Commit 3686aae

Browse files
committed
Merge branch 'packettunnel-state-refactor-port'
2 parents 895646f + 8e8910d commit 3686aae

8 files changed

+205
-216
lines changed

ios/PacketTunnelCore/Actor/ObservedState.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ extension State {
8686
}
8787
}
8888

89-
extension ConnectionState {
90-
/// Map `ConnectionState` to `ObservedConnectionState`.
89+
extension State.ConnectionData {
90+
/// Map `State.ConnectionData` to `ObservedConnectionState`.
9191
var observedConnectionState: ObservedConnectionState {
9292
ObservedConnectionState(
9393
selectedRelay: selectedRelay,
@@ -101,8 +101,8 @@ extension ConnectionState {
101101
}
102102
}
103103

104-
extension BlockedState {
105-
/// Map `BlockedState` to `ObservedBlockedState`
104+
extension State.BlockingData {
105+
/// Map `State.BlockingData` to `ObservedBlockedState`
106106
var observedBlockedState: ObservedBlockedState {
107107
return ObservedBlockedState(reason: reason, relayConstraints: relayConstraints)
108108
}

ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ extension PacketTunnelActor {
5454
- Returns: New blocked state that should be assigned to error state, otherwise `nil` when actor is past or at `disconnecting` phase or
5555
when actor is already in the error state and no changes need to be made.
5656
*/
57-
private func makeBlockedState(reason: BlockedStateReason) -> BlockedState? {
57+
private func makeBlockedState(reason: BlockedStateReason) -> State.BlockingData? {
5858
switch state {
5959
case .initial:
60-
return BlockedState(
60+
return State.BlockingData(
6161
reason: reason,
6262
relayConstraints: nil,
6363
currentKey: nil,
@@ -93,11 +93,11 @@ extension PacketTunnelActor {
9393
Map connection state to blocked state.
9494
*/
9595
private func mapConnectionState(
96-
_ connState: ConnectionState,
96+
_ connState: State.ConnectionData,
9797
reason: BlockedStateReason,
9898
priorState: StatePriorToBlockedState
99-
) -> BlockedState {
100-
BlockedState(
99+
) -> State.BlockingData {
100+
State.BlockingData(
101101
reason: reason,
102102
relayConstraints: connState.relayConstraints,
103103
currentKey: connState.currentKey,

ios/PacketTunnelCore/Actor/PacketTunnelActor+KeyPolicy.swift

+19-96
Original file line numberDiff line numberDiff line change
@@ -23,65 +23,19 @@ extension PacketTunnelActor {
2323
- Parameter lastKeyRotation: date when last key rotation took place.
2424
*/
2525
func cacheActiveKey(lastKeyRotation: Date?) {
26-
func mutateConnectionState(_ connState: inout ConnectionState) -> Bool {
27-
switch connState.keyPolicy {
28-
case .useCurrent:
29-
if let currentKey = connState.currentKey {
30-
connState.lastKeyRotation = lastKeyRotation
31-
32-
// Move currentKey into keyPolicy.
33-
connState.keyPolicy = .usePrior(currentKey, startKeySwitchTask())
34-
connState.currentKey = nil
35-
36-
return true
37-
} else {
38-
return false
39-
}
40-
41-
case .usePrior:
42-
// It's unlikely that we'll see subsequent key rotations happen frequently.
43-
return false
44-
}
45-
}
46-
47-
switch state {
48-
case var .connecting(connState):
49-
if mutateConnectionState(&connState) {
50-
state = .connecting(connState)
51-
}
52-
53-
case var .connected(connState):
54-
if mutateConnectionState(&connState) {
55-
state = .connected(connState)
56-
}
57-
58-
case var .reconnecting(connState):
59-
if mutateConnectionState(&connState) {
60-
state = .reconnecting(connState)
61-
}
62-
63-
case var .error(blockedState):
64-
switch blockedState.keyPolicy {
65-
case .useCurrent:
66-
// Key policy is preserved between states and key rotation may still happen while in blocked state.
67-
// Therefore perform the key switch as normal with one exception that it shouldn't reconnect the tunnel
68-
// automatically.
69-
if let currentKey = blockedState.currentKey {
70-
blockedState.lastKeyRotation = lastKeyRotation
71-
72-
// Move currentKey into keyPolicy.
73-
blockedState.keyPolicy = .usePrior(currentKey, startKeySwitchTask())
74-
blockedState.currentKey = nil
75-
76-
state = .error(blockedState)
77-
}
78-
79-
case .usePrior:
80-
break
81-
}
82-
83-
case .initial, .disconnected, .disconnecting:
84-
break
26+
state.mutateAssociatedData { stateData in
27+
guard
28+
stateData.keyPolicy == .useCurrent,
29+
let currentKey = stateData.currentKey
30+
else { return }
31+
// Key policy is preserved between states and key rotation may still happen while in blocked state.
32+
// Therefore perform the key switch as normal with one exception that it shouldn't reconnect the tunnel
33+
// automatically.
34+
stateData.lastKeyRotation = lastKeyRotation
35+
36+
// Move currentKey into keyPolicy.
37+
stateData.keyPolicy = .usePrior(currentKey, startKeySwitchTask())
38+
stateData.currentKey = nil
8539
}
8640
}
8741

@@ -123,36 +77,10 @@ extension PacketTunnelActor {
12377
- Returns: `true` if the tunnel should reconnect, otherwise `false`.
12478
*/
12579
private func switchToCurrentKeyInner() -> Bool {
126-
switch state {
127-
case var .connecting(connState):
128-
if setCurrentKeyPolicy(&connState.keyPolicy) {
129-
state = .connecting(connState)
130-
return true
131-
}
132-
133-
case var .connected(connState):
134-
if setCurrentKeyPolicy(&connState.keyPolicy) {
135-
state = .connected(connState)
136-
return true
137-
}
138-
139-
case var .reconnecting(connState):
140-
if setCurrentKeyPolicy(&connState.keyPolicy) {
141-
state = .reconnecting(connState)
142-
return true
143-
}
144-
145-
case var .error(blockedState):
146-
if setCurrentKeyPolicy(&blockedState.keyPolicy) {
147-
state = .error(blockedState)
148-
149-
// Prevent tunnel from reconnecting when in blocked state.
150-
return false
151-
}
152-
153-
case .disconnected, .disconnecting, .initial:
154-
break
155-
}
80+
let oldKeyPolicy = state.keyPolicy
81+
state.mutateKeyPolicy(setCurrentKeyPolicy)
82+
// Prevent tunnel from reconnecting when in blocked state.
83+
guard case .error = state else { return state.keyPolicy != oldKeyPolicy }
15684
return false
15785
}
15886

@@ -162,14 +90,9 @@ extension PacketTunnelActor {
16290
- Parameter keyPolicy: a reference to key policy held either in connection state or blocked state struct.
16391
- Returns: `true` when the policy was modified, otherwise `false`.
16492
*/
165-
private func setCurrentKeyPolicy(_ keyPolicy: inout KeyPolicy) -> Bool {
166-
switch keyPolicy {
167-
case .useCurrent:
168-
return false
169-
170-
case .usePrior:
93+
private func setCurrentKeyPolicy(_ keyPolicy: inout KeyPolicy) {
94+
if case .usePrior = keyPolicy {
17195
keyPolicy = .useCurrent
172-
return true
17396
}
17497
}
17598
}

ios/PacketTunnelCore/Actor/PacketTunnelActor+NetworkReachability.swift

+1-38
Original file line numberDiff line numberDiff line change
@@ -43,43 +43,6 @@ extension PacketTunnelActor {
4343

4444
let newReachability = networkPath.networkReachability
4545

46-
func mutateConnectionState(_ connState: inout ConnectionState) -> Bool {
47-
if connState.networkReachability != newReachability {
48-
connState.networkReachability = newReachability
49-
return true
50-
}
51-
return false
52-
}
53-
54-
switch state {
55-
case var .connecting(connState):
56-
if mutateConnectionState(&connState) {
57-
state = .connecting(connState)
58-
}
59-
60-
case var .connected(connState):
61-
if mutateConnectionState(&connState) {
62-
state = .connected(connState)
63-
}
64-
65-
case var .reconnecting(connState):
66-
if mutateConnectionState(&connState) {
67-
state = .reconnecting(connState)
68-
}
69-
70-
case var .disconnecting(connState):
71-
if mutateConnectionState(&connState) {
72-
state = .disconnecting(connState)
73-
}
74-
75-
case var .error(blockedState):
76-
if blockedState.networkReachability != newReachability {
77-
blockedState.networkReachability = newReachability
78-
state = .error(blockedState)
79-
}
80-
81-
case .initial, .disconnected:
82-
break
83-
}
46+
state.mutateAssociatedData { $0.networkReachability = newReachability }
8447
}
8548
}

ios/PacketTunnelCore/Actor/PacketTunnelActor.swift

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import WireGuardKitTypes
2727
*/
2828
public actor PacketTunnelActor {
2929
var state: State = .initial {
30-
didSet {
30+
didSet(oldValue) {
31+
guard state != oldValue else { return }
3132
logger.debug("\(state.logFormat())")
3233
observedState = state.observedState
3334
}
@@ -293,7 +294,7 @@ extension PacketTunnelActor {
293294
nextRelay: NextRelay,
294295
settings: Settings,
295296
reason: ReconnectReason
296-
) throws -> ConnectionState? {
297+
) throws -> State.ConnectionData? {
297298
var keyPolicy: KeyPolicy = .useCurrent
298299
var networkReachability = defaultPathObserver.defaultPath?.networkReachability ?? .undetermined
299300
var lastKeyRotation: Date?
@@ -332,7 +333,7 @@ extension PacketTunnelActor {
332333
return nil
333334
}
334335
let selectedRelay = try callRelaySelector(nil, 0)
335-
return ConnectionState(
336+
return State.ConnectionData(
336337
selectedRelay: selectedRelay,
337338
relayConstraints: settings.relayConstraints,
338339
currentKey: settings.privateKey,
@@ -350,7 +351,7 @@ extension PacketTunnelActor {
350351
nextRelay: NextRelay,
351352
settings: Settings,
352353
reason: ReconnectReason
353-
) throws -> ConnectionState? {
354+
) throws -> State.ConnectionData? {
354355
guard let connectionState = try makeConnectionState(nextRelay: nextRelay, settings: settings, reason: reason)
355356
else { return nil }
356357

@@ -361,7 +362,7 @@ extension PacketTunnelActor {
361362
)
362363

363364
let transportLayer = protocolObfuscator.transportLayer.map { $0 } ?? .udp
364-
return ConnectionState(
365+
return State.ConnectionData(
365366
selectedRelay: connectionState.selectedRelay,
366367
relayConstraints: connectionState.relayConstraints,
367368
currentKey: settings.privateKey,

0 commit comments

Comments
 (0)