解决NSLock的死锁问题

This commit is contained in:
anlicheng 2026-03-11 16:30:25 +08:00
parent bbccd4623c
commit 5c45362476
2 changed files with 19 additions and 18 deletions

View File

@ -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)
// arpmac
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)

View File

@ -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()
}
}