From 5c45362476cc3b64a1e91f26c6aa64d6088f03d2 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 11 Mar 2026 16:30:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3NSLock=E7=9A=84=E6=AD=BB?= =?UTF-8?q?=E9=94=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/Actors/SDLContextActor.swift | 8 +++++++ Tun/Punchnet/ArpServer.swift | 29 +++++++++-------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 02eae84..22f09b7 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -171,6 +171,7 @@ actor SDLContextActor { // 处理权限的请求问题 await self.identifyStore.applyPolicyResponse(policyResponse) case .arpResponse(let arpResponse): + SDLLogger.shared.log("[SDLContext] get arp response: \(arpResponse)") self.arpServer.handleArpResponse(arpResponse: arpResponse) } } @@ -623,8 +624,10 @@ actor SDLContextActor { } let (packets, numbers) = await self.provider.packetFlow.readPackets() + SDLLogger.shared.log("[SDLContext] deal tun packet 00", level: .debug) for (data, number) in zip(packets, numbers) where number == 2 { if let ipPacket = IPPacket(data) { + SDLLogger.shared.log("[SDLContext] deal tun packet 11", level: .debug) await self.dealTunPacket(packet: ipPacket) } } @@ -638,6 +641,7 @@ actor SDLContextActor { if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) { self.dnsClient?.forward(ipPacket: packet) + SDLLogger.shared.log("[SDLContext] deal tun packet 22", level: .debug) return } @@ -646,6 +650,7 @@ actor SDLContextActor { if dstIp == networkAddr.ip { let nePacket = NEPacket(data: packet.data, protocolFamily: 2) self.provider.packetFlow.writePacketObjects([nePacket]) + SDLLogger.shared.log("[SDLContext] deal tun packet 33", level: .debug) return } @@ -656,8 +661,10 @@ actor SDLContextActor { SDLLogger.shared.log("[SDLContext] flow_session: \(flowSession)", level: .debug) } + SDLLogger.shared.log("[SDLContext] deal tun packet 44", level: .debug) // 查找arp缓存中是否有目标mac地址 if let dstMac = self.arpServer.query(ip: dstIp) { + SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", level: .debug) await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) } else { @@ -703,6 +710,7 @@ actor SDLContextActor { else { // 通过super_node进行转发 udpHole.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress) + SDLLogger.shared.log("[SDLContext] send packet by super: \(self.config.stunSocketAddress)", level: .debug) // 流量统计 self.flowTracer.inc(num: data.count, type: .forward) diff --git a/Tun/Punchnet/ArpServer.swift b/Tun/Punchnet/ArpServer.swift index 5ac6d73..2334f06 100644 --- a/Tun/Punchnet/ArpServer.swift +++ b/Tun/Punchnet/ArpServer.swift @@ -66,48 +66,41 @@ final class ArpServer { 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 = [:] + locker.unlock() } func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws { - locker.lock() - defer { - locker.unlock() - } - guard let quicClient else { return } + locker.lock() + let pktID = self.packetId + self.packetId += 1 + locker.unlock() + // 进行arp查询 var arpRequest = SDLArpRequest() arpRequest.targetIp = targetIp - arpRequest.pktID = self.packetId - self.packetId += 1 + arpRequest.pktID = pktID quicClient.send(type: .arpRequest, data: try arpRequest.serializedData()) } func handleArpResponse(arpResponse: SDLArpResponse) { - locker.lock() - defer { - locker.unlock() - } - let targetIp = arpResponse.targetIp let targetMac = arpResponse.targetMac if !targetMac.isEmpty { - self.append(ip: targetIp, mac: targetMac) + let expireAt = Date().timeIntervalSince1970 + arpTTL + locker.lock() + self.known_macs[targetIp] = ArpEntry(mac: targetMac, expireTime: expireAt) + locker.unlock() } }