This commit is contained in:
anlicheng 2026-01-27 23:13:41 +08:00
parent 715fa6f491
commit fe680b31b2
3 changed files with 39 additions and 18 deletions

View File

@ -8,6 +8,7 @@
import Foundation
import NIOCore
import NIOPosix
import SwiftProtobuf
// sn-server
actor SDLUDPHoleActor {
@ -204,7 +205,6 @@ actor SDLUDPHoleActor {
}
return .peerInfo(peerInfo)
case .event:
guard let eventVal = buffer.readInteger(as: UInt8.self),
let event = SDLEventType(rawValue: eventVal),

View File

@ -149,6 +149,7 @@ public class SDLContext {
private func startUDPHole() async throws {
self.udpHoleActor = try await SDLUDPHoleActor(logger: self.logger)
try await withThrowingTaskGroup(of: Void.self) { group in
group.addTask {
try await self.udpHoleActor?.start()
@ -160,20 +161,19 @@ public class SDLContext {
try await Task.sleep(nanoseconds: 5 * 1_000_000_000)
try Task.checkCancellation()
// TODO
// if let udpHoleActor = self.udpHoleActor {
// let cookie = await udpHoleActor.getCookieId()
// var stunRequest = SDLStunRequest()
// stunRequest.clientID = self.config.clientId
// stunRequest.networkID = self.devAddr.networkID
// stunRequest.ip = self.devAddr.netAddr
// stunRequest.mac = self.devAddr.mac
// stunRequest.natType = UInt32(self.natType.rawValue)
//
// let remoteAddress = self.config.stunSocketAddress
// await udpHoleActor.send(type: .stunRequest, data: try stunRequest.serializedData(), remoteAddress: remoteAddress)
// self.lastCookie = cookie
// }
if let udpHoleActor = self.udpHoleActor {
let cookie = await udpHoleActor.getCookieId()
var stunRequest = SDLStunRequest()
stunRequest.clientID = self.config.clientId
stunRequest.networkID = self.config.networkAddress.networkId
stunRequest.ip = self.config.networkAddress.ip
stunRequest.mac = self.config.networkAddress.mac
stunRequest.natType = UInt32(self.natType.rawValue)
let remoteAddress = self.config.stunSocketAddress
await udpHoleActor.send(type: .stunRequest, data: try stunRequest.serializedData(), remoteAddress: remoteAddress)
self.lastCookie = cookie
}
}
}
@ -181,6 +181,28 @@ public class SDLContext {
if let messageStream = self.udpHoleActor?.messageStream {
for try await (remoteAddress, message) in messageStream {
try Task.checkCancellation()
switch message {
case .registerSuperAck(let registerSuperAck):
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
case .registerSuperNak(let registerSuperNak):
await self.handleRegisterSuperNak(nakPacket: registerSuperNak)
case .peerInfo(let peerInfo):
()
case .event(let event):
try await self.handleEvent(event: event)
case .stunReply(let stunReply):
await self.handleStunReply(stunReply: stunReply)
case .stunProbeReply(_):
()
case .data(let data):
try await self.handleData(data: data)
case .register(let register):
try await self.handleRegister(remoteAddress: remoteAddress, register: register)
case .registerAck(let registerAck):
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
default:
self.logger.log("get unknown message: \(message)", level: .error)
}
}
}
}
@ -254,6 +276,7 @@ public class SDLContext {
//// return
//// }
///
private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async {
// rsa
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
@ -345,7 +368,7 @@ public class SDLContext {
}
}
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegister) async {
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
// tun,
let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {

View File

@ -104,8 +104,6 @@ enum SDLHoleInboundMessage {
case registerSuperNak(SDLRegisterSuperNak)
case peerInfo(SDLPeerInfo)
case pong
case event(SDLEvent)
case stunReply(SDLStunReply)