From eb2896fad6684eadf2ee196c39df7af3d1d62250 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 27 May 2026 15:29:20 +0800 Subject: [PATCH] fix PacketOutboundActor --- Tun/Context/SDLContextActor.swift | 9 +++- Tun/Outbound/PacketOutboundActor.swift | 60 ++++++-------------------- 2 files changed, 21 insertions(+), 48 deletions(-) diff --git a/Tun/Context/SDLContextActor.swift b/Tun/Context/SDLContextActor.swift index b3b8268..02f8599 100644 --- a/Tun/Context/SDLContextActor.swift +++ b/Tun/Context/SDLContextActor.swift @@ -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(()) diff --git a/Tun/Outbound/PacketOutboundActor.swift b/Tun/Outbound/PacketOutboundActor.swift index 4ca2191..fdd28c8 100644 --- a/Tun/Outbound/PacketOutboundActor.swift +++ b/Tun/Outbound/PacketOutboundActor.swift @@ -26,8 +26,6 @@ actor PacketOutboundActor { private let superService: SDLSuperService private let udpHoleService: SDLUDPHoleService private let flowTracer: SDLFlowTracer - private var packetReaderTask: Task? - 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()