This commit is contained in:
anlicheng 2026-02-15 00:34:40 +08:00
parent 78dc345d8b
commit d8c6eb67a6
8 changed files with 294 additions and 346 deletions

View File

@ -46,7 +46,7 @@ actor SDLContextActor {
private var dnsClient: SDLDNSClient? private var dnsClient: SDLDNSClient?
private var dnsWorker: Task<Void, Never>? private var dnsWorker: Task<Void, Never>?
private var quicClient: SDLQUICClient private var quicClient: SDLQUICClient?
private var quicWorker: Task<Void, Never>? private var quicWorker: Task<Void, Never>?
nonisolated private let puncherActor: SDLPuncherActor nonisolated private let puncherActor: SDLPuncherActor
@ -101,6 +101,7 @@ actor SDLContextActor {
self.startMonitor() self.startMonitor()
self.loopChildWorkers.append(spawnLoop { self.loopChildWorkers.append(spawnLoop {
SDLLogger.shared.log("[SDLContext] try start quicClient")
let quicClient = try await self.startQUICClient() let quicClient = try await self.startQUICClient()
SDLLogger.shared.log("[SDLContext] quicClient running!!!!") SDLLogger.shared.log("[SDLContext] quicClient running!!!!")
await quicClient.waitClose() await quicClient.waitClose()
@ -131,7 +132,7 @@ actor SDLContextActor {
private func startQUICClient() async throws -> SDLQUICClient { private func startQUICClient() async throws -> SDLQUICClient {
// monitor // monitor
let quicClient = SDLQUICClient(host: "127.0.0.1", port: 1365) let quicClient = SDLQUICClient(host: "118.178.229.213", port: 1365)
quicClient.start() quicClient.start()
// quic // quic
@ -145,6 +146,9 @@ actor SDLContextActor {
} }
self.quicClient = quicClient self.quicClient = quicClient
//
self.doRegisterSuper()
return quicClient return quicClient
} }
@ -238,44 +242,27 @@ actor SDLContextActor {
SDLLogger.shared.log("[SDLContext] udp pingTask cancel") SDLLogger.shared.log("[SDLContext] udp pingTask cancel")
} }
// //
let dataTask = Task.detached { let messageTask = Task.detached {
for await data in udpHole.dataStream { for await (remoteAddress, message) in udpHole.messageStream {
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 {
if Task.isCancelled { if Task.isCancelled {
break break
} }
switch signal { switch message {
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)
case .stunProbeReply(let probeReply): case .stunProbeReply(let probeReply):
await self.proberActor.handleProbeReply(localAddress: localAddress, reply: probeReply) await self.proberActor.handleProbeReply(localAddress: localAddress, reply: probeReply)
case .register(let register): case .register(let register):
try? await self.handleRegister(remoteAddress: remoteAddress, register: register) try? await self.handleRegister(remoteAddress: remoteAddress, register: register)
case .registerAck(let registerAck): case .registerAck(let registerAck):
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck) await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
case .policyReponse(let policyResponse): case .data(let data):
SDLLogger.shared.log("[SDLContext] get a policyResponse: \(policyResponse.totalNum) of \(policyResponse.index), bytes: \(policyResponse.rules.count)") try? await self.handleData(data: data)
//
await self.identifyStore.apply(policyResponse: policyResponse) // 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.udpHole = udpHole
self.udpHoleWorkers = [pingTask, dataTask, signalTask] self.udpHoleWorkers = [pingTask, messageTask]
// nat // nat
Task { Task {
@ -292,8 +279,7 @@ actor SDLContextActor {
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)") SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)")
} }
//
self.doRegisterSuper()
return udpHole return udpHole
} }
@ -383,9 +369,9 @@ actor SDLContextActor {
private func handleEvent(event: SDLEvent) async throws { private func handleEvent(event: SDLEvent) async throws {
switch event { switch event {
case .dropMacs(let dropMacsEvent): // case .dropMacs(let dropMacsEvent):
SDLLogger.shared.log("[SDLContext] drop macs", level: .info) // SDLLogger.shared.log("[SDLContext] drop macs", level: .info)
await self.arpServer.dropMacs(macs: dropMacsEvent.macs) // await self.arpServer.dropMacs(macs: dropMacsEvent.macs)
case .natChanged(let natChangedEvent): case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
@ -401,9 +387,6 @@ actor SDLContextActor {
register.dstMac = sendRegisterEvent.dstMac register.dstMac = sendRegisterEvent.dstMac
self.udpHole?.send(type: .register, data: try register.serializedData(), remoteAddress: remoteAddress) 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): case .networkShutdown(let shutdownEvent):
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
self.noticeClient?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)
@ -417,7 +400,6 @@ actor SDLContextActor {
private func doRegisterSuper() { private func doRegisterSuper() {
// //
var registerSuper = SDLRegisterSuper() var registerSuper = SDLRegisterSuper()
registerSuper.pktID = 0
registerSuper.clientID = self.config.clientId registerSuper.clientID = self.config.clientId
registerSuper.networkID = self.config.networkAddress.networkId registerSuper.networkID = self.config.networkAddress.networkId
registerSuper.mac = self.config.networkAddress.mac registerSuper.mac = self.config.networkAddress.mac
@ -429,7 +411,7 @@ actor SDLContextActor {
if let registerSuperData = try? registerSuper.serializedData() { if let registerSuperData = try? registerSuper.serializedData() {
SDLLogger.shared.log("[SDLContext] will send register super") 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 // 5
Task { Task {
@ -544,12 +526,8 @@ actor SDLContextActor {
// //
if let sessionToken = self.sessionToken { if let sessionToken = self.sessionToken {
var policyRequest = SDLPolicyRequest() 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.srcIdentityID = data.identityID
policyRequest.dstIdentityID = self.config.identityId policyRequest.dstIdentityID = self.config.identityId
policyRequest.sessionToken = sessionToken
await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest) await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest)
} }
@ -725,12 +703,8 @@ actor SDLContextActor {
// //
if let sessionToken = self.sessionToken { if let sessionToken = self.sessionToken {
var policyRequest = SDLPolicyRequest() var policyRequest = SDLPolicyRequest()
policyRequest.clientID = self.config.clientId
policyRequest.networkID = self.config.networkAddress.networkId
policyRequest.mac = self.config.networkAddress.mac
policyRequest.srcIdentityID = 1234 policyRequest.srcIdentityID = 1234
policyRequest.dstIdentityID = self.config.identityId policyRequest.dstIdentityID = self.config.identityId
policyRequest.sessionToken = sessionToken
await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest) await self.policyRequesterActor.submitPolicyRequest(using: self.udpHole, request: &policyRequest)
} }

View File

@ -44,7 +44,7 @@ actor SDLPuncherActor {
if self.pktId == 0 { if self.pktId == 0 {
self.pktId = 1 self.pktId = 1
} }
self.tryHole(using: udpHole, pktId: pktId, request: request) //self.tryHole(using: udpHole, pktId: pktId, request: request)
Task { Task {
// //
@ -54,22 +54,22 @@ actor SDLPuncherActor {
} }
} }
func handlePeerInfo(using udpHole: SDLUDPHole, peerInfo: SDLPeerInfo) async { // func handlePeerInfo(using udpHole: SDLUDPHole, peerInfo: SDLPeerInfo) async {
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) { // if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { // if let remoteAddress = try? await peerInfo.v4Info.socketAddress() {
SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) // SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
// register // // register
var register = SDLRegister() // var register = SDLRegister()
register.networkID = request.networkId // register.networkID = request.networkId
register.srcMac = request.srcMac // register.srcMac = request.srcMac
register.dstMac = request.dstMac // register.dstMac = request.dstMac
//
udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress) // udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
} else { // } else {
SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) // SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
} // }
} // }
} // }
private func endCooldown(for key: Data) { private func endCooldown(for key: Data) {
self.coolingDown.remove(key) self.coolingDown.remove(key)
@ -79,14 +79,14 @@ actor SDLPuncherActor {
self.pendingRequests.removeValue(forKey: pktId) self.pendingRequests.removeValue(forKey: pktId)
} }
private func tryHole(using udpHole: SDLUDPHole, pktId: UInt32, request: RegisterRequest) { // private func tryHole(using udpHole: SDLUDPHole, pktId: UInt32, request: RegisterRequest) {
var queryInfo = SDLQueryInfo() // var queryInfo = SDLQueryInfo()
queryInfo.pktID = pktId // queryInfo.pktID = pktId
queryInfo.dstMac = request.dstMac // queryInfo.dstMac = request.dstMac
self.pendingRequests[pktId] = request // self.pendingRequests[pktId] = request
//
if let queryData = try? queryInfo.serializedData() { // if let queryData = try? queryInfo.serializedData() {
udpHole.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress) // udpHole.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
} // }
} // }
} }

View File

@ -35,7 +35,7 @@ final class SDLQUICClient {
case .ready: case .ready:
self.readyCont?.resume() self.readyCont?.resume()
self.readyCont = nil self.readyCont = nil
case .failed(let error): case .failed(_):
self.closeCont?.resume() self.closeCont?.resume()
self.closeCont = nil self.closeCont = nil
case .cancelled: case .cancelled:
@ -52,8 +52,8 @@ final class SDLQUICClient {
} }
} }
func send(data: Data) { func send(type: SDLPacketType, data: Data) {
transport.send(data) self.transport.send(type: type, data: data)
} }
func waitReady() async throws { func waitReady() async throws {
@ -89,12 +89,14 @@ final class SDLQUICTransport {
private let connection: NWConnection private let connection: NWConnection
init(host: String, port: UInt16) { 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) self.connection = NWConnection(host: .init(host), port: .init(rawValue: port)!, using: params)
} }
func start(queue: DispatchQueue, onEvent: @escaping (Event) -> Void) { func start(queue: DispatchQueue, onEvent: @escaping (Event) -> Void) {
SDLLogger.shared.log("[SDLQUICTransport] call start")
connection.stateUpdateHandler = { state in connection.stateUpdateHandler = { state in
SDLLogger.shared.log("[SDLQUICTransport] new state: \(state)")
switch state { switch state {
case .ready: onEvent(.ready) case .ready: onEvent(.ready)
case .failed(let e): onEvent(.failed(e)) 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 len = UInt16(data.count).bigEndian
var packet = Data(Data(bytes: &len, count: 2)) var packet = Data(Data(bytes: &len, count: 2))
packet.append(type.rawValue)
packet.append(data) packet.append(data)
connection.send(content: packet, completion: .contentProcessed { _ in }) connection.send(content: packet, completion: .contentProcessed { _ in })
@ -178,6 +181,13 @@ extension SDLQUICClient {
} }
switch packetType { 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: case .registerSuperAck:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else { let registerSuperAck = try? SDLRegisterSuperAck(serializedBytes: bytes) else {

View File

@ -6,10 +6,12 @@
// //
struct IdentityRuleMap { struct IdentityRuleMap {
let version: UInt32
// map[proto][port] // map[proto][port]
let ruleMap: [UInt8: [UInt16: Bool]] let ruleMap: [UInt8: [UInt16: Bool]]
init(ruleMap: [UInt8: [UInt16: Bool]]) { init(version: UInt32, ruleMap: [UInt8: [UInt16: Bool]]) {
self.version = version
self.ruleMap = ruleMap self.ruleMap = ruleMap
} }

View File

@ -7,58 +7,6 @@
import Foundation import Foundation
import NIO 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? {
// parts0total_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..<totalNum {
if let part = self.parts[i] {
rulesData.append(part.rules)
}
}
SDLLogger.shared.log("[IdentitySession] get a completed rules: \(rulesData.count)")
return rulesData
}
private func isContinuousFromZero(indexs: [UInt32]) -> Bool {
guard !indexs.isEmpty else {
return false
}
return indexs.enumerated().allSatisfy { idx, value in
idx == value
}
}
}
actor IdentityStore { actor IdentityStore {
typealias IdentityID = UInt32 typealias IdentityID = UInt32
@ -66,7 +14,6 @@ actor IdentityStore {
private let publisher: SnapshotPublisher<IdentitySnapshot> private let publisher: SnapshotPublisher<IdentitySnapshot>
private var identityMap: [IdentityID: IdentityRuleMap] = [:] private var identityMap: [IdentityID: IdentityRuleMap] = [:]
private var sessions: [IdentityID: IdentitySession] = [:]
init(publisher: SnapshotPublisher<IdentitySnapshot>) { init(publisher: SnapshotPublisher<IdentitySnapshot>) {
self.publisher = publisher self.publisher = publisher
@ -74,12 +21,14 @@ actor IdentityStore {
func apply(policyResponse: SDLPolicyResponse) { func apply(policyResponse: SDLPolicyResponse) {
let id = policyResponse.srcIdentityID let id = policyResponse.srcIdentityID
let session = self.sessions[id, default: IdentitySession(part: policyResponse)] let version = policyResponse.version
session.merge(part: policyResponse)
guard self.identityMap[id] == nil || ((self.identityMap[id]?.version ?? 0) < version) else {
return
}
// //
if let rulesData = session.process() { var buffer = alloctor.buffer(bytes: policyResponse.rules)
var buffer = alloctor.buffer(bytes: rulesData)
var ruleMap: [UInt8: [UInt16: Bool]] = [:] var ruleMap: [UInt8: [UInt16: Bool]] = [:]
while true { while true {
guard let proto = buffer.readInteger(endianness: .big, as: UInt8.self), guard let proto = buffer.readInteger(endianness: .big, as: UInt8.self),
@ -88,19 +37,13 @@ actor IdentityStore {
} }
ruleMap[proto, default: [:]][port] = true ruleMap[proto, default: [:]][port] = true
} }
self.identityMap[id] = IdentityRuleMap(ruleMap: ruleMap) self.identityMap[id] = IdentityRuleMap(version: version, 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))") 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() let snapshot = compileSnapshot()
publisher.publish(snapshot) publisher.publish(snapshot)
} else {
self.sessions[id] = session
}
} }
private func compileSnapshot() -> IdentitySnapshot { private func compileSnapshot() -> IdentitySnapshot {

View File

@ -78,6 +78,8 @@ struct SDLEmpty: Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var unknownFields = SwiftProtobuf.UnknownStorage() var unknownFields = SwiftProtobuf.UnknownStorage()
init() {} init() {}
@ -89,6 +91,8 @@ struct SDLRegisterSuper: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var clientID: String = String() var clientID: String = String()
/// https /// https
@ -121,6 +125,8 @@ struct SDLRegisterSuperAck: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var aesKey: Data = Data() var aesKey: Data = Data()
var sessionToken: Data = Data() var sessionToken: Data = Data()
@ -135,6 +141,8 @@ struct SDLRegisterSuperNak: Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var errorCode: UInt32 = 0 var errorCode: UInt32 = 0
var errorMessage: String = String() var errorMessage: String = String()
@ -149,6 +157,8 @@ struct SDLQueryInfo: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var dstMac: Data = Data() var dstMac: Data = Data()
var unknownFields = SwiftProtobuf.UnknownStorage() var unknownFields = SwiftProtobuf.UnknownStorage()
@ -161,6 +171,8 @@ struct SDLPeerInfo: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var dstMac: Data = Data() var dstMac: Data = Data()
var v4Info: SDLV4Info { var v4Info: SDLV4Info {
@ -197,6 +209,8 @@ struct SDLArpRequest: Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var targetIp: UInt32 = 0 var targetIp: UInt32 = 0
var unknownFields = SwiftProtobuf.UnknownStorage() var unknownFields = SwiftProtobuf.UnknownStorage()
@ -209,6 +223,8 @@ struct SDLArpResponse: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var targetIp: UInt32 = 0 var targetIp: UInt32 = 0
var targetMac: Data = Data() var targetMac: Data = Data()
@ -224,6 +240,8 @@ struct SDLPolicyRequest: Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var srcIdentityID: UInt32 = 0 var srcIdentityID: UInt32 = 0
var dstIdentityID: UInt32 = 0 var dstIdentityID: UInt32 = 0
@ -241,6 +259,8 @@ struct SDLPolicyResponse: @unchecked Sendable {
// `Message` and `Message+*Additions` files in the SwiftProtobuf library for // `Message` and `Message+*Additions` files in the SwiftProtobuf library for
// methods supported on all messages. // methods supported on all messages.
var pktID: UInt32 = 0
var srcIdentityID: UInt32 = 0 var srcIdentityID: UInt32 = 0
var dstIdentityID: 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. /// Clears the value of `v6Info`. Subsequent reads from it will return its default value.
mutating func clearV6Info() {self._v6Info = nil} mutating func clearV6Info() {self._v6Info = nil}
var sessionToken: Data = Data()
var unknownFields = SwiftProtobuf.UnknownStorage() var unknownFields = SwiftProtobuf.UnknownStorage()
init() {} init() {}
@ -589,34 +611,8 @@ extension SDLWelcome: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementatio
extension SDLEmpty: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { extension SDLEmpty: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLEmpty" static let protoMessageName: String = "SDLEmpty"
static let _protobuf_nameMap = SwiftProtobuf._NameMap()
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
// Load everything into unknown fields
while try decoder.nextFieldNumber() != nil {}
}
func traverse<V: SwiftProtobuf.Visitor>(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 = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "client_id"), 1: .standard(proto: "pkt_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"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try { try decoder.decodeSingularStringField(value: &self.clientID) }() case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }()
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) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(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<D: SwiftProtobuf.Decoder>(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<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if !self.clientID.isEmpty { if !self.clientID.isEmpty {
try visitor.visitSingularStringField(value: self.clientID, fieldNumber: 1) try visitor.visitSingularStringField(value: self.clientID, fieldNumber: 2)
} }
if self.networkID != 0 { if self.networkID != 0 {
try visitor.visitSingularUInt32Field(value: self.networkID, fieldNumber: 2) try visitor.visitSingularUInt32Field(value: self.networkID, fieldNumber: 3)
} }
if !self.mac.isEmpty { if !self.mac.isEmpty {
try visitor.visitSingularBytesField(value: self.mac, fieldNumber: 3) try visitor.visitSingularBytesField(value: self.mac, fieldNumber: 4)
} }
if self.ip != 0 { if self.ip != 0 {
try visitor.visitSingularUInt32Field(value: self.ip, fieldNumber: 4) try visitor.visitSingularUInt32Field(value: self.ip, fieldNumber: 5)
} }
if self.maskLen != 0 { if self.maskLen != 0 {
try visitor.visitSingularUInt32Field(value: self.maskLen, fieldNumber: 5) try visitor.visitSingularUInt32Field(value: self.maskLen, fieldNumber: 6)
} }
if !self.hostname.isEmpty { if !self.hostname.isEmpty {
try visitor.visitSingularStringField(value: self.hostname, fieldNumber: 6) try visitor.visitSingularStringField(value: self.hostname, fieldNumber: 7)
} }
if !self.pubKey.isEmpty { if !self.pubKey.isEmpty {
try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 7) try visitor.visitSingularStringField(value: self.pubKey, fieldNumber: 8)
} }
if !self.accessToken.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLRegisterSuper, rhs: SDLRegisterSuper) -> Bool { static func ==(lhs: SDLRegisterSuper, rhs: SDLRegisterSuper) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.clientID != rhs.clientID {return false} if lhs.clientID != rhs.clientID {return false}
if lhs.networkID != rhs.networkID {return false} if lhs.networkID != rhs.networkID {return false}
if lhs.mac != rhs.mac {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 { extension SDLRegisterSuperAck: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLRegisterSuperAck" static let protoMessageName: String = "SDLRegisterSuperAck"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "aes_key"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "session_token"), 2: .standard(proto: "aes_key"),
3: .standard(proto: "session_token"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try { try decoder.decodeSingularBytesField(value: &self.aesKey) }() case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }()
case 2: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }() case 2: try { try decoder.decodeSingularBytesField(value: &self.aesKey) }()
case 3: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if !self.aesKey.isEmpty { if !self.aesKey.isEmpty {
try visitor.visitSingularBytesField(value: self.aesKey, fieldNumber: 1) try visitor.visitSingularBytesField(value: self.aesKey, fieldNumber: 2)
} }
if !self.sessionToken.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLRegisterSuperAck, rhs: SDLRegisterSuperAck) -> Bool { static func ==(lhs: SDLRegisterSuperAck, rhs: SDLRegisterSuperAck) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.aesKey != rhs.aesKey {return false} if lhs.aesKey != rhs.aesKey {return false}
if lhs.sessionToken != rhs.sessionToken {return false} if lhs.sessionToken != rhs.sessionToken {return false}
if lhs.unknownFields != rhs.unknownFields {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 { extension SDLRegisterSuperNak: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLRegisterSuperNak" static let protoMessageName: String = "SDLRegisterSuperNak"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "error_code"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "error_message"), 2: .standard(proto: "error_code"),
3: .standard(proto: "error_message"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.errorCode) }() case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }()
case 2: try { try decoder.decodeSingularStringField(value: &self.errorMessage) }() case 2: try { try decoder.decodeSingularUInt32Field(value: &self.errorCode) }()
case 3: try { try decoder.decodeSingularStringField(value: &self.errorMessage) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if self.errorCode != 0 { if self.errorCode != 0 {
try visitor.visitSingularUInt32Field(value: self.errorCode, fieldNumber: 1) try visitor.visitSingularUInt32Field(value: self.errorCode, fieldNumber: 2)
} }
if !self.errorMessage.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLRegisterSuperNak, rhs: SDLRegisterSuperNak) -> Bool { static func ==(lhs: SDLRegisterSuperNak, rhs: SDLRegisterSuperNak) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.errorCode != rhs.errorCode {return false} if lhs.errorCode != rhs.errorCode {return false}
if lhs.errorMessage != rhs.errorMessage {return false} if lhs.errorMessage != rhs.errorMessage {return false}
if lhs.unknownFields != rhs.unknownFields {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 { extension SDLQueryInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLQueryInfo" static let protoMessageName: String = "SDLQueryInfo"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "dst_mac"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "dst_mac"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { 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 default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if !self.dstMac.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLQueryInfo, rhs: SDLQueryInfo) -> Bool { static func ==(lhs: SDLQueryInfo, rhs: SDLQueryInfo) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.dstMac != rhs.dstMac {return false} if lhs.dstMac != rhs.dstMac {return false}
if lhs.unknownFields != rhs.unknownFields {return false} if lhs.unknownFields != rhs.unknownFields {return false}
return true return true
@ -791,9 +850,10 @@ extension SDLQueryInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementat
extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLPeerInfo" static let protoMessageName: String = "SDLPeerInfo"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "dst_mac"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "v4_info"), 2: .standard(proto: "dst_mac"),
3: .standard(proto: "v6_info"), 3: .standard(proto: "v4_info"),
4: .standard(proto: "v6_info"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { 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.decodeSingularMessageField(value: &self._v4Info) }() case 2: try { try decoder.decodeSingularBytesField(value: &self.dstMac) }()
case 3: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }() case 3: try { try decoder.decodeSingularMessageField(value: &self._v4Info) }()
case 4: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }()
default: break default: break
} }
} }
@ -815,19 +876,23 @@ extension SDLPeerInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementati
// allocates stack space for every if/case branch local when no optimizations // allocates stack space for every if/case branch local when no optimizations
// are enabled. https://github.com/apple/swift-protobuf/issues/1034 and // are enabled. https://github.com/apple/swift-protobuf/issues/1034 and
// https://github.com/apple/swift-protobuf/issues/1182 // https://github.com/apple/swift-protobuf/issues/1182
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if !self.dstMac.isEmpty { 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 { 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 { if let v = self._v6Info {
try visitor.visitSingularMessageField(value: v, fieldNumber: 3) try visitor.visitSingularMessageField(value: v, fieldNumber: 4)
} }() } }()
try unknownFields.traverse(visitor: &visitor) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLPeerInfo, rhs: SDLPeerInfo) -> Bool { static func ==(lhs: SDLPeerInfo, rhs: SDLPeerInfo) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.dstMac != rhs.dstMac {return false} if lhs.dstMac != rhs.dstMac {return false}
if lhs._v4Info != rhs._v4Info {return false} if lhs._v4Info != rhs._v4Info {return false}
if lhs._v6Info != rhs._v6Info {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 { extension SDLArpRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLArpRequest" static let protoMessageName: String = "SDLArpRequest"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "target_ip"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "target_ip"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { 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 default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if self.targetIp != 0 { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLArpRequest, rhs: SDLArpRequest) -> Bool { static func ==(lhs: SDLArpRequest, rhs: SDLArpRequest) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.targetIp != rhs.targetIp {return false} if lhs.targetIp != rhs.targetIp {return false}
if lhs.unknownFields != rhs.unknownFields {return false} if lhs.unknownFields != rhs.unknownFields {return false}
return true return true
@ -871,8 +942,9 @@ extension SDLArpRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementa
extension SDLArpResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { extension SDLArpResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLArpResponse" static let protoMessageName: String = "SDLArpResponse"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "target_ip"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "target_mac"), 2: .standard(proto: "target_ip"),
3: .standard(proto: "target_mac"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { 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.decodeSingularBytesField(value: &self.targetMac) }() case 2: try { try decoder.decodeSingularUInt32Field(value: &self.targetIp) }()
case 3: try { try decoder.decodeSingularBytesField(value: &self.targetMac) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if self.targetIp != 0 { if self.targetIp != 0 {
try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 1) try visitor.visitSingularUInt32Field(value: self.targetIp, fieldNumber: 2)
} }
if !self.targetMac.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLArpResponse, rhs: SDLArpResponse) -> Bool { static func ==(lhs: SDLArpResponse, rhs: SDLArpResponse) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.targetIp != rhs.targetIp {return false} if lhs.targetIp != rhs.targetIp {return false}
if lhs.targetMac != rhs.targetMac {return false} if lhs.targetMac != rhs.targetMac {return false}
if lhs.unknownFields != rhs.unknownFields {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 { extension SDLPolicyRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLPolicyRequest" static let protoMessageName: String = "SDLPolicyRequest"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "src_identity_id"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "dst_identity_id"), 2: .standard(proto: "src_identity_id"),
3: .same(proto: "version"), 3: .standard(proto: "dst_identity_id"),
4: .same(proto: "version"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() case 2: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() case 3: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }()
case 4: try { try decoder.decodeSingularUInt32Field(value: &self.version) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if self.srcIdentityID != 0 { if self.srcIdentityID != 0 {
try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 1) try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 2)
} }
if self.dstIdentityID != 0 { if self.dstIdentityID != 0 {
try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 2) try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 3)
} }
if self.version != 0 { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLPolicyRequest, rhs: SDLPolicyRequest) -> Bool { static func ==(lhs: SDLPolicyRequest, rhs: SDLPolicyRequest) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.srcIdentityID != rhs.srcIdentityID {return false} if lhs.srcIdentityID != rhs.srcIdentityID {return false}
if lhs.dstIdentityID != rhs.dstIdentityID {return false} if lhs.dstIdentityID != rhs.dstIdentityID {return false}
if lhs.version != rhs.version {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 { extension SDLPolicyResponse: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding {
static let protoMessageName: String = "SDLPolicyResponse" static let protoMessageName: String = "SDLPolicyResponse"
static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ static let _protobuf_nameMap: SwiftProtobuf._NameMap = [
1: .standard(proto: "src_identity_id"), 1: .standard(proto: "pkt_id"),
2: .standard(proto: "dst_identity_id"), 2: .standard(proto: "src_identity_id"),
3: .same(proto: "version"), 3: .standard(proto: "dst_identity_id"),
4: .same(proto: "rules"), 4: .same(proto: "version"),
5: .same(proto: "rules"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(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 // allocates stack space for every case branch when no optimizations are
// enabled. https://github.com/apple/swift-protobuf/issues/1034 // enabled. https://github.com/apple/swift-protobuf/issues/1034
switch fieldNumber { switch fieldNumber {
case 1: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }() case 1: try { try decoder.decodeSingularUInt32Field(value: &self.pktID) }()
case 2: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }() case 2: try { try decoder.decodeSingularUInt32Field(value: &self.srcIdentityID) }()
case 3: try { try decoder.decodeSingularUInt32Field(value: &self.version) }() case 3: try { try decoder.decodeSingularUInt32Field(value: &self.dstIdentityID) }()
case 4: try { try decoder.decodeSingularBytesField(value: &self.rules) }() case 4: try { try decoder.decodeSingularUInt32Field(value: &self.version) }()
case 5: try { try decoder.decodeSingularBytesField(value: &self.rules) }()
default: break default: break
} }
} }
} }
func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws { func traverse<V: SwiftProtobuf.Visitor>(visitor: inout V) throws {
if self.pktID != 0 {
try visitor.visitSingularUInt32Field(value: self.pktID, fieldNumber: 1)
}
if self.srcIdentityID != 0 { if self.srcIdentityID != 0 {
try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 1) try visitor.visitSingularUInt32Field(value: self.srcIdentityID, fieldNumber: 2)
} }
if self.dstIdentityID != 0 { if self.dstIdentityID != 0 {
try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 2) try visitor.visitSingularUInt32Field(value: self.dstIdentityID, fieldNumber: 3)
} }
if self.version != 0 { if self.version != 0 {
try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 3) try visitor.visitSingularUInt32Field(value: self.version, fieldNumber: 4)
} }
if !self.rules.isEmpty { 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) try unknownFields.traverse(visitor: &visitor)
} }
static func ==(lhs: SDLPolicyResponse, rhs: SDLPolicyResponse) -> Bool { static func ==(lhs: SDLPolicyResponse, rhs: SDLPolicyResponse) -> Bool {
if lhs.pktID != rhs.pktID {return false}
if lhs.srcIdentityID != rhs.srcIdentityID {return false} if lhs.srcIdentityID != rhs.srcIdentityID {return false}
if lhs.dstIdentityID != rhs.dstIdentityID {return false} if lhs.dstIdentityID != rhs.dstIdentityID {return false}
if lhs.version != rhs.version {return false} if lhs.version != rhs.version {return false}
@ -1140,6 +1229,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement
5: .same(proto: "ip"), 5: .same(proto: "ip"),
6: .standard(proto: "nat_type"), 6: .standard(proto: "nat_type"),
7: .standard(proto: "v6_info"), 7: .standard(proto: "v6_info"),
8: .standard(proto: "session_token"),
] ]
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws { mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
@ -1155,6 +1245,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement
case 5: try { try decoder.decodeSingularUInt32Field(value: &self.ip) }() case 5: try { try decoder.decodeSingularUInt32Field(value: &self.ip) }()
case 6: try { try decoder.decodeSingularUInt32Field(value: &self.natType) }() case 6: try { try decoder.decodeSingularUInt32Field(value: &self.natType) }()
case 7: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }() case 7: try { try decoder.decodeSingularMessageField(value: &self._v6Info) }()
case 8: try { try decoder.decodeSingularBytesField(value: &self.sessionToken) }()
default: break default: break
} }
} }
@ -1186,6 +1277,9 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement
try { if let v = self._v6Info { try { if let v = self._v6Info {
try visitor.visitSingularMessageField(value: v, fieldNumber: 7) try visitor.visitSingularMessageField(value: v, fieldNumber: 7)
} }() } }()
if !self.sessionToken.isEmpty {
try visitor.visitSingularBytesField(value: self.sessionToken, fieldNumber: 8)
}
try unknownFields.traverse(visitor: &visitor) try unknownFields.traverse(visitor: &visitor)
} }
@ -1197,6 +1291,7 @@ extension SDLStunRequest: SwiftProtobuf.Message, SwiftProtobuf._MessageImplement
if lhs.ip != rhs.ip {return false} if lhs.ip != rhs.ip {return false}
if lhs.natType != rhs.natType {return false} if lhs.natType != rhs.natType {return false}
if lhs._v6Info != rhs._v6Info {return false} if lhs._v6Info != rhs._v6Info {return false}
if lhs.sessionToken != rhs.sessionToken {return false}
if lhs.unknownFields != rhs.unknownFields {return false} if lhs.unknownFields != rhs.unknownFields {return false}
return true return true
} }

View File

@ -36,6 +36,9 @@ enum SDLPacketType: UInt8 {
case policyRequest = 0xb0 case policyRequest = 0xb0
case policyResponse = 0xb1 case policyResponse = 0xb1
//
case welcome = 0x4F
case data = 0xFF case data = 0xFF
} }
@ -93,6 +96,9 @@ extension SDLStunProbeReply {
// --MARK: , // --MARK: ,
enum SDLHoleMessage { enum SDLHoleMessage {
case data(SDLData) case data(SDLData)
case register(SDLRegister)
case registerAck(SDLRegisterAck)
case stunProbeReply(SDLStunProbeReply)
} }
enum SDLQUICInboundMessage { enum SDLQUICInboundMessage {
@ -105,12 +111,6 @@ enum SDLQUICInboundMessage {
case peerInfo(SDLPeerInfo) case peerInfo(SDLPeerInfo)
case event(SDLEvent) case event(SDLEvent)
case stunProbeReply(SDLStunProbeReply)
//case register(SDLRegister)
//case registerAck(SDLRegisterAck)
case policyReponse(SDLPolicyResponse) case policyReponse(SDLPolicyResponse)
} }

View File

@ -25,11 +25,8 @@ final class SDLUDPHole: ChannelInboundHandler {
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
private var channel: Channel? private var channel: Channel?
public let signalStream: AsyncStream<(SocketAddress, SDLHoleSignal)> public let messageStream: AsyncStream<(SocketAddress, SDLHoleMessage)>
private let signalContinuation: AsyncStream<(SocketAddress, SDLHoleSignal)>.Continuation private let messageContinuation: AsyncStream<(SocketAddress, SDLHoleMessage)>.Continuation
public let dataStream: AsyncStream<SDLData>
private let dataContinuation: AsyncStream<SDLData>.Continuation
// channelready // channelready
private var cont: CheckedContinuation<Void, Never>? private var cont: CheckedContinuation<Void, Never>?
@ -42,8 +39,7 @@ final class SDLUDPHole: ChannelInboundHandler {
// //
init() throws { init() throws {
(self.signalStream, self.signalContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleSignal).self, bufferingPolicy: .unbounded) (self.messageStream, self.messageContinuation) = AsyncStream.makeStream(of: (SocketAddress, SDLHoleMessage).self, bufferingPolicy: .unbounded)
(self.dataStream, self.dataContinuation) = AsyncStream.makeStream(of: SDLData.self, bufferingPolicy: .unbounded)
} }
func start() throws { func start() throws {
@ -90,12 +86,7 @@ final class SDLUDPHole: ChannelInboundHandler {
let remoteAddress = envelope.remoteAddress let remoteAddress = envelope.remoteAddress
do { do {
if let message = try decode(buffer: &buffer) { if let message = try decode(buffer: &buffer) {
switch message { self.messageContinuation.yield((remoteAddress, message))
case .data(let data):
self.dataContinuation.yield(data)
case .signal(let signal):
self.signalContinuation.yield((remoteAddress, signal))
}
} else { } else {
SDLLogger.shared.log("[SDLUDPHole] decode message, get null", level: .warning) SDLLogger.shared.log("[SDLUDPHole] decode message, get null", level: .warning)
} }
@ -105,9 +96,7 @@ final class SDLUDPHole: ChannelInboundHandler {
} }
func channelInactive(context: ChannelHandlerContext) { func channelInactive(context: ChannelHandlerContext) {
self.signalContinuation.finish() self.messageContinuation.finish()
self.dataContinuation.finish()
context.close(promise: nil) context.close(promise: nil)
} }
@ -157,84 +146,19 @@ final class SDLUDPHole: ChannelInboundHandler {
let registerPacket = try? SDLRegister(serializedBytes: bytes) else { let registerPacket = try? SDLRegister(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.register(registerPacket)) return .register(registerPacket)
case .registerAck: case .registerAck:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.registerAck(registerAck)) return .registerAck(registerAck)
case .stunProbeReply: case .stunProbeReply:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else {
return nil return nil
} }
return .signal(.stunProbeReply(stunProbeReply)) return .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)))
}
default: default:
SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)") SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)")