From aa26d6586975e880a50f30563a68309089991cb3 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 8 Jan 2026 11:43:36 +0800 Subject: [PATCH] fix --- Tun/Punchnet/ARPPacket.swift | 6 ++ Tun/Punchnet/Actors/SDLSuperClientActor.swift | 5 +- Tun/Punchnet/SDLContext.swift | 57 +++++++++++-------- Tun/Punchnet/SDLMessage.swift | 10 ++++ 4 files changed, 54 insertions(+), 24 deletions(-) diff --git a/Tun/Punchnet/ARPPacket.swift b/Tun/Punchnet/ARPPacket.swift index fa618d2..4694f15 100644 --- a/Tun/Punchnet/ARPPacket.swift +++ b/Tun/Punchnet/ARPPacket.swift @@ -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 { diff --git a/Tun/Punchnet/Actors/SDLSuperClientActor.swift b/Tun/Punchnet/Actors/SDLSuperClientActor.swift index 003fe54..692c66e 100644 --- a/Tun/Punchnet/Actors/SDLSuperClientActor.swift +++ b/Tun/Punchnet/Actors/SDLSuperClientActor.swift @@ -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)) diff --git a/Tun/Punchnet/SDLContext.swift b/Tun/Punchnet/SDLContext.swift index 87f1e9e..1ffbeae 100644 --- a/Tun/Punchnet/SDLContext.swift +++ b/Tun/Punchnet/SDLContext.swift @@ -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) + } +} diff --git a/Tun/Punchnet/SDLMessage.swift b/Tun/Punchnet/SDLMessage.swift index 9293a29..888eb2a 100644 --- a/Tun/Punchnet/SDLMessage.swift +++ b/Tun/Punchnet/SDLMessage.swift @@ -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 + } + } + }