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