性能优化
This commit is contained in:
parent
182f6ffd17
commit
195724a222
@ -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 {
|
||||
}
|
||||
|
||||
// 查找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)
|
||||
}
|
||||
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)
|
||||
|
||||
@ -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 {
|
||||
Loading…
x
Reference in New Issue
Block a user