fix PacketOutboundActor
This commit is contained in:
parent
8183e3b3bf
commit
eb2896fad6
@ -228,6 +228,8 @@ actor SDLContextActor {
|
||||
|
||||
let superService = self.superService
|
||||
let udpHoleService = self.udpHoleService
|
||||
let packetOutboundActor = self.packetOutboundActor
|
||||
let readySignal = self.readySignal
|
||||
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
defer {
|
||||
@ -246,6 +248,11 @@ actor SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
group.addTask(priority: .high) {
|
||||
_ = try await readySignal.wait()
|
||||
try await packetOutboundActor.runPacketReader()
|
||||
}
|
||||
|
||||
try await group.waitForAll()
|
||||
}
|
||||
}
|
||||
@ -283,7 +290,6 @@ actor SDLContextActor {
|
||||
self.updatePolicyWorker = nil
|
||||
await self.policyService.clear()
|
||||
|
||||
await self.packetOutboundActor.stop()
|
||||
await self.udpHoleService.stop()
|
||||
|
||||
let dnsService = self.dnsService
|
||||
@ -434,7 +440,6 @@ extension SDLContextActor {
|
||||
do {
|
||||
try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer)
|
||||
SDLLogger.log("[SDLContext] setNetworkSettings successed")
|
||||
await self.packetOutboundActor.startPacketReader()
|
||||
// 开启权限的定时更新
|
||||
await self.whenRegistedSuper()
|
||||
await self.readySignal.succeed(())
|
||||
|
||||
@ -26,8 +26,6 @@ actor PacketOutboundActor {
|
||||
private let superService: SDLSuperService
|
||||
private let udpHoleService: SDLUDPHoleService
|
||||
private let flowTracer: SDLFlowTracer
|
||||
private var packetReaderTask: Task<Void, Never>?
|
||||
private var packetReaderGeneration: UInt64 = 0
|
||||
|
||||
private var networkAddress: SDLConfiguration.NetworkAddress
|
||||
private var identityId: UInt32
|
||||
@ -73,48 +71,26 @@ actor PacketOutboundActor {
|
||||
self.dnsService = dnsService
|
||||
}
|
||||
|
||||
func startPacketReader() async {
|
||||
guard self.packetReaderTask == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
self.packetReaderGeneration &+= 1
|
||||
|
||||
func runPacketReader() async throws {
|
||||
let provider = self.provider
|
||||
let generation = self.packetReaderGeneration
|
||||
|
||||
self.packetReaderTask = Task(priority: .high) { [weak self] in
|
||||
while !Task.isCancelled {
|
||||
guard let batch = await Self.readPackets(from: provider) else {
|
||||
break
|
||||
}
|
||||
|
||||
if Task.isCancelled {
|
||||
break
|
||||
}
|
||||
|
||||
for (data, number) in zip(batch.packets, batch.protocols) where number.int32Value == 2 {
|
||||
if Task.isCancelled {
|
||||
break
|
||||
}
|
||||
|
||||
if let packet = IPPacketView(data) {
|
||||
await self?.handleTunPacket(packet)
|
||||
}
|
||||
}
|
||||
while !Task.isCancelled {
|
||||
guard let batch = await Self.readPackets(from: provider) else {
|
||||
break
|
||||
}
|
||||
|
||||
await self?.finishPacketReader(generation: generation)
|
||||
SDLLogger.log("[PacketOutboundActor] packet reader task finished")
|
||||
try Task.checkCancellation()
|
||||
|
||||
for (data, number) in zip(batch.packets, batch.protocols) where number.int32Value == 2 {
|
||||
try Task.checkCancellation()
|
||||
|
||||
if let packet = IPPacketView(data) {
|
||||
await self.handleTunPacket(packet)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func stop() {
|
||||
self.packetReaderGeneration &+= 1
|
||||
|
||||
let packetReaderTask = self.packetReaderTask
|
||||
self.packetReaderTask = nil
|
||||
packetReaderTask?.cancel()
|
||||
SDLLogger.log("[PacketOutboundActor] packet reader task finished")
|
||||
}
|
||||
|
||||
func handleTunPacket(_ packet: IPPacketView) async {
|
||||
@ -190,14 +166,6 @@ actor PacketOutboundActor {
|
||||
return true
|
||||
}
|
||||
|
||||
private func finishPacketReader(generation: UInt64) {
|
||||
guard generation == self.packetReaderGeneration else {
|
||||
return
|
||||
}
|
||||
|
||||
self.packetReaderTask = nil
|
||||
}
|
||||
|
||||
private static func readPackets(from provider: NEPacketTunnelProvider) async -> PacketReadResult {
|
||||
let readContinuation = OnceContinuation<PacketReadResult, Never>()
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user