fix arp
This commit is contained in:
parent
c5c06cbb1f
commit
fbeb8d1a09
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// ArpServer.swift
|
// ArpResolver.swift
|
||||||
// sdlan
|
// sdlan
|
||||||
// 1. 通过ip地址查找mac地址
|
// 1. 通过ip地址查找mac地址
|
||||||
// 2. 要限制单位时间内,同一个ip的查询
|
// 2. 要限制单位时间内,同一个ip的查询
|
||||||
@ -8,7 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Darwin
|
import Darwin
|
||||||
|
|
||||||
actor ArpServer {
|
actor ArpResolver {
|
||||||
// 增加缓存时间逻辑
|
// 增加缓存时间逻辑
|
||||||
struct ArpEntry {
|
struct ArpEntry {
|
||||||
var mac: Data
|
var mac: Data
|
||||||
@ -79,7 +79,7 @@ actor SDLContextActor {
|
|||||||
private var ipv6AssistClient: SDLIPV6AssistClient?
|
private var ipv6AssistClient: SDLIPV6AssistClient?
|
||||||
|
|
||||||
private let sessionManager: SessionManager
|
private let sessionManager: SessionManager
|
||||||
nonisolated private let arpServer: ArpServer
|
nonisolated private let arpResolver: ArpResolver
|
||||||
|
|
||||||
// 内部socket通讯
|
// 内部socket通讯
|
||||||
// 改为基于 App Group + Darwin Notification 的通知
|
// 改为基于 App Group + Darwin Notification 的通知
|
||||||
@ -100,7 +100,7 @@ actor SDLContextActor {
|
|||||||
let puncherActor = SDLPuncherActor()
|
let puncherActor = SDLPuncherActor()
|
||||||
let proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray)
|
let proberActor = SDLNATProberActor(addressArray: config.stunProbeSocketAddressArray)
|
||||||
let sessionManager = SessionManager()
|
let sessionManager = SessionManager()
|
||||||
let arpServer = ArpServer()
|
let arpResolver = ArpResolver()
|
||||||
let flowTracer = SDLFlowTracer()
|
let flowTracer = SDLFlowTracer()
|
||||||
let policyService = PolicyService(identityId: config.identityId)
|
let policyService = PolicyService(identityId: config.identityId)
|
||||||
let superServiceProxy = SDLSuperServiceProxy()
|
let superServiceProxy = SDLSuperServiceProxy()
|
||||||
@ -110,7 +110,7 @@ actor SDLContextActor {
|
|||||||
config: config,
|
config: config,
|
||||||
dataCipher: nil,
|
dataCipher: nil,
|
||||||
sessionManager: sessionManager,
|
sessionManager: sessionManager,
|
||||||
arpServer: arpServer,
|
arpResolver: arpResolver,
|
||||||
puncherActor: puncherActor,
|
puncherActor: puncherActor,
|
||||||
policyService: policyService,
|
policyService: policyService,
|
||||||
superServiceProxy: superServiceProxy,
|
superServiceProxy: superServiceProxy,
|
||||||
@ -123,7 +123,7 @@ actor SDLContextActor {
|
|||||||
dataCipher: nil,
|
dataCipher: nil,
|
||||||
policyService: policyService,
|
policyService: policyService,
|
||||||
packetOutboundActor: packetOutboundActor,
|
packetOutboundActor: packetOutboundActor,
|
||||||
arpServer: arpServer,
|
arpResolver: arpResolver,
|
||||||
superServiceProxy: superServiceProxy,
|
superServiceProxy: superServiceProxy,
|
||||||
flowTracer: flowTracer
|
flowTracer: flowTracer
|
||||||
)
|
)
|
||||||
@ -136,7 +136,7 @@ actor SDLContextActor {
|
|||||||
self.proberActor = proberActor
|
self.proberActor = proberActor
|
||||||
|
|
||||||
self.sessionManager = sessionManager
|
self.sessionManager = sessionManager
|
||||||
self.arpServer = arpServer
|
self.arpResolver = arpResolver
|
||||||
self.flowTracer = flowTracer
|
self.flowTracer = flowTracer
|
||||||
|
|
||||||
// 权限控制
|
// 权限控制
|
||||||
@ -152,7 +152,7 @@ actor SDLContextActor {
|
|||||||
|
|
||||||
// 启动arp的定时清理任务
|
// 启动arp的定时清理任务
|
||||||
await self.puncherActor.start()
|
await self.puncherActor.start()
|
||||||
await self.arpServer.start()
|
await self.arpResolver.start()
|
||||||
|
|
||||||
let dnsService = SDLDNSService(serverHost: self.config.serverHost, publicDnsServers: self.publicDnsServers) { [weak self] event in
|
let dnsService = SDLDNSService(serverHost: self.config.serverHost, publicDnsServers: self.publicDnsServers) { [weak self] event in
|
||||||
await self?.handleDNSEvent(event)
|
await self?.handleDNSEvent(event)
|
||||||
@ -180,7 +180,7 @@ actor SDLContextActor {
|
|||||||
// 处理context的停止问题
|
// 处理context的停止问题
|
||||||
public func stop() async {
|
public func stop() async {
|
||||||
await self.puncherActor.stop()
|
await self.puncherActor.stop()
|
||||||
await self.arpServer.stop()
|
await self.arpResolver.stop()
|
||||||
await self.sessionManager.clear()
|
await self.sessionManager.clear()
|
||||||
|
|
||||||
await self.stunRequestWorker?.stop()
|
await self.stunRequestWorker?.stop()
|
||||||
@ -298,7 +298,7 @@ extension SDLContextActor {
|
|||||||
await self.policyService.applyPolicyResponse(policyResponse)
|
await self.policyService.applyPolicyResponse(policyResponse)
|
||||||
case .arpResponse(let arpResponse):
|
case .arpResponse(let arpResponse):
|
||||||
SDLLogger.log("[SDLContext] get arp response: \(arpResponse)")
|
SDLLogger.log("[SDLContext] get arp response: \(arpResponse)")
|
||||||
await self.arpServer.handleArpResponse(arpResponse: arpResponse)
|
await self.arpResolver.handleArpResponse(arpResponse: arpResponse)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ actor PacketInboundActor {
|
|||||||
private let provider: NEPacketTunnelProvider
|
private let provider: NEPacketTunnelProvider
|
||||||
private let policyService: PolicyService
|
private let policyService: PolicyService
|
||||||
private let packetOutboundActor: PacketOutboundActor
|
private let packetOutboundActor: PacketOutboundActor
|
||||||
private let arpServer: ArpServer
|
private let arpResolver: ArpResolver
|
||||||
private let superServiceProxy: SDLSuperServiceProxy
|
private let superServiceProxy: SDLSuperServiceProxy
|
||||||
private let flowTracer: SDLFlowTracer
|
private let flowTracer: SDLFlowTracer
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ actor PacketInboundActor {
|
|||||||
dataCipher: CCDataCipher?,
|
dataCipher: CCDataCipher?,
|
||||||
policyService: PolicyService,
|
policyService: PolicyService,
|
||||||
packetOutboundActor: PacketOutboundActor,
|
packetOutboundActor: PacketOutboundActor,
|
||||||
arpServer: ArpServer,
|
arpResolver: ArpResolver,
|
||||||
superServiceProxy: SDLSuperServiceProxy,
|
superServiceProxy: SDLSuperServiceProxy,
|
||||||
flowTracer: SDLFlowTracer) {
|
flowTracer: SDLFlowTracer) {
|
||||||
self.provider = provider
|
self.provider = provider
|
||||||
@ -34,7 +34,7 @@ actor PacketInboundActor {
|
|||||||
self.dataCipher = dataCipher
|
self.dataCipher = dataCipher
|
||||||
self.policyService = policyService
|
self.policyService = policyService
|
||||||
self.packetOutboundActor = packetOutboundActor
|
self.packetOutboundActor = packetOutboundActor
|
||||||
self.arpServer = arpServer
|
self.arpResolver = arpResolver
|
||||||
self.superServiceProxy = superServiceProxy
|
self.superServiceProxy = superServiceProxy
|
||||||
self.flowTracer = flowTracer
|
self.flowTracer = flowTracer
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ actor PacketInboundActor {
|
|||||||
await self.packetOutboundActor.routeLayerPacket(dstMac: dstMac, type: .arp, data: responseData)
|
await self.packetOutboundActor.routeLayerPacket(dstMac: dstMac, type: .arp, data: responseData)
|
||||||
case .appendARP(let ip, let mac):
|
case .appendARP(let ip, let mac):
|
||||||
SDLLogger.log("[PacketInboundActor] get arp response packet")
|
SDLLogger.log("[PacketInboundActor] get arp response packet")
|
||||||
await self.arpServer.append(ip: ip, mac: mac)
|
await self.arpResolver.append(ip: ip, mac: mac)
|
||||||
case .writeToTun(let packetData, let identityID):
|
case .writeToTun(let packetData, let identityID):
|
||||||
let packet = NEPacket(data: packetData, protocolFamily: 2)
|
let packet = NEPacket(data: packetData, protocolFamily: 2)
|
||||||
self.provider.packetFlow.writePacketObjects([packet])
|
self.provider.packetFlow.writePacketObjects([packet])
|
||||||
|
|||||||
@ -14,7 +14,7 @@ actor PacketOutboundActor {
|
|||||||
|
|
||||||
private let provider: NEPacketTunnelProvider
|
private let provider: NEPacketTunnelProvider
|
||||||
private let sessionManager: SessionManager
|
private let sessionManager: SessionManager
|
||||||
private let arpServer: ArpServer
|
private let arpResolver: ArpResolver
|
||||||
private let puncherActor: SDLPuncherActor
|
private let puncherActor: SDLPuncherActor
|
||||||
private let policyService: PolicyService
|
private let policyService: PolicyService
|
||||||
private let superServiceProxy: SDLSuperServiceProxy
|
private let superServiceProxy: SDLSuperServiceProxy
|
||||||
@ -34,7 +34,7 @@ actor PacketOutboundActor {
|
|||||||
config: SDLConfiguration,
|
config: SDLConfiguration,
|
||||||
dataCipher: CCDataCipher?,
|
dataCipher: CCDataCipher?,
|
||||||
sessionManager: SessionManager,
|
sessionManager: SessionManager,
|
||||||
arpServer: ArpServer,
|
arpResolver: ArpResolver,
|
||||||
puncherActor: SDLPuncherActor,
|
puncherActor: SDLPuncherActor,
|
||||||
policyService: PolicyService,
|
policyService: PolicyService,
|
||||||
superServiceProxy: SDLSuperServiceProxy,
|
superServiceProxy: SDLSuperServiceProxy,
|
||||||
@ -47,7 +47,7 @@ actor PacketOutboundActor {
|
|||||||
self.stunSocketAddress = config.stunSocketAddress
|
self.stunSocketAddress = config.stunSocketAddress
|
||||||
self.dataCipher = dataCipher
|
self.dataCipher = dataCipher
|
||||||
self.sessionManager = sessionManager
|
self.sessionManager = sessionManager
|
||||||
self.arpServer = arpServer
|
self.arpResolver = arpResolver
|
||||||
self.puncherActor = puncherActor
|
self.puncherActor = puncherActor
|
||||||
self.policyService = policyService
|
self.policyService = policyService
|
||||||
self.superServiceProxy = superServiceProxy
|
self.superServiceProxy = superServiceProxy
|
||||||
@ -195,12 +195,12 @@ actor PacketOutboundActor {
|
|||||||
SDLLogger.log("[PacketOutboundActor] use exit_node: \(SDLUtil.int32ToIp(ip))", for: .trace)
|
SDLLogger.log("[PacketOutboundActor] use exit_node: \(SDLUtil.int32ToIp(ip))", for: .trace)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let dstMac = self.arpServer.snapshot().lookup(ip) {
|
if let dstMac = self.arpResolver.snapshot().lookup(ip) {
|
||||||
SDLLogger.log("[PacketOutboundActor] dstIp: \(SDLUtil.int32ToIp(ip)), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace)
|
SDLLogger.log("[PacketOutboundActor] dstIp: \(SDLUtil.int32ToIp(ip)), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace)
|
||||||
await self.routeLayerPacket(dstMac: dstMac, type: type, data: data)
|
await self.routeLayerPacket(dstMac: dstMac, type: type, data: data)
|
||||||
} else {
|
} else {
|
||||||
SDLLogger.log("[PacketOutboundActor] dstIp: \(SDLUtil.int32ToIp(ip)) arp query not found, broadcast", for: .trace)
|
SDLLogger.log("[PacketOutboundActor] dstIp: \(SDLUtil.int32ToIp(ip)) arp query not found, broadcast", for: .trace)
|
||||||
if let arpRequest = try? await self.arpServer.makeArpRequest(targetIp: ip) {
|
if let arpRequest = try? await self.arpResolver.makeArpRequest(targetIp: ip) {
|
||||||
await self.superServiceProxy.send(type: .arpRequest, data: arpRequest)
|
await self.superServiceProxy.send(type: .arpRequest, data: arpRequest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user