mirror of
https://github.com/n0-computer/noq.git
synced 2026-10-03 12:40:46 +00:00
Switch PacketBuilder to use TransmitBuf
This allows making TransmitBuf::buf private at last. Now all the logic it handles is fully encapsulated.
This commit is contained in:
@@ -717,7 +717,7 @@ impl Connection {
|
||||
builder.pad_to(buf.segment_size() as u16);
|
||||
}
|
||||
|
||||
builder.finish_and_track(now, self, path_id, sent_frames.take(), buf.buf);
|
||||
builder.finish_and_track(now, self, path_id, sent_frames.take(), &mut buf);
|
||||
|
||||
if buf.num_datagrams() == 1 {
|
||||
buf.clip_datagram_size();
|
||||
@@ -762,7 +762,7 @@ impl Connection {
|
||||
// datagram.
|
||||
// Finish current packet without adding extra padding
|
||||
if let Some(builder) = builder_storage.take() {
|
||||
builder.finish_and_track(now, self, path_id, sent_frames.take(), buf.buf);
|
||||
builder.finish_and_track(now, self, path_id, sent_frames.take(), &mut buf);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -898,7 +898,7 @@ impl Connection {
|
||||
non_retransmits: true,
|
||||
..SentFrames::default()
|
||||
}),
|
||||
buf.buf,
|
||||
&mut buf,
|
||||
);
|
||||
self.stats.udp_tx.on_sent(1, buf.len());
|
||||
return Some(Transmit {
|
||||
@@ -955,7 +955,7 @@ impl Connection {
|
||||
builder.pad_to(MIN_INITIAL_SIZE);
|
||||
}
|
||||
let last_packet_number = builder.exact_number;
|
||||
builder.finish_and_track(now, self, path_id, sent_frames, buf.buf);
|
||||
builder.finish_and_track(now, self, path_id, sent_frames, &mut buf);
|
||||
self.path_data_mut(path_id).congestion.on_sent(
|
||||
now,
|
||||
buf.len() as u64,
|
||||
@@ -1006,7 +1006,7 @@ impl Connection {
|
||||
non_retransmits: true,
|
||||
..Default::default()
|
||||
};
|
||||
builder.finish_and_track(now, self, path_id, Some(sent_frames), buf.buf);
|
||||
builder.finish_and_track(now, self, path_id, Some(sent_frames), &mut buf);
|
||||
|
||||
self.stats.path.sent_plpmtud_probes += 1;
|
||||
|
||||
@@ -1086,7 +1086,7 @@ impl Connection {
|
||||
// sending a datagram of this size
|
||||
builder.pad_to(MIN_INITIAL_SIZE);
|
||||
|
||||
builder.finish(self, buf.buf);
|
||||
builder.finish(self, buf);
|
||||
self.stats.udp_tx.on_sent(1, buf.len());
|
||||
|
||||
Some(Transmit {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use bytes::Bytes;
|
||||
use bytes::{BufMut, Bytes};
|
||||
use rand::Rng;
|
||||
use tracing::{trace, trace_span};
|
||||
|
||||
@@ -121,9 +121,9 @@ impl PacketBuilder {
|
||||
version,
|
||||
}),
|
||||
};
|
||||
let partial_encode = header.encode(buffer.buf);
|
||||
let partial_encode = header.encode(buffer);
|
||||
if conn.peer_params.grease_quic_bit && conn.rng.random() {
|
||||
buffer.buf[partial_encode.start] ^= FIXED_BIT;
|
||||
buffer.as_mut_slice()[partial_encode.start] ^= FIXED_BIT;
|
||||
}
|
||||
|
||||
let (sample_size, tag_len) = if let Some(ref crypto) = space.crypto {
|
||||
@@ -186,7 +186,7 @@ impl PacketBuilder {
|
||||
conn: &mut Connection,
|
||||
path_id: PathId,
|
||||
sent: Option<SentFrames>,
|
||||
buffer: &mut Vec<u8>,
|
||||
buffer: &mut TransmitBuf<'_>,
|
||||
) {
|
||||
let ack_eliciting = self.ack_eliciting;
|
||||
let exact_number = self.exact_number;
|
||||
@@ -235,11 +235,15 @@ impl PacketBuilder {
|
||||
}
|
||||
|
||||
/// Encrypt packet, returning the length of the packet and whether padding was added
|
||||
pub(super) fn finish(self, conn: &mut Connection, buffer: &mut Vec<u8>) -> (usize, bool) {
|
||||
pub(super) fn finish(
|
||||
self,
|
||||
conn: &mut Connection,
|
||||
buffer: &mut TransmitBuf<'_>,
|
||||
) -> (usize, bool) {
|
||||
let pad = buffer.len() < self.min_size;
|
||||
if pad {
|
||||
trace!("PADDING * {}", self.min_size - buffer.len());
|
||||
buffer.resize(self.min_size, 0);
|
||||
buffer.put_bytes(0, self.min_size - buffer.len());
|
||||
}
|
||||
|
||||
let space = &conn.spaces[self.space];
|
||||
@@ -258,9 +262,9 @@ impl PacketBuilder {
|
||||
"Mismatching crypto tag len"
|
||||
);
|
||||
|
||||
buffer.resize(buffer.len() + packet_crypto.tag_len(), 0);
|
||||
buffer.put_bytes(0, packet_crypto.tag_len());
|
||||
let encode_start = self.partial_encode.start;
|
||||
let packet_buf = &mut buffer[encode_start..];
|
||||
let packet_buf = &mut buffer.as_mut_slice()[encode_start..];
|
||||
// for packet protection, PathId(0) and no path are equivalent.
|
||||
self.partial_encode.finish(
|
||||
packet_buf,
|
||||
|
||||
@@ -27,7 +27,7 @@ use super::BufLen;
|
||||
#[derive(Debug)]
|
||||
pub(super) struct TransmitBuf<'a> {
|
||||
/// The buffer itself, packets are written to this buffer
|
||||
pub(super) buf: &'a mut Vec<u8>,
|
||||
buf: &'a mut Vec<u8>,
|
||||
/// Offset into the buffer at which the current datagram starts
|
||||
///
|
||||
/// Note that when coalescing packets this might be before the start of the current
|
||||
@@ -187,6 +187,11 @@ impl<'a> TransmitBuf<'a> {
|
||||
pub(super) fn len(&self) -> usize {
|
||||
self.buf.len()
|
||||
}
|
||||
|
||||
/// Returns the already written bytes in the buffer
|
||||
pub(super) fn as_mut_slice(&mut self) -> &mut [u8] {
|
||||
self.buf.as_mut_slice()
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl BufMut for TransmitBuf<'_> {
|
||||
|
||||
Reference in New Issue
Block a user