fix context

This commit is contained in:
anlicheng 2026-01-30 16:41:10 +08:00
parent b5d574ea31
commit 352dff8e19

View File

@ -13,24 +13,24 @@ import NIOCore
/*
1. rsa的加解密逻辑
*/
public class SDLContext {
let config: SDLConfiguration
actor SDLContext {
nonisolated let config: SDLConfiguration
// nat
var natType: SDLNATProberActor.NatType = .blocked
// AES
let aesCipher: AESCipher
nonisolated let aesCipher: AESCipher
// aes
var aesKey: Data = Data()
// rsa, public_key
let rsaCipher: RSACipher
nonisolated let rsaCipher: RSACipher
//
var udpHole: SDLUDPHole?
var providerAdapter: SDLTunnelProviderAdapter
nonisolated let providerAdapter: SDLTunnelProviderAdapter
var puncherActor: SDLPuncherActor?
// dnsclient
var dnsClient: SDLDNSClient?
@ -44,9 +44,6 @@ public class SDLContext {
private var sessionManager: SessionManager
private var arpServer: ArpServer
// stunRequestcookie
private var lastCookie: UInt32? = 0
//
private var monitor: SDLNetworkMonitor?
@ -54,9 +51,9 @@ public class SDLContext {
private var noticeClient: SDLNoticeClient?
//
private var flowTracer = SDLFlowTracer()
nonisolated private let flowTracer = SDLFlowTracer()
private let logger: SDLLogger
nonisolated private let logger: SDLLogger
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) {
self.logger = logger
@ -105,16 +102,14 @@ public class SDLContext {
// event
group.addTask {
if let eventStream = self.udpHole?.eventStream {
if let eventStream = await self.udpHole?.eventStream {
for try await event in eventStream {
try Task.checkCancellation()
Task {
switch event {
case .ready:
try await self.handleUDPHoleReady()
case .closed:
()
}
switch event {
case .ready:
await self.handleUDPHoleReady()
case .closed:
()
}
}
}
@ -122,7 +117,7 @@ public class SDLContext {
//
group.addTask {
if let dataStream = self.udpHole?.dataStream {
if let dataStream = await self.udpHole?.dataStream {
for try await data in dataStream {
try Task.checkCancellation()
Task {
@ -134,7 +129,7 @@ public class SDLContext {
// signal
group.addTask {
if let signalStream = self.udpHole?.signalStream {
if let signalStream = await self.udpHole?.signalStream {
for try await(remoteAddress, signal) in signalStream {
try Task.checkCancellation()
Task {
@ -161,7 +156,7 @@ public class SDLContext {
// DNS
group.addTask {
if let packetFlow = self.dnsClient?.packetFlow {
if let packetFlow = await self.dnsClient?.packetFlow {
for await packet in packetFlow {
let nePacket = NEPacket(data: packet, protocolFamily: 2)
self.providerAdapter.writePackets(packets: [nePacket])
@ -171,12 +166,12 @@ public class SDLContext {
// Monitor
group.addTask {
for await event in self.monitor!.eventStream {
for await event in await self.monitor!.eventStream {
switch event {
case .changed:
// nat
//self.natType = await self.getNatType()
self.logger.log("didNetworkPathChanged, nat type is: \(self.natType)", level: .info)
self.logger.log("didNetworkPathChanged, nat type is: \(await self.natType)", level: .info)
case .unreachable:
self.logger.log("didNetworkPathUnreachable", level: .warning)
}
@ -197,18 +192,22 @@ public class SDLContext {
self.readTask?.cancel()
}
private func handleUDPHoleReady() async throws {
private func setNatType(natType: SDLNATProberActor.NatType) {
self.natType = natType
}
private func handleUDPHoleReady() async {
if let udpHole = self.udpHole {
self.puncherActor = SDLPuncherActor(udpHole: udpHole, querySocketAddress: config.stunSocketAddress, logger: logger)
self.proberActor = SDLNATProberActor(udpHole: udpHole, addressArray: self.config.stunProbeSocketAddressArray, logger: self.logger)
}
await withTaskGroup(of: Void.self) { group in
await withDiscardingTaskGroup { group in
group.addTask {
// nat
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)")
if let natType = await self.proberActor?.probeNatType() {
await self.setNatType(natType: natType)
self.logger.log("[SDLContext] nat_type is: \(natType)")
}
}
@ -226,7 +225,7 @@ public class SDLContext {
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)
await self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress)
}
}
}
@ -265,7 +264,7 @@ public class SDLContext {
self.aesKey = aesKey
}
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) async {
private func handleRegisterSuperNak(nakPacket: SDLRegisterSuperNak) {
let errorMessage = nakPacket.errorMessage
guard let errorCode = SDLNAKErrorCode(rawValue: UInt8(nakPacket.errorCode)) else {
return
@ -284,7 +283,7 @@ public class SDLContext {
}
private func handleEvent(event: SDLEvent) async throws {
private func handleEvent(event: SDLEvent) throws {
switch event {
case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac
@ -309,7 +308,7 @@ public class SDLContext {
}
}
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) async throws {
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
let networkAddr = config.networkAddress
self.logger.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
@ -330,7 +329,7 @@ public class SDLContext {
}
}
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) {
// tun,
let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
@ -341,7 +340,7 @@ public class SDLContext {
}
}
private func handleData(data: SDLData) async throws {
private func handleData(data: SDLData) throws {
let mac = LayerPacket.MacAddress(data: data.dstMac)
let networkAddr = config.networkAddress
@ -426,7 +425,7 @@ public class SDLContext {
await withDiscardingTaskGroup() { group in
for packet in chunkPackets {
group.addTask {
self.dealPacket(packet: packet)
await self.dealPacket(packet: packet)
}
}
}