perf(quic-proxy): use BufPool and BufMargins in QuicSocket (#2626)

This commit is contained in:
Luna Yao authored and GitHub committed 2026-10-05 11:57:32 +08:00
1 parent 92eecf1e73
commit 39dcd0908f
1 file changed
+7 -26
+7 -26
View File
@@ -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<EcnCodepoint>,
}
#[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;