Skip to content

Commit f2ecc76

Browse files
committed
No BufMut on TransmitBuf
BufMut is no longer directly implemented on TransmitBuf, instead you need to call TransmitBuf::datagram_mut to get a BufMut for the current datagram.
1 parent 6fa46f8 commit f2ecc76

File tree

3 files changed

+27
-37
lines changed

3 files changed

+27
-37
lines changed

quinn-proto/src/connection/mod.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ impl Connection {
757757
self.receiving_ecn,
758758
&mut SentFrames::default(),
759759
&mut self.spaces[space_id],
760-
&mut buf,
760+
&mut buf.datagram_mut(),
761761
&mut self.stats,
762762
);
763763
}
@@ -774,22 +774,22 @@ impl Connection {
774774
match self.state {
775775
State::Closed(state::Closed { ref reason }) => {
776776
if space_id == SpaceId::Data || reason.is_transport_layer() {
777-
reason.encode(&mut buf, max_frame_size)
777+
reason.encode(&mut buf.datagram_mut(), max_frame_size)
778778
} else {
779779
frame::ConnectionClose {
780780
error_code: TransportErrorCode::APPLICATION_ERROR,
781781
frame_type: None,
782782
reason: Bytes::new(),
783783
}
784-
.encode(&mut buf, max_frame_size)
784+
.encode(&mut buf.datagram_mut(), max_frame_size)
785785
}
786786
}
787787
State::Draining => frame::ConnectionClose {
788788
error_code: TransportErrorCode::NO_ERROR,
789789
frame_type: None,
790790
reason: Bytes::new(),
791791
}
792-
.encode(&mut buf, max_frame_size),
792+
.encode(&mut buf.datagram_mut(), max_frame_size),
793793
_ => unreachable!(
794794
"tried to make a close packet when the connection wasn't closed"
795795
),
@@ -817,8 +817,8 @@ impl Connection {
817817
// above.
818818
let mut builder = builder_storage.take().unwrap();
819819
trace!("PATH_RESPONSE {:08x} (off-path)", token);
820-
buf.write(frame::FrameType::PATH_RESPONSE);
821-
buf.write(token);
820+
buf.datagram_mut().write(frame::FrameType::PATH_RESPONSE);
821+
buf.datagram_mut().write(token);
822822
self.stats.frame_tx.path_response += 1;
823823
builder.pad_to(MIN_INITIAL_SIZE);
824824
builder.finish_and_track(
@@ -844,7 +844,7 @@ impl Connection {
844844
let sent = self.populate_packet(
845845
now,
846846
space_id,
847-
&mut buf,
847+
&mut buf.datagram_mut(),
848848
builder.max_size,
849849
builder.exact_number,
850850
);
@@ -908,12 +908,12 @@ impl Connection {
908908
PacketBuilder::new(now, space_id, self.rem_cids.active(), &mut buf, true, self)?;
909909

910910
// We implement MTU probes as ping packets padded up to the probe size
911-
buf.write(frame::FrameType::PING);
911+
buf.datagram_mut().write(frame::FrameType::PING);
912912
self.stats.frame_tx.ping += 1;
913913

914914
// If supported by the peer, we want no delays to the probe's ACK
915915
if self.peer_supports_ack_frequency() {
916-
buf.write(frame::FrameType::IMMEDIATE_ACK);
916+
buf.datagram_mut().write(frame::FrameType::IMMEDIATE_ACK);
917917
self.stats.frame_tx.immediate_ack += 1;
918918
}
919919

@@ -986,8 +986,8 @@ impl Connection {
986986
debug_assert_eq!(buf.datagram_start_offset(), 0);
987987
let mut builder = PacketBuilder::new(now, SpaceId::Data, *prev_cid, buf, false, self)?;
988988
trace!("validating previous path with PATH_CHALLENGE {:08x}", token);
989-
buf.write(frame::FrameType::PATH_CHALLENGE);
990-
buf.write(token);
989+
buf.datagram_mut().write(frame::FrameType::PATH_CHALLENGE);
990+
buf.datagram_mut().write(token);
991991
self.stats.frame_tx.path_challenge += 1;
992992

993993
// An endpoint MUST expand datagrams that contain a PATH_CHALLENGE frame
@@ -3975,6 +3975,12 @@ impl BufLen for Vec<u8> {
39753975
}
39763976
}
39773977

3978+
impl BufLen for bytes::buf::Limit<&mut Vec<u8>> {
3979+
fn len(&self) -> usize {
3980+
self.get_ref().len()
3981+
}
3982+
}
3983+
39783984
#[cfg(test)]
39793985
mod tests {
39803986
use super::*;

quinn-proto/src/connection/packet_builder.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ impl PacketBuilder {
120120
version,
121121
}),
122122
};
123-
let partial_encode = header.encode(buffer);
123+
let partial_encode = header.encode(&mut buffer.datagram_mut());
124124
if conn.peer_params.grease_quic_bit && conn.rng.random() {
125125
buffer.as_mut_slice()[partial_encode.start] ^= FIXED_BIT;
126126
}
@@ -233,8 +233,9 @@ impl PacketBuilder {
233233
) -> (usize, bool) {
234234
let pad = buffer.len() < self.min_size;
235235
if pad {
236-
trace!("PADDING * {}", self.min_size - buffer.len());
237-
buffer.put_bytes(0, self.min_size - buffer.len());
236+
let padding_bytes = self.min_size - buffer.len();
237+
trace!("PADDING * {padding_bytes}");
238+
buffer.datagram_mut().put_bytes(0, padding_bytes);
238239
}
239240

240241
let space = &conn.spaces[self.space];
@@ -253,7 +254,7 @@ impl PacketBuilder {
253254
"Mismatching crypto tag len"
254255
);
255256

256-
buffer.put_bytes(0, packet_crypto.tag_len());
257+
buffer.datagram_mut().put_bytes(0, packet_crypto.tag_len());
257258
let encode_start = self.partial_encode.start;
258259
let packet_buf = &mut buffer.as_mut_slice()[encode_start..];
259260
self.partial_encode.finish(

quinn-proto/src/connection/transmit_buf.rs

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use bytes::BufMut;
22

3-
use super::BufLen;
4-
53
/// The buffer in which to write datagrams for [`Connection::poll_transmit`]
64
///
75
/// The `poll_transmit` function writes zero or more datagrams to a buffer. Multiple
@@ -142,6 +140,11 @@ impl<'a> TransmitBuf<'a> {
142140
self.buf_capacity = self.buf.len();
143141
}
144142

143+
/// Returns a buffer into which the current datagram can be written
144+
pub(super) fn datagram_mut(&mut self) -> bytes::buf::Limit<&mut Vec<u8>> {
145+
self.buf.limit(self.buf_capacity)
146+
}
147+
145148
/// Returns the GSO segment size
146149
///
147150
/// This is also the maximum size datagrams are allowed to be. The first and last
@@ -193,23 +196,3 @@ impl<'a> TransmitBuf<'a> {
193196
self.buf.as_mut_slice()
194197
}
195198
}
196-
197-
unsafe impl BufMut for TransmitBuf<'_> {
198-
fn remaining_mut(&self) -> usize {
199-
self.buf.remaining_mut()
200-
}
201-
202-
unsafe fn advance_mut(&mut self, cnt: usize) {
203-
self.buf.advance_mut(cnt);
204-
}
205-
206-
fn chunk_mut(&mut self) -> &mut bytes::buf::UninitSlice {
207-
self.buf.chunk_mut()
208-
}
209-
}
210-
211-
impl BufLen for TransmitBuf<'_> {
212-
fn len(&self) -> usize {
213-
self.len()
214-
}
215-
}

0 commit comments

Comments
 (0)