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 dnsWorker: Task<Void, Never>?
private var quicClient: SDLQUICClient
private var quicClient: SDLQUICClient?
private var quicWorker: Task<Void, Never>?
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)
}

View File

@ -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)
// }
// }
}

View File

@ -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 {

View File

@ -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
}

View File

@ -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? {
// 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 {
typealias IdentityID = UInt32
@ -66,7 +14,6 @@ actor IdentityStore {
private let publisher: SnapshotPublisher<IdentitySnapshot>
private var identityMap: [IdentityID: IdentityRuleMap] = [:]
private var sessions: [IdentityID: IdentitySession] = [:]
init(publisher: SnapshotPublisher<IdentitySnapshot>) {
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 {

View File

@ -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<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 = [
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<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
// 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<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 {
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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<V: SwiftProtobuf.Visitor>(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<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
// 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<V: SwiftProtobuf.Visitor>(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<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 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
}

View File

@ -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)
}

View File

@ -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<SDLData>
private let dataContinuation: AsyncStream<SDLData>.Continuation
public let messageStream: AsyncStream<(SocketAddress, SDLHoleMessage)>
private let messageContinuation: AsyncStream<(SocketAddress, SDLHoleMessage)>.Continuation
// channelready
private var cont: CheckedContinuation<Void, Never>?
@ -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)")