Skip to main content

net_wire/quic/frame/
parse.rs

1//! QUIC frame parsing diagnostics.
2
3use core::fmt;
4
5use super::super::varint::{QuicVarIntLen, QuicVarIntParseError};
6
7/// Identifies a semantic field in a QUIC frame.
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9#[non_exhaustive]
10pub enum QuicFrameField {
11    /// The CRYPTO frame's offset field.
12    CryptoOffset,
13    /// The CRYPTO frame's data-length field.
14    CryptoLength,
15    /// The CRYPTO frame's opaque data bytes.
16    CryptoData,
17    /// The frame's token-length field.
18    TokenLength,
19    /// The frame's opaque token bytes.
20    Token,
21    /// The frame's stream-ID field.
22    StreamId,
23    /// The STREAM frame's offset field.
24    StreamOffset,
25    /// The STREAM frame's data-length field.
26    StreamLength,
27    /// The STREAM frame's opaque data bytes.
28    StreamData,
29    /// The frame's maximum-data field.
30    MaximumData,
31    /// The frame's maximum-stream-data field.
32    MaximumStreamData,
33    /// The frame's maximum-streams field.
34    MaximumStreams,
35    /// The frame's application-error-code field.
36    ApplicationErrorCode,
37    /// The CONNECTION_CLOSE frame's error-code field.
38    ConnectionCloseErrorCode,
39    /// The transport CONNECTION_CLOSE frame's triggering-frame-type field.
40    TriggeringFrameType,
41    /// The CONNECTION_CLOSE frame's reason-phrase-length field.
42    ReasonPhraseLength,
43    /// The CONNECTION_CLOSE frame's opaque reason-phrase bytes.
44    ReasonPhrase,
45    /// The frame's final-size field.
46    FinalSize,
47    /// The frame's opaque path-validation data.
48    PathData,
49    /// The frame's connection-ID sequence-number field.
50    SequenceNumber,
51    /// The frame's retire-prior-to field.
52    RetirePriorTo,
53    /// The frame's connection-ID-length field.
54    ConnectionIdLength,
55    /// The frame's opaque connection-ID bytes.
56    ConnectionId,
57    /// The frame's stateless-reset-token bytes.
58    StatelessResetToken,
59    /// The ACK frame's largest-acknowledged field.
60    LargestAcknowledged,
61    /// The ACK frame's acknowledgment-delay field.
62    AckDelay,
63    /// The ACK frame's additional-range count field.
64    AckRangeCount,
65    /// The ACK frame's first acknowledgment-range field.
66    FirstAckRange,
67    /// An ACK frame's additional-range gap field.
68    AckGap,
69    /// An ACK frame's additional-range length field.
70    AckRangeLength,
71    /// The ACK_ECN frame's ECT(0) count field.
72    Ect0Count,
73    /// The ACK_ECN frame's ECT(1) count field.
74    Ect1Count,
75    /// The ACK_ECN frame's ECN-CE count field.
76    EcnCeCount,
77}
78
79/// Failure to parse a QUIC plaintext frame sequence.
80#[derive(Clone, Copy, Debug, Eq, PartialEq)]
81pub enum QuicFrameParseError {
82    /// The supplied plaintext frame sequence contains no frames.
83    EmptySequence,
84    /// The frame-type variable integer is incomplete at the indicated sequence offset.
85    FrameType {
86        /// Absolute byte offset of the frame type from the sequence start.
87        offset: usize,
88        /// Exact variable-integer parsing failure.
89        error: QuicVarIntParseError,
90    },
91    /// A semantic frame field variable integer is incomplete at the indicated sequence offset.
92    Field {
93        /// Semantic field whose variable integer could not be parsed.
94        field: QuicFrameField,
95        /// Absolute byte offset of the field from the sequence start.
96        offset: usize,
97        /// Exact variable-integer parsing failure.
98        error: QuicVarIntParseError,
99    },
100    /// A semantic frame field exceeds its RFC-defined maximum value.
101    FieldValueOutOfRange {
102        /// Semantic field whose decoded value exceeds its maximum.
103        field: QuicFrameField,
104        /// Absolute byte offset of the field from the sequence start.
105        offset: usize,
106        /// Decoded field value.
107        value: u64,
108        /// Greatest permitted field value.
109        maximum: u64,
110    },
111    /// A semantic frame field exceeds the decoded value of another field.
112    FieldValueExceedsField {
113        /// Semantic field whose decoded value is too large.
114        field: QuicFrameField,
115        /// Absolute byte offset of the field from the sequence start.
116        offset: usize,
117        /// Decoded field value.
118        value: u64,
119        /// Semantic field supplying the maximum value.
120        maximum_field: QuicFrameField,
121        /// Decoded maximum-field value.
122        maximum: u64,
123    },
124    /// A decoded frame byte range exceeds its RFC-defined maximum end offset.
125    FieldRangeOutOfRange {
126        /// Semantic field encoding the decoded range start.
127        field: QuicFrameField,
128        /// Absolute byte offset of the encoded range-start field from the sequence start.
129        offset: usize,
130        /// Decoded range start.
131        start: u64,
132        /// Decoded range length.
133        length: u64,
134        /// Greatest permitted decoded range end.
135        maximum: u64,
136    },
137    /// A decoded bounded-byte field length cannot be represented as `usize` on this target.
138    LengthNotRepresentable {
139        /// Semantic field whose length cannot be represented.
140        field: QuicFrameField,
141        /// Absolute byte offset of the encoded length from the sequence start.
142        offset: usize,
143        /// Decoded wire length.
144        value: u64,
145    },
146    /// An implicit bounded-byte field length cannot be represented as `u64`.
147    ImplicitLengthNotRepresentable {
148        /// Semantic field whose implicit length cannot be represented.
149        field: QuicFrameField,
150        /// Absolute byte offset of the bounded byte field from the sequence start.
151        offset: usize,
152        /// Native byte length derived from the supplied slice.
153        length: usize,
154    },
155    /// Computing the end of a bounded-byte field overflows `usize`.
156    LengthOverflow {
157        /// Semantic bounded-byte field whose end cannot be represented.
158        field: QuicFrameField,
159        /// Absolute byte offset of the bounded byte field from the sequence start.
160        offset: usize,
161        /// Representable bounded byte-field length.
162        length: usize,
163    },
164    /// A bounded-byte field is incomplete.
165    IncompleteBytes {
166        /// Semantic bounded-byte field that is incomplete.
167        field: QuicFrameField,
168        /// Absolute byte offset of the bounded byte field from the sequence start.
169        offset: usize,
170        /// Bytes required by the bounded byte field.
171        required: usize,
172        /// Bytes available for the bounded byte field.
173        available: usize,
174    },
175    /// A semantically required nonempty field is empty.
176    EmptyField {
177        /// Semantic field that must not be empty.
178        field: QuicFrameField,
179        /// Absolute byte offset of the field from the sequence start.
180        offset: usize,
181    },
182    /// Computing an ACK range packet number would be negative.
183    AckRangeUnderflow {
184        /// ACK field whose encoded value caused the underflow.
185        field: QuicFrameField,
186        /// Absolute byte offset of the encoded field from the sequence start.
187        offset: usize,
188        /// Packet number before subtracting this field.
189        base: u64,
190        /// Decoded field value being subtracted.
191        value: u64,
192        /// Additional fixed adjustment applied after `value`.
193        adjustment: u64,
194    },
195    /// The frame type has no safe boundary without implementing its type-specific layout.
196    UnsupportedFrameType {
197        /// Decoded raw frame-type value.
198        value: u64,
199        /// Exact encoded frame-type width.
200        length: QuicVarIntLen,
201        /// Absolute byte offset of the frame type from the sequence start.
202        offset: usize,
203    },
204}
205
206impl fmt::Display for QuicFrameParseError {
207    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208        match self {
209            Self::EmptySequence => write!(f, "QUIC plaintext frame sequence is empty"),
210            Self::FrameType { offset, error } => write!(
211                f,
212                "QUIC frame type at offset {offset} cannot be parsed: {error}"
213            ),
214            Self::Field {
215                field,
216                offset,
217                error,
218            } => write!(
219                f,
220                "QUIC frame {field:?} field at offset {offset} cannot be parsed: {error}"
221            ),
222            Self::FieldValueOutOfRange {
223                field,
224                offset,
225                value,
226                maximum,
227            } => write!(
228                f,
229                "QUIC frame {field:?} field at offset {offset} has value {value}, exceeding maximum {maximum}"
230            ),
231            Self::FieldValueExceedsField {
232                field,
233                offset,
234                value,
235                maximum_field,
236                maximum,
237            } => write!(
238                f,
239                "QUIC frame {field:?} field at offset {offset} has value {value}, exceeding {maximum_field:?} value {maximum}"
240            ),
241            Self::FieldRangeOutOfRange {
242                field,
243                offset,
244                start,
245                length,
246                maximum,
247            } => write!(
248                f,
249                "QUIC frame {field:?} range at offset {offset} has start {start} plus length {length}, exceeding maximum end {maximum}"
250            ),
251            Self::LengthNotRepresentable {
252                field,
253                offset,
254                value,
255            } => write!(
256                f,
257                "QUIC frame {field:?} length at offset {offset} has unrepresentable value {value}"
258            ),
259            Self::ImplicitLengthNotRepresentable {
260                field,
261                offset,
262                length,
263            } => write!(
264                f,
265                "QUIC frame {field:?} implicit length at offset {offset} cannot represent native length {length} as u64"
266            ),
267            Self::LengthOverflow {
268                field,
269                offset,
270                length,
271            } => write!(
272                f,
273                "QUIC frame {field:?} bounded field at offset {offset} overflows with length {length}"
274            ),
275            Self::IncompleteBytes {
276                field,
277                offset,
278                required,
279                available,
280            } => write!(
281                f,
282                "QUIC frame {field:?} bytes at offset {offset} are incomplete: need {required} bytes, have {available}"
283            ),
284            Self::EmptyField { field, offset } => write!(
285                f,
286                "QUIC frame {field:?} field at offset {offset} must be nonempty"
287            ),
288            Self::AckRangeUnderflow {
289                field,
290                offset,
291                base,
292                value,
293                adjustment,
294            } => write!(
295                f,
296                "QUIC ACK {field:?} field at offset {offset} underflows: {base} minus {value} minus {adjustment}"
297            ),
298            Self::UnsupportedFrameType {
299                value,
300                length,
301                offset,
302            } => write!(
303                f,
304                "QUIC frame type {value} at offset {offset} with encoded width {} is unsupported",
305                length.byte_len()
306            ),
307        }
308    }
309}