fix context

This commit is contained in:
anlicheng 2025-08-01 23:37:19 +08:00
parent 29b9bebe87
commit 0fe9b43c08

View File

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