fix context
This commit is contained in:
parent
29b9bebe87
commit
0fe9b43c08
@ -78,6 +78,7 @@ public class SDLContext: @unchecked Sendable {
|
|||||||
// 处理holer
|
// 处理holer
|
||||||
private var holerPublishers: [Data:PassthroughSubject<RegisterRequest, Never>] = [:]
|
private var holerPublishers: [Data:PassthroughSubject<RegisterRequest, Never>] = [:]
|
||||||
private var bag = Set<AnyCancellable>()
|
private var bag = Set<AnyCancellable>()
|
||||||
|
private var locker = NSLock()
|
||||||
|
|
||||||
struct RegisterRequest {
|
struct RegisterRequest {
|
||||||
let srcMac: Data
|
let srcMac: Data
|
||||||
@ -492,7 +493,7 @@ public class SDLContext: @unchecked Sendable {
|
|||||||
else {
|
else {
|
||||||
// 构造arp请求
|
// 构造arp请求
|
||||||
let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
|
let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
|
||||||
let arpReqeust: ARPPacket = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
||||||
await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal())
|
await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal())
|
||||||
|
|
||||||
NSLog("[SDLContext] dstIp: \(dstIp) arp query not found")
|
NSLog("[SDLContext] dstIp: \(dstIp) arp query not found")
|
||||||
@ -528,19 +529,26 @@ public class SDLContext: @unchecked Sendable {
|
|||||||
|
|
||||||
// 尝试打洞
|
// 尝试打洞
|
||||||
let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID)
|
let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID)
|
||||||
self.submitRegisterRequest(dstMac: dstMac, request: registerRequest)
|
self.submitRegisterRequest(request: registerRequest)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func submitRegisterRequest(dstMac: Data, request: RegisterRequest) {
|
private func submitRegisterRequest(request: RegisterRequest) {
|
||||||
|
self.locker.lock()
|
||||||
|
defer {
|
||||||
|
self.locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
let dstMac = request.dstMac
|
||||||
if let publisher = self.holerPublishers[dstMac] {
|
if let publisher = self.holerPublishers[dstMac] {
|
||||||
publisher.send(request)
|
publisher.send(request)
|
||||||
} else {
|
} else {
|
||||||
let publisher = PassthroughSubject<RegisterRequest, Never>()
|
let publisher = PassthroughSubject<RegisterRequest, Never>()
|
||||||
publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global())
|
publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global())
|
||||||
.sink { request in
|
.sink { request in
|
||||||
self.tryHole(request: request)
|
Task {
|
||||||
|
await self.tryHole(request: request)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.store(in: &self.bag)
|
.store(in: &self.bag)
|
||||||
|
|
||||||
@ -548,26 +556,24 @@ public class SDLContext: @unchecked Sendable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func tryHole(request: RegisterRequest) {
|
private func tryHole(request: RegisterRequest) async {
|
||||||
Task {
|
guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else {
|
||||||
guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else {
|
return
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
switch message.packet {
|
||||||
switch message.packet {
|
case .empty:
|
||||||
case .empty:
|
SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
|
||||||
SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
|
case .peerInfo(let peerInfo):
|
||||||
case .peerInfo(let peerInfo):
|
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
||||||
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning)
|
||||||
SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning)
|
// 发送register包
|
||||||
// 发送register包
|
await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac)
|
||||||
await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac)
|
} else {
|
||||||
} else {
|
SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||||
SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
|
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user