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): case .natType(let natType):
self.setNatType(natType: natType) self.setNatType(natType: natType)
SDLLogger.log("[SDLContext] nat_type is: \(natType)") SDLLogger.log("[SDLContext] nat_type is: \(natType)")
case .packet(let remoteAddress, let message, let source): case .packet(let remoteAddress, let message):
await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message, source: source) await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message)
case .closed(let error): case .closed(let error):
SDLLogger.log("[SDLContext] udpHole closed: \(error)", for: .debug) 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 { switch message {
case .stunReply(_), .stunProbeReply(_): case .stunReply(_), .stunProbeReply(_):
SDLLogger.log("[SDLContext] get a stun reply", for: .debug) SDLLogger.log("[SDLContext] get a stun reply", for: .debug)
case .register(let register): 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): 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 let networkAddr = config.networkAddress
SDLLogger.log("[SDLContext] register packet: \(register), network_address: \(networkAddr)") 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) await self.sendPeerPacket(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
// , super-nodenatudpnat // , 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) await self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.log("[SDLContext] didReadRegister get unsupported remoteAddress: \(remoteAddress)", for: .debug) 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, // tun,
let networkAddr = config.networkAddress let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId { 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) await self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.log("[SDLContext] didReadRegisterAck get unsupported remoteAddress: \(remoteAddress)", for: .debug) SDLLogger.log("[SDLContext] didReadRegisterAck get unsupported remoteAddress: \(remoteAddress)", for: .debug)
@ -700,6 +702,17 @@ extension SDLContextActor {
} }
} }
private static func addressType(from remoteAddress: SocketAddress) -> Session.AddressType? {
switch remoteAddress {
case .v4:
return .v4
case .v6:
return .v6
default:
return nil
}
}
} }
// MARK: Stun // MARK: Stun

View File

@ -1,25 +1,11 @@
import Foundation import Foundation
import NIOCore 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 { actor SDLUDPHoleService {
enum Event { enum Event {
case ready(SocketAddress) case ready(SocketAddress)
case natType(SDLNATProberActor.NatType) case natType(SDLNATProberActor.NatType)
case packet(SocketAddress, SDLHoleControlMessage, source: SDLUDPHoleKind) case packet(SocketAddress, SDLHoleControlMessage)
case closed(Error) case closed(Error)
} }

View File

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

View File

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