fix udpHole

This commit is contained in:
anlicheng 2026-01-29 22:07:46 +08:00
parent d15240a3a7
commit 2abef3d0bf
4 changed files with 57 additions and 45 deletions

View File

@ -52,7 +52,7 @@ actor SDLNATProberActor {
// MARK: - Dependencies
private let udpHole: SDLUDPHoleActor
private let udpHole: SDLUDPHole
private let addressArray: [[SocketAddress]]
private let logger: SDLLogger
@ -63,7 +63,7 @@ actor SDLNATProberActor {
// MARK: - Init
init(udpHole: SDLUDPHoleActor, addressArray: [[SocketAddress]], logger: SDLLogger) {
init(udpHole: SDLUDPHole, addressArray: [[SocketAddress]], logger: SDLLogger) {
self.udpHole = udpHole
self.addressArray = addressArray
self.logger = logger

View File

@ -13,7 +13,7 @@ actor SDLPuncherActor {
private var coolingDown: Set<Data> = []
private let cooldown: Duration = .seconds(5)
private var udpHoleActor: SDLUDPHoleActor?
private var udpHole: SDLUDPHole?
private var pktId: UInt32 = 1
//
@ -34,8 +34,8 @@ actor SDLPuncherActor {
self.logger = logger
}
func setUDPHoleActor(udpHoleActor: SDLUDPHoleActor?) {
self.udpHoleActor = udpHoleActor
func setUDPHoleActor(udpHole: SDLUDPHole?) {
self.udpHole = udpHole
}
func submitRegisterRequest(request: RegisterRequest) {
@ -73,7 +73,7 @@ actor SDLPuncherActor {
register.srcMac = request.srcMac
register.dstMac = request.dstMac
await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
self.udpHole?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
} else {
self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
}
@ -95,7 +95,7 @@ actor SDLPuncherActor {
self.pendingRequests[pktId] = request
if let queryData = try? queryInfo.serializedData() {
await self.udpHoleActor?.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
self.udpHole?.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
}
}
}

View File

@ -19,7 +19,7 @@ import NIOPosix
import SwiftProtobuf
// sn-server
actor SDLUDPHoleActor {
final class SDLUDPHole {
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
private var channel: Channel?
@ -77,7 +77,7 @@ actor SDLUDPHoleActor {
}
extension SDLUDPHoleActor {
extension SDLUDPHole {
final class SDLUDPHoleHandler: ChannelInboundHandler {
typealias InboundIn = AddressedEnvelope<ByteBuffer>

View File

@ -43,7 +43,7 @@ public class SDLContext {
let rsaCipher: RSACipher
//
var udpHoleActor: SDLUDPHoleActor?
var udpHole: SDLUDPHole?
var providerActor: SDLTunnelProviderActor
var puncherActor: SDLPuncherActor
// dnsclient
@ -88,8 +88,8 @@ public class SDLContext {
public func start() async throws {
// udp
self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger)
try await self.udpHoleActor?.start()
self.udpHole = try SDLUDPHole(logger: self.logger)
try self.udpHole?.start()
self.logger.log("[SDLContext] udpHole started")
// dns
@ -120,10 +120,12 @@ public class SDLContext {
}
group.addTask {
if let eventStream = self.udpHoleActor?.eventStream {
if let eventStream = self.udpHole?.eventStream {
for try await event in eventStream {
try Task.checkCancellation()
try? await self.dispatchEvent(event: event)
Task {
try await self.dispatchEvent(event: event)
}
}
}
}
@ -160,21 +162,26 @@ public class SDLContext {
}
public func stop() async {
self.udpHoleActor = nil
self.udpHole = nil
self.noticeClientActor = nil
self.readTask?.cancel()
}
private func handleUDPHoleReady() async throws {
await self.puncherActor.setUDPHoleActor(udpHoleActor: self.udpHoleActor)
await self.puncherActor.setUDPHoleActor(udpHole: self.udpHole)
await withTaskGroup(of: Void.self) { group in
group.addTask {
// nat
if let udpHoleActor = self.udpHoleActor {
if let udpHoleActor = self.udpHole {
self.proberActor = SDLNATProberActor(udpHole: udpHoleActor, addressArray: self.config.stunProbeSocketAddressArray, logger: self.logger)
self.natType = await self.proberActor!.probeNatType()
self.logger.log("[SDLContext] nat_type is: \(self.natType)")
}
}
group.addTask {
var registerSuper = SDLRegisterSuper()
registerSuper.pktID = 0
registerSuper.clientID = self.config.clientId
@ -186,9 +193,12 @@ public class SDLContext {
registerSuper.pubKey = self.rsaCipher.pubKey
registerSuper.accessToken = self.config.accessToken
self.logger.log("will send register super")
await self.udpHoleActor?.send(type: .registerSuper, data: try registerSuper.serializedData(), remoteAddress: self.config.stunSocketAddress)
if let registerSuperData = try? registerSuper.serializedData() {
self.logger.log("[SDLContext] will send register super")
self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress)
}
}
}
}
private func sendStunRequest() async {
@ -201,11 +211,11 @@ public class SDLContext {
if let stunData = try? stunRequest.serializedData() {
let remoteAddress = self.config.stunSocketAddress
await self.udpHoleActor?.send(type: .stunRequest, data: stunData, remoteAddress: remoteAddress)
self.udpHole?.send(type: .stunRequest, data: stunData, remoteAddress: remoteAddress)
}
}
private func dispatchEvent(event: SDLUDPHoleActor.UDPHoleEvent) async throws {
private func dispatchEvent(event: SDLUDPHole.UDPHoleEvent) async throws {
switch event {
case .ready:
try await self.handleUDPHoleReady()
@ -284,7 +294,7 @@ public class SDLContext {
register.networkID = self.config.networkAddress.networkId
register.srcMac = self.config.networkAddress.mac
register.dstMac = sendRegisterEvent.dstMac
await self.udpHoleActor?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress)
self.udpHole?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress)
}
case .networkShutdown(let shutdownEvent):
@ -306,7 +316,7 @@ public class SDLContext {
registerAck.srcMac = networkAddr.mac
registerAck.dstMac = register.srcMac
await self.udpHoleActor?.send(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
self.udpHole?.send(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
// , super-nodenatudpnat
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
await self.sessionManager.addSession(session: session)
@ -397,8 +407,10 @@ public class SDLContext {
self.readTask = Task(priority: .high) {
repeat {
let packets = await self.providerActor.readPackets()
Task {
let ipPackets = packets.compactMap { IPPacket($0) }
await self.batchProcessPackets(batchSize: 20, packets: ipPackets)
}
} while true
}
}
@ -469,18 +481,18 @@ public class SDLContext {
// 广
if ARPPacket.isBroadcastMac(dstMac) {
// super_node
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
self.udpHole?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
}
else {
// session
if let session = await self.sessionManager.getSession(toAddress: dstMac) {
self.logger.log("[SDLContext] send packet by session: \(session)", level: .debug)
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: session.natAddress)
self.udpHole?.send(type: .data, data: data, remoteAddress: session.natAddress)
await self.flowTracer.inc(num: data.count, type: .p2p)
}
else {
// super_node
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
self.udpHole?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
//
await self.flowTracer.inc(num: data.count, type: .forward)
//
@ -490,7 +502,7 @@ public class SDLContext {
}
deinit {
self.udpHoleActor = nil
self.udpHole = nil
self.dnsClientActor = nil
}
}