diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index b10064b..f696110 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -46,7 +46,7 @@ actor SDLContextActor { private var dnsClient: SDLDNSClient? private var dnsWorker: Task? - private var quicClient: SDLQUICClient + private var quicClient: SDLQUICClient? private var quicWorker: Task? nonisolated private let puncherActor: SDLPuncherActor @@ -101,6 +101,7 @@ actor SDLContextActor { self.startMonitor() self.loopChildWorkers.append(spawnLoop { + SDLLogger.shared.log("[SDLContext] try start quicClient") let quicClient = try await self.startQUICClient() SDLLogger.shared.log("[SDLContext] quicClient running!!!!") await quicClient.waitClose() @@ -131,13 +132,13 @@ actor SDLContextActor { private func startQUICClient() async throws -> SDLQUICClient { // 启动monitor - let quicClient = SDLQUICClient(host: "127.0.0.1", port: 1365) + let quicClient = SDLQUICClient(host: "118.178.229.213", port: 1365) quicClient.start() // 等待quic准备好 try await quicClient.waitReady() SDLLogger.shared.log("[SDLContext] start quic client ready") - + self.quicWorker = Task.detached { for await message in quicClient.receiveStream(maxLen: 86400) { SDLLogger.shared.log("[SDLContext] quic client receive message: \(message)") @@ -145,6 +146,9 @@ actor SDLContextActor { } self.quicClient = quicClient + // 注册 + self.doRegisterSuper() + return quicClient } @@ -238,44 +242,27 @@ actor SDLContextActor { SDLLogger.shared.log("[SDLContext] udp pingTask cancel") } - // 处理数据流 - let dataTask = Task.detached { - for await data in udpHole.dataStream { - if Task.isCancelled { - break - } - try? await self.handleData(data: data) - } - - SDLLogger.shared.log("[SDLContext] udp dataTask cancel") - } - - // 处理控制信号 - let signalTask = Task.detached { - for await(remoteAddress, signal) in udpHole.signalStream { + // 处理消息流 + let messageTask = Task.detached { + for await (remoteAddress, message) in udpHole.messageStream { if Task.isCancelled { break } - switch signal { - case .registerSuperAck(let registerSuperAck): - await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck) - case .registerSuperNak(let registerSuperNak): - await self.handleRegisterSuperNak(nakPacket: registerSuperNak) - case .peerInfo(let peerInfo): - await self.puncherActor.handlePeerInfo(using: udpHole, peerInfo: peerInfo) - case .event(let event): - try? await self.handleEvent(event: event) + switch message { case .stunProbeReply(let probeReply): await self.proberActor.handleProbeReply(localAddress: localAddress, reply: probeReply) case .register(let register): try? await self.handleRegister(remoteAddress: remoteAddress, register: register) case .registerAck(let registerAck): await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck) - case .policyReponse(let policyResponse): - SDLLogger.shared.log("[SDLContext] get a policyResponse: \(policyResponse.totalNum) of \(policyResponse.index), bytes: \(policyResponse.rules.count)") - // 处理权限的请求问题 - await self.identifyStore.apply(policyResponse: policyResponse) + case .data(let data): + try? await self.handleData(data: data) + +// case .policyReponse(let policyResponse): +// SDLLogger.shared.log("[SDLContext] get a policyResponse: \(policyResponse.totalNum) of \(policyResponse.index), bytes: \(policyResponse.rules.count)") +// // 处理权限的请求问题 +// await self.identifyStore.apply(policyResponse: policyResponse) } } @@ -283,7 +270,7 @@ actor SDLContextActor { } self.udpHole = udpHole - self.udpHoleWorkers = [pingTask, dataTask, signalTask] + self.udpHoleWorkers = [pingTask, messageTask] // 开始探测nat的类型 Task { @@ -292,8 +279,7 @@ actor SDLContextActor { SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)") } - // 注册 - self.doRegisterSuper() + return udpHole } @@ -383,9 +369,9 @@ actor SDLContextActor { private func handleEvent(event: SDLEvent) async throws { switch event { - case .dropMacs(let dropMacsEvent): - SDLLogger.shared.log("[SDLContext] drop macs", level: .info) - await self.arpServer.dropMacs(macs: dropMacsEvent.macs) +// case .dropMacs(let dropMacsEvent): +// SDLLogger.shared.log("[SDLContext] drop macs", level: .info) +// await self.arpServer.dropMacs(macs: dropMacsEvent.macs) case .natChanged(let natChangedEvent): let dstMac = natChangedEvent.mac SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) @@ -401,9 +387,6 @@ actor SDLContextActor { register.dstMac = sendRegisterEvent.dstMac self.udpHole?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress) } - case .refreshAuth(let refreshAuthEvent): - SDLLogger.shared.log("[SDLContext] refresh auth: \(refreshAuthEvent.networkID)", level: .info) - self.doRegisterSuper() case .networkShutdown(let shutdownEvent): let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) self.noticeClient?.send(data: alertNotice) @@ -417,7 +400,6 @@ actor SDLContextActor { private func doRegisterSuper() { // 注册 var registerSuper = SDLRegisterSuper() - registerSuper.pktID = 0 registerSuper.clientID = self.config.clientId registerSuper.networkID = self.config.networkAddress.networkId registerSuper.mac = self.config.networkAddress.mac @@ -429,7 +411,7 @@ actor SDLContextActor { if let registerSuperData = try? registerSuper.serializedData() { SDLLogger.shared.log("[SDLContext] will send register super") - self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress) + self.quicClient?.send(type: .registerSuper, data: registerSuperData) // 5秒后检查注册是否完成 Task { @@ -544,12 +526,8 @@ actor SDLContextActor { // 向服务器请求权限逻辑 if let sessionToken = self.sessionToken { var policyRequest = SDLPolicyRequest() - policyRequest.clientID = self.config.clientId - policyRequest.networkID = self.config.networkAddress.networkId - policyRequest.mac = self.config.networkAddress.mac policyRequest.srcIdentityID = data.identityID policyRequest.dstIdentityID = self.config.identityId - policyRequest.sessionToken = sessionToken await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest) } @@ -725,12 +703,8 @@ actor SDLContextActor { // 向服务器请求权限逻辑 if let sessionToken = self.sessionToken { var policyRequest = SDLPolicyRequest() - policyRequest.clientID = self.config.clientId - policyRequest.networkID = self.config.networkAddress.networkId - policyRequest.mac = self.config.networkAddress.mac policyRequest.srcIdentityID = 1234 policyRequest.dstIdentityID = self.config.identityId - policyRequest.sessionToken = sessionToken await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest) } diff --git a/Tun/Punchnet/Actors/SDLPuncherActor.swift b/Tun/Punchnet/Actors/SDLPuncherActor.swift index e88671e..f39fd1a 100644 --- a/Tun/Punchnet/Actors/SDLPuncherActor.swift +++ b/Tun/Punchnet/Actors/SDLPuncherActor.swift @@ -44,7 +44,7 @@ actor SDLPuncherActor { if self.pktId == 0 { self.pktId = 1 } - self.tryHole(using: udpHole, pktId: pktId, request: request) + //self.tryHole(using: udpHole, pktId: pktId, request: request) Task { // 启动冷却期 @@ -54,22 +54,22 @@ actor SDLPuncherActor { } } - func handlePeerInfo(using udpHole: SDLUDPHole, peerInfo: SDLPeerInfo) async { - if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) { - if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { - SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) - // 发送register包 - var register = SDLRegister() - register.networkID = request.networkId - register.srcMac = request.srcMac - register.dstMac = request.dstMac - - udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress) - } else { - SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) - } - } - } +// func handlePeerInfo(using udpHole: SDLUDPHole, peerInfo: SDLPeerInfo) async { +// if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) { +// if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { +// SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) +// // 发送register包 +// var register = SDLRegister() +// register.networkID = request.networkId +// register.srcMac = request.srcMac +// register.dstMac = request.dstMac +// +// udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress) +// } else { +// SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) +// } +// } +// } private func endCooldown(for key: Data) { self.coolingDown.remove(key) @@ -79,14 +79,14 @@ actor SDLPuncherActor { self.pendingRequests.removeValue(forKey: pktId) } - private func tryHole(using udpHole: SDLUDPHole, pktId: UInt32, request: RegisterRequest) { - var queryInfo = SDLQueryInfo() - queryInfo.pktID = pktId - queryInfo.dstMac = request.dstMac - self.pendingRequests[pktId] = request - - if let queryData = try? queryInfo.serializedData() { - udpHole.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress) - } - } +// private func tryHole(using udpHole: SDLUDPHole, pktId: UInt32, request: RegisterRequest) { +// var queryInfo = SDLQueryInfo() +// queryInfo.pktID = pktId +// queryInfo.dstMac = request.dstMac +// self.pendingRequests[pktId] = request +// +// if let queryData = try? queryInfo.serializedData() { +// udpHole.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress) +// } +// } } diff --git a/Tun/Punchnet/Actors/SDLQuicClient.swift b/Tun/Punchnet/Actors/SDLQuicClient.swift index 0a2c494..38c1878 100644 --- a/Tun/Punchnet/Actors/SDLQuicClient.swift +++ b/Tun/Punchnet/Actors/SDLQuicClient.swift @@ -35,7 +35,7 @@ final class SDLQUICClient { case .ready: self.readyCont?.resume() self.readyCont = nil - case .failed(let error): + case .failed(_): self.closeCont?.resume() self.closeCont = nil case .cancelled: @@ -52,8 +52,8 @@ final class SDLQUICClient { } } - func send(data: Data) { - transport.send(data) + func send(type: SDLPacketType, data: Data) { + self.transport.send(type: type, data: data) } func waitReady() async throws { @@ -89,12 +89,14 @@ final class SDLQUICTransport { private let connection: NWConnection init(host: String, port: UInt16) { - let params = NWParameters(quic: .init()) + let params = NWParameters(quic: .init(alpn: ["punchnet/1.0"])) self.connection = NWConnection(host: .init(host), port: .init(rawValue: port)!, using: params) } func start(queue: DispatchQueue, onEvent: @escaping (Event) -> Void) { + SDLLogger.shared.log("[SDLQUICTransport] call start") connection.stateUpdateHandler = { state in + SDLLogger.shared.log("[SDLQUICTransport] new state: \(state)") switch state { case .ready: onEvent(.ready) case .failed(let e): onEvent(.failed(e)) @@ -153,9 +155,10 @@ final class SDLQUICTransport { } } - func send(_ data: Data) { + func send(type: SDLPacketType, data: Data) { var len = UInt16(data.count).bigEndian var packet = Data(Data(bytes: &len, count: 2)) + packet.append(type.rawValue) packet.append(data) connection.send(content: packet, completion: .contentProcessed { _ in }) @@ -178,6 +181,13 @@ extension SDLQUICClient { } switch packetType { + case .welcome: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let welcome = try? SDLWelcome(serializedBytes: bytes) else { + return nil + } + return .welcome(welcome) + case .registerSuperAck: guard let bytes = buffer.readBytes(length: buffer.readableBytes), let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else { diff --git a/Tun/Punchnet/Policy/IdentityRuleMap.swift b/Tun/Punchnet/Policy/IdentityRuleMap.swift index f0bfd29..a4224bb 100644 --- a/Tun/Punchnet/Policy/IdentityRuleMap.swift +++ b/Tun/Punchnet/Policy/IdentityRuleMap.swift @@ -6,10 +6,12 @@ // struct IdentityRuleMap { + let version: UInt32 // map[proto][port] let ruleMap: [UInt8: [UInt16: Bool]] - init(ruleMap: [UInt8: [UInt16: Bool]]) { + init(version: UInt32, ruleMap: [UInt8: [UInt16: Bool]]) { + self.version = version self.ruleMap = ruleMap } diff --git a/Tun/Punchnet/Policy/IdentityStore.swift b/Tun/Punchnet/Policy/IdentityStore.swift index 157135b..abc8288 100644 --- a/Tun/Punchnet/Policy/IdentityStore.swift +++ b/Tun/Punchnet/Policy/IdentityStore.swift @@ -7,58 +7,6 @@ import Foundation import NIO -final class IdentitySession { - var version: UInt32 - var totalNum: UInt32 - private var parts: [UInt32: SDLPolicyResponse] = [:] - - init(part: SDLPolicyResponse) { - self.version = part.version - self.totalNum = part.totalNum - self.parts[part.index] = part - } - - func merge(part: SDLPolicyResponse) { - if part.version < version { - // 低版本数据丢弃 - } else if part.version == version { - self.parts[part.index] = part - } else { - self.parts.removeAll() - self.parts[part.index] = part - } - } - - func process() -> Data? { - // parts是连续的,从0开始,并且数量等于total_num - let indexs = parts.keys.sorted().map { UInt32($0) } - guard indexs.count == self.totalNum && isContinuousFromZero(indexs: indexs) else { - return nil - } - - var rulesData: Data = Data() - for i in 0.. Bool { - guard !indexs.isEmpty else { - return false - } - - return indexs.enumerated().allSatisfy { idx, value in - idx == value - } - } - -} - actor IdentityStore { typealias IdentityID = UInt32 @@ -66,7 +14,6 @@ actor IdentityStore { private let publisher: SnapshotPublisher private var identityMap: [IdentityID: IdentityRuleMap] = [:] - private var sessions: [IdentityID: IdentitySession] = [:] init(publisher: SnapshotPublisher) { self.publisher = publisher @@ -74,33 +21,29 @@ actor IdentityStore { func apply(policyResponse: SDLPolicyResponse) { let id = policyResponse.srcIdentityID - let session = self.sessions[id, default: IdentitySession(part: policyResponse)] - session.merge(part: policyResponse) + let version = policyResponse.version + + guard self.identityMap[id] == nil || ((self.identityMap[id]?.version ?? 0) < version) else { + return + } // 判断一下是否接受完成 - if let rulesData = session.process() { - var buffer = alloctor.buffer(bytes: rulesData) - var ruleMap: [UInt8: [UInt16: Bool]] = [:] - while true { - guard let proto = buffer.readInteger(endianness: .big, as: UInt8.self), - let port = buffer.readInteger(endianness: .big, as: UInt16.self) else { - break - } - ruleMap[proto, default: [:]][port] = true + var buffer = alloctor.buffer(bytes: policyResponse.rules) + var ruleMap: [UInt8: [UInt16: Bool]] = [:] + while true { + guard let proto = buffer.readInteger(endianness: .big, as: UInt8.self), + let port = buffer.readInteger(endianness: .big, as: UInt16.self) else { + break } - self.identityMap[id] = IdentityRuleMap(ruleMap: ruleMap) - - // 删除当前的session信息 - self.sessions.removeValue(forKey: id) - - SDLLogger.shared.log("[IdentitySession] get compile Snapshot rules nums: \(self.identityMap[id]?.ruleMap.count), success: \(self.identityMap[id]?.isAllow(proto: 1, port: 80))") - - // 发布新的快照信息 - let snapshot = compileSnapshot() - publisher.publish(snapshot) - } else { - self.sessions[id] = session + ruleMap[proto, default: [:]][port] = true } + self.identityMap[id] = IdentityRuleMap(version: version, ruleMap: ruleMap) + + SDLLogger.shared.log("[IdentitySession] get compile Snapshot rules nums: \(self.identityMap[id]?.ruleMap.count), success: \(self.identityMap[id]?.isAllow(proto: 1, port: 80))") + + // 发布新的快照信息 + let snapshot = compileSnapshot() + publisher.publish(snapshot) } private func compileSnapshot() -> IdentitySnapshot { diff --git a/Tun/Punchnet/SDLMessage.pb.swift b/Tun/Punchnet/SDLMessage.pb.swift index 9815000..4eacda7 100644 --- a/Tun/Punchnet/SDLMessage.pb.swift +++ b/Tun/Punchnet/SDLMessage.pb.swift @@ -78,6 +78,8 @@ struct SDLEmpty: Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -89,6 +91,8 @@ struct SDLRegisterSuper: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var clientID: String = String() /// 网络地址信息已经有https请求分配了 @@ -121,6 +125,8 @@ struct SDLRegisterSuperAck: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var aesKey: Data = Data() var sessionToken: Data = Data() @@ -135,6 +141,8 @@ struct SDLRegisterSuperNak: Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var errorCode: UInt32 = 0 var errorMessage: String = String() @@ -149,6 +157,8 @@ struct SDLQueryInfo: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var dstMac: Data = Data() var unknownFields = SwiftProtobuf.UnknownStorage() @@ -161,6 +171,8 @@ struct SDLPeerInfo: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var dstMac: Data = Data() var v4Info: SDLV4Info { @@ -197,6 +209,8 @@ struct SDLArpRequest: Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var targetIp: UInt32 = 0 var unknownFields = SwiftProtobuf.UnknownStorage() @@ -209,6 +223,8 @@ struct SDLArpResponse: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var targetIp: UInt32 = 0 var targetMac: Data = Data() @@ -224,6 +240,8 @@ struct SDLPolicyRequest: Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var srcIdentityID: UInt32 = 0 var dstIdentityID: UInt32 = 0 @@ -241,6 +259,8 @@ struct SDLPolicyResponse: @unchecked Sendable { // `Message` and `Message+*Additions` files in the SwiftProtobuf library for // methods supported on all messages. + var pktID: UInt32 = 0 + var srcIdentityID: UInt32 = 0 var dstIdentityID: UInt32 = 0 @@ -338,6 +358,8 @@ struct SDLStunRequest: @unchecked Sendable { /// Clears the value of `v6Info`. Subsequent reads from it will return its default value. mutating func clearV6Info() {self._v6Info = nil} + var sessionToken: Data = Data() + var unknownFields = SwiftProtobuf.UnknownStorage() init() {} @@ -589,34 +611,8 @@ extension SDLWelcome: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio extension SDLEmpty: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLEmpty" - static let _protobuf_nameMap = SwiftProtobuf._NameMap() - - mutating func decodeMessage(decoder: inout D) throws { - // Load everything into unknown fields - while try decoder.nextFieldNumber() != nil {} - } - - func traverse(visitor: inout V) throws { - try unknownFields.traverse(visitor: &visitor) - } - - static func ==(lhs: SDLEmpty, rhs: SDLEmpty) -> Bool { - if lhs.unknownFields != rhs.unknownFields {return false} - return true - } -} - -extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { - static let protoMessageName: String = "SDLRegisterSuper" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "client_id"), - 2: .standard(proto: "network_id"), - 3: .same(proto: "mac"), - 4: .same(proto: "ip"), - 5: .standard(proto: "mask_len"), - 6: .same(proto: "hostname"), - 7: .standard(proto: "pub_key"), - 8: .standard(proto: "access_token"), + 1: .standard(proto: "pkt_id"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -625,48 +621,93 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularStringField(value: &self.clientID) }() - case 2: try { try decoder.decodeSingularUInt32Field(value: &self.networkID) }() - case 3: try { try decoder.decodeSingularBytesField(value: &self.mac) }() - case 4: try { try decoder.decodeSingularUInt32Field(value: &self.ip) }() - case 5: try { try decoder.decodeSingularUInt32Field(value: &self.maskLen) }() - case 6: try { try decoder.decodeSingularStringField(value: &self.hostname) }() - case 7: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() - case 8: try { try decoder.decodeSingularStringField(value: &self.accessToken) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + static func ==(lhs: SDLEmpty, rhs: SDLEmpty) -> Bool { + if lhs.pktID != rhs.pktID {return false} + if lhs.unknownFields != rhs.unknownFields {return false} + return true + } +} + +extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = "SDLRegisterSuper" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "client_id"), + 3: .standard(proto: "network_id"), + 4: .same(proto: "mac"), + 5: .same(proto: "ip"), + 6: .standard(proto: "mask_len"), + 7: .same(proto: "hostname"), + 8: .standard(proto: "pub_key"), + 9: .standard(proto: "access_token"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + // The use of inline closures is to circumvent an issue where the compiler + // allocates stack space for every case branch when no optimizations are + // enabled. https://github.com/apple/swift-protobuf/issues/1034 + switch fieldNumber { + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularStringField(value: &self.clientID) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.networkID) }() + case 4: try { try decoder.decodeSingularBytesField(value: &self.mac) }() + case 5: try { try decoder.decodeSingularUInt32Field(value: &self.ip) }() + case 6: try { try decoder.decodeSingularUInt32Field(value: &self.maskLen) }() + case 7: try { try decoder.decodeSingularStringField(value: &self.hostname) }() + case 8: try { try decoder.decodeSingularStringField(value: &self.pubKey) }() + case 9: try { try decoder.decodeSingularStringField(value: &self.accessToken) }() + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if !self.clientID.isEmpty { - try visitor.visitSingularStringField(value: self.clientID, fieldNumber: 1) + try visitor.visitSingularStringField(value: self.clientID, fieldNumber: 2) } if self.networkID != 0 { - try visitor.visitSingularUInt32Field(value: self.networkID, fieldNumber: 2) + try visitor.visitSingularUInt32Field(value: self.networkID, fieldNumber: 3) } if !self.mac.isEmpty { - try visitor.visitSingularBytesField(value: self.mac, fieldNumber: 3) + try visitor.visitSingularBytesField(value: self.mac, fieldNumber: 4) } if self.ip != 0 { - try visitor.visitSingularUInt32Field(value: self.ip, fieldNumber: 4) + try visitor.visitSingularUInt32Field(value: self.ip, fieldNumber: 5) } if self.maskLen != 0 { - try visitor.visitSingularUInt32Field(value: self.maskLen, fieldNumber: 5) + try visitor.visitSingularUInt32Field(value: self.maskLen, fieldNumber: 6) } if !self.hostname.isEmpty { - try visitor.visitSingularStringField(value: self.hostname, fieldNumber: 6) + try visitor.visitSingularStringField(value: self.hostname, fieldNumber: 7) } if !self.pubKey.isEmpty { - try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 7) + try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 8) } if !self.accessToken.isEmpty { - try visitor.visitSingularStringField(value: self.accessToken, fieldNumber: 8) + try visitor.visitSingularStringField(value: self.accessToken, fieldNumber: 9) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLRegisterSuper, rhs: SDLRegisterSuper) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.clientID != rhs.clientID {return false} if lhs.networkID != rhs.networkID {return false} if lhs.mac != rhs.mac {return false} @@ -683,8 +724,9 @@ extension SDLRegisterSuper: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme extension SDLRegisterSuperAck: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLRegisterSuperAck" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "aes_key"), - 2: .standard(proto: "session_token"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "aes_key"), + 3: .standard(proto: "session_token"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -693,24 +735,29 @@ extension SDLRegisterSuperAck: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularBytesField(value: &self.aesKey) }() - case 2: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.aesKey) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if !self.aesKey.isEmpty { - try visitor.visitSingularBytesField(value: self.aesKey, fieldNumber: 1) + try visitor.visitSingularBytesField(value: self.aesKey, fieldNumber: 2) } if !self.sessionToken.isEmpty { - try visitor.visitSingularBytesField(value: self.sessionToken, fieldNumber: 2) + try visitor.visitSingularBytesField(value: self.sessionToken, fieldNumber: 3) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLRegisterSuperAck, rhs: SDLRegisterSuperAck) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.aesKey != rhs.aesKey {return false} if lhs.sessionToken != rhs.sessionToken {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -721,8 +768,9 @@ extension SDLRegisterSuperAck: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl extension SDLRegisterSuperNak: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLRegisterSuperNak" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "error_code"), - 2: .standard(proto: "error_message"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "error_code"), + 3: .standard(proto: "error_message"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -731,24 +779,29 @@ extension SDLRegisterSuperNak: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.errorCode) }() - case 2: try { try decoder.decodeSingularStringField(value: &self.errorMessage) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.errorCode) }() + case 3: try { try decoder.decodeSingularStringField(value: &self.errorMessage) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if self.errorCode != 0 { - try visitor.visitSingularUInt32Field(value: self.errorCode, fieldNumber: 1) + try visitor.visitSingularUInt32Field(value: self.errorCode, fieldNumber: 2) } if !self.errorMessage.isEmpty { - try visitor.visitSingularStringField(value: self.errorMessage, fieldNumber: 2) + try visitor.visitSingularStringField(value: self.errorMessage, fieldNumber: 3) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLRegisterSuperNak, rhs: SDLRegisterSuperNak) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.errorCode != rhs.errorCode {return false} if lhs.errorMessage != rhs.errorMessage {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -759,7 +812,8 @@ extension SDLRegisterSuperNak: SwiftProtobuf.Message, SwiftProtobuf._MessageImpl extension SDLQueryInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLQueryInfo" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "dst_mac"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "dst_mac"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -768,20 +822,25 @@ extension SDLQueryInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularBytesField(value: &self.dstMac) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.dstMac) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if !self.dstMac.isEmpty { - try visitor.visitSingularBytesField(value: self.dstMac, fieldNumber: 1) + try visitor.visitSingularBytesField(value: self.dstMac, fieldNumber: 2) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLQueryInfo, rhs: SDLQueryInfo) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.dstMac != rhs.dstMac {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -791,9 +850,10 @@ extension SDLQueryInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLPeerInfo" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "dst_mac"), - 2: .standard(proto: "v4_info"), - 3: .standard(proto: "v6_info"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "dst_mac"), + 3: .standard(proto: "v4_info"), + 4: .standard(proto: "v6_info"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -802,9 +862,10 @@ extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularBytesField(value: &self.dstMac) }() - case 2: try { try decoder.decodeSingularMessageField(value: &self._v4Info) }() - case 3: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularBytesField(value: &self.dstMac) }() + case 3: try { try decoder.decodeSingularMessageField(value: &self._v4Info) }() + case 4: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }() default: break } } @@ -815,19 +876,23 @@ extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati // allocates stack space for every if/case branch local when no optimizations // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and // https://github.com/apple/swift-protobuf/issues/1182 + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if !self.dstMac.isEmpty { - try visitor.visitSingularBytesField(value: self.dstMac, fieldNumber: 1) + try visitor.visitSingularBytesField(value: self.dstMac, fieldNumber: 2) } try { if let v = self._v4Info { - try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) } }() try { if let v = self._v6Info { - try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) } }() try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLPeerInfo, rhs: SDLPeerInfo) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.dstMac != rhs.dstMac {return false} if lhs._v4Info != rhs._v4Info {return false} if lhs._v6Info != rhs._v6Info {return false} @@ -839,7 +904,8 @@ extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati extension SDLArpRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLArpRequest" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "target_ip"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "target_ip"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -848,20 +914,25 @@ extension SDLArpRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.targetIp) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.targetIp) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if self.targetIp != 0 { - try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 1) + try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 2) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLArpRequest, rhs: SDLArpRequest) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.targetIp != rhs.targetIp {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true @@ -871,8 +942,9 @@ extension SDLArpRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa extension SDLArpResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLArpResponse" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "target_ip"), - 2: .standard(proto: "target_mac"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "target_ip"), + 3: .standard(proto: "target_mac"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -881,24 +953,29 @@ extension SDLArpResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.targetIp) }() - case 2: try { try decoder.decodeSingularBytesField(value: &self.targetMac) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.targetIp) }() + case 3: try { try decoder.decodeSingularBytesField(value: &self.targetMac) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if self.targetIp != 0 { - try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 1) + try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 2) } if !self.targetMac.isEmpty { - try visitor.visitSingularBytesField(value: self.targetMac, fieldNumber: 2) + try visitor.visitSingularBytesField(value: self.targetMac, fieldNumber: 3) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLArpResponse, rhs: SDLArpResponse) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.targetIp != rhs.targetIp {return false} if lhs.targetMac != rhs.targetMac {return false} if lhs.unknownFields != rhs.unknownFields {return false} @@ -909,9 +986,10 @@ extension SDLArpResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement extension SDLPolicyRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLPolicyRequest" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "src_identity_id"), - 2: .standard(proto: "dst_identity_id"), - 3: .same(proto: "version"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "src_identity_id"), + 3: .standard(proto: "dst_identity_id"), + 4: .same(proto: "version"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -920,28 +998,33 @@ extension SDLPolicyRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() - case 2: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() - case 3: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if self.srcIdentityID != 0 { - try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 1) + try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 2) } if self.dstIdentityID != 0 { - try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 2) + try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 3) } if self.version != 0 { - try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 3) + try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 4) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLPolicyRequest, rhs: SDLPolicyRequest) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.srcIdentityID != rhs.srcIdentityID {return false} if lhs.dstIdentityID != rhs.dstIdentityID {return false} if lhs.version != rhs.version {return false} @@ -953,10 +1036,11 @@ extension SDLPolicyRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImpleme extension SDLPolicyResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { static let protoMessageName: String = "SDLPolicyResponse" static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ - 1: .standard(proto: "src_identity_id"), - 2: .standard(proto: "dst_identity_id"), - 3: .same(proto: "version"), - 4: .same(proto: "rules"), + 1: .standard(proto: "pkt_id"), + 2: .standard(proto: "src_identity_id"), + 3: .standard(proto: "dst_identity_id"), + 4: .same(proto: "version"), + 5: .same(proto: "rules"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -965,32 +1049,37 @@ extension SDLPolicyResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplem // allocates stack space for every case branch when no optimizations are // enabled. https://github.com/apple/swift-protobuf/issues/1034 switch fieldNumber { - case 1: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() - case 2: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() - case 3: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() - case 4: try { try decoder.decodeSingularBytesField(value: &self.rules) }() + case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }() + case 2: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() + case 3: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() + case 4: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() + case 5: try { try decoder.decodeSingularBytesField(value: &self.rules) }() default: break } } } func traverse(visitor: inout V) throws { + if self.pktID != 0 { + try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1) + } if self.srcIdentityID != 0 { - try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 1) + try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 2) } if self.dstIdentityID != 0 { - try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 2) + try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 3) } if self.version != 0 { - try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 3) + try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 4) } if !self.rules.isEmpty { - try visitor.visitSingularBytesField(value: self.rules, fieldNumber: 4) + try visitor.visitSingularBytesField(value: self.rules, fieldNumber: 5) } try unknownFields.traverse(visitor: &visitor) } static func ==(lhs: SDLPolicyResponse, rhs: SDLPolicyResponse) -> Bool { + if lhs.pktID != rhs.pktID {return false} if lhs.srcIdentityID != rhs.srcIdentityID {return false} if lhs.dstIdentityID != rhs.dstIdentityID {return false} if lhs.version != rhs.version {return false} @@ -1140,6 +1229,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement 5: .same(proto: "ip"), 6: .standard(proto: "nat_type"), 7: .standard(proto: "v6_info"), + 8: .standard(proto: "session_token"), ] mutating func decodeMessage(decoder: inout D) throws { @@ -1155,6 +1245,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement case 5: try { try decoder.decodeSingularUInt32Field(value: &self.ip) }() case 6: try { try decoder.decodeSingularUInt32Field(value: &self.natType) }() case 7: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }() + case 8: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }() default: break } } @@ -1186,6 +1277,9 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement try { if let v = self._v6Info { try visitor.visitSingularMessageField(value: v, fieldNumber: 7) } }() + if !self.sessionToken.isEmpty { + try visitor.visitSingularBytesField(value: self.sessionToken, fieldNumber: 8) + } try unknownFields.traverse(visitor: &visitor) } @@ -1197,6 +1291,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement if lhs.ip != rhs.ip {return false} if lhs.natType != rhs.natType {return false} if lhs._v6Info != rhs._v6Info {return false} + if lhs.sessionToken != rhs.sessionToken {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Tun/Punchnet/SDLMessage.swift b/Tun/Punchnet/SDLMessage.swift index f284f1d..7129aec 100644 --- a/Tun/Punchnet/SDLMessage.swift +++ b/Tun/Punchnet/SDLMessage.swift @@ -36,6 +36,9 @@ enum SDLPacketType: UInt8 { case policyRequest = 0xb0 case policyResponse = 0xb1 + // 获取欢迎消息 + case welcome = 0x4F + case data = 0xFF } @@ -93,6 +96,9 @@ extension SDLStunProbeReply { // --MARK: 进来的消息, 这里需要采用代数类型来表示 enum SDLHoleMessage { case data(SDLData) + case register(SDLRegister) + case registerAck(SDLRegisterAck) + case stunProbeReply(SDLStunProbeReply) } enum SDLQUICInboundMessage { @@ -105,12 +111,6 @@ enum SDLQUICInboundMessage { case peerInfo(SDLPeerInfo) case event(SDLEvent) - - case stunProbeReply(SDLStunProbeReply) - - //case register(SDLRegister) - //case registerAck(SDLRegisterAck) - case policyReponse(SDLPolicyResponse) } diff --git a/Tun/Punchnet/SDLUDPHole.swift b/Tun/Punchnet/SDLUDPHole.swift index e3c3a2a..02b8b8e 100644 --- a/Tun/Punchnet/SDLUDPHole.swift +++ b/Tun/Punchnet/SDLUDPHole.swift @@ -25,11 +25,8 @@ final class SDLUDPHole: ChannelInboundHandler { private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private var channel: Channel? - public let signalStream: AsyncStream<(SocketAddress, SDLHoleSignal)> - private let signalContinuation: AsyncStream<(SocketAddress, SDLHoleSignal)>.Continuation - - public let dataStream: AsyncStream - private let dataContinuation: AsyncStream.Continuation + public let messageStream: AsyncStream<(SocketAddress, SDLHoleMessage)> + private let messageContinuation: AsyncStream<(SocketAddress, SDLHoleMessage)>.Continuation // 解决channelready的问题 private var cont: CheckedContinuation? @@ -42,8 +39,7 @@ final class SDLUDPHole: ChannelInboundHandler { // 启动函数 init() throws { - (self.signalStream, self.signalContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleSignal).self, bufferingPolicy: .unbounded) - (self.dataStream, self.dataContinuation) = AsyncStream.makeStream(of: SDLData.self, bufferingPolicy: .unbounded) + (self.messageStream, self.messageContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleMessage).self, bufferingPolicy: .unbounded) } func start() throws { @@ -90,12 +86,7 @@ final class SDLUDPHole: ChannelInboundHandler { let remoteAddress = envelope.remoteAddress do { if let message = try decode(buffer: &buffer) { - switch message { - case .data(let data): - self.dataContinuation.yield(data) - case .signal(let signal): - self.signalContinuation.yield((remoteAddress, signal)) - } + self.messageContinuation.yield((remoteAddress, message)) } else { SDLLogger.shared.log("[SDLUDPHole] decode message, get null", level: .warning) } @@ -105,9 +96,7 @@ final class SDLUDPHole: ChannelInboundHandler { } func channelInactive(context: ChannelHandlerContext) { - self.signalContinuation.finish() - self.dataContinuation.finish() - + self.messageContinuation.finish() context.close(promise: nil) } @@ -157,84 +146,19 @@ final class SDLUDPHole: ChannelInboundHandler { let registerPacket = try? SDLRegister(serializedBytes: bytes) else { return nil } - return .signal(.register(registerPacket)) + return .register(registerPacket) case .registerAck: guard let bytes = buffer.readBytes(length: buffer.readableBytes), let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { return nil } - return .signal(.registerAck(registerAck)) + return .registerAck(registerAck) case .stunProbeReply: guard let bytes = buffer.readBytes(length: buffer.readableBytes), let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { return nil } - return .signal(.stunProbeReply(stunProbeReply)) - case .registerSuperAck: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else { - return nil - } - return .signal(.registerSuperAck(registerSuperAck)) - case .registerSuperNak: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerSuperNak = try? SDLRegisterSuperNak(serializedBytes: bytes) else { - return nil - } - return .signal(.registerSuperNak(registerSuperNak)) - case .peerInfo: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let peerInfo = try? SDLPeerInfo(serializedBytes: bytes) else { - return nil - } - return .signal(.peerInfo(peerInfo)) - case .policyResponse: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let policyResponse = try? SDLPolicyResponse(serializedBytes: bytes) else { - return nil - } - return .signal(.policyReponse(policyResponse)) - case .event: - guard let eventVal = buffer.readInteger(as: UInt8.self), - let event = SDLEventType(rawValue: eventVal), - let bytes = buffer.readBytes(length: buffer.readableBytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 15") - return nil - } - - switch event { - case .dropMacs: - guard let dropMacsEvent = try? SDLDropMacsEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 16") - return nil - } - return .signal(.event(.dropMacs(dropMacsEvent))) - - case .natChanged: - guard let natChangedEvent = try? SDLNatChangedEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 16") - return nil - } - return .signal(.event(.natChanged(natChangedEvent))) - case .sendRegister: - guard let sendRegisterEvent = try? SDLSendRegisterEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 17") - return nil - } - return .signal(.event(.sendRegister(sendRegisterEvent))) - case .refreshAuth: - guard let refreshAuthEvent = try? SDLRefreshAuthEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 17") - return nil - } - return .signal(.event(.refreshAuth(refreshAuthEvent))) - case .networkShutdown: - guard let networkShutdownEvent = try? SDLNetworkShutdownEvent(serializedBytes: bytes) else { - SDLLogger.shared.log("[SDLUDPHole] decode error 18") - return nil - } - return .signal(.event(.networkShutdown(networkShutdownEvent))) - } + return .stunProbeReply(stunProbeReply) default: SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)")