解决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) await self.identifyStore.applyPolicyResponse(policyResponse)
case .arpResponse(let arpResponse): case .arpResponse(let arpResponse):
SDLLogger.shared.log("[SDLContext] get arp response: \(arpResponse)")
self.arpServer.handleArpResponse(arpResponse: arpResponse) self.arpServer.handleArpResponse(arpResponse: arpResponse)
} }
} }
@ -623,8 +624,10 @@ actor SDLContextActor {
} }
let (packets, numbers) = await self.provider.packetFlow.readPackets() 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 { for (data, number) in zip(packets, numbers) where number == 2 {
if let ipPacket = IPPacket(data) { if let ipPacket = IPPacket(data) {
SDLLogger.shared.log("[SDLContext] deal tun packet 11", level: .debug)
await self.dealTunPacket(packet: ipPacket) await self.dealTunPacket(packet: ipPacket)
} }
} }
@ -638,6 +641,7 @@ actor SDLContextActor {
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) { if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
self.dnsClient?.forward(ipPacket: packet) self.dnsClient?.forward(ipPacket: packet)
SDLLogger.shared.log("[SDLContext] deal tun packet 22", level: .debug)
return return
} }
@ -646,6 +650,7 @@ actor SDLContextActor {
if dstIp == networkAddr.ip { if dstIp == networkAddr.ip {
let nePacket = NEPacket(data: packet.data, protocolFamily: 2) let nePacket = NEPacket(data: packet.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([nePacket]) self.provider.packetFlow.writePacketObjects([nePacket])
SDLLogger.shared.log("[SDLContext] deal tun packet 33", level: .debug)
return return
} }
@ -656,8 +661,10 @@ actor SDLContextActor {
SDLLogger.shared.log("[SDLContext] flow_session: \(flowSession)", level: .debug) SDLLogger.shared.log("[SDLContext] flow_session: \(flowSession)", level: .debug)
} }
SDLLogger.shared.log("[SDLContext] deal tun packet 44", level: .debug)
// arpmac // arpmac
if let dstMac = self.arpServer.query(ip: dstIp) { 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) await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
} }
else { else {
@ -703,6 +710,7 @@ actor SDLContextActor {
else { else {
// super_node // super_node
udpHole.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress) 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) self.flowTracer.inc(num: data.count, type: .forward)

View File

@ -66,48 +66,41 @@ final class ArpServer {
defer { defer {
locker.unlock() locker.unlock()
} }
self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) } self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) }
} }
func clear() { func clear() {
locker.lock() locker.lock()
defer {
locker.unlock()
}
self.known_macs = [:] self.known_macs = [:]
locker.unlock()
} }
func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws { func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws {
locker.lock()
defer {
locker.unlock()
}
guard let quicClient else { guard let quicClient else {
return return
} }
locker.lock()
let pktID = self.packetId
self.packetId += 1
locker.unlock()
// arp // arp
var arpRequest = SDLArpRequest() var arpRequest = SDLArpRequest()
arpRequest.targetIp = targetIp arpRequest.targetIp = targetIp
arpRequest.pktID = self.packetId arpRequest.pktID = pktID
self.packetId += 1
quicClient.send(type: .arpRequest, data: try arpRequest.serializedData()) quicClient.send(type: .arpRequest, data: try arpRequest.serializedData())
} }
func handleArpResponse(arpResponse: SDLArpResponse) { func handleArpResponse(arpResponse: SDLArpResponse) {
locker.lock()
defer {
locker.unlock()
}
let targetIp = arpResponse.targetIp let targetIp = arpResponse.targetIp
let targetMac = arpResponse.targetMac let targetMac = arpResponse.targetMac
if !targetMac.isEmpty { 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()
} }
} }