解决NSLock的死锁问题
This commit is contained in:
parent
bbccd4623c
commit
5c45362476
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user