fix
This commit is contained in:
parent
abfc35aa7d
commit
aa26d65869
@ -14,6 +14,8 @@ target_ip: \(SDLUtil.int32ToIp(self.targetIP)), target_mac: \(SDLUtil.formatMacA
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
|
||||||
|
|
||||||
// ARP操作码
|
// ARP操作码
|
||||||
enum Opcode: UInt16 {
|
enum Opcode: UInt16 {
|
||||||
case request = 0x01
|
case request = 0x01
|
||||||
@ -94,6 +96,10 @@ target_ip: \(SDLUtil.int32ToIp(self.targetIP)), target_mac: \(SDLUtil.formatMacA
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func isBroadcastMac(_ macAddress: Data) -> Bool {
|
||||||
|
return macAddress == broadcastMac
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ARPPacket {
|
extension ARPPacket {
|
||||||
|
|||||||
@ -72,7 +72,10 @@ actor SDLSuperClientActor {
|
|||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
|
|
||||||
if let message = SDLSuperClientDecoder.decode(buffer: &packet) {
|
if let message = SDLSuperClientDecoder.decode(buffer: &packet) {
|
||||||
self.logger.log("[SDLSuperTransport] read message: \(message)", level: .debug)
|
if !message.isPong() {
|
||||||
|
self.logger.log("[SDLSuperClient] read message: \(message)", level: .debug)
|
||||||
|
}
|
||||||
|
|
||||||
switch message.packet {
|
switch message.packet {
|
||||||
case .event(let event):
|
case .event(let event):
|
||||||
self.inboundContinuation.yield(.event(event))
|
self.inboundContinuation.yield(.event(event))
|
||||||
|
|||||||
@ -245,8 +245,8 @@ public class SDLContext {
|
|||||||
for await event in self.monitor!.eventStream {
|
for await event in self.monitor!.eventStream {
|
||||||
switch event {
|
switch event {
|
||||||
case .changed:
|
case .changed:
|
||||||
// TODO 需要重新探测网络的nat类型
|
// 需要重新探测网络的nat类型
|
||||||
//self.natType = await SDLNatProber.getNatType(udpHole: self.udpHole, config: self.config, logger: self.logger)
|
self.natType = await self.getNatType()
|
||||||
self.logger.log("didNetworkPathChanged, nat type is: \(self.natType)", level: .info)
|
self.logger.log("didNetworkPathChanged, nat type is: \(self.natType)", level: .info)
|
||||||
case .unreachable:
|
case .unreachable:
|
||||||
self.logger.log("didNetworkPathUnreachable", level: .warning)
|
self.logger.log("didNetworkPathUnreachable", level: .warning)
|
||||||
@ -411,8 +411,8 @@ public class SDLContext {
|
|||||||
case .ready:
|
case .ready:
|
||||||
await self.puncherActor.setUDPHoleActor(udpHoleActor: self.udpHoleActor)
|
await self.puncherActor.setUDPHoleActor(udpHoleActor: self.udpHoleActor)
|
||||||
// 获取当前网络的类型
|
// 获取当前网络的类型
|
||||||
//self.natType = await SDLNatProber.getNatType(udpHole: self.udpHole, config: self.config)
|
self.natType = await getNatType()
|
||||||
self.logger.log("[SDLContext] nat type is: \(self.natType)", level: .debug)
|
self.logger.log("[SDLContext] broadcast is: \(self.natType)", level: .debug)
|
||||||
|
|
||||||
case .message(let remoteAddress, let message):
|
case .message(let remoteAddress, let message):
|
||||||
switch message {
|
switch message {
|
||||||
@ -541,7 +541,7 @@ public class SDLContext {
|
|||||||
|
|
||||||
if SDLDNSClientActor.Helper.isDnsRequestPacket(ipPacket: packet) {
|
if SDLDNSClientActor.Helper.isDnsRequestPacket(ipPacket: packet) {
|
||||||
let destIp = packet.header.destination_ip
|
let destIp = packet.header.destination_ip
|
||||||
self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination)", level: .debug)
|
self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
|
||||||
await self.dnsClientActor?.forward(ipPacket: packet)
|
await self.dnsClientActor?.forward(ipPacket: packet)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -559,12 +559,10 @@ public class SDLContext {
|
|||||||
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 构造arp请求
|
self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
|
||||||
let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
|
// 构造arp广播
|
||||||
let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
||||||
await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal())
|
await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
|
||||||
|
|
||||||
self.logger.log("[SDLContext] dstIp: \(dstIp) arp query not found", level: .debug)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -585,21 +583,27 @@ public class SDLContext {
|
|||||||
dataPacket.ttl = 255
|
dataPacket.ttl = 255
|
||||||
dataPacket.data = encodedPacket
|
dataPacket.data = encodedPacket
|
||||||
|
|
||||||
// 通过session发送到对端
|
let data = try! dataPacket.serializedData()
|
||||||
if let session = await self.sessionManager.getSession(toAddress: dstMac) {
|
// 广播地址不要去尝试打洞
|
||||||
self.logger.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
if ARPPacket.isBroadcastMac(dstMac) {
|
||||||
await self.udpHoleActor?.send(type: .data, data: try! dataPacket.serializedData(), remoteAddress: session.natAddress)
|
// 通过super_node进行转发
|
||||||
await self.flowTracer.inc(num: data.count, type: .p2p)
|
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 通过super_node进行转发
|
// 通过session发送到对端
|
||||||
let superAddress = self.config.stunSocketAddress
|
if let session = await self.sessionManager.getSession(toAddress: dstMac) {
|
||||||
await self.udpHoleActor?.send(type: .data, data: try! dataPacket.serializedData(), remoteAddress: superAddress)
|
self.logger.log("[SDLContext] send packet by session: \(session)", level: .debug)
|
||||||
// 流量统计
|
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: session.natAddress)
|
||||||
await self.flowTracer.inc(num: data.count, type: .forward)
|
await self.flowTracer.inc(num: data.count, type: .p2p)
|
||||||
|
}
|
||||||
// 尝试打洞
|
else {
|
||||||
await self.puncherActor.submitRegisterRequest(request: .init(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID))
|
// 通过super_node进行转发
|
||||||
|
await self.udpHoleActor?.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
|
||||||
|
// 流量统计
|
||||||
|
await self.flowTracer.inc(num: data.count, type: .forward)
|
||||||
|
// 尝试打洞
|
||||||
|
await self.puncherActor.submitRegisterRequest(request: .init(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -702,3 +706,10 @@ extension SDLContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private extension UInt32 {
|
||||||
|
// 转换成ip地址
|
||||||
|
func asIpAddress() -> String {
|
||||||
|
return SDLUtil.int32ToIp(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -153,4 +153,14 @@ struct SDLSuperInboundMessage {
|
|||||||
case event(SDLEvent)
|
case event(SDLEvent)
|
||||||
case command(SDLCommand)
|
case command(SDLCommand)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isPong() -> Bool {
|
||||||
|
switch self.packet {
|
||||||
|
case .pong:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user