性能优化
This commit is contained in:
parent
182f6ffd17
commit
195724a222
@ -55,8 +55,8 @@ actor SDLContextActor {
|
|||||||
// 数据包读取任务
|
// 数据包读取任务
|
||||||
private var readTask: Task<(), Never>?
|
private var readTask: Task<(), Never>?
|
||||||
|
|
||||||
private var sessionManager: SessionManager
|
nonisolated private let sessionManager = SessionManager()
|
||||||
private var arpServer: ArpServerActor
|
nonisolated private let arpServer = ArpServer()
|
||||||
|
|
||||||
// 网络状态变化的健康
|
// 网络状态变化的健康
|
||||||
private var monitor: SDLNetworkMonitor?
|
private var monitor: SDLNetworkMonitor?
|
||||||
@ -71,7 +71,7 @@ actor SDLContextActor {
|
|||||||
// 处理内部的需要长时间运行的任务
|
// 处理内部的需要长时间运行的任务
|
||||||
private var supervisor = SDLSupervisor()
|
private var supervisor = SDLSupervisor()
|
||||||
|
|
||||||
private let provider: NEPacketTunnelProvider
|
nonisolated private let provider: NEPacketTunnelProvider
|
||||||
|
|
||||||
// 处理权限控制
|
// 处理权限控制
|
||||||
private let identifyStore: IdentityStore
|
private let identifyStore: IdentityStore
|
||||||
@ -90,9 +90,6 @@ actor SDLContextActor {
|
|||||||
self.rsaCipher = rsaCipher
|
self.rsaCipher = rsaCipher
|
||||||
self.aesCipher = aesCipher
|
self.aesCipher = aesCipher
|
||||||
|
|
||||||
self.sessionManager = SessionManager()
|
|
||||||
self.arpServer = ArpServerActor()
|
|
||||||
|
|
||||||
self.puncherActor = SDLPuncherActor()
|
self.puncherActor = SDLPuncherActor()
|
||||||
self.proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray)
|
self.proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray)
|
||||||
|
|
||||||
@ -170,7 +167,7 @@ actor SDLContextActor {
|
|||||||
// 处理权限的请求问题
|
// 处理权限的请求问题
|
||||||
await self.identifyStore.applyPolicyResponse(policyResponse)
|
await self.identifyStore.applyPolicyResponse(policyResponse)
|
||||||
case .arpResponse(let arpResponse):
|
case .arpResponse(let arpResponse):
|
||||||
await self.arpServer.handleArpResponse(arpResponse: arpResponse)
|
self.arpServer.handleArpResponse(arpResponse: arpResponse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -534,7 +531,7 @@ actor SDLContextActor {
|
|||||||
await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
|
await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
|
||||||
case .response:
|
case .response:
|
||||||
SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug)
|
||||||
await self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
|
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
|
SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
|
||||||
@ -655,7 +652,7 @@ actor SDLContextActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查找arp缓存中是否有目标mac地址
|
// 查找arp缓存中是否有目标mac地址
|
||||||
if let dstMac = await self.arpServer.query(ip: dstIp) {
|
if let dstMac = self.arpServer.query(ip: dstIp) {
|
||||||
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -664,7 +661,7 @@ actor SDLContextActor {
|
|||||||
// 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())
|
// await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
|
||||||
|
|
||||||
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
|
try? self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -693,7 +690,7 @@ actor SDLContextActor {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 通过session发送到对端
|
// 通过session发送到对端
|
||||||
if let session = await self.sessionManager.getSession(toAddress: dstMac) {
|
if let session = self.sessionManager.getSession(toAddress: dstMac) {
|
||||||
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
||||||
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
|
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
|
||||||
self.flowTracer.inc(num: data.count, type: .p2p)
|
self.flowTracer.inc(num: data.count, type: .p2p)
|
||||||
|
|||||||
@ -7,13 +7,15 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Darwin
|
import Darwin
|
||||||
|
|
||||||
actor ArpServerActor {
|
final class ArpServer {
|
||||||
// 增加缓存时间逻辑
|
// 增加缓存时间逻辑
|
||||||
struct ArpEntry {
|
struct ArpEntry {
|
||||||
var mac: Data
|
var mac: Data
|
||||||
var expireTime: TimeInterval
|
var expireTime: TimeInterval
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let locker = NSLock()
|
||||||
|
|
||||||
private var packetId: UInt32 = 1
|
private var packetId: UInt32 = 1
|
||||||
private var known_macs: [UInt32: ArpEntry] = [:]
|
private var known_macs: [UInt32: ArpEntry] = [:]
|
||||||
private let arpTTL: TimeInterval
|
private let arpTTL: TimeInterval
|
||||||
@ -23,6 +25,11 @@ actor ArpServerActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func query(ip: UInt32) -> Data? {
|
func query(ip: UInt32) -> Data? {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
guard let entry = known_macs[ip] else {
|
guard let entry = known_macs[ip] else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -36,23 +43,48 @@ actor ArpServerActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func append(ip: UInt32, mac: Data) {
|
func append(ip: UInt32, mac: Data) {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
let expireAt = Date().timeIntervalSince1970 + arpTTL
|
let expireAt = Date().timeIntervalSince1970 + arpTTL
|
||||||
self.known_macs[ip] = ArpEntry(mac: mac, expireTime: expireAt)
|
self.known_macs[ip] = ArpEntry(mac: mac, expireTime: expireAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func remove(ip: UInt32) {
|
func remove(ip: UInt32) {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
self.known_macs.removeValue(forKey: ip)
|
self.known_macs.removeValue(forKey: ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
func dropMacs(macs: [Data]) {
|
func dropMacs(macs: [Data]) {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) }
|
self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) }
|
||||||
}
|
}
|
||||||
|
|
||||||
func clear() {
|
func clear() {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
self.known_macs = [:]
|
self.known_macs = [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws {
|
func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
guard let quicClient else {
|
guard let quicClient else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -67,6 +99,11 @@ actor ArpServerActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleArpResponse(arpResponse: SDLArpResponse) {
|
func handleArpResponse(arpResponse: SDLArpResponse) {
|
||||||
|
locker.lock()
|
||||||
|
defer {
|
||||||
|
locker.unlock()
|
||||||
|
}
|
||||||
|
|
||||||
let targetIp = arpResponse.targetIp
|
let targetIp = arpResponse.targetIp
|
||||||
let targetMac = arpResponse.targetMac
|
let targetMac = arpResponse.targetMac
|
||||||
if !targetMac.isEmpty {
|
if !targetMac.isEmpty {
|
||||||
Loading…
x
Reference in New Issue
Block a user