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