fix PacketOutboundActor

This commit is contained in:
anlicheng 2026-05-27 15:29:20 +08:00
parent 8183e3b3bf
commit eb2896fad6
2 changed files with 21 additions and 48 deletions

View File

@ -228,6 +228,8 @@ actor SDLContextActor {
let superService = self.superService let superService = self.superService
let udpHoleService = self.udpHoleService let udpHoleService = self.udpHoleService
let packetOutboundActor = self.packetOutboundActor
let readySignal = self.readySignal
try await withThrowingTaskGroup(of: Void.self) { group in try await withThrowingTaskGroup(of: Void.self) { group in
defer { defer {
@ -246,6 +248,11 @@ actor SDLContextActor {
} }
} }
group.addTask(priority: .high) {
_ = try await readySignal.wait()
try await packetOutboundActor.runPacketReader()
}
try await group.waitForAll() try await group.waitForAll()
} }
} }
@ -283,7 +290,6 @@ actor SDLContextActor {
self.updatePolicyWorker = nil self.updatePolicyWorker = nil
await self.policyService.clear() await self.policyService.clear()
await self.packetOutboundActor.stop()
await self.udpHoleService.stop() await self.udpHoleService.stop()
let dnsService = self.dnsService let dnsService = self.dnsService
@ -434,7 +440,6 @@ extension SDLContextActor {
do { do {
try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer) try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer)
SDLLogger.log("[SDLContext] setNetworkSettings successed") SDLLogger.log("[SDLContext] setNetworkSettings successed")
await self.packetOutboundActor.startPacketReader()
// //
await self.whenRegistedSuper() await self.whenRegistedSuper()
await self.readySignal.succeed(()) await self.readySignal.succeed(())

View File

@ -26,8 +26,6 @@ actor PacketOutboundActor {
private let superService: SDLSuperService private let superService: SDLSuperService
private let udpHoleService: SDLUDPHoleService private let udpHoleService: SDLUDPHoleService
private let flowTracer: SDLFlowTracer private let flowTracer: SDLFlowTracer
private var packetReaderTask: Task<Void, Never>?
private var packetReaderGeneration: UInt64 = 0
private var networkAddress: SDLConfiguration.NetworkAddress private var networkAddress: SDLConfiguration.NetworkAddress
private var identityId: UInt32 private var identityId: UInt32
@ -73,48 +71,26 @@ actor PacketOutboundActor {
self.dnsService = dnsService self.dnsService = dnsService
} }
func startPacketReader() async { func runPacketReader() async throws {
guard self.packetReaderTask == nil else {
return
}
self.packetReaderGeneration &+= 1
let provider = self.provider let provider = self.provider
let generation = self.packetReaderGeneration
self.packetReaderTask = Task(priority: .high) { [weak self] in while !Task.isCancelled {
while !Task.isCancelled { guard let batch = await Self.readPackets(from: provider) else {
guard let batch = await Self.readPackets(from: provider) else { break
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)
}
}
} }
await self?.finishPacketReader(generation: generation) try Task.checkCancellation()
SDLLogger.log("[PacketOutboundActor] packet reader task finished")
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() { SDLLogger.log("[PacketOutboundActor] packet reader task finished")
self.packetReaderGeneration &+= 1
let packetReaderTask = self.packetReaderTask
self.packetReaderTask = nil
packetReaderTask?.cancel()
} }
func handleTunPacket(_ packet: IPPacketView) async { func handleTunPacket(_ packet: IPPacketView) async {
@ -190,14 +166,6 @@ actor PacketOutboundActor {
return true 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 { private static func readPackets(from provider: NEPacketTunnelProvider) async -> PacketReadResult {
let readContinuation = OnceContinuation<PacketReadResult, Never>() let readContinuation = OnceContinuation<PacketReadResult, Never>()