s2n_quic_core/frame/
mtu_probing_complete.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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//# MTU_PROBING_COMPLETE Frame {
16//#   Type (i) = 0xdc0001,
17//#   Mtu [16],
18//# }
19
20//# MTU_PROBING_COMPLETE frames contain the following fields:
21//#
22//# Mtu: A 16-bit unsigned integer indicating the maximum transmission
23//#     unit that has been confirmed through probing.
24
25#[derive(Copy, Clone, Debug, PartialEq, Eq)]
26pub struct MtuProbingComplete {
27    /// A 16-bit value indicating the confirmed MTU
28    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}