解决NSLock的死锁问题
This commit is contained in:
parent
bbccd4623c
commit
5c45362476
@ -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)
|
||||||
// 查找arp缓存中是否有目标mac地址
|
// 查找arp缓存中是否有目标mac地址
|
||||||
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)
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user