fix
This commit is contained in:
parent
0c31f1425a
commit
69815ab701
@ -644,25 +644,25 @@ extension SDLContextActor {
|
||||
case .natType(let natType):
|
||||
self.setNatType(natType: natType)
|
||||
SDLLogger.log("[SDLContext] nat_type is: \(natType)")
|
||||
case .packet(let remoteAddress, let message, let source):
|
||||
await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message, source: source)
|
||||
case .packet(let remoteAddress, let message):
|
||||
await self.handleUDPHolePacket(remoteAddress: remoteAddress, message: message)
|
||||
case .closed(let error):
|
||||
SDLLogger.log("[SDLContext] udpHole closed: \(error)", for: .debug)
|
||||
}
|
||||
}
|
||||
|
||||
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleControlMessage, source: SDLUDPHoleKind) async {
|
||||
private func handleUDPHolePacket(remoteAddress: SocketAddress, message: SDLHoleControlMessage) async {
|
||||
switch message {
|
||||
case .stunReply(_), .stunProbeReply(_):
|
||||
SDLLogger.log("[SDLContext] get a stun reply", for: .debug)
|
||||
case .register(let register):
|
||||
try? await self.handleRegister(remoteAddress: remoteAddress, register: register, source: source)
|
||||
try? await self.handleRegister(remoteAddress: remoteAddress, register: register)
|
||||
case .registerAck(let registerAck):
|
||||
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck, source: source)
|
||||
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
|
||||
}
|
||||
}
|
||||
|
||||
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister, source: SDLUDPHoleKind) async throws {
|
||||
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) async throws {
|
||||
let networkAddr = config.networkAddress
|
||||
SDLLogger.log("[SDLContext] register packet: \(register), network_address: \(networkAddr)")
|
||||
|
||||
@ -676,7 +676,8 @@ extension SDLContextActor {
|
||||
|
||||
await self.sendPeerPacket(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
|
||||
// 这里需要建立到来源的会话, 在复杂网络下,通过super-node查询到的nat地址不一定靠谱,需要通过udp包的来源地址作为nat地址
|
||||
if let session = Session(dstMac: register.srcMac, natAddress: remoteAddress, addressType: source.convertAddressType()) {
|
||||
if let addressType = Self.addressType(from: remoteAddress),
|
||||
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress, addressType: addressType) {
|
||||
await self.sessionManager.addSession(session: session)
|
||||
} else {
|
||||
SDLLogger.log("[SDLContext] didReadRegister get unsupported remoteAddress: \(remoteAddress)", for: .debug)
|
||||
@ -686,11 +687,12 @@ extension SDLContextActor {
|
||||
}
|
||||
}
|
||||
|
||||
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck, source: SDLUDPHoleKind) async {
|
||||
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
|
||||
// 判断目标地址是否是tun的网卡地址, 并且是在同一个网络下
|
||||
let networkAddr = config.networkAddress
|
||||
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
|
||||
if let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress, addressType: source.convertAddressType()) {
|
||||
if let addressType = Self.addressType(from: remoteAddress),
|
||||
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress, addressType: addressType) {
|
||||
await self.sessionManager.addSession(session: session)
|
||||
} else {
|
||||
SDLLogger.log("[SDLContext] didReadRegisterAck get unsupported remoteAddress: \(remoteAddress)", for: .debug)
|
||||
@ -699,6 +701,17 @@ extension SDLContextActor {
|
||||
SDLLogger.log("[SDLContext] didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)")
|
||||
}
|
||||
}
|
||||
|
||||
private static func addressType(from remoteAddress: SocketAddress) -> Session.AddressType? {
|
||||
switch remoteAddress {
|
||||
case .v4:
|
||||
return .v4
|
||||
case .v6:
|
||||
return .v6
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -1,25 +1,11 @@
|
||||
import Foundation
|
||||
import NIOCore
|
||||
|
||||
enum SDLUDPHoleKind: Equatable {
|
||||
case v4
|
||||
case v6
|
||||
|
||||
func convertAddressType() -> Session.AddressType {
|
||||
switch self {
|
||||
case .v4:
|
||||
return .v4
|
||||
case .v6:
|
||||
return .v6
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
actor SDLUDPHoleService {
|
||||
enum Event {
|
||||
case ready(SocketAddress)
|
||||
case natType(SDLNATProberActor.NatType)
|
||||
case packet(SocketAddress, SDLHoleControlMessage, source: SDLUDPHoleKind)
|
||||
case packet(SocketAddress, SDLHoleControlMessage)
|
||||
case closed(Error)
|
||||
}
|
||||
|
||||
|
||||
@ -120,7 +120,7 @@ actor SDLUDPHoleSession {
|
||||
case .stunProbeReply(let probeReply):
|
||||
await self.proberActor.handleProbeReply(localAddress: self.localAddress, reply: probeReply)
|
||||
default:
|
||||
await self.onEvent(.packet(remoteAddress, control, source: .v4))
|
||||
await self.onEvent(.packet(remoteAddress, control))
|
||||
}
|
||||
case .data(let data):
|
||||
await self.onData(data)
|
||||
|
||||
@ -40,7 +40,7 @@ actor SDLUDPHoleV6Session {
|
||||
try Task.checkCancellation()
|
||||
switch message {
|
||||
case .control(let control):
|
||||
await onEvent(.packet(remoteAddress, control, source: .v6))
|
||||
await onEvent(.packet(remoteAddress, control))
|
||||
case .data(let data):
|
||||
await onData(data)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user