性能优化

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 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 {
} }
// arpmac // 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) 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)

View File

@ -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 {