mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-10-08 10:56:13 -08:00
perf(quic-proxy): use BufPool and BufMargins in QuicSocket (#2626)
This commit is contained in:
1 parent
92eecf1e73
commit
39dcd0908f
1 file changed
+7
-26
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user