From 3da520177871089a1fc59b2a1c24f06df58137ef Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Thu, 21 May 2026 19:57:16 +0800 Subject: [PATCH] fix buffer data --- Tun/Inbound/PacketInboundProcessor.swift | 4 ++-- Tun/NetworkStack/LayerPacket.swift | 23 +++++++++++++++++++++-- Tun/UDPHole/SDLHoleMessage.swift | 11 ++++++----- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Tun/Inbound/PacketInboundProcessor.swift b/Tun/Inbound/PacketInboundProcessor.swift index 1d90eaf..ede0de4 100644 --- a/Tun/Inbound/PacketInboundProcessor.swift +++ b/Tun/Inbound/PacketInboundProcessor.swift @@ -59,8 +59,8 @@ final class PacketInboundProcessor { return nil } - let decryptedData = try dataCipher.decrypt(cipherText: Data(data.data)) - let layerPacket = try LayerPacket(layerData: decryptedData) + let decryptedData = try dataCipher.decrypt(cipherText: data.data) + let layerPacket = try LayerPacketView(layerData: decryptedData) let inboundBytes = decryptedData.count // 处理arp请求 diff --git a/Tun/NetworkStack/LayerPacket.swift b/Tun/NetworkStack/LayerPacket.swift index 5657f52..4c1024f 100644 --- a/Tun/NetworkStack/LayerPacket.swift +++ b/Tun/NetworkStack/LayerPacket.swift @@ -79,10 +79,11 @@ struct LayerPacket { } func marshal() -> Data { - var packet = Data() + var packet = Data(capacity: 14 + self.data.count) packet.append(dstMac) packet.append(srcMac) - packet.append(self.type.rawValue.data()) + packet.append(UInt8(self.type.rawValue >> 8)) + packet.append(UInt8(self.type.rawValue & 0x00FF)) packet.append(self.data) return packet @@ -97,3 +98,21 @@ struct LayerPacket { } } + +struct LayerPacketView { + let type: LayerPacket.PacketType + let data: Data + + init(layerData payload: Data) throws { + guard payload.count >= 14 else { + throw LayerPacket.LayerPacketError.invalidLength + } + + guard let type = LayerPacket.PacketType(rawValue: UInt16(bytes: (payload[12], payload[13]))) else { + throw LayerPacket.LayerPacketError.invaldPacketType + } + + self.type = type + self.data = payload.dropFirst(14) + } +} diff --git a/Tun/UDPHole/SDLHoleMessage.swift b/Tun/UDPHole/SDLHoleMessage.swift index 834d3af..068a7d3 100644 --- a/Tun/UDPHole/SDLHoleMessage.swift +++ b/Tun/UDPHole/SDLHoleMessage.swift @@ -6,6 +6,7 @@ // import Foundation import NIOCore +import NIOFoundationCompat import NIOPosix import SwiftProtobuf @@ -32,31 +33,31 @@ extension SDLHoleMessage { switch packetType { case .data: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), + guard let bytes = buffer.readData(length: buffer.readableBytes, byteTransferStrategy: .noCopy), let dataPacket = try? SDLData(serializedBytes: bytes) else { return nil } return .data(dataPacket) case .register: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), + guard let bytes = buffer.readData(length: buffer.readableBytes, byteTransferStrategy: .noCopy), let registerPacket = try? SDLRegister(serializedBytes: bytes) else { return nil } return .control(.register(registerPacket)) case .registerAck: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), + guard let bytes = buffer.readData(length: buffer.readableBytes, byteTransferStrategy: .noCopy), let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { return nil } return .control(.registerAck(registerAck)) case .stunProbeReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), + guard let bytes = buffer.readData(length: buffer.readableBytes, byteTransferStrategy: .noCopy), let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { return nil } return .control(.stunProbeReply(stunProbeReply)) case .stunReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), + guard let bytes = buffer.readData(length: buffer.readableBytes, byteTransferStrategy: .noCopy), let stunReply = try? SDLStunReply(serializedBytes: bytes) else { return nil }