diff --git a/Tun/Punchnet/Context/PacketOutboundActor.swift b/Tun/Punchnet/Context/PacketOutboundActor.swift index a7d2033..7d1f558 100644 --- a/Tun/Punchnet/Context/PacketOutboundActor.swift +++ b/Tun/Punchnet/Context/PacketOutboundActor.swift @@ -18,6 +18,7 @@ actor PacketOutboundActor { private let superServiceProxy: SDLSuperServiceProxy private let udpHoleServiceProxy: SDLUDPHoleServiceProxy private let flowTracer: SDLFlowTracer + private var packetReaderService: SDLPacketReaderService? private var networkAddress: SDLConfiguration.NetworkAddress private var identityId: UInt32 @@ -63,6 +64,22 @@ actor PacketOutboundActor { self.dnsService = dnsService } + func startPacketReader() async { + if self.packetReaderService == nil { + self.packetReaderService = SDLPacketReaderService(provider: self.provider) { [weak self] event in + await self?.handlePacketReaderEvent(event) + } + } + + await self.packetReaderService?.start() + } + + func stop() async { + let packetReaderService = self.packetReaderService + self.packetReaderService = nil + await packetReaderService?.stop() + } + func handleTunPacket(_ packet: IPPacket) async { let router = SDLTunPacketRouter(networkAddress: self.networkAddress, exitNode: self.exitNode) let decision = router.route(packet: packet) @@ -74,6 +91,13 @@ actor PacketOutboundActor { await self.handleTunRouteDecision(decision) } + private func handlePacketReaderEvent(_ event: SDLPacketReaderService.Event) async { + switch event { + case .packet(let packet): + await self.handleTunPacket(packet) + } + } + func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async { let forwarder = self.makeLayerPacketForwarder() guard let plan = try? await forwarder.makeDeliveryPlan(dstMac: dstMac, type: type, data: data) else { diff --git a/Tun/Punchnet/Context/SDLContextActor.swift b/Tun/Punchnet/Context/SDLContextActor.swift index 0512a75..efdb245 100644 --- a/Tun/Punchnet/Context/SDLContextActor.swift +++ b/Tun/Punchnet/Context/SDLContextActor.swift @@ -64,7 +64,6 @@ actor SDLContextActor { nonisolated let rsaCipher: RSACipher private var dnsService: SDLDNSService? - private var packetReaderService: SDLPacketReaderService? private let superServiceProxy: SDLSuperServiceProxy private let udpHoleServiceProxy: SDLUDPHoleServiceProxy private let packetOutboundActor: PacketOutboundActor @@ -175,9 +174,7 @@ actor SDLContextActor { self.updatePolicyTask = nil await self.policyService.clear() - let packetReaderService = self.packetReaderService - self.packetReaderService = nil - await packetReaderService?.stop() + await self.packetOutboundActor.stop() await self.udpHoleServiceProxy.stop() @@ -323,7 +320,7 @@ extension SDLContextActor { do { try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer) SDLLogger.log("[SDLContext] setNetworkSettings successed") - await self.startPacketReader() + await self.packetOutboundActor.startPacketReader() // 开启权限的定时更新 await self.whenRegistedSuper() } catch let err { @@ -601,23 +598,6 @@ extension SDLContextActor { // MARK: NEPacketTunnelProvider相关的逻辑 extension SDLContextActor { - // 开始读取数据, 用单独的线程处理packetFlow - private func startPacketReader() async { - if self.packetReaderService == nil { - self.packetReaderService = SDLPacketReaderService(provider: self.provider) { [weak self] event in - await self?.handlePacketReaderEvent(event) - } - } - await self.packetReaderService?.start() - } - - private func handlePacketReaderEvent(_ event: SDLPacketReaderService.Event) async { - switch event { - case .packet(let packet): - await self.packetOutboundActor.handleTunPacket(packet) - } - } - // 取消出口节点的时候,ip地址为: 0.0.0.0 public func updateExitNode(exitNodeIp: String) async throws { if let ip = SDLUtil.ipv4StrToInt32(exitNodeIp), ip > 0 {