This commit is contained in:
anlicheng 2026-02-04 00:51:18 +08:00
parent c63b20b568
commit 9cafe1aa57
3 changed files with 70 additions and 38 deletions

View File

@ -25,6 +25,9 @@ actor SDLContextActor {
// aes // aes
private var aesKey: Data? private var aesKey: Data?
// session token
private var sessionToken: Data?
// rsa, public_key // rsa, public_key
nonisolated let rsaCipher: RSACipher nonisolated let rsaCipher: RSACipher
@ -159,7 +162,7 @@ actor SDLContextActor {
self.udpHoleWorkers = nil self.udpHoleWorkers = nil
// udp // udp
let udpHole = try SDLUDPHole(logger: SDLLogger.shared) let udpHole = try SDLUDPHole()
try udpHole.start() try udpHole.start()
SDLLogger.shared.log("[SDLContext] udpHole started") SDLLogger.shared.log("[SDLContext] udpHole started")
self.udpHole = udpHole self.udpHole = udpHole
@ -177,12 +180,10 @@ actor SDLContextActor {
if Task.isCancelled { if Task.isCancelled {
break break
} }
SDLLogger.shared.log("[SDLContext] will do stunRequest22")
await self.sendStunRequest() await self.sendStunRequest()
SDLLogger.shared.log("[SDLContext] will do stunRequest44")
} }
SDLLogger.shared.log("[SDLContext] will do stunRequest55") SDLLogger.shared.log("[SDLContext] pingTask cancel")
} }
// //
@ -284,15 +285,19 @@ actor SDLContextActor {
} }
private func sendStunRequest() { private func sendStunRequest() {
guard let sessionToken = self.sessionToken else {
return
}
var stunRequest = SDLStunRequest() var stunRequest = SDLStunRequest()
stunRequest.clientID = self.config.clientId stunRequest.clientID = self.config.clientId
stunRequest.networkID = self.config.networkAddress.networkId stunRequest.networkID = self.config.networkAddress.networkId
stunRequest.ip = self.config.networkAddress.ip stunRequest.ip = self.config.networkAddress.ip
stunRequest.mac = self.config.networkAddress.mac stunRequest.mac = self.config.networkAddress.mac
stunRequest.natType = UInt32(self.natType.rawValue) stunRequest.natType = UInt32(self.natType.rawValue)
stunRequest.sessionToken = sessionToken
SDLLogger.shared.log("[SDLContext] will send stun request") SDLLogger.shared.log("[SDLContext] send stun request: \(stunRequest)")
if let stunData = try? stunRequest.serializedData() { if let stunData = try? stunRequest.serializedData() {
let remoteAddress = self.config.stunSocketAddress let remoteAddress = self.config.stunSocketAddress
self.udpHole?.send(type: .stunRequest, data: stunData, remoteAddress: remoteAddress) self.udpHole?.send(type: .stunRequest, data: stunData, remoteAddress: remoteAddress)
@ -301,23 +306,20 @@ actor SDLContextActor {
private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async { private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async {
// rsa // rsa
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey)) self.aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
self.sessionToken = registerSuperAck.sessionToken
SDLLogger.shared.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info) SDLLogger.shared.log("[SDLContext] get registerSuperAck, aes_key len: \(self.aesKey!.count)", level: .info)
// tun // tun
do { do {
let ipAddress = try await self.providerAdapter.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer) let ipAddress = try await self.providerAdapter.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer)
SDLLogger.shared.log("[SDLContext] setNetworkSettings successed") SDLLogger.shared.log("[SDLContext] setNetworkSettings successed")
self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress)) self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress))
SDLLogger.shared.log("[SDLContext] send ip successed")
self.startReader() self.startReader()
SDLLogger.shared.log("[SDLContext] reader started")
} catch let err { } catch let err {
SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error) SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error)
exit(-1) exit(-1)
} }
self.aesKey = aesKey
} }
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) { private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) {
@ -341,6 +343,9 @@ actor SDLContextActor {
private func handleEvent(event: SDLEvent) throws { private func handleEvent(event: SDLEvent) throws {
switch event { switch event {
case .dropMacs(let dropMacsEvent):
SDLLogger.shared.log("[SDLContext] drop macs", level: .info)
()
case .natChanged(let natChangedEvent): case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
@ -356,7 +361,9 @@ actor SDLContextActor {
register.dstMac = sendRegisterEvent.dstMac register.dstMac = sendRegisterEvent.dstMac
self.udpHole?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress) self.udpHole?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress)
} }
case .refreshAuth(let refreshAuthEvent):
SDLLogger.shared.log("[SDLContext] refresh auth", level: .info)
()
case .networkShutdown(let shutdownEvent): case .networkShutdown(let shutdownEvent):
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
self.noticeClient?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)

View File

@ -21,15 +21,9 @@ enum SDLPacketType: UInt8 {
case queryInfo = 0x06 case queryInfo = 0x06
case peerInfo = 0x07 case peerInfo = 0x07
case ping = 0x08
case pong = 0x09
// //
case event = 0x10 case event = 0x10
//
case flowTracer = 0x15
case register = 0x20 case register = 0x20
case registerAck = 0x21 case registerAck = 0x21
@ -113,13 +107,17 @@ enum SDLHoleSignal {
// //
enum SDLEventType: UInt8 { enum SDLEventType: UInt8 {
case dropMacs = 0x02
case natChanged = 0x03 case natChanged = 0x03
case sendRegister = 0x04 case sendRegister = 0x04
case refreshAuth = 0x05
case networkShutdown = 0xFF case networkShutdown = 0xFF
} }
enum SDLEvent { enum SDLEvent {
case dropMacs(SDLDropMacsEvent)
case natChanged(SDLNatChangedEvent) case natChanged(SDLNatChangedEvent)
case sendRegister(SDLSendRegisterEvent) case sendRegister(SDLSendRegisterEvent)
case refreshAuth(SDLRefreshAuthEvent)
case networkShutdown(SDLNetworkShutdownEvent) case networkShutdown(SDLNetworkShutdownEvent)
} }

View File

@ -35,16 +35,13 @@ final class SDLUDPHole: ChannelInboundHandler {
private var cont: CheckedContinuation<Void, Never>? private var cont: CheckedContinuation<Void, Never>?
private var isReady: Bool = false private var isReady: Bool = false
private let logger: SDLLogger
enum HoleEvent { enum HoleEvent {
case ready case ready
case closed case closed
} }
// //
init(logger: SDLLogger) throws { init() throws {
self.logger = logger
(self.signalStream, self.signalContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleSignal).self, bufferingPolicy: .unbounded) (self.signalStream, self.signalContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleSignal).self, bufferingPolicy: .unbounded)
(self.dataStream, self.dataContinuation) = AsyncStream.makeStream(of: SDLData.self, bufferingPolicy: .unbounded) (self.dataStream, self.dataContinuation) = AsyncStream.makeStream(of: SDLData.self, bufferingPolicy: .unbounded)
} }
@ -57,7 +54,7 @@ final class SDLUDPHole: ChannelInboundHandler {
} }
let channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait() let channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait()
self.logger.log("[UDPHole] started", level: .debug) SDLLogger.shared.log("[UDPHole] started", level: .debug)
self.channel = channel self.channel = channel
} }
@ -100,10 +97,10 @@ final class SDLUDPHole: ChannelInboundHandler {
self.signalContinuation.yield((remoteAddress, signal)) self.signalContinuation.yield((remoteAddress, signal))
} }
} else { } else {
self.logger.log("[SDLUDPHole] decode message, get null", level: .warning) SDLLogger.shared.log("[SDLUDPHole] decode message, get null", level: .warning)
} }
} catch let err { } catch let err {
self.logger.log("[SDLUDPHole] decode message, get error: \(err)", level: .warning) SDLLogger.shared.log("[SDLUDPHole] decode message, get error: \(err)", level: .warning)
} }
} }
@ -141,72 +138,102 @@ final class SDLUDPHole: ChannelInboundHandler {
// --MARK: // --MARK:
private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? { private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? {
guard let type = buffer.readInteger(as: UInt8.self), guard let type = buffer.readInteger(as: UInt8.self),
let packetType = SDLPacketType(rawValue: type), let packetType = SDLPacketType(rawValue: type) else {
let bytes = buffer.readBytes(length: buffer.readableBytes) else { SDLLogger.shared.log("[SDLUDPHole] decode error 11")
return nil return nil
} }
switch packetType { switch packetType {
case .data: case .data:
let dataPacket = try SDLData(serializedBytes: bytes) guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let dataPacket = try? SDLData(serializedBytes: bytes) else {
return nil
}
return .data(dataPacket) return .data(dataPacket)
case .register: case .register:
let registerPacket = try SDLRegister(serializedBytes: bytes) guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerPacket = try? SDLRegister(serializedBytes: bytes) else {
return nil
}
return .signal(.register(registerPacket)) return .signal(.register(registerPacket))
case .registerAck: case .registerAck:
let registerAck = try SDLRegisterAck(serializedBytes: bytes) guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else {
return nil
}
return .signal(.registerAck(registerAck)) return .signal(.registerAck(registerAck))
case .stunProbeReply: case .stunProbeReply:
let stunProbeReply = try SDLStunProbeReply(serializedBytes: bytes) guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else {
return nil
}
return .signal(.stunProbeReply(stunProbeReply)) return .signal(.stunProbeReply(stunProbeReply))
case .registerSuperAck: case .registerSuperAck:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else { let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.registerSuperAck(registerSuperAck)) return .signal(.registerSuperAck(registerSuperAck))
case .registerSuperNak: case .registerSuperNak:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerSuperNak = try? SDLRegisterSuperNak(serializedBytes: bytes) else { let registerSuperNak = try? SDLRegisterSuperNak(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.registerSuperNak(registerSuperNak)) return .signal(.registerSuperNak(registerSuperNak))
case .peerInfo: case .peerInfo:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let peerInfo = try? SDLPeerInfo(serializedBytes: bytes) else { let peerInfo = try? SDLPeerInfo(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.peerInfo(peerInfo)) return .signal(.peerInfo(peerInfo))
case .event: case .event:
guard let eventVal = buffer.readInteger(as: UInt8.self), guard let eventVal = buffer.readInteger(as: UInt8.self),
let event = SDLEventType(rawValue: eventVal), let event = SDLEventType(rawValue: eventVal),
let bytes = buffer.readBytes(length: buffer.readableBytes) else { let bytes = buffer.readBytes(length: buffer.readableBytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 15")
return nil return nil
} }
switch event { switch event {
case .dropMacs:
guard let dropMacsEvent = try? SDLDropMacsEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 16")
return nil
}
return .signal(.event(.dropMacs(dropMacsEvent)))
case .natChanged: case .natChanged:
guard let natChangedEvent = try? SDLNatChangedEvent(serializedBytes: bytes) else { guard let natChangedEvent = try? SDLNatChangedEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 16")
return nil return nil
} }
return .signal(.event(.natChanged(natChangedEvent))) return .signal(.event(.natChanged(natChangedEvent)))
case .sendRegister: case .sendRegister:
guard let sendRegisterEvent = try? SDLSendRegisterEvent(serializedBytes: bytes) else { guard let sendRegisterEvent = try? SDLSendRegisterEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 17")
return nil return nil
} }
return .signal(.event(.sendRegister(sendRegisterEvent))) return .signal(.event(.sendRegister(sendRegisterEvent)))
case .refreshAuth:
guard let refreshAuthEvent = try? SDLRefreshAuthEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 17")
return nil
}
return .signal(.event(.refreshAuth(refreshAuthEvent)))
case .networkShutdown: case .networkShutdown:
guard let networkShutdownEvent = try? SDLNetworkShutdownEvent(serializedBytes: bytes) else { guard let networkShutdownEvent = try? SDLNetworkShutdownEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 18")
return nil return nil
} }
return .signal(.event(.networkShutdown(networkShutdownEvent))) return .signal(.event(.networkShutdown(networkShutdownEvent)))
} }
default: default:
SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)")
return nil return nil
} }
} }
deinit { deinit {