punchnet-macos/Tun/Punchnet/SDLMessage.swift
2026-04-14 20:32:21 +08:00

179 lines
4.0 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// SDLPacketType.swift
// Tun
//
// Created by on 2024/4/10.
//
import Foundation
import NIOCore
//
enum SDLPacketType: UInt8 {
case empty = 0x00
case registerSuper = 0x01
case registerSuperAck = 0x02
case registerSuperNak = 0x04
case unregisterSuper = 0x05
case queryInfo = 0x06
case peerInfo = 0x07
//
case ping = 0x08
case pong = 0x09
//
case event = 0x10
case register = 0x20
case registerAck = 0x21
case stunRequest = 0x30
case stunReply = 0x31
case stunProbe = 0x32
case stunProbeReply = 0x33
// arp
case arpRequest = 0x50
case arpResponse = 0x51
//
case policyRequest = 0xb0
case policyResponse = 0xb1
//
case welcome = 0x4F
case data = 0xFF
}
// Id
struct SDLIdGenerator: Sendable {
// id
private var packetId: UInt32
init(seed packetId: UInt32) {
self.packetId = packetId
}
mutating func nextId() -> UInt32 {
let packetId = self.packetId
self.packetId = packetId + 1
return packetId
}
}
//
// --MARK:
// Attr
enum SDLProbeAttr: UInt8 {
case none = 0
case port = 1
case peer = 2
}
// Nak
enum SDLNAKErrorCode: UInt8 {
case invalidToken = 1
case nodeDisabled = 2
case noIpAddress = 3
case networkFault = 4
case internalFault = 5
}
extension SDLV4Info {
func socketAddress() async throws -> SocketAddress? {
guard self.v4.count == 4 else {
return nil
}
let address = "\(v4[0]).\(v4[1]).\(v4[2]).\(v4[3])"
return try await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
}
}
extension SDLV6Info {
func socketAddress() async throws -> SocketAddress? {
guard let address = SDLUtil.ipv6DataToString(self.v6) else {
return nil
}
return try await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
}
}
extension SDLStunProbeReply {
func socketAddress() async -> SocketAddress? {
let address = SDLUtil.int32ToIp(self.ip)
return try? await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
}
}
// --MARK: ,
enum SDLHoleMessage {
case data(SDLData)
case register(SDLRegister)
case registerAck(SDLRegisterAck)
case stunProbeReply(SDLStunProbeReply)
case stunReply(SDLStunReply)
}
enum SDLHoleControlMessage {
case register(SDLRegister)
case registerAck(SDLRegisterAck)
case stunProbeReply(SDLStunProbeReply)
case stunReply(SDLStunReply)
}
enum SDLHoleInboundMessage {
case control(SDLHoleControlMessage)
case data(SDLData)
}
extension SDLHoleMessage {
var inboundMessage: SDLHoleInboundMessage {
switch self {
case .data(let data):
return .data(data)
case .register(let register):
return .control(.register(register))
case .registerAck(let registerAck):
return .control(.registerAck(registerAck))
case .stunProbeReply(let stunProbeReply):
return .control(.stunProbeReply(stunProbeReply))
case .stunReply(let stunReply):
return .control(.stunReply(stunReply))
}
}
}
enum SDLQUICInboundMessage {
//
case welcome(SDLWelcome)
case pong
//
case registerSuperAck(SDLRegisterSuperAck)
case registerSuperNak(SDLRegisterSuperNak)
case peerInfo(SDLPeerInfo)
case event(SDLEvent)
case policyReponse(SDLPolicyResponse)
case arpResponse(SDLArpResponse)
}
//
enum SDLEventType: UInt8 {
case natChanged = 0x03
case sendRegister = 0x04
case networkShutdown = 0xFF
}