This commit is contained in:
anlicheng 2026-05-27 21:32:48 +08:00
parent 0c31f1425a
commit 69815ab701
4 changed files with 25 additions and 26 deletions

View File

@ -644,25 +644,25 @@ extension SDLContextActor {
case .natType(let natType):
self.setNatType(natType: natType)
SDLLogger.log("[SDLContext] nat_type is: \(natType)")
case .packet(let remoteAddress, let message, let source):
await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message, source: source)
case .packet(let remoteAddress, let message):
await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message)
case .closed(let error):
SDLLogger.log("[SDLContext] udpHole closed: \(error)", for: .debug)
}
}
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleControlMessage, source: SDLUDPHoleKind) async {
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleControlMessage) async {
switch message {
case .stunReply(_), .stunProbeReply(_):
SDLLogger.log("[SDLContext] get a stun reply", for: .debug)
case .register(let register):
try? await self.handleRegister(remoteAddress: remoteAddress, register: register, source: source)
try? await self.handleRegister(remoteAddress: remoteAddress, register: register)
case .registerAck(let registerAck):
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck, source: source)
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
}
}
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister, source: SDLUDPHoleKind) async throws {
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) async throws {
let networkAddr = config.networkAddress
SDLLogger.log("[SDLContext] register packet: \(register), network_address: \(networkAddr)")
@ -676,7 +676,8 @@ extension SDLContextActor {
await self.sendPeerPacket(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
// , super-nodenatudpnat
if let session = Session(dstMac: register.srcMac, natAddress: remoteAddress, addressType: source.convertAddressType()) {
if let addressType = Self.addressType(from: remoteAddress),
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress, addressType: addressType) {
await self.sessionManager.addSession(session: session)
} else {
SDLLogger.log("[SDLContext] didReadRegister get unsupported remoteAddress: \(remoteAddress)", for: .debug)
@ -686,11 +687,12 @@ extension SDLContextActor {
}
}
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck, source: SDLUDPHoleKind) async {
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
// tun,
let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
if let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress, addressType: source.convertAddressType()) {
if let addressType = Self.addressType(from: remoteAddress),
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress, addressType: addressType) {
await self.sessionManager.addSession(session: session)
} else {
SDLLogger.log("[SDLContext] didReadRegisterAck get unsupported remoteAddress: \(remoteAddress)", for: .debug)
@ -699,6 +701,17 @@ extension SDLContextActor {
SDLLogger.log("[SDLContext] didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)")
}
}
private static func addressType(from remoteAddress: SocketAddress) -> Session.AddressType? {
switch remoteAddress {
case .v4:
return .v4
case .v6:
return .v6
default:
return nil
}
}
}

View File

@ -1,25 +1,11 @@
import Foundation
import NIOCore
enum SDLUDPHoleKind: Equatable {
case v4
case v6
func convertAddressType() -> Session.AddressType {
switch self {
case .v4:
return .v4
case .v6:
return .v6
}
}
}
actor SDLUDPHoleService {
enum Event {
case ready(SocketAddress)
case natType(SDLNATProberActor.NatType)
case packet(SocketAddress, SDLHoleControlMessage, source: SDLUDPHoleKind)
case packet(SocketAddress, SDLHoleControlMessage)
case closed(Error)
}

View File

@ -120,7 +120,7 @@ actor SDLUDPHoleSession {
case .stunProbeReply(let probeReply):
await self.proberActor.handleProbeReply(localAddress: self.localAddress, reply: probeReply)
default:
await self.onEvent(.packet(remoteAddress, control, source: .v4))
await self.onEvent(.packet(remoteAddress, control))
}
case .data(let data):
await self.onData(data)

View File

@ -40,7 +40,7 @@ actor SDLUDPHoleV6Session {
try Task.checkCancellation()
switch message {
case .control(let control):
await onEvent(.packet(remoteAddress, control, source: .v6))
await onEvent(.packet(remoteAddress, control))
case .data(let data):
await onData(data)
}