This commit is contained in:
anlicheng 2026-01-27 23:47:46 +08:00
parent fe680b31b2
commit cd4c977b83
2 changed files with 46 additions and 29 deletions

View File

@ -6,6 +6,7 @@
//
import Foundation
import NIOCore
actor SDLPuncherActor {
// dstMac
@ -14,8 +15,13 @@ actor SDLPuncherActor {
private var udpHoleActor: SDLUDPHoleActor?
private var pktId: UInt32 = 1
//
private var pendingRequests: [UInt32:RegisterRequest] = [:]
// holer
private var logger: SDLLogger
private var querySocketAddress: SocketAddress
struct RegisterRequest {
let srcMac: Data
@ -23,7 +29,8 @@ actor SDLPuncherActor {
let networkId: UInt32
}
init(logger: SDLLogger) {
init(querySocketAddress: SocketAddress, logger: SDLLogger) {
self.querySocketAddress = querySocketAddress
self.logger = logger
}
@ -41,11 +48,35 @@ actor SDLPuncherActor {
//
coolingDown.insert(dstMac)
let pktId = self.pktId
self.pktId &+= 1
if self.pktId == 0 {
self.pktId = 1
}
Task {
await self.tryHole(request: request)
await self.tryHole(pktId: pktId, request: request)
//
try? await Task.sleep(for: .seconds(5))
self.endCooldown(for: dstMac)
self.removePendingRequest(for: pktId)
}
}
func handlePeerInfo(peerInfo: SDLPeerInfo) async {
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
if let remoteAddress = peerInfo.v4Info.socketAddress() {
self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
// register
var register = SDLRegister()
register.networkID = request.networkId
register.srcMac = request.srcMac
register.dstMac = request.dstMac
await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
} else {
self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
}
}
}
@ -53,32 +84,18 @@ actor SDLPuncherActor {
self.coolingDown.remove(key)
}
private func tryHole(request: RegisterRequest) async {
// var queryInfo = SDLQueryInfo()
// queryInfo.dstMac = request.dstMac
// guard let message = try? await self.superClientActor?.request(type: .queryInfo, data: try queryInfo.serializedData()) else {
// return
// }
//
// switch message.packet {
// case .empty:
// self.logger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
// case .peerInfo(let peerInfo):
// if let remoteAddress = peerInfo.v4Info.socketAddress() {
// self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
// // register
// var register = SDLRegister()
// register.networkID = request.networkId
// register.srcMac = request.srcMac
// register.dstMac = request.dstMac
//
// await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
// } else {
// self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
// }
// default:
// self.logger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
// }
private func removePendingRequest(for pktId: UInt32) {
self.pendingRequests.removeValue(forKey: pktId)
}
private func tryHole(pktId: UInt32, request: RegisterRequest) async {
var queryInfo = SDLQueryInfo()
queryInfo.pktID = pktId
queryInfo.dstMac = request.dstMac
self.pendingRequests[pktId] = request
if let queryData = try? queryInfo.serializedData() {
await self.udpHoleActor?.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
}
}
}

View File

@ -83,7 +83,7 @@ public class SDLContext {
self.sessionManager = SessionManager()
self.arpServer = ArpServer(known_macs: [:])
self.providerActor = SDLTunnelProviderActor(provider: provider, logger: logger)
self.puncherActor = SDLPuncherActor(logger: logger)
self.puncherActor = SDLPuncherActor(querySocketAddress: config.stunSocketAddress, logger: logger)
}
public func start() async throws {