fix context
This commit is contained in:
parent
d4390f5117
commit
b5d574ea31
@ -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
|
||||||
|
|||||||
@ -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 {
|
|||||||
|
|
||||||
// 查找arp缓存中是否有目标mac地址
|
// 查找arp缓存中是否有目标mac地址
|
||||||
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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user