s2n_quic_core/frame/
mtu_probing_complete.rs1use crate::{event, frame::ExtensionTag, varint::VarInt};
5use s2n_codec::{Encoder, EncoderValue};
6
7const TAG: VarInt = VarInt::from_u32(0xdc0001);
8
9macro_rules! mtu_probing_complete_tag {
10 () => {
11 0xdc0001u64
12 };
13}
14
15#[derive(Copy, Clone, Debug, PartialEq, Eq)]
26pub struct MtuProbingComplete {
27 pub mtu: u16,
29}
30
31impl MtuProbingComplete {
32 pub const fn tag(&self) -> ExtensionTag {
33 TAG
34 }
35
36 pub const fn new(mtu: u16) -> Self {
37 Self { mtu }
38 }
39}
40
41impl<'a> ::s2n_codec::DecoderParameterizedValue<'a> for MtuProbingComplete {
42 type Parameter = ExtensionTag;
43
44 #[inline]
45 fn decode_parameterized(
46 _tag: Self::Parameter,
47 buffer: ::s2n_codec::DecoderBuffer<'a>,
48 ) -> ::s2n_codec::DecoderBufferResult<'a, Self> {
49 let (mtu, buffer) = buffer.decode::<u16>()?;
50 let frame = MtuProbingComplete { mtu };
51 Ok((frame, buffer))
52 }
53}
54
55impl<'a> ::s2n_codec::DecoderParameterizedValueMut<'a> for MtuProbingComplete {
56 type Parameter = ExtensionTag;
57
58 #[inline]
59 fn decode_parameterized_mut(
60 _tag: Self::Parameter,
61 buffer: ::s2n_codec::DecoderBufferMut<'a>,
62 ) -> ::s2n_codec::DecoderBufferMutResult<'a, Self> {
63 let (mtu, buffer) = buffer.decode::<u16>()?;
64 let frame = MtuProbingComplete { mtu };
65 Ok((frame, buffer))
66 }
67}
68
69impl EncoderValue for MtuProbingComplete {
70 fn encode<E: Encoder>(&self, buffer: &mut E) {
71 buffer.encode(&TAG);
72 buffer.encode(&self.mtu);
73 }
74}
75
76impl event::IntoEvent<event::builder::Frame> for &MtuProbingComplete {
77 #[inline]
78 fn into_event(self) -> event::builder::Frame {
79 event::builder::Frame::MtuProbingComplete {
80 mtu: self.mtu,
81 }
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 use super::*;
88 use s2n_codec::{DecoderBuffer, DecoderParameterizedValue, EncoderValue};
89
90 #[test]
91 fn round_trip() {
92 let frame = MtuProbingComplete::new(1500);
93 let encoded = frame.encode_to_vec();
94
95 let buffer = DecoderBuffer::new(encoded.as_slice());
96 let (tag, buffer) = buffer.decode::<ExtensionTag>().expect("decoding succeeds");
97 assert_eq!(TAG, tag);
98 let (decoded_frame, remaining) =
99 MtuProbingComplete::decode_parameterized(TAG, buffer).expect("decoding succeeds");
100 assert!(remaining.is_empty());
101 assert_eq!(frame.mtu, decoded_frame.mtu);
102 }
103
104 #[test]
105 fn min_mtu() {
106 let frame = MtuProbingComplete::new(0);
107 let encoded = frame.encode_to_vec();
108
109 let buffer = DecoderBuffer::new(encoded.as_slice());
110 let (tag, buffer) = buffer.decode::<ExtensionTag>().expect("decoding succeeds");
111 assert_eq!(TAG, tag);
112 let (decoded_frame, _) =
113 MtuProbingComplete::decode_parameterized(TAG, buffer).expect("decoding succeeds");
114 assert_eq!(0, decoded_frame.mtu);
115 }
116
117 #[test]
118 fn max_mtu() {
119 let frame = MtuProbingComplete::new(u16::MAX);
120 let encoded = frame.encode_to_vec();
121
122 let buffer = DecoderBuffer::new(encoded.as_slice());
123 let (tag, buffer) = buffer.decode::<ExtensionTag>().expect("decoding succeeds");
124 assert_eq!(TAG, tag);
125 let (decoded_frame, _) =
126 MtuProbingComplete::decode_parameterized(TAG, buffer).expect("decoding succeeds");
127 assert_eq!(u16::MAX, decoded_frame.mtu);
128 }
129
130 #[test]
131 fn incomplete_frame() {
132 let frame = MtuProbingComplete::new(1500);
133 let mut encoded = frame.encode_to_vec();
134 encoded.truncate(encoded.len() - 1);
135
136 let buffer = DecoderBuffer::new(encoded.as_slice());
137 let (tag, buffer) = buffer.decode::<ExtensionTag>().expect("decoding succeeds");
138 assert_eq!(TAG, tag);
139
140 assert!(MtuProbingComplete::decode_parameterized(TAG, buffer).is_err());
141 }
142}