fix context
This commit is contained in:
parent
d4390f5117
commit
b5d574ea31
@ -23,7 +23,7 @@ actor SDLPuncherActor {
|
||||
private var logger: SDLLogger
|
||||
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 {
|
||||
let srcMac: Data
|
||||
|
||||
@ -8,33 +8,19 @@
|
||||
import Foundation
|
||||
import NetworkExtension
|
||||
import NIOCore
|
||||
import Combine
|
||||
|
||||
// 上下文环境变量,全局共享
|
||||
/*
|
||||
1. 处理rsa的加解密逻辑
|
||||
*/
|
||||
|
||||
@available(macOS 14, *)
|
||||
public class SDLContext {
|
||||
|
||||
// 路由信息
|
||||
struct Route {
|
||||
let dstAddress: String
|
||||
let subnetMask: String
|
||||
|
||||
var debugInfo: String {
|
||||
return "\(dstAddress):\(subnetMask)"
|
||||
}
|
||||
}
|
||||
|
||||
let config: SDLConfiguration
|
||||
|
||||
// nat的网络类型
|
||||
var natType: SDLNATProberActor.NatType = .blocked
|
||||
|
||||
// AES加密,授权通过后,对象才会被创建
|
||||
var aesCipher: AESCipher
|
||||
let aesCipher: AESCipher
|
||||
|
||||
// aes
|
||||
var aesKey: Data = Data()
|
||||
@ -69,7 +55,6 @@ public class SDLContext {
|
||||
|
||||
// 流量统计
|
||||
private var flowTracer = SDLFlowTracer()
|
||||
private var flowTracerCancel: AnyCancellable?
|
||||
|
||||
private let logger: SDLLogger
|
||||
|
||||
@ -381,7 +366,7 @@ public class SDLContext {
|
||||
case .request:
|
||||
self.logger.log("[SDLContext] get arp request packet", level: .debug)
|
||||
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:
|
||||
self.logger.log("[SDLContext] get arp response packet", level: .debug)
|
||||
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
|
||||
@ -427,10 +412,8 @@ public class SDLContext {
|
||||
self.readTask = Task(priority: .high) {
|
||||
repeat {
|
||||
let packets = await self.providerAdapter.readPackets()
|
||||
Task {
|
||||
let ipPackets = packets.compactMap { IPPacket($0) }
|
||||
await self.batchProcessPackets(batchSize: 20, packets: ipPackets)
|
||||
}
|
||||
let ipPackets = packets.compactMap { IPPacket($0) }
|
||||
await self.batchProcessPackets(batchSize: 20, packets: ipPackets)
|
||||
} while true
|
||||
}
|
||||
}
|
||||
@ -439,12 +422,11 @@ public class SDLContext {
|
||||
private func batchProcessPackets(batchSize: Int, packets: [IPPacket]) async {
|
||||
for startIndex in stride(from: 0, to: packets.count, by: batchSize) {
|
||||
let endIndex = Swift.min(startIndex + batchSize, packets.count)
|
||||
|
||||
let chunkPackets = packets[startIndex..<endIndex]
|
||||
await withTaskGroup(of: Void.self) { group in
|
||||
await withDiscardingTaskGroup() { group in
|
||||
for packet in chunkPackets {
|
||||
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
|
||||
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
|
||||
let destIp = packet.header.destination_ip
|
||||
@ -471,17 +453,17 @@ public class SDLContext {
|
||||
|
||||
// 查找arp缓存中是否有目标mac地址
|
||||
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 {
|
||||
self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
|
||||
// 构造arp广播
|
||||
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
|
||||
// 将数据封装层2层的数据包
|
||||
let layerPacket = LayerPacket(dstMac: dstMac, srcMac: networkAddr.mac, type: type, data: data)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user