This commit is contained in:
anlicheng 2026-01-08 11:43:36 +08:00
parent abfc35aa7d
commit aa26d65869
4 changed files with 54 additions and 24 deletions

View File

@ -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 {

View File

@ -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))

View File

@ -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)
}
}

View File

@ -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
}
}
} }