Move in/out states to a generic struct
This commit is contained in:
parent
2bd9484a43
commit
d80c0b5460
@ -18,6 +18,7 @@ custom_categories:
|
|||||||
- LinkInterface
|
- LinkInterface
|
||||||
- TunnelInterface
|
- TunnelInterface
|
||||||
- PacketStream
|
- PacketStream
|
||||||
|
- BidirectionalState
|
||||||
- SessionProxy
|
- SessionProxy
|
||||||
- SessionProxyDelegate
|
- SessionProxyDelegate
|
||||||
- SessionReply
|
- SessionReply
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
0E1108B31F77B9F900A92462 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0E1108B21F77B9F900A92462 /* Assets.xcassets */; };
|
0E1108B31F77B9F900A92462 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0E1108B21F77B9F900A92462 /* Assets.xcassets */; };
|
||||||
0E1108B61F77B9F900A92462 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E1108B41F77B9F900A92462 /* LaunchScreen.storyboard */; };
|
0E1108B61F77B9F900A92462 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0E1108B41F77B9F900A92462 /* LaunchScreen.storyboard */; };
|
||||||
0E12B2A32145341B00B4BAE9 /* PacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12B2A22145341B00B4BAE9 /* PacketTests.swift */; };
|
0E12B2A32145341B00B4BAE9 /* PacketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12B2A22145341B00B4BAE9 /* PacketTests.swift */; };
|
||||||
|
0E12B2A521454F7F00B4BAE9 /* BidirectionalState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12B2A421454F7F00B4BAE9 /* BidirectionalState.swift */; };
|
||||||
|
0E12B2A621454F7F00B4BAE9 /* BidirectionalState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12B2A421454F7F00B4BAE9 /* BidirectionalState.swift */; };
|
||||||
0E245D692135972800B012A2 /* PushTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E245D682135972800B012A2 /* PushTests.swift */; };
|
0E245D692135972800B012A2 /* PushTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E245D682135972800B012A2 /* PushTests.swift */; };
|
||||||
0E245D6C2137F73600B012A2 /* CompressionFramingNative.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */; };
|
0E245D6C2137F73600B012A2 /* CompressionFramingNative.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */; };
|
||||||
0E39BCE8214B2AB60035E9DE /* ControlPacket.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E39BCE6214B2AB60035E9DE /* ControlPacket.h */; };
|
0E39BCE8214B2AB60035E9DE /* ControlPacket.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E39BCE6214B2AB60035E9DE /* ControlPacket.h */; };
|
||||||
@ -195,6 +197,7 @@
|
|||||||
0E1108B51F77B9F900A92462 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
0E1108B51F77B9F900A92462 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
0E1108B71F77B9F900A92462 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
0E1108B71F77B9F900A92462 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
0E12B2A22145341B00B4BAE9 /* PacketTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PacketTests.swift; sourceTree = "<group>"; };
|
0E12B2A22145341B00B4BAE9 /* PacketTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PacketTests.swift; sourceTree = "<group>"; };
|
||||||
|
0E12B2A421454F7F00B4BAE9 /* BidirectionalState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BidirectionalState.swift; sourceTree = "<group>"; };
|
||||||
0E17D7F91F730D9F009EE129 /* TunnelKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TunnelKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
0E17D7F91F730D9F009EE129 /* TunnelKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TunnelKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
0E245D682135972800B012A2 /* PushTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushTests.swift; sourceTree = "<group>"; };
|
0E245D682135972800B012A2 /* PushTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushTests.swift; sourceTree = "<group>"; };
|
||||||
0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressionFramingNative.h; sourceTree = "<group>"; };
|
0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressionFramingNative.h; sourceTree = "<group>"; };
|
||||||
@ -424,6 +427,7 @@
|
|||||||
children = (
|
children = (
|
||||||
0EFEB42E2006D3C800F81029 /* Allocation.h */,
|
0EFEB42E2006D3C800F81029 /* Allocation.h */,
|
||||||
0EFEB4462006D3C800F81029 /* Allocation.m */,
|
0EFEB4462006D3C800F81029 /* Allocation.m */,
|
||||||
|
0E12B2A421454F7F00B4BAE9 /* BidirectionalState.swift */,
|
||||||
0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */,
|
0E245D6B2137F73600B012A2 /* CompressionFramingNative.h */,
|
||||||
0E39BCE6214B2AB60035E9DE /* ControlPacket.h */,
|
0E39BCE6214B2AB60035E9DE /* ControlPacket.h */,
|
||||||
0E39BCE7214B2AB60035E9DE /* ControlPacket.m */,
|
0E39BCE7214B2AB60035E9DE /* ControlPacket.m */,
|
||||||
@ -884,6 +888,7 @@
|
|||||||
0EFEB4782006D3C800F81029 /* TunnelKitProvider+Configuration.swift in Sources */,
|
0EFEB4782006D3C800F81029 /* TunnelKitProvider+Configuration.swift in Sources */,
|
||||||
0E3E0F212108A8CC00B371C1 /* SessionProxy+PushReply.swift in Sources */,
|
0E3E0F212108A8CC00B371C1 /* SessionProxy+PushReply.swift in Sources */,
|
||||||
0EFEB4752006D3C800F81029 /* Errors.m in Sources */,
|
0EFEB4752006D3C800F81029 /* Errors.m in Sources */,
|
||||||
|
0E12B2A521454F7F00B4BAE9 /* BidirectionalState.swift in Sources */,
|
||||||
0EBBF2E52084FE6F00E36B40 /* GenericSocket.swift in Sources */,
|
0EBBF2E52084FE6F00E36B40 /* GenericSocket.swift in Sources */,
|
||||||
0EFEB4762006D3C800F81029 /* DataPath.m in Sources */,
|
0EFEB4762006D3C800F81029 /* DataPath.m in Sources */,
|
||||||
0E0C2127212ED29D008AB282 /* SessionProxy+Configuration.swift in Sources */,
|
0E0C2127212ED29D008AB282 /* SessionProxy+Configuration.swift in Sources */,
|
||||||
@ -936,6 +941,7 @@
|
|||||||
0EFEB4A42006D7F300F81029 /* DataPath.m in Sources */,
|
0EFEB4A42006D7F300F81029 /* DataPath.m in Sources */,
|
||||||
0EBBF2E62084FE6F00E36B40 /* GenericSocket.swift in Sources */,
|
0EBBF2E62084FE6F00E36B40 /* GenericSocket.swift in Sources */,
|
||||||
0E3E0F222108A8CC00B371C1 /* SessionProxy+PushReply.swift in Sources */,
|
0E3E0F222108A8CC00B371C1 /* SessionProxy+PushReply.swift in Sources */,
|
||||||
|
0E12B2A621454F7F00B4BAE9 /* BidirectionalState.swift in Sources */,
|
||||||
0EFEB4912006D7F300F81029 /* TLSBox.m in Sources */,
|
0EFEB4912006D7F300F81029 /* TLSBox.m in Sources */,
|
||||||
0EFEB49D2006D7F300F81029 /* IOInterface.swift in Sources */,
|
0EFEB49D2006D7F300F81029 /* IOInterface.swift in Sources */,
|
||||||
0E0C2128212ED29D008AB282 /* SessionProxy+Configuration.swift in Sources */,
|
0E0C2128212ED29D008AB282 /* SessionProxy+Configuration.swift in Sources */,
|
||||||
|
@ -281,8 +281,8 @@ open class TunnelKitProvider: NEPacketTunnelProvider {
|
|||||||
case .dataCount:
|
case .dataCount:
|
||||||
if let proxy = proxy {
|
if let proxy = proxy {
|
||||||
response = Data()
|
response = Data()
|
||||||
response?.append(UInt64(proxy.bytesIn))
|
response?.append(UInt64(proxy.bytesCount.inbound))
|
||||||
response?.append(UInt64(proxy.bytesOut))
|
response?.append(UInt64(proxy.bytesCount.outbound))
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
65
TunnelKit/Sources/Core/BidirectionalState.swift
Normal file
65
TunnelKit/Sources/Core/BidirectionalState.swift
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// BidirectionalState.swift
|
||||||
|
// TunnelKit
|
||||||
|
//
|
||||||
|
// Created by Davide De Rosa on 9/9/18.
|
||||||
|
// Copyright (c) 2018 Davide De Rosa. All rights reserved.
|
||||||
|
//
|
||||||
|
// https://github.com/keeshux
|
||||||
|
//
|
||||||
|
// This file is part of TunnelKit.
|
||||||
|
//
|
||||||
|
// TunnelKit is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// TunnelKit is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with TunnelKit. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// A generic structure holding a pair of inbound/outbound states.
|
||||||
|
public class BidirectionalState<T> {
|
||||||
|
private let resetValue: T
|
||||||
|
|
||||||
|
/// The inbound state.
|
||||||
|
public var inbound: T
|
||||||
|
|
||||||
|
/// The outbound state.
|
||||||
|
public var outbound: T
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns current state as a pair.
|
||||||
|
|
||||||
|
- Returns: Current state as a pair, inbound first.
|
||||||
|
*/
|
||||||
|
public var pair: (T, T) {
|
||||||
|
return (inbound, outbound)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Inits state with a value that will later be reused by `reset()`.
|
||||||
|
|
||||||
|
- Parameter value: The value to initialize with and reset to.
|
||||||
|
*/
|
||||||
|
public init(withResetValue value: T) {
|
||||||
|
inbound = value
|
||||||
|
outbound = value
|
||||||
|
resetValue = value
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Resets state to the value provided with `init(withResetValue:)`.
|
||||||
|
*/
|
||||||
|
public func reset() {
|
||||||
|
inbound = resetValue
|
||||||
|
outbound = resetValue
|
||||||
|
}
|
||||||
|
}
|
@ -146,9 +146,7 @@ public class SessionProxy {
|
|||||||
|
|
||||||
private var connectedDate: Date?
|
private var connectedDate: Date?
|
||||||
|
|
||||||
private var lastPingOut: Date
|
private var lastPing: BidirectionalState<Date>
|
||||||
|
|
||||||
private var lastPingIn: Date
|
|
||||||
|
|
||||||
private var isStopping: Bool
|
private var isStopping: Bool
|
||||||
|
|
||||||
@ -159,23 +157,17 @@ public class SessionProxy {
|
|||||||
|
|
||||||
private let controlPlainBuffer: ZeroingData
|
private let controlPlainBuffer: ZeroingData
|
||||||
|
|
||||||
private var controlQueueOut: [ControlPacket]
|
private var controlQueue: BidirectionalState<[ControlPacket]>
|
||||||
|
|
||||||
private var controlQueueIn: [ControlPacket]
|
|
||||||
|
|
||||||
private var controlPendingAcks: Set<UInt32>
|
private var controlPendingAcks: Set<UInt32>
|
||||||
|
|
||||||
private var controlPacketIdOut: UInt32
|
private var controlPacketId: BidirectionalState<UInt32>
|
||||||
|
|
||||||
private var controlPacketIdIn: UInt32
|
|
||||||
|
|
||||||
private var authenticator: Authenticator?
|
private var authenticator: Authenticator?
|
||||||
|
|
||||||
// MARK: Data
|
// MARK: Data
|
||||||
|
|
||||||
private(set) var bytesIn: Int
|
private(set) var bytesCount: BidirectionalState<Int>
|
||||||
|
|
||||||
private(set) var bytesOut: Int
|
|
||||||
|
|
||||||
// MARK: Init
|
// MARK: Init
|
||||||
|
|
||||||
@ -192,18 +184,14 @@ public class SessionProxy {
|
|||||||
keys = [:]
|
keys = [:]
|
||||||
oldKeys = []
|
oldKeys = []
|
||||||
negotiationKeyIdx = 0
|
negotiationKeyIdx = 0
|
||||||
lastPingOut = Date.distantPast
|
lastPing = BidirectionalState(withResetValue: Date.distantPast)
|
||||||
lastPingIn = Date.distantPast
|
|
||||||
isStopping = false
|
isStopping = false
|
||||||
|
|
||||||
controlPlainBuffer = Z(count: TLSBoxMaxBufferLength)
|
controlPlainBuffer = Z(count: TLSBoxMaxBufferLength)
|
||||||
controlQueueOut = []
|
controlQueue = BidirectionalState(withResetValue: [])
|
||||||
controlQueueIn = []
|
|
||||||
controlPendingAcks = []
|
controlPendingAcks = []
|
||||||
controlPacketIdOut = 0
|
controlPacketId = BidirectionalState(withResetValue: 0)
|
||||||
controlPacketIdIn = 0
|
bytesCount = BidirectionalState(withResetValue: 0)
|
||||||
bytesIn = 0
|
|
||||||
bytesOut = 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
@ -433,7 +421,7 @@ public class SessionProxy {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
lastPingIn = Date()
|
lastPing.inbound = Date()
|
||||||
|
|
||||||
var dataPacketsByKey = [UInt8: [Data]]()
|
var dataPacketsByKey = [UInt8: [Data]]()
|
||||||
|
|
||||||
@ -545,22 +533,22 @@ public class SessionProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let controlPacket = ControlPacket(code: code, key: key, sessionId: sessionId, packetId: packetId, payload: payload)
|
let controlPacket = ControlPacket(code: code, key: key, sessionId: sessionId, packetId: packetId, payload: payload)
|
||||||
controlQueueIn.append(controlPacket)
|
controlQueue.inbound.append(controlPacket)
|
||||||
controlQueueIn.sort { $0.packetId < $1.packetId }
|
controlQueue.inbound.sort { $0.packetId < $1.packetId }
|
||||||
|
|
||||||
for queuedControlPacket in controlQueueIn {
|
for queuedControlPacket in controlQueue.inbound {
|
||||||
if (queuedControlPacket.packetId < controlPacketIdIn) {
|
if (queuedControlPacket.packetId < controlPacketId.inbound) {
|
||||||
controlQueueIn.removeFirst()
|
controlQueue.inbound.removeFirst()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (queuedControlPacket.packetId != controlPacketIdIn) {
|
if (queuedControlPacket.packetId != controlPacketId.inbound) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
handleControlPacket(queuedControlPacket)
|
handleControlPacket(queuedControlPacket)
|
||||||
|
|
||||||
controlPacketIdIn += 1
|
controlPacketId.inbound += 1
|
||||||
controlQueueIn.removeFirst()
|
controlQueue.inbound.removeFirst()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -580,7 +568,7 @@ public class SessionProxy {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
sendDataPackets(packets)
|
sendDataPackets(packets)
|
||||||
lastPingOut = Date()
|
lastPing.outbound = Date()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ruby: ping
|
// Ruby: ping
|
||||||
@ -590,14 +578,14 @@ public class SessionProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let now = Date()
|
let now = Date()
|
||||||
guard (now.timeIntervalSince(lastPingIn) <= CoreConfiguration.pingTimeout) else {
|
guard (now.timeIntervalSince(lastPing.inbound) <= CoreConfiguration.pingTimeout) else {
|
||||||
deferStop(.shutdown, SessionError.pingTimeout)
|
deferStop(.shutdown, SessionError.pingTimeout)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// postpone ping if elapsed less than keep-alive
|
// postpone ping if elapsed less than keep-alive
|
||||||
if let interval = keepAliveInterval {
|
if let interval = keepAliveInterval {
|
||||||
let elapsed = now.timeIntervalSince(lastPingOut)
|
let elapsed = now.timeIntervalSince(lastPing.outbound)
|
||||||
guard (elapsed >= interval) else {
|
guard (elapsed >= interval) else {
|
||||||
scheduleNextPing(elapsed: elapsed)
|
scheduleNextPing(elapsed: elapsed)
|
||||||
return
|
return
|
||||||
@ -606,7 +594,7 @@ public class SessionProxy {
|
|||||||
|
|
||||||
log.debug("Send ping")
|
log.debug("Send ping")
|
||||||
sendDataPackets([DataPacket.pingString])
|
sendDataPackets([DataPacket.pingString])
|
||||||
lastPingOut = Date()
|
lastPing.outbound = Date()
|
||||||
|
|
||||||
scheduleNextPing()
|
scheduleNextPing()
|
||||||
}
|
}
|
||||||
@ -626,14 +614,11 @@ public class SessionProxy {
|
|||||||
// Ruby: reset_ctrl
|
// Ruby: reset_ctrl
|
||||||
private func resetControlChannel() {
|
private func resetControlChannel() {
|
||||||
controlPlainBuffer.zero()
|
controlPlainBuffer.zero()
|
||||||
controlQueueOut.removeAll()
|
controlQueue.reset()
|
||||||
controlQueueIn.removeAll()
|
|
||||||
controlPendingAcks.removeAll()
|
controlPendingAcks.removeAll()
|
||||||
controlPacketIdOut = 0
|
controlPacketId.reset()
|
||||||
controlPacketIdIn = 0
|
|
||||||
authenticator = nil
|
authenticator = nil
|
||||||
bytesIn = 0
|
bytesCount.reset()
|
||||||
bytesOut = 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ruby: hard_reset
|
// Ruby: hard_reset
|
||||||
@ -942,7 +927,7 @@ public class SessionProxy {
|
|||||||
fatalError("Missing sessionId, do hardReset() first")
|
fatalError("Missing sessionId, do hardReset() first")
|
||||||
}
|
}
|
||||||
|
|
||||||
let oldIdOut = controlPacketIdOut
|
let oldIdOut = controlPacketId.outbound
|
||||||
let maxCount = link.mtu
|
let maxCount = link.mtu
|
||||||
var queuedCount = 0
|
var queuedCount = 0
|
||||||
var offset = 0
|
var offset = 0
|
||||||
@ -950,19 +935,19 @@ public class SessionProxy {
|
|||||||
repeat {
|
repeat {
|
||||||
let subPayloadLength = min(maxCount, payload.count - offset)
|
let subPayloadLength = min(maxCount, payload.count - offset)
|
||||||
let subPayloadData = payload.subdata(offset: offset, count: subPayloadLength)
|
let subPayloadData = payload.subdata(offset: offset, count: subPayloadLength)
|
||||||
let packet = ControlPacket(code: code, key: key, sessionId: sessionId, packetId: controlPacketIdOut, payload: subPayloadData)
|
let packet = ControlPacket(code: code, key: key, sessionId: sessionId, packetId: controlPacketId.outbound, payload: subPayloadData)
|
||||||
|
|
||||||
controlQueueOut.append(packet)
|
controlQueue.outbound.append(packet)
|
||||||
controlPacketIdOut += 1
|
controlPacketId.outbound += 1
|
||||||
offset += maxCount
|
offset += maxCount
|
||||||
queuedCount += subPayloadLength
|
queuedCount += subPayloadLength
|
||||||
} while (offset < payload.count)
|
} while (offset < payload.count)
|
||||||
|
|
||||||
assert(queuedCount == payload.count)
|
assert(queuedCount == payload.count)
|
||||||
|
|
||||||
let packetCount = controlPacketIdOut - oldIdOut
|
let packetCount = controlPacketId.outbound - oldIdOut
|
||||||
if (packetCount > 1) {
|
if (packetCount > 1) {
|
||||||
log.debug("Enqueued \(packetCount) control packets [\(oldIdOut)-\(controlPacketIdOut - 1)]")
|
log.debug("Enqueued \(packetCount) control packets [\(oldIdOut)-\(controlPacketId.outbound - 1)]")
|
||||||
} else {
|
} else {
|
||||||
log.debug("Enqueued 1 control packet [\(oldIdOut)]")
|
log.debug("Enqueued 1 control packet [\(oldIdOut)]")
|
||||||
}
|
}
|
||||||
@ -972,7 +957,7 @@ public class SessionProxy {
|
|||||||
|
|
||||||
// Ruby: flush_ctrl_q_out
|
// Ruby: flush_ctrl_q_out
|
||||||
private func flushControlQueue() {
|
private func flushControlQueue() {
|
||||||
for controlPacket in controlQueueOut {
|
for controlPacket in controlQueue.outbound {
|
||||||
if let sentDate = controlPacket.sentDate {
|
if let sentDate = controlPacket.sentDate {
|
||||||
let timeAgo = -sentDate.timeIntervalSinceNow
|
let timeAgo = -sentDate.timeIntervalSinceNow
|
||||||
guard (timeAgo >= CoreConfiguration.retransmissionLimit) else {
|
guard (timeAgo >= CoreConfiguration.retransmissionLimit) else {
|
||||||
@ -1083,7 +1068,7 @@ public class SessionProxy {
|
|||||||
|
|
||||||
// Ruby: handle_data_pkt
|
// Ruby: handle_data_pkt
|
||||||
private func handleDataPackets(_ packets: [Data], key: SessionKey) {
|
private func handleDataPackets(_ packets: [Data], key: SessionKey) {
|
||||||
bytesIn += packets.flatCount
|
bytesCount.inbound += packets.flatCount
|
||||||
do {
|
do {
|
||||||
guard let decryptedPackets = try key.decrypt(packets: packets) else {
|
guard let decryptedPackets = try key.decrypt(packets: packets) else {
|
||||||
log.warning("Could not decrypt packets, is SessionKey properly configured (dataPath, peerId)?")
|
log.warning("Could not decrypt packets, is SessionKey properly configured (dataPath, peerId)?")
|
||||||
@ -1118,7 +1103,7 @@ public class SessionProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WARNING: runs in Network.framework queue
|
// WARNING: runs in Network.framework queue
|
||||||
bytesOut += encryptedPackets.flatCount
|
bytesCount.outbound += encryptedPackets.flatCount
|
||||||
link?.writePackets(encryptedPackets) { [weak self] (error) in
|
link?.writePackets(encryptedPackets) { [weak self] (error) in
|
||||||
if let error = error {
|
if let error = error {
|
||||||
self?.queue.sync {
|
self?.queue.sync {
|
||||||
@ -1151,9 +1136,9 @@ public class SessionProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// drop queued out packets if ack-ed
|
// drop queued out packets if ack-ed
|
||||||
for (i, controlPacket) in controlQueueOut.enumerated() {
|
for (i, controlPacket) in controlQueue.outbound.enumerated() {
|
||||||
if packetIds.contains(controlPacket.packetId) {
|
if packetIds.contains(controlPacket.packetId) {
|
||||||
controlQueueOut.remove(at: i)
|
controlQueue.outbound.remove(at: i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user