Skip to content

Commit 0eaa4f4

Browse files
committed
Use DatagramBuffer in PacketBuilder
The PacketBuilder no longer has any business with the TransmitBuilder, it can do everything with just the DatagramBuffer.
1 parent 5e62f8a commit 0eaa4f4

File tree

2 files changed

+41
-25
lines changed

2 files changed

+41
-25
lines changed

quinn-proto/src/connection/mod.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,12 @@ impl Connection {
662662
builder.pad_to(transmit.segment_size() as u16);
663663
}
664664

665-
builder.finish_and_track(now, self, sent_frames.take(), &mut transmit);
665+
builder.finish_and_track(
666+
now,
667+
self,
668+
sent_frames.take(),
669+
&mut transmit.datagram_mut(),
670+
);
666671

667672
if transmit.num_datagrams() == 1 {
668673
transmit.clip_datagram_size();
@@ -707,7 +712,12 @@ impl Connection {
707712
// datagram.
708713
// Finish current packet without adding extra padding
709714
if let Some(builder) = builder_storage.take() {
710-
builder.finish_and_track(now, self, sent_frames.take(), &mut transmit);
715+
builder.finish_and_track(
716+
now,
717+
self,
718+
sent_frames.take(),
719+
&mut transmit.datagram_mut(),
720+
);
711721
}
712722
}
713723

@@ -738,7 +748,7 @@ impl Connection {
738748
now,
739749
space_id,
740750
self.rem_cids.active(),
741-
&mut transmit,
751+
&mut transmit.datagram_mut(),
742752
ack_eliciting,
743753
self,
744754
)?);
@@ -835,7 +845,7 @@ impl Connection {
835845
non_retransmits: true,
836846
..SentFrames::default()
837847
}),
838-
&mut transmit,
848+
&mut transmit.datagram_mut(),
839849
);
840850
self.stats.udp_tx.on_sent(1, transmit.len());
841851
return Some(Transmit {
@@ -888,7 +898,7 @@ impl Connection {
888898
builder.pad_to(MIN_INITIAL_SIZE);
889899
}
890900
let last_packet_number = builder.exact_number;
891-
builder.finish_and_track(now, self, sent_frames, &mut transmit);
901+
builder.finish_and_track(now, self, sent_frames, &mut transmit.datagram_mut());
892902
self.path
893903
.congestion
894904
.on_sent(now, transmit.len() as u64, last_packet_number);
@@ -912,7 +922,7 @@ impl Connection {
912922
now,
913923
space_id,
914924
self.rem_cids.active(),
915-
&mut transmit,
925+
&mut transmit.datagram_mut(),
916926
true,
917927
self,
918928
)?;
@@ -934,7 +944,7 @@ impl Connection {
934944
non_retransmits: true,
935945
..Default::default()
936946
};
937-
builder.finish_and_track(now, self, Some(sent_frames), &mut transmit);
947+
builder.finish_and_track(now, self, Some(sent_frames), &mut transmit.datagram_mut());
938948

939949
self.stats.path.sent_plpmtud_probes += 1;
940950

@@ -1000,7 +1010,14 @@ impl Connection {
10001010
// if a post-migration packet caused the CID to be retired, it's fair to pretend
10011011
// this is sent first.
10021012
debug_assert!(buf.datagram().is_empty());
1003-
let mut builder = PacketBuilder::new(now, SpaceId::Data, *prev_cid, buf, false, self)?;
1013+
let mut builder = PacketBuilder::new(
1014+
now,
1015+
SpaceId::Data,
1016+
*prev_cid,
1017+
&mut buf.datagram_mut(),
1018+
false,
1019+
self,
1020+
)?;
10041021
trace!("validating previous path with PATH_CHALLENGE {:08x}", token);
10051022
buf.datagram_mut().write(frame::FrameType::PATH_CHALLENGE);
10061023
buf.datagram_mut().write(token);
@@ -1012,7 +1029,7 @@ impl Connection {
10121029
// sending a datagram of this size
10131030
builder.pad_to(MIN_INITIAL_SIZE);
10141031

1015-
builder.finish(self, buf);
1032+
builder.finish(self, &mut buf.datagram_mut());
10161033
self.stats.udp_tx.on_sent(1, buf.len());
10171034

10181035
Some(Transmit {

quinn-proto/src/connection/packet_builder.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use bytes::{BufMut, Bytes};
22
use rand::Rng;
33
use tracing::{trace, trace_span};
44

5-
use super::{Connection, SentFrames, TransmitBuilder, spaces::SentPacket};
5+
use super::{Connection, DatagramBuffer, SentFrames, spaces::SentPacket};
66
use crate::{
77
ConnectionId, Instant, TransportError, TransportErrorCode,
88
connection::ConnectionSide,
@@ -36,7 +36,7 @@ impl PacketBuilder {
3636
now: Instant,
3737
space_id: SpaceId,
3838
dst_cid: ConnectionId,
39-
buffer: &mut TransmitBuilder<'_>,
39+
datagram: &mut DatagramBuffer<'_>,
4040
ack_eliciting: bool,
4141
conn: &mut Connection,
4242
) -> Option<Self> {
@@ -120,9 +120,9 @@ impl PacketBuilder {
120120
version,
121121
}),
122122
};
123-
let partial_encode = header.encode(&mut buffer.datagram_mut());
123+
let partial_encode = header.encode(datagram);
124124
if conn.peer_params.grease_quic_bit && conn.rng.random() {
125-
buffer.datagram_mut()[partial_encode.start] ^= FIXED_BIT;
125+
datagram[partial_encode.start] ^= FIXED_BIT;
126126
}
127127

128128
let (sample_size, tag_len) = if let Some(ref crypto) = space.crypto {
@@ -146,10 +146,10 @@ impl PacketBuilder {
146146
// pn_len + payload_len + tag_len >= sample_size + 4
147147
// payload_len >= sample_size + 4 - pn_len - tag_len
148148
let min_size = Ord::max(
149-
buffer.datagram().len() + (sample_size + 4).saturating_sub(number.len() + tag_len),
149+
datagram.len() + (sample_size + 4).saturating_sub(number.len() + tag_len),
150150
partial_encode.start + dst_cid.len() + 6,
151151
);
152-
let max_size = buffer.datagram_mut().capacity() - tag_len;
152+
let max_size = datagram.capacity() - tag_len;
153153
debug_assert!(max_size >= min_size);
154154

155155
Some(Self {
@@ -179,12 +179,12 @@ impl PacketBuilder {
179179
now: Instant,
180180
conn: &mut Connection,
181181
sent: Option<SentFrames>,
182-
buffer: &mut TransmitBuilder<'_>,
182+
datagram: &mut DatagramBuffer<'_>,
183183
) {
184184
let ack_eliciting = self.ack_eliciting;
185185
let exact_number = self.exact_number;
186186
let space_id = self.space;
187-
let (size, padded) = self.finish(conn, buffer);
187+
let (size, padded) = self.finish(conn, datagram);
188188
let sent = match sent {
189189
Some(sent) => sent,
190190
None => return,
@@ -225,13 +225,13 @@ impl PacketBuilder {
225225
pub(super) fn finish(
226226
self,
227227
conn: &mut Connection,
228-
buffer: &mut TransmitBuilder<'_>,
228+
datagram: &mut DatagramBuffer<'_>,
229229
) -> (usize, bool) {
230-
let pad = self.min_size > buffer.datagram().len();
230+
let pad = self.min_size > datagram.len();
231231
if pad {
232-
let padding_bytes = self.min_size - buffer.datagram().len();
232+
let padding_bytes = self.min_size - datagram.len();
233233
trace!("PADDING * {padding_bytes}");
234-
buffer.datagram_mut().put_bytes(0, padding_bytes);
234+
datagram.put_bytes(0, padding_bytes);
235235
}
236236

237237
let space = &conn.spaces[self.space];
@@ -250,16 +250,15 @@ impl PacketBuilder {
250250
"Mismatching crypto tag len"
251251
);
252252

253-
buffer.datagram_mut().put_bytes(0, packet_crypto.tag_len());
253+
datagram.put_bytes(0, packet_crypto.tag_len());
254254
let encode_start = self.partial_encode.start;
255-
let mut datagram_buf = buffer.datagram_mut();
256-
let packet_buf = &mut datagram_buf[encode_start..];
255+
let packet_buf = &mut datagram[encode_start..];
257256
self.partial_encode.finish(
258257
packet_buf,
259258
header_crypto,
260259
Some((self.exact_number, packet_crypto)),
261260
);
262261

263-
(buffer.datagram().len() - encode_start, pad)
262+
(datagram.len() - encode_start, pad)
264263
}
265264
}

0 commit comments

Comments
 (0)