fix context

This commit is contained in:
anlicheng 2026-01-30 15:23:35 +08:00
parent d4390f5117
commit b5d574ea31
2 changed files with 11 additions and 29 deletions

View File

@ -23,7 +23,7 @@ actor SDLPuncherActor {
private var logger: SDLLogger private var logger: SDLLogger
private var querySocketAddress: SocketAddress private var querySocketAddress: SocketAddress
private let(requestStream, requestContinuation) = AsyncStream.makeStream(of: RegisterRequest.self, bufferingPolicy: .unbounded) nonisolated private let(requestStream, requestContinuation) = AsyncStream.makeStream(of: RegisterRequest.self, bufferingPolicy: .unbounded)
struct RegisterRequest { struct RegisterRequest {
let srcMac: Data let srcMac: Data

View File

@ -8,33 +8,19 @@
import Foundation import Foundation
import NetworkExtension import NetworkExtension
import NIOCore import NIOCore
import Combine
// //
/* /*
1. rsa的加解密逻辑 1. rsa的加解密逻辑
*/ */
@available(macOS 14, *)
public class SDLContext { public class SDLContext {
//
struct Route {
let dstAddress: String
let subnetMask: String
var debugInfo: String {
return "\(dstAddress):\(subnetMask)"
}
}
let config: SDLConfiguration let config: SDLConfiguration
// nat // nat
var natType: SDLNATProberActor.NatType = .blocked var natType: SDLNATProberActor.NatType = .blocked
// AES // AES
var aesCipher: AESCipher let aesCipher: AESCipher
// aes // aes
var aesKey: Data = Data() var aesKey: Data = Data()
@ -69,7 +55,6 @@ public class SDLContext {
// //
private var flowTracer = SDLFlowTracer() private var flowTracer = SDLFlowTracer()
private var flowTracerCancel: AnyCancellable?
private let logger: SDLLogger private let logger: SDLLogger
@ -381,7 +366,7 @@ public class SDLContext {
case .request: case .request:
self.logger.log("[SDLContext] get arp request packet", level: .debug) self.logger.log("[SDLContext] get arp request packet", level: .debug)
let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip) let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip)
await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal()) self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
case .response: case .response:
self.logger.log("[SDLContext] get arp response packet", level: .debug) self.logger.log("[SDLContext] get arp response packet", level: .debug)
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC) self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
@ -427,10 +412,8 @@ public class SDLContext {
self.readTask = Task(priority: .high) { self.readTask = Task(priority: .high) {
repeat { repeat {
let packets = await self.providerAdapter.readPackets() let packets = await self.providerAdapter.readPackets()
Task {
let ipPackets = packets.compactMap { IPPacket($0) } let ipPackets = packets.compactMap { IPPacket($0) }
await self.batchProcessPackets(batchSize: 20, packets: ipPackets) await self.batchProcessPackets(batchSize: 20, packets: ipPackets)
}
} while true } while true
} }
} }
@ -439,12 +422,11 @@ public class SDLContext {
private func batchProcessPackets(batchSize: Int, packets: [IPPacket]) async { private func batchProcessPackets(batchSize: Int, packets: [IPPacket]) async {
for startIndex in stride(from: 0, to: packets.count, by: batchSize) { for startIndex in stride(from: 0, to: packets.count, by: batchSize) {
let endIndex = Swift.min(startIndex + batchSize, packets.count) let endIndex = Swift.min(startIndex + batchSize, packets.count)
let chunkPackets = packets[startIndex..<endIndex] let chunkPackets = packets[startIndex..<endIndex]
await withTaskGroup(of: Void.self) { group in await withDiscardingTaskGroup() { group in
for packet in chunkPackets { for packet in chunkPackets {
group.addTask { group.addTask {
await self.dealPacket(packet: packet) self.dealPacket(packet: packet)
} }
} }
} }
@ -452,7 +434,7 @@ public class SDLContext {
} }
// //
private func dealPacket(packet: IPPacket) async { private func dealPacket(packet: IPPacket) {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) { if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
let destIp = packet.header.destination_ip let destIp = packet.header.destination_ip
@ -471,17 +453,17 @@ public class SDLContext {
// arpmac // arpmac
if let dstMac = self.arpServer.query(ip: dstIp) { if let dstMac = self.arpServer.query(ip: dstIp) {
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
} }
else { else {
self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug) self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
// arp广 // arp广
let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp) let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal()) self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
} }
} }
private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) async { private func routeLayerPacket(dstMac: Data, type: LayerPacket.PacketType, data: Data) {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
// 2 // 2
let layerPacket = LayerPacket(dstMac: dstMac, srcMac: networkAddr.mac, type: type, data: data) let layerPacket = LayerPacket(dstMac: dstMac, srcMac: networkAddr.mac, type: type, data: data)