From 39dcd0908f2fbb30d72520f2a3b32ac65b63753c Mon Sep 17 00:00:00 2001 From: Luna Yao <40349250+ZnqbuZ@users.noreply.github.com> Date: Mon, 5 Oct 2026 05:57:32 +0200 Subject: [PATCH] perf(quic-proxy): use BufPool and BufMargins in QuicSocket (#2626) --- easytier/src/gateway/quic_proxy.rs | 33 +++++++----------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/easytier/src/gateway/quic_proxy.rs b/easytier/src/gateway/quic_proxy.rs index 060a8889..bd44f37d 100644 --- a/easytier/src/gateway/quic_proxy.rs +++ b/easytier/src/gateway/quic_proxy.rs @@ -3,6 +3,7 @@ use crate::proto::peer_rpc::KcpConnData as QuicConnData; use crate::tunnel::quic::{ QUIC_VERSION_ETQ1, client_config, endpoint_config, etq1_client_config, server_config, }; +use crate::utils::buf::{BufMargins, BufPool}; use anyhow::{Context, Error, anyhow, ensure}; use atomic_refcell::AtomicRefCell; use bytes::{BufMut, Bytes, BytesMut}; @@ -21,7 +22,6 @@ use std::future::Future; use std::io::IoSliceMut; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::pin::Pin; -use std::ptr::copy_nonoverlapping; use std::sync::Arc; use std::task::Poll; use std::time::Duration; @@ -54,17 +54,7 @@ struct QuicPacket { ecn: Option, } -#[derive(Debug, Clone, Copy, From, Into)] -pub struct PacketMargins { - pub header: usize, - pub trailer: usize, -} - -impl PacketMargins { - pub fn len(&self) -> usize { - self.header + self.trailer - } -} +type PacketMargins = BufMargins; //endregion //region socket @@ -117,26 +107,17 @@ impl AsyncUdpSocket for QuicSocket { let segment_size = transmit.segment_size.unwrap_or(len); let chunks = transmit.contents.chunks(segment_size); - let segment = segment_size + self.margins.len(); - - let mut payload = BytesMut::with_capacity(chunks.len() * segment); + let segment = segment_size + self.margins.size(); // The length of the last chunk could be smaller than segment_size + let mut payload = BufPool::new(chunks.len() * segment); for chunk in chunks { - let len = chunk.len(); - unsafe { - copy_nonoverlapping( - chunk.as_ptr(), - payload.chunk_mut().as_mut_ptr().add(self.margins.header), - len, - ); - payload.advance_mut(len + self.margins.len()); - } + payload.write(chunk, self.margins); } permit.send(QuicPacket { addr: transmit.destination, - payload, + payload: payload.split(), segment: Some(segment), ecn: transmit.ecn, }); @@ -1314,7 +1295,7 @@ mod tests { let mut rx = socket.rx.into_inner(); let packet = rx.recv().await.unwrap(); - let actual_segment_size = segment_size + margins.len(); + let actual_segment_size = segment_size + margins.size(); let payload = packet.payload; let chunk1_start = margins.header;