diff --git a/Tun/Context/SDLContextActor.swift b/Tun/Context/SDLContextActor.swift index 0e22286..5babd19 100644 --- a/Tun/Context/SDLContextActor.swift +++ b/Tun/Context/SDLContextActor.swift @@ -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 + } + } } diff --git a/Tun/UDPHole/SDLUDPHoleService.swift b/Tun/UDPHole/SDLUDPHoleService.swift index 4c45951..1941124 100644 --- a/Tun/UDPHole/SDLUDPHoleService.swift +++ b/Tun/UDPHole/SDLUDPHoleService.swift @@ -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) } diff --git a/Tun/UDPHole/SDLUDPHoleSession.swift b/Tun/UDPHole/SDLUDPHoleSession.swift index eac83bb..9938f3f 100644 --- a/Tun/UDPHole/SDLUDPHoleSession.swift +++ b/Tun/UDPHole/SDLUDPHoleSession.swift @@ -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) diff --git a/Tun/UDPHoleV6/SDLUDPHoleV6Session.swift b/Tun/UDPHoleV6/SDLUDPHoleV6Session.swift index eaeef15..a51949d 100644 --- a/Tun/UDPHoleV6/SDLUDPHoleV6Session.swift +++ b/Tun/UDPHoleV6/SDLUDPHoleV6Session.swift @@ -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) }