性能优化

This commit is contained in:
anlicheng 2026-03-10 18:06:15 +08:00
parent 182f6ffd17
commit 195724a222
2 changed files with 46 additions and 12 deletions

View File

@ -55,8 +55,8 @@ actor SDLContextActor {
//
private var readTask: Task<(), Never>?
private var sessionManager: SessionManager
private var arpServer: ArpServerActor
nonisolated private let sessionManager = SessionManager()
nonisolated private let arpServer = ArpServer()
//
private var monitor: SDLNetworkMonitor?
@ -71,7 +71,7 @@ actor SDLContextActor {
//
private var supervisor = SDLSupervisor()
private let provider: NEPacketTunnelProvider
nonisolated private let provider: NEPacketTunnelProvider
//
private let identifyStore: IdentityStore
@ -90,9 +90,6 @@ actor SDLContextActor {
self.rsaCipher = rsaCipher
self.aesCipher = aesCipher
self.sessionManager = SessionManager()
self.arpServer = ArpServerActor()
self.puncherActor = SDLPuncherActor()
self.proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray)
@ -170,7 +167,7 @@ actor SDLContextActor {
//
await self.identifyStore.applyPolicyResponse(policyResponse)
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())
case .response:
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 {
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 {
}
// arpmac
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)
}
else {
@ -664,7 +661,7 @@ actor SDLContextActor {
// let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
// 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 {
// 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)
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
self.flowTracer.inc(num: data.count, type: .p2p)

View File

@ -7,13 +7,15 @@
import Foundation
import Darwin
actor ArpServerActor {
final class ArpServer {
//
struct ArpEntry {
var mac: Data
var expireTime: TimeInterval
}
private let locker = NSLock()
private var packetId: UInt32 = 1
private var known_macs: [UInt32: ArpEntry] = [:]
private let arpTTL: TimeInterval
@ -23,6 +25,11 @@ actor ArpServerActor {
}
func query(ip: UInt32) -> Data? {
locker.lock()
defer {
locker.unlock()
}
guard let entry = known_macs[ip] else {
return nil
}
@ -36,23 +43,48 @@ actor ArpServerActor {
}
func append(ip: UInt32, mac: Data) {
locker.lock()
defer {
locker.unlock()
}
let expireAt = Date().timeIntervalSince1970 + arpTTL
self.known_macs[ip] = ArpEntry(mac: mac, expireTime: expireAt)
}
func remove(ip: UInt32) {
locker.lock()
defer {
locker.unlock()
}
self.known_macs.removeValue(forKey: ip)
}
func dropMacs(macs: [Data]) {
locker.lock()
defer {
locker.unlock()
}
self.known_macs = self.known_macs.filter { !macs.contains($0.value.mac) }
}
func clear() {
locker.lock()
defer {
locker.unlock()
}
self.known_macs = [:]
}
func arpRequest(targetIp: UInt32, use quicClient: SDLQUICClient?) throws {
locker.lock()
defer {
locker.unlock()
}
guard let quicClient else {
return
}
@ -67,6 +99,11 @@ actor ArpServerActor {
}
func handleArpResponse(arpResponse: SDLArpResponse) {
locker.lock()
defer {
locker.unlock()
}
let targetIp = arpResponse.targetIp
let targetMac = arpResponse.targetMac
if !targetMac.isEmpty {