From 195724a222df252c19795d8b92b41f2c3c8cb83d Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 10 Mar 2026 18:06:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/Actors/SDLContextActor.swift | 19 ++++----- .../ArpServerActor.swift => ArpServer.swift} | 39 ++++++++++++++++++- 2 files changed, 46 insertions(+), 12 deletions(-) rename Tun/Punchnet/{Actors/ArpServerActor.swift => ArpServer.swift} (74%) diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 16e926f..0fa7ffe 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -55,8 +55,8 @@ actor SDLContextActor { // 数据包读取任务 private var readTask: Task<(), Never>? - private var sessionManager: SessionManager - private var arpServer: ArpServerActor + nonisolated private let sessionManager = SessionManager() + nonisolated private let arpServer = ArpServer() // 网络状态变化的健康 private var monitor: SDLNetworkMonitor? @@ -71,7 +71,7 @@ actor SDLContextActor { // 处理内部的需要长时间运行的任务 private var supervisor = SDLSupervisor() - private let provider: NEPacketTunnelProvider + nonisolated private let provider: NEPacketTunnelProvider // 处理权限控制 private let identifyStore: IdentityStore @@ -90,9 +90,6 @@ actor SDLContextActor { self.rsaCipher = rsaCipher self.aesCipher = aesCipher - self.sessionManager = SessionManager() - self.arpServer = ArpServerActor() - self.puncherActor = SDLPuncherActor() self.proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray) @@ -170,7 +167,7 @@ actor SDLContextActor { // 处理权限的请求问题 await self.identifyStore.applyPolicyResponse(policyResponse) case .arpResponse(let arpResponse): - await self.arpServer.handleArpResponse(arpResponse: arpResponse) + self.arpServer.handleArpResponse(arpResponse: arpResponse) } } } @@ -534,7 +531,7 @@ actor SDLContextActor { await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal()) case .response: SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug) - await self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC) + self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC) } } else { SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug) @@ -655,7 +652,7 @@ actor SDLContextActor { } // 查找arp缓存中是否有目标mac地址 - if let dstMac = await self.arpServer.query(ip: dstIp) { + if let dstMac = self.arpServer.query(ip: dstIp) { await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) } else { @@ -664,7 +661,7 @@ actor SDLContextActor { // let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp) // await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal()) - try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient) + try? self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient) } } @@ -693,7 +690,7 @@ actor SDLContextActor { } else { // 通过session发送到对端 - if let session = await self.sessionManager.getSession(toAddress: dstMac) { + if let session = self.sessionManager.getSession(toAddress: dstMac) { SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug) udpHole.send(type: .data, data: data, remoteAddress: session.natAddress) self.flowTracer.inc(num: data.count, type: .p2p) diff --git a/Tun/Punchnet/Actors/ArpServerActor.swift b/Tun/Punchnet/ArpServer.swift similarity index 74% rename from Tun/Punchnet/Actors/ArpServerActor.swift rename to Tun/Punchnet/ArpServer.swift index 745b8f9..5ac6d73 100644 --- a/Tun/Punchnet/Actors/ArpServerActor.swift +++ b/Tun/Punchnet/ArpServer.swift @@ -7,13 +7,15 @@ import Foundation import Darwin -actor ArpServerActor { +final class ArpServer { // 增加缓存时间逻辑 struct ArpEntry { var mac: Data var expireTime: TimeInterval } + private let locker = NSLock() + private var packetId: UInt32 = 1 private var known_macs: [UInt32: ArpEntry] = [:] private let arpTTL: TimeInterval @@ -23,6 +25,11 @@ actor ArpServerActor { } func query(ip: UInt32) -> Data? { + locker.lock() + defer { + locker.unlock() + } + guard let entry = known_macs[ip] else { return nil } @@ -36,23 +43,48 @@ actor ArpServerActor { } func append(ip: UInt32, mac: Data) { + locker.lock() + defer { + locker.unlock() + } + let expireAt = Date().timeIntervalSince1970 + arpTTL self.known_macs[ip] = ArpEntry(mac: mac, expireTime: expireAt) } func remove(ip: UInt32) { + locker.lock() + defer { + locker.unlock() + } + self.known_macs.removeValue(forKey: ip) } func dropMacs(macs: [Data]) { + locker.lock() + defer { + locker.unlock() + } + self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) } } func clear() { + locker.lock() + defer { + locker.unlock() + } + self.known_macs = [:] } func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws { + locker.lock() + defer { + locker.unlock() + } + guard let quicClient else { return } @@ -67,6 +99,11 @@ actor ArpServerActor { } func handleArpResponse(arpResponse: SDLArpResponse) { + locker.lock() + defer { + locker.unlock() + } + let targetIp = arpResponse.targetIp let targetMac = arpResponse.targetMac if !targetMac.isEmpty {