Skip to main content

quiche/
frame.rs

1// Copyright (C) 2018-2019, Cloudflare, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8//     * Redistributions of source code must retain the above copyright notice,
9//       this list of conditions and the following disclaimer.
10//
11//     * Redistributions in binary form must reproduce the above copyright
12//       notice, this list of conditions and the following disclaimer in the
13//       documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27use std::convert::TryInto;
28
29use crate::Error;
30use crate::Result;
31
32use crate::packet;
33use crate::range_buf::RangeBuf;
34use crate::ranges;
35
36#[cfg(feature = "qlog")]
37use qlog::events::quic::AckedRanges;
38#[cfg(feature = "qlog")]
39use qlog::events::quic::ErrorSpace;
40#[cfg(feature = "qlog")]
41use qlog::events::quic::QuicFrame;
42#[cfg(feature = "qlog")]
43use qlog::events::quic::StreamType;
44
45pub const MAX_CRYPTO_OVERHEAD: usize = 8;
46pub const MAX_DGRAM_OVERHEAD: usize = 2;
47pub const MAX_STREAM_OVERHEAD: usize = 12;
48pub const MAX_STREAM_SIZE: u64 = 1 << 62;
49
50#[derive(Clone, Debug, PartialEq, Eq)]
51pub struct EcnCounts {
52    ect0_count: u64,
53    ect1_count: u64,
54    ecn_ce_count: u64,
55}
56
57#[derive(Clone, PartialEq, Eq)]
58pub enum Frame {
59    Padding {
60        len: usize,
61    },
62
63    Ping {
64        // Attach metadata to the Ping frame. This doesn't appear on the wire,
65        // but does tell us if this frame was part of a PMTUD probe and how
66        // large the probe was. This will only show up on sent frames and be
67        // None otherwise. This is the total size of the QUIC packet in the
68        // probe.
69        mtu_probe: Option<usize>,
70    },
71
72    ACK {
73        ack_delay: u64,
74        ranges: ranges::RangeSet,
75        ecn_counts: Option<EcnCounts>,
76    },
77
78    ResetStream {
79        stream_id: u64,
80        error_code: u64,
81        final_size: u64,
82    },
83
84    StopSending {
85        stream_id: u64,
86        error_code: u64,
87    },
88
89    Crypto {
90        data: RangeBuf,
91    },
92
93    CryptoHeader {
94        offset: u64,
95        length: usize,
96    },
97
98    NewToken {
99        token: Vec<u8>,
100    },
101
102    Stream {
103        stream_id: u64,
104        data: RangeBuf,
105    },
106
107    StreamHeader {
108        stream_id: u64,
109        offset: u64,
110        length: usize,
111        fin: bool,
112    },
113
114    MaxData {
115        max: u64,
116    },
117
118    MaxStreamData {
119        stream_id: u64,
120        max: u64,
121    },
122
123    MaxStreamsBidi {
124        max: u64,
125    },
126
127    MaxStreamsUni {
128        max: u64,
129    },
130
131    DataBlocked {
132        limit: u64,
133    },
134
135    StreamDataBlocked {
136        stream_id: u64,
137        limit: u64,
138    },
139
140    StreamsBlockedBidi {
141        limit: u64,
142    },
143
144    StreamsBlockedUni {
145        limit: u64,
146    },
147
148    NewConnectionId {
149        seq_num: u64,
150        retire_prior_to: u64,
151        conn_id: Vec<u8>,
152        reset_token: [u8; 16],
153    },
154
155    RetireConnectionId {
156        seq_num: u64,
157    },
158
159    PathChallenge {
160        data: [u8; 8],
161    },
162
163    PathResponse {
164        data: [u8; 8],
165    },
166
167    ConnectionClose {
168        error_code: u64,
169        frame_type: u64,
170        reason: Vec<u8>,
171    },
172
173    ApplicationClose {
174        error_code: u64,
175        reason: Vec<u8>,
176    },
177
178    HandshakeDone,
179
180    Datagram {
181        data: Vec<u8>,
182    },
183
184    DatagramHeader {
185        length: usize,
186    },
187}
188
189impl Frame {
190    pub fn from_bytes(
191        b: &mut octets::Octets, pkt: packet::Type,
192    ) -> Result<Frame> {
193        let frame_type = b.get_varint()?;
194
195        let frame = match frame_type {
196            0x00 => {
197                let mut len = 1;
198
199                while b.peek_u8() == Ok(0x00) {
200                    b.get_u8()?;
201
202                    len += 1;
203                }
204
205                Frame::Padding { len }
206            },
207
208            0x01 => Frame::Ping { mtu_probe: None },
209
210            0x02..=0x03 => parse_ack_frame(frame_type, b)?,
211
212            0x04 => Frame::ResetStream {
213                stream_id: b.get_varint()?,
214                error_code: b.get_varint()?,
215                final_size: b.get_varint()?,
216            },
217
218            0x05 => Frame::StopSending {
219                stream_id: b.get_varint()?,
220                error_code: b.get_varint()?,
221            },
222
223            0x06 => {
224                let offset = b.get_varint()?;
225                let data = b.get_bytes_with_varint_length()?;
226                let data = <RangeBuf>::from(data.as_ref(), offset, false);
227
228                Frame::Crypto { data }
229            },
230
231            0x07 => {
232                let len = b.get_varint()?;
233                if len == 0 {
234                    return Err(Error::InvalidFrame);
235                }
236
237                Frame::NewToken {
238                    token: b.get_bytes(len as usize)?.to_vec(),
239                }
240            },
241
242            0x08..=0x0f => parse_stream_frame(frame_type, b)?,
243
244            0x10 => Frame::MaxData {
245                max: b.get_varint()?,
246            },
247
248            0x11 => Frame::MaxStreamData {
249                stream_id: b.get_varint()?,
250                max: b.get_varint()?,
251            },
252
253            0x12 => Frame::MaxStreamsBidi {
254                max: b.get_varint()?,
255            },
256
257            0x13 => Frame::MaxStreamsUni {
258                max: b.get_varint()?,
259            },
260
261            0x14 => Frame::DataBlocked {
262                limit: b.get_varint()?,
263            },
264
265            0x15 => Frame::StreamDataBlocked {
266                stream_id: b.get_varint()?,
267                limit: b.get_varint()?,
268            },
269
270            0x16 => Frame::StreamsBlockedBidi {
271                limit: b.get_varint()?,
272            },
273
274            0x17 => Frame::StreamsBlockedUni {
275                limit: b.get_varint()?,
276            },
277
278            0x18 => {
279                let seq_num = b.get_varint()?;
280                let retire_prior_to = b.get_varint()?;
281                let conn_id_len = b.get_u8()?;
282
283                if !(1..=packet::MAX_CID_LEN).contains(&conn_id_len) {
284                    return Err(Error::InvalidFrame);
285                }
286
287                Frame::NewConnectionId {
288                    seq_num,
289                    retire_prior_to,
290                    conn_id: b.get_bytes(conn_id_len as usize)?.to_vec(),
291                    reset_token: b
292                        .get_bytes(16)?
293                        .buf()
294                        .try_into()
295                        .map_err(|_| Error::BufferTooShort)?,
296                }
297            },
298
299            0x19 => Frame::RetireConnectionId {
300                seq_num: b.get_varint()?,
301            },
302
303            0x1a => Frame::PathChallenge {
304                data: b
305                    .get_bytes(8)?
306                    .buf()
307                    .try_into()
308                    .map_err(|_| Error::BufferTooShort)?,
309            },
310
311            0x1b => Frame::PathResponse {
312                data: b
313                    .get_bytes(8)?
314                    .buf()
315                    .try_into()
316                    .map_err(|_| Error::BufferTooShort)?,
317            },
318
319            0x1c => Frame::ConnectionClose {
320                error_code: b.get_varint()?,
321                frame_type: b.get_varint()?,
322                reason: b.get_bytes_with_varint_length()?.to_vec(),
323            },
324
325            0x1d => Frame::ApplicationClose {
326                error_code: b.get_varint()?,
327                reason: b.get_bytes_with_varint_length()?.to_vec(),
328            },
329
330            0x1e => Frame::HandshakeDone,
331
332            0x30 | 0x31 => parse_datagram_frame(frame_type, b)?,
333
334            _ => return Err(Error::InvalidFrame),
335        };
336
337        let allowed = match (pkt, &frame) {
338            // PADDING and PING are allowed on all packet types.
339            (_, Frame::Padding { .. }) | (_, Frame::Ping { .. }) => true,
340
341            // ACK, CRYPTO, HANDSHAKE_DONE, NEW_TOKEN, PATH_RESPONSE, and
342            // RETIRE_CONNECTION_ID can't be sent on 0-RTT packets.
343            (packet::Type::ZeroRTT, Frame::ACK { .. }) => false,
344            (packet::Type::ZeroRTT, Frame::Crypto { .. }) => false,
345            (packet::Type::ZeroRTT, Frame::HandshakeDone) => false,
346            (packet::Type::ZeroRTT, Frame::NewToken { .. }) => false,
347            (packet::Type::ZeroRTT, Frame::PathResponse { .. }) => false,
348            (packet::Type::ZeroRTT, Frame::RetireConnectionId { .. }) => false,
349            (packet::Type::ZeroRTT, Frame::ConnectionClose { .. }) => false,
350
351            // ACK, CRYPTO and CONNECTION_CLOSE can be sent on all other packet
352            // types.
353            (_, Frame::ACK { .. }) => true,
354            (_, Frame::Crypto { .. }) => true,
355            (_, Frame::ConnectionClose { .. }) => true,
356
357            // All frames are allowed on 0-RTT and 1-RTT packets.
358            (packet::Type::Short, _) => true,
359            (packet::Type::ZeroRTT, _) => true,
360
361            // All other cases are forbidden.
362            (..) => false,
363        };
364
365        if !allowed {
366            return Err(Error::InvalidPacket);
367        }
368
369        Ok(frame)
370    }
371
372    pub fn to_bytes(&self, b: &mut octets::OctetsMut) -> Result<usize> {
373        let before = b.cap();
374
375        match self {
376            Frame::Padding { len } => {
377                let mut left = *len;
378
379                while left > 0 {
380                    b.put_varint(0x00)?;
381
382                    left -= 1;
383                }
384            },
385
386            Frame::Ping { .. } => {
387                b.put_varint(0x01)?;
388            },
389
390            Frame::ACK {
391                ack_delay,
392                ranges,
393                ecn_counts,
394            } => {
395                if ecn_counts.is_none() {
396                    b.put_varint(0x02)?;
397                } else {
398                    b.put_varint(0x03)?;
399                }
400
401                let mut it = ranges.iter().rev();
402
403                let first = it.next().unwrap();
404                let ack_block = (first.end - 1) - first.start;
405
406                b.put_varint(first.end - 1)?;
407                b.put_varint(*ack_delay)?;
408                b.put_varint(it.len() as u64)?;
409                b.put_varint(ack_block)?;
410
411                let mut smallest_ack = first.start;
412
413                for block in it {
414                    let gap = smallest_ack - block.end - 1;
415                    let ack_block = (block.end - 1) - block.start;
416
417                    b.put_varint(gap)?;
418                    b.put_varint(ack_block)?;
419
420                    smallest_ack = block.start;
421                }
422
423                if let Some(ecn) = ecn_counts {
424                    b.put_varint(ecn.ect0_count)?;
425                    b.put_varint(ecn.ect1_count)?;
426                    b.put_varint(ecn.ecn_ce_count)?;
427                }
428            },
429
430            Frame::ResetStream {
431                stream_id,
432                error_code,
433                final_size,
434            } => {
435                b.put_varint(0x04)?;
436
437                b.put_varint(*stream_id)?;
438                b.put_varint(*error_code)?;
439                b.put_varint(*final_size)?;
440            },
441
442            Frame::StopSending {
443                stream_id,
444                error_code,
445            } => {
446                b.put_varint(0x05)?;
447
448                b.put_varint(*stream_id)?;
449                b.put_varint(*error_code)?;
450            },
451
452            Frame::Crypto { data } => {
453                encode_crypto_header(data.off(), data.len() as u64, b)?;
454
455                b.put_bytes(data)?;
456            },
457
458            Frame::CryptoHeader { .. } => (),
459
460            Frame::NewToken { token } => {
461                b.put_varint(0x07)?;
462
463                b.put_varint(token.len() as u64)?;
464                b.put_bytes(token)?;
465            },
466
467            Frame::Stream { stream_id, data } => {
468                encode_stream_header(
469                    *stream_id,
470                    data.off(),
471                    data.len() as u64,
472                    data.fin(),
473                    b,
474                )?;
475
476                b.put_bytes(data)?;
477            },
478
479            Frame::StreamHeader { .. } => (),
480
481            Frame::MaxData { max } => {
482                b.put_varint(0x10)?;
483
484                b.put_varint(*max)?;
485            },
486
487            Frame::MaxStreamData { stream_id, max } => {
488                b.put_varint(0x11)?;
489
490                b.put_varint(*stream_id)?;
491                b.put_varint(*max)?;
492            },
493
494            Frame::MaxStreamsBidi { max } => {
495                b.put_varint(0x12)?;
496
497                b.put_varint(*max)?;
498            },
499
500            Frame::MaxStreamsUni { max } => {
501                b.put_varint(0x13)?;
502
503                b.put_varint(*max)?;
504            },
505
506            Frame::DataBlocked { limit } => {
507                b.put_varint(0x14)?;
508
509                b.put_varint(*limit)?;
510            },
511
512            Frame::StreamDataBlocked { stream_id, limit } => {
513                b.put_varint(0x15)?;
514
515                b.put_varint(*stream_id)?;
516                b.put_varint(*limit)?;
517            },
518
519            Frame::StreamsBlockedBidi { limit } => {
520                b.put_varint(0x16)?;
521
522                b.put_varint(*limit)?;
523            },
524
525            Frame::StreamsBlockedUni { limit } => {
526                b.put_varint(0x17)?;
527
528                b.put_varint(*limit)?;
529            },
530
531            Frame::NewConnectionId {
532                seq_num,
533                retire_prior_to,
534                conn_id,
535                reset_token,
536            } => {
537                b.put_varint(0x18)?;
538
539                b.put_varint(*seq_num)?;
540                b.put_varint(*retire_prior_to)?;
541                b.put_u8(conn_id.len() as u8)?;
542                b.put_bytes(conn_id.as_ref())?;
543                b.put_bytes(reset_token.as_ref())?;
544            },
545
546            Frame::RetireConnectionId { seq_num } => {
547                b.put_varint(0x19)?;
548
549                b.put_varint(*seq_num)?;
550            },
551
552            Frame::PathChallenge { data } => {
553                b.put_varint(0x1a)?;
554
555                b.put_bytes(data.as_ref())?;
556            },
557
558            Frame::PathResponse { data } => {
559                b.put_varint(0x1b)?;
560
561                b.put_bytes(data.as_ref())?;
562            },
563
564            Frame::ConnectionClose {
565                error_code,
566                frame_type,
567                reason,
568            } => {
569                b.put_varint(0x1c)?;
570
571                b.put_varint(*error_code)?;
572                b.put_varint(*frame_type)?;
573                b.put_varint(reason.len() as u64)?;
574                b.put_bytes(reason.as_ref())?;
575            },
576
577            Frame::ApplicationClose { error_code, reason } => {
578                b.put_varint(0x1d)?;
579
580                b.put_varint(*error_code)?;
581                b.put_varint(reason.len() as u64)?;
582                b.put_bytes(reason.as_ref())?;
583            },
584
585            Frame::HandshakeDone => {
586                b.put_varint(0x1e)?;
587            },
588
589            Frame::Datagram { data } => {
590                encode_dgram_header(data.len() as u64, b)?;
591
592                b.put_bytes(data.as_ref())?;
593            },
594
595            Frame::DatagramHeader { .. } => (),
596        }
597
598        Ok(before - b.cap())
599    }
600
601    pub fn wire_len(&self) -> usize {
602        match self {
603            Frame::Padding { len } => *len,
604
605            Frame::Ping { .. } => 1,
606
607            Frame::ACK {
608                ack_delay,
609                ranges,
610                ecn_counts,
611            } => {
612                let mut it = ranges.iter().rev();
613
614                let first = it.next().unwrap();
615                let ack_block = (first.end - 1) - first.start;
616
617                let mut len = 1 + // frame type
618                    octets::varint_len(first.end - 1) + // largest_ack
619                    octets::varint_len(*ack_delay) + // ack_delay
620                    octets::varint_len(it.len() as u64) + // block_count
621                    octets::varint_len(ack_block); // first_block
622
623                let mut smallest_ack = first.start;
624
625                for block in it {
626                    let gap = smallest_ack - block.end - 1;
627                    let ack_block = (block.end - 1) - block.start;
628
629                    len += octets::varint_len(gap) + // gap
630                           octets::varint_len(ack_block); // ack_block
631
632                    smallest_ack = block.start;
633                }
634
635                if let Some(ecn) = ecn_counts {
636                    len += octets::varint_len(ecn.ect0_count) +
637                        octets::varint_len(ecn.ect1_count) +
638                        octets::varint_len(ecn.ecn_ce_count);
639                }
640
641                len
642            },
643
644            Frame::ResetStream {
645                stream_id,
646                error_code,
647                final_size,
648            } => {
649                1 + // frame type
650                octets::varint_len(*stream_id) + // stream_id
651                octets::varint_len(*error_code) + // error_code
652                octets::varint_len(*final_size) // final_size
653            },
654
655            Frame::StopSending {
656                stream_id,
657                error_code,
658            } => {
659                1 + // frame type
660                octets::varint_len(*stream_id) + // stream_id
661                octets::varint_len(*error_code) // error_code
662            },
663
664            Frame::Crypto { data } => {
665                1 + // frame type
666                octets::varint_len(data.off()) + // offset
667                2 + // length, always encode as 2-byte varint
668                data.len() // data
669            },
670
671            Frame::CryptoHeader { offset, length, .. } => {
672                1 + // frame type
673                octets::varint_len(*offset) + // offset
674                2 + // length, always encode as 2-byte varint
675                length // data
676            },
677
678            Frame::NewToken { token } => {
679                1 + // frame type
680                octets::varint_len(token.len() as u64) + // token length
681                token.len() // token
682            },
683
684            Frame::Stream { stream_id, data } => {
685                1 + // frame type
686                octets::varint_len(*stream_id) + // stream_id
687                octets::varint_len(data.off()) + // offset
688                2 + // length, always encode as 2-byte varint
689                data.len() // data
690            },
691
692            Frame::StreamHeader {
693                stream_id,
694                offset,
695                length,
696                ..
697            } => {
698                1 + // frame type
699                octets::varint_len(*stream_id) + // stream_id
700                octets::varint_len(*offset) + // offset
701                2 + // length, always encode as 2-byte varint
702                length // data
703            },
704
705            Frame::MaxData { max } => {
706                1 + // frame type
707                octets::varint_len(*max) // max
708            },
709
710            Frame::MaxStreamData { stream_id, max } => {
711                1 + // frame type
712                octets::varint_len(*stream_id) + // stream_id
713                octets::varint_len(*max) // max
714            },
715
716            Frame::MaxStreamsBidi { max } => {
717                1 + // frame type
718                octets::varint_len(*max) // max
719            },
720
721            Frame::MaxStreamsUni { max } => {
722                1 + // frame type
723                octets::varint_len(*max) // max
724            },
725
726            Frame::DataBlocked { limit } => {
727                1 + // frame type
728                octets::varint_len(*limit) // limit
729            },
730
731            Frame::StreamDataBlocked { stream_id, limit } => {
732                1 + // frame type
733                octets::varint_len(*stream_id) + // stream_id
734                octets::varint_len(*limit) // limit
735            },
736
737            Frame::StreamsBlockedBidi { limit } => {
738                1 + // frame type
739                octets::varint_len(*limit) // limit
740            },
741
742            Frame::StreamsBlockedUni { limit } => {
743                1 + // frame type
744                octets::varint_len(*limit) // limit
745            },
746
747            Frame::NewConnectionId {
748                seq_num,
749                retire_prior_to,
750                conn_id,
751                reset_token,
752            } => {
753                1 + // frame type
754                octets::varint_len(*seq_num) + // seq_num
755                octets::varint_len(*retire_prior_to) + // retire_prior_to
756                1 + // conn_id length
757                conn_id.len() + // conn_id
758                reset_token.len() // reset_token
759            },
760
761            Frame::RetireConnectionId { seq_num } => {
762                1 + // frame type
763                octets::varint_len(*seq_num) // seq_num
764            },
765
766            Frame::PathChallenge { .. } => {
767                1 + // frame type
768                8 // data
769            },
770
771            Frame::PathResponse { .. } => {
772                1 + // frame type
773                8 // data
774            },
775
776            Frame::ConnectionClose {
777                frame_type,
778                error_code,
779                reason,
780                ..
781            } => {
782                1 + // frame type
783                octets::varint_len(*error_code) + // error_code
784                octets::varint_len(*frame_type) + // frame_type
785                octets::varint_len(reason.len() as u64) + // reason_len
786                reason.len() // reason
787            },
788
789            Frame::ApplicationClose { reason, error_code } => {
790                1 + // frame type
791                octets::varint_len(*error_code) + // error_code
792                octets::varint_len(reason.len() as u64) + // reason_len
793                reason.len() // reason
794            },
795
796            Frame::HandshakeDone => {
797                1 // frame type
798            },
799
800            Frame::Datagram { data } => {
801                1 + // frame type
802                2 + // length, always encode as 2-byte varint
803                data.len() // data
804            },
805
806            Frame::DatagramHeader { length } => {
807                1 + // frame type
808                2 + // length, always encode as 2-byte varint
809                *length // data
810            },
811        }
812    }
813
814    pub fn ack_eliciting(&self) -> bool {
815        // Any other frame is ack-eliciting (note the `!`).
816        !matches!(
817            self,
818            Frame::Padding { .. } |
819                Frame::ACK { .. } |
820                Frame::ApplicationClose { .. } |
821                Frame::ConnectionClose { .. }
822        )
823    }
824
825    pub fn probing(&self) -> bool {
826        matches!(
827            self,
828            Frame::Padding { .. } |
829                Frame::NewConnectionId { .. } |
830                Frame::PathChallenge { .. } |
831                Frame::PathResponse { .. }
832        )
833    }
834
835    #[cfg(feature = "qlog")]
836    pub fn to_qlog(&self) -> QuicFrame {
837        use qlog::events::ConnectionClosedFrameError;
838        use qlog::events::RawInfo;
839
840        match self {
841            Frame::Padding { len } => QuicFrame::Padding {
842                raw: Some(RawInfo {
843                    length: None,
844                    payload_length: Some(*len as u64),
845                    data: None,
846                }),
847            },
848
849            Frame::Ping { .. } => QuicFrame::Ping { raw: None },
850
851            Frame::ACK {
852                ack_delay,
853                ranges,
854                ecn_counts,
855            } => {
856                let ack_ranges = AckedRanges::Double(
857                    ranges.iter().map(|r| (r.start, r.end - 1)).collect(),
858                );
859
860                let (ect0, ect1, ce) = match ecn_counts {
861                    Some(ecn) => (
862                        Some(ecn.ect0_count),
863                        Some(ecn.ect1_count),
864                        Some(ecn.ecn_ce_count),
865                    ),
866
867                    None => (None, None, None),
868                };
869
870                QuicFrame::Ack {
871                    ack_delay: Some(*ack_delay as f32 / 1000.0),
872                    acked_ranges: Some(ack_ranges),
873                    ect1,
874                    ect0,
875                    ce,
876                    raw: None,
877                }
878            },
879
880            Frame::ResetStream {
881                stream_id,
882                error_code,
883                final_size,
884            } => QuicFrame::ResetStream {
885                stream_id: *stream_id,
886                error: qlog::events::ApplicationError::Unknown,
887                error_code: Some(*error_code),
888                final_size: *final_size,
889                raw: None,
890            },
891
892            Frame::StopSending {
893                stream_id,
894                error_code,
895            } => QuicFrame::StopSending {
896                stream_id: *stream_id,
897                error: qlog::events::ApplicationError::Unknown,
898                error_code: Some(*error_code),
899                raw: None,
900            },
901
902            Frame::Crypto { data } => QuicFrame::Crypto {
903                offset: data.off(),
904                raw: Some(RawInfo {
905                    length: None,
906                    payload_length: Some(data.len() as u64),
907                    data: None,
908                }),
909            },
910
911            Frame::CryptoHeader { offset, length } => QuicFrame::Crypto {
912                offset: *offset,
913                raw: Some(RawInfo {
914                    length: None,
915                    payload_length: Some(*length as u64),
916                    data: None,
917                }),
918            },
919
920            Frame::NewToken { token } => QuicFrame::NewToken {
921                token: qlog::Token {
922                    // TODO: pick the token type some how
923                    ty: Some(qlog::TokenType::Retry),
924                    raw: Some(RawInfo {
925                        data: qlog::HexSlice::maybe_string(Some(token)),
926                        length: Some(token.len() as u64),
927                        payload_length: None,
928                    }),
929                    details: None,
930                },
931                raw: None,
932            },
933
934            Frame::Stream { stream_id, data } => QuicFrame::Stream {
935                stream_id: *stream_id,
936                offset: Some(data.off()),
937                fin: data.fin().then_some(true),
938                raw: Some(RawInfo {
939                    length: None,
940                    payload_length: Some(data.len() as u64),
941                    data: None,
942                }),
943            },
944
945            Frame::StreamHeader {
946                stream_id,
947                offset,
948                length,
949                fin,
950            } => QuicFrame::Stream {
951                stream_id: *stream_id,
952                offset: Some(*offset),
953                fin: fin.then(|| true),
954                raw: Some(RawInfo {
955                    length: None,
956                    payload_length: Some(*length as u64),
957                    data: None,
958                }),
959            },
960
961            Frame::MaxData { max } => QuicFrame::MaxData {
962                maximum: *max,
963                raw: None,
964            },
965
966            Frame::MaxStreamData { stream_id, max } => QuicFrame::MaxStreamData {
967                stream_id: *stream_id,
968                maximum: *max,
969                raw: None,
970            },
971
972            Frame::MaxStreamsBidi { max } => QuicFrame::MaxStreams {
973                stream_type: StreamType::Bidirectional,
974                maximum: *max,
975                raw: None,
976            },
977
978            Frame::MaxStreamsUni { max } => QuicFrame::MaxStreams {
979                stream_type: StreamType::Unidirectional,
980                maximum: *max,
981                raw: None,
982            },
983
984            Frame::DataBlocked { limit } => QuicFrame::DataBlocked {
985                limit: *limit,
986                raw: None,
987            },
988
989            Frame::StreamDataBlocked { stream_id, limit } =>
990                QuicFrame::StreamDataBlocked {
991                    stream_id: *stream_id,
992                    limit: *limit,
993                    raw: None,
994                },
995
996            Frame::StreamsBlockedBidi { limit } => QuicFrame::StreamsBlocked {
997                stream_type: StreamType::Bidirectional,
998                limit: *limit,
999                raw: None,
1000            },
1001
1002            Frame::StreamsBlockedUni { limit } => QuicFrame::StreamsBlocked {
1003                stream_type: StreamType::Unidirectional,
1004                limit: *limit,
1005                raw: None,
1006            },
1007
1008            Frame::NewConnectionId {
1009                seq_num,
1010                retire_prior_to,
1011                conn_id,
1012                reset_token,
1013            } => QuicFrame::NewConnectionId {
1014                sequence_number: *seq_num,
1015                retire_prior_to: *retire_prior_to,
1016                connection_id_length: Some(conn_id.len() as u8),
1017                connection_id: format!("{}", qlog::HexSlice::new(conn_id)),
1018                stateless_reset_token: qlog::HexSlice::maybe_string(Some(
1019                    reset_token,
1020                )),
1021                raw: None,
1022            },
1023
1024            Frame::RetireConnectionId { seq_num } =>
1025                QuicFrame::RetireConnectionId {
1026                    sequence_number: *seq_num,
1027                    raw: None,
1028                },
1029
1030            Frame::PathChallenge { .. } => QuicFrame::PathChallenge {
1031                data: None,
1032                raw: None,
1033            },
1034
1035            Frame::PathResponse { .. } => QuicFrame::PathResponse {
1036                data: None,
1037                raw: None,
1038            },
1039
1040            Frame::ConnectionClose {
1041                error_code, reason, ..
1042            } => QuicFrame::ConnectionClose {
1043                // TODO: use actual variant not unknown
1044                error: Some(ConnectionClosedFrameError::TransportError(
1045                    qlog::events::quic::TransportError::Unknown,
1046                )),
1047                error_space: Some(ErrorSpace::TransportError),
1048                error_code: Some(*error_code),
1049                reason: Some(String::from_utf8_lossy(reason).into_owned()),
1050                reason_bytes: None,
1051                trigger_frame_type: None, // don't know trigger type
1052            },
1053
1054            Frame::ApplicationClose { error_code, reason } => {
1055                QuicFrame::ConnectionClose {
1056                    error: Some(ConnectionClosedFrameError::ApplicationError(
1057                        qlog::events::ApplicationError::Unknown,
1058                    )),
1059                    error_space: Some(ErrorSpace::ApplicationError),
1060                    error_code: Some(*error_code),
1061                    reason: Some(String::from_utf8_lossy(reason).into_owned()),
1062                    reason_bytes: None,
1063                    trigger_frame_type: None, // don't know trigger type
1064                }
1065            },
1066
1067            Frame::HandshakeDone => QuicFrame::HandshakeDone { raw: None },
1068
1069            Frame::Datagram { data } => QuicFrame::Datagram {
1070                raw: Some(RawInfo {
1071                    length: None,
1072                    payload_length: Some(data.len() as u64),
1073                    data: None,
1074                }),
1075            },
1076
1077            Frame::DatagramHeader { length } => QuicFrame::Datagram {
1078                raw: Some(RawInfo {
1079                    length: None,
1080                    payload_length: Some(*length as u64),
1081                    data: None,
1082                }),
1083            },
1084        }
1085    }
1086}
1087
1088impl std::fmt::Debug for Frame {
1089    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1090        match self {
1091            Frame::Padding { len } => {
1092                write!(f, "PADDING len={len}")?;
1093            },
1094
1095            Frame::Ping { mtu_probe } => {
1096                write!(f, "PING mtu_probe={mtu_probe:?}")?;
1097            },
1098
1099            Frame::ACK {
1100                ack_delay,
1101                ranges,
1102                ecn_counts,
1103            } => {
1104                write!(
1105                    f,
1106                    "ACK delay={ack_delay} blocks={ranges:?} ecn_counts={ecn_counts:?}"
1107                )?;
1108            },
1109
1110            Frame::ResetStream {
1111                stream_id,
1112                error_code,
1113                final_size,
1114            } => {
1115                write!(
1116                    f,
1117                    "RESET_STREAM stream={stream_id} err={error_code:x} size={final_size}"
1118                )?;
1119            },
1120
1121            Frame::StopSending {
1122                stream_id,
1123                error_code,
1124            } => {
1125                write!(f, "STOP_SENDING stream={stream_id} err={error_code:x}")?;
1126            },
1127
1128            Frame::Crypto { data } => {
1129                write!(f, "CRYPTO off={} len={}", data.off(), data.len())?;
1130            },
1131
1132            Frame::CryptoHeader { offset, length } => {
1133                write!(f, "CRYPTO off={offset} len={length}")?;
1134            },
1135
1136            Frame::NewToken { token } => {
1137                write!(f, "NEW_TOKEN len={}", token.len())?;
1138            },
1139
1140            Frame::Stream { stream_id, data } => {
1141                write!(
1142                    f,
1143                    "STREAM id={} off={} len={} fin={}",
1144                    stream_id,
1145                    data.off(),
1146                    data.len(),
1147                    data.fin()
1148                )?;
1149            },
1150
1151            Frame::StreamHeader {
1152                stream_id,
1153                offset,
1154                length,
1155                fin,
1156            } => {
1157                write!(
1158                    f,
1159                    "STREAM id={stream_id} off={offset} len={length} fin={fin}"
1160                )?;
1161            },
1162
1163            Frame::MaxData { max } => {
1164                write!(f, "MAX_DATA max={max}")?;
1165            },
1166
1167            Frame::MaxStreamData { stream_id, max } => {
1168                write!(f, "MAX_STREAM_DATA stream={stream_id} max={max}")?;
1169            },
1170
1171            Frame::MaxStreamsBidi { max } => {
1172                write!(f, "MAX_STREAMS type=bidi max={max}")?;
1173            },
1174
1175            Frame::MaxStreamsUni { max } => {
1176                write!(f, "MAX_STREAMS type=uni max={max}")?;
1177            },
1178
1179            Frame::DataBlocked { limit } => {
1180                write!(f, "DATA_BLOCKED limit={limit}")?;
1181            },
1182
1183            Frame::StreamDataBlocked { stream_id, limit } => {
1184                write!(
1185                    f,
1186                    "STREAM_DATA_BLOCKED stream={stream_id} limit={limit}"
1187                )?;
1188            },
1189
1190            Frame::StreamsBlockedBidi { limit } => {
1191                write!(f, "STREAMS_BLOCKED type=bidi limit={limit}")?;
1192            },
1193
1194            Frame::StreamsBlockedUni { limit } => {
1195                write!(f, "STREAMS_BLOCKED type=uni limit={limit}")?;
1196            },
1197
1198            Frame::NewConnectionId {
1199                seq_num,
1200                retire_prior_to,
1201                conn_id,
1202                reset_token,
1203            } => {
1204                write!(
1205                    f,
1206                    "NEW_CONNECTION_ID seq_num={seq_num} retire_prior_to={retire_prior_to} conn_id={conn_id:02x?} reset_token={reset_token:02x?}",
1207                )?;
1208            },
1209
1210            Frame::RetireConnectionId { seq_num } => {
1211                write!(f, "RETIRE_CONNECTION_ID seq_num={seq_num}")?;
1212            },
1213
1214            Frame::PathChallenge { data } => {
1215                write!(f, "PATH_CHALLENGE data={data:02x?}")?;
1216            },
1217
1218            Frame::PathResponse { data } => {
1219                write!(f, "PATH_RESPONSE data={data:02x?}")?;
1220            },
1221
1222            Frame::ConnectionClose {
1223                error_code,
1224                frame_type,
1225                reason,
1226            } => {
1227                write!(
1228                    f,
1229                    "CONNECTION_CLOSE err={error_code:x} frame={frame_type:x} reason={reason:x?}"
1230                )?;
1231            },
1232
1233            Frame::ApplicationClose { error_code, reason } => {
1234                write!(
1235                    f,
1236                    "APPLICATION_CLOSE err={error_code:x} reason={reason:x?}"
1237                )?;
1238            },
1239
1240            Frame::HandshakeDone => {
1241                write!(f, "HANDSHAKE_DONE")?;
1242            },
1243
1244            Frame::Datagram { data } => {
1245                write!(f, "DATAGRAM len={}", data.len())?;
1246            },
1247
1248            Frame::DatagramHeader { length } => {
1249                write!(f, "DATAGRAM len={length}")?;
1250            },
1251        }
1252
1253        Ok(())
1254    }
1255}
1256
1257fn parse_ack_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
1258    let first = ty as u8;
1259
1260    let largest_ack = b.get_varint()?;
1261    let ack_delay = b.get_varint()?;
1262    let block_count = b.get_varint()?;
1263    let ack_block = b.get_varint()?;
1264
1265    if largest_ack < ack_block {
1266        return Err(Error::InvalidFrame);
1267    }
1268
1269    let mut smallest_ack = largest_ack - ack_block;
1270
1271    let mut ranges = ranges::RangeSet::default();
1272
1273    ranges.insert(smallest_ack..largest_ack + 1);
1274
1275    for _i in 0..block_count {
1276        let gap = b.get_varint()?;
1277
1278        if smallest_ack < 2 + gap {
1279            return Err(Error::InvalidFrame);
1280        }
1281
1282        let largest_ack = (smallest_ack - gap) - 2;
1283        let ack_block = b.get_varint()?;
1284
1285        if largest_ack < ack_block {
1286            return Err(Error::InvalidFrame);
1287        }
1288
1289        smallest_ack = largest_ack - ack_block;
1290
1291        ranges.insert(smallest_ack..largest_ack + 1);
1292    }
1293
1294    let ecn_counts = if first & 0x01 != 0 {
1295        let ecn = EcnCounts {
1296            ect0_count: b.get_varint()?,
1297            ect1_count: b.get_varint()?,
1298            ecn_ce_count: b.get_varint()?,
1299        };
1300
1301        Some(ecn)
1302    } else {
1303        None
1304    };
1305
1306    Ok(Frame::ACK {
1307        ack_delay,
1308        ranges,
1309        ecn_counts,
1310    })
1311}
1312
1313pub fn encode_crypto_header(
1314    offset: u64, length: u64, b: &mut octets::OctetsMut,
1315) -> Result<()> {
1316    b.put_varint(0x06)?;
1317
1318    b.put_varint(offset)?;
1319
1320    // Always encode length field as 2-byte varint.
1321    b.put_varint_with_len(length, 2)?;
1322
1323    Ok(())
1324}
1325
1326pub fn encode_stream_header(
1327    stream_id: u64, offset: u64, length: u64, fin: bool,
1328    b: &mut octets::OctetsMut,
1329) -> Result<()> {
1330    let mut ty: u8 = 0x08;
1331
1332    // Always encode offset.
1333    ty |= 0x04;
1334
1335    // Always encode length.
1336    ty |= 0x02;
1337
1338    if fin {
1339        ty |= 0x01;
1340    }
1341
1342    b.put_varint(u64::from(ty))?;
1343
1344    b.put_varint(stream_id)?;
1345    b.put_varint(offset)?;
1346
1347    // Always encode length field as 2-byte varint.
1348    b.put_varint_with_len(length, 2)?;
1349
1350    Ok(())
1351}
1352
1353pub fn encode_dgram_header(length: u64, b: &mut octets::OctetsMut) -> Result<()> {
1354    let mut ty: u8 = 0x30;
1355
1356    // Always encode length
1357    ty |= 0x01;
1358
1359    b.put_varint(u64::from(ty))?;
1360
1361    // Always encode length field as 2-byte varint.
1362    b.put_varint_with_len(length, 2)?;
1363
1364    Ok(())
1365}
1366
1367fn parse_stream_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
1368    let first = ty as u8;
1369
1370    let stream_id = b.get_varint()?;
1371
1372    let offset = if first & 0x04 != 0 {
1373        b.get_varint()?
1374    } else {
1375        0
1376    };
1377
1378    let len = if first & 0x02 != 0 {
1379        b.get_varint()? as usize
1380    } else {
1381        b.cap()
1382    };
1383
1384    if offset + len as u64 >= MAX_STREAM_SIZE {
1385        return Err(Error::InvalidFrame);
1386    }
1387
1388    let fin = first & 0x01 != 0;
1389
1390    let data = b.get_bytes(len)?;
1391    let data = <RangeBuf>::from(data.as_ref(), offset, fin);
1392
1393    Ok(Frame::Stream { stream_id, data })
1394}
1395
1396fn parse_datagram_frame(ty: u64, b: &mut octets::Octets) -> Result<Frame> {
1397    let first = ty as u8;
1398
1399    let len = if first & 0x01 != 0 {
1400        b.get_varint()? as usize
1401    } else {
1402        b.cap()
1403    };
1404
1405    let data = b.get_bytes(len)?;
1406
1407    Ok(Frame::Datagram {
1408        data: Vec::from(data.buf()),
1409    })
1410}
1411
1412#[cfg(test)]
1413mod tests {
1414    use super::*;
1415
1416    #[test]
1417    fn padding() {
1418        let mut d = [42; 128];
1419
1420        let frame = Frame::Padding { len: 128 };
1421
1422        let wire_len = {
1423            let mut b = octets::OctetsMut::with_slice(&mut d);
1424            frame.to_bytes(&mut b).unwrap()
1425        };
1426
1427        assert_eq!(wire_len, 128);
1428
1429        let mut b = octets::Octets::with_slice(&d);
1430        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1431
1432        let mut b = octets::Octets::with_slice(&d);
1433        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
1434
1435        let mut b = octets::Octets::with_slice(&d);
1436        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1437
1438        let mut b = octets::Octets::with_slice(&d);
1439        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
1440    }
1441
1442    #[test]
1443    fn ping() {
1444        let mut d = [42; 128];
1445
1446        let frame = Frame::Ping { mtu_probe: None };
1447
1448        let wire_len = {
1449            let mut b = octets::OctetsMut::with_slice(&mut d);
1450            frame.to_bytes(&mut b).unwrap()
1451        };
1452
1453        assert_eq!(wire_len, 1);
1454        assert_eq!(&d[..wire_len], [0x01_u8]);
1455
1456        let mut b = octets::Octets::with_slice(&d);
1457        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1458
1459        let mut b = octets::Octets::with_slice(&d);
1460        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1461
1462        let mut b = octets::Octets::with_slice(&d);
1463        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
1464
1465        let mut b = octets::Octets::with_slice(&d);
1466        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
1467    }
1468
1469    #[test]
1470    fn ack() {
1471        let mut d = [42; 128];
1472
1473        let mut ranges = ranges::RangeSet::default();
1474        ranges.insert(4..7);
1475        ranges.insert(9..12);
1476        ranges.insert(15..19);
1477        ranges.insert(3000..5000);
1478
1479        let frame = Frame::ACK {
1480            ack_delay: 874_656_534,
1481            ranges,
1482            ecn_counts: None,
1483        };
1484
1485        let wire_len = {
1486            let mut b = octets::OctetsMut::with_slice(&mut d);
1487            frame.to_bytes(&mut b).unwrap()
1488        };
1489
1490        assert_eq!(wire_len, 17);
1491
1492        let mut b = octets::Octets::with_slice(&d);
1493        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1494
1495        let mut b = octets::Octets::with_slice(&d);
1496        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
1497
1498        let mut b = octets::Octets::with_slice(&d);
1499        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
1500
1501        let mut b = octets::Octets::with_slice(&d);
1502        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
1503    }
1504
1505    #[test]
1506    fn ack_ecn() {
1507        let mut d = [42; 128];
1508
1509        let mut ranges = ranges::RangeSet::default();
1510        ranges.insert(4..7);
1511        ranges.insert(9..12);
1512        ranges.insert(15..19);
1513        ranges.insert(3000..5000);
1514
1515        let ecn_counts = Some(EcnCounts {
1516            ect0_count: 100,
1517            ect1_count: 200,
1518            ecn_ce_count: 300,
1519        });
1520
1521        let frame = Frame::ACK {
1522            ack_delay: 874_656_534,
1523            ranges,
1524            ecn_counts,
1525        };
1526
1527        let wire_len = {
1528            let mut b = octets::OctetsMut::with_slice(&mut d);
1529            frame.to_bytes(&mut b).unwrap()
1530        };
1531
1532        assert_eq!(wire_len, 23);
1533
1534        let mut b = octets::Octets::with_slice(&d);
1535        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1536
1537        let mut b = octets::Octets::with_slice(&d);
1538        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
1539
1540        let mut b = octets::Octets::with_slice(&d);
1541        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
1542
1543        let mut b = octets::Octets::with_slice(&d);
1544        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
1545    }
1546
1547    #[test]
1548    fn reset_stream() {
1549        let mut d = [42; 128];
1550
1551        let frame = Frame::ResetStream {
1552            stream_id: 123_213,
1553            error_code: 21_123_767,
1554            final_size: 21_123_767,
1555        };
1556
1557        let wire_len = {
1558            let mut b = octets::OctetsMut::with_slice(&mut d);
1559            frame.to_bytes(&mut b).unwrap()
1560        };
1561
1562        assert_eq!(wire_len, 13);
1563
1564        let mut b = octets::Octets::with_slice(&d);
1565        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1566
1567        let mut b = octets::Octets::with_slice(&d);
1568        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1569
1570        let mut b = octets::Octets::with_slice(&d);
1571        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1572
1573        let mut b = octets::Octets::with_slice(&d);
1574        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1575    }
1576
1577    #[test]
1578    fn stop_sending() {
1579        let mut d = [42; 128];
1580
1581        let frame = Frame::StopSending {
1582            stream_id: 123_213,
1583            error_code: 15_352,
1584        };
1585
1586        let wire_len = {
1587            let mut b = octets::OctetsMut::with_slice(&mut d);
1588            frame.to_bytes(&mut b).unwrap()
1589        };
1590
1591        assert_eq!(wire_len, 7);
1592
1593        let mut b = octets::Octets::with_slice(&d);
1594        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1595
1596        let mut b = octets::Octets::with_slice(&d);
1597        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1598
1599        let mut b = octets::Octets::with_slice(&d);
1600        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1601
1602        let mut b = octets::Octets::with_slice(&d);
1603        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1604    }
1605
1606    #[test]
1607    fn crypto() {
1608        let mut d = [42; 128];
1609
1610        let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1611
1612        let frame = Frame::Crypto {
1613            data: <RangeBuf>::from(&data, 1230976, false),
1614        };
1615
1616        let wire_len = {
1617            let mut b = octets::OctetsMut::with_slice(&mut d);
1618            frame.to_bytes(&mut b).unwrap()
1619        };
1620
1621        assert_eq!(wire_len, 19);
1622
1623        let mut b = octets::Octets::with_slice(&d);
1624        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1625
1626        let mut b = octets::Octets::with_slice(&d);
1627        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
1628
1629        let mut b = octets::Octets::with_slice(&d);
1630        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
1631
1632        let mut b = octets::Octets::with_slice(&d);
1633        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
1634    }
1635
1636    #[test]
1637    fn new_token() {
1638        let mut d = [42; 128];
1639
1640        let frame = Frame::NewToken {
1641            token: Vec::from("this is a token"),
1642        };
1643
1644        let wire_len = {
1645            let mut b = octets::OctetsMut::with_slice(&mut d);
1646            frame.to_bytes(&mut b).unwrap()
1647        };
1648
1649        assert_eq!(wire_len, 17);
1650
1651        let mut b = octets::Octets::with_slice(&d);
1652        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1653
1654        let mut b = octets::Octets::with_slice(&d);
1655        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1656
1657        let mut b = octets::Octets::with_slice(&d);
1658        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
1659
1660        let mut b = octets::Octets::with_slice(&d);
1661        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1662    }
1663
1664    #[test]
1665    fn stream() {
1666        let mut d = [42; 128];
1667
1668        let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1669
1670        let frame = Frame::Stream {
1671            stream_id: 32,
1672            data: <RangeBuf>::from(&data, 1230976, true),
1673        };
1674
1675        let wire_len = {
1676            let mut b = octets::OctetsMut::with_slice(&mut d);
1677            frame.to_bytes(&mut b).unwrap()
1678        };
1679
1680        assert_eq!(wire_len, 20);
1681
1682        let mut b = octets::Octets::with_slice(&d);
1683        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1684
1685        let mut b = octets::Octets::with_slice(&d);
1686        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1687
1688        let mut b = octets::Octets::with_slice(&d);
1689        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1690
1691        let mut b = octets::Octets::with_slice(&d);
1692        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1693    }
1694
1695    #[test]
1696    fn stream_too_big() {
1697        let mut d = [42; 128];
1698
1699        let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1700
1701        let frame = Frame::Stream {
1702            stream_id: 32,
1703            data: <RangeBuf>::from(&data, MAX_STREAM_SIZE - 11, true),
1704        };
1705
1706        let wire_len = {
1707            let mut b = octets::OctetsMut::with_slice(&mut d);
1708            frame.to_bytes(&mut b).unwrap()
1709        };
1710
1711        assert_eq!(wire_len, 24);
1712
1713        let mut b = octets::Octets::with_slice(&d);
1714        assert_eq!(
1715            Frame::from_bytes(&mut b, packet::Type::Short),
1716            Err(Error::InvalidFrame)
1717        );
1718    }
1719
1720    #[test]
1721    fn max_data() {
1722        let mut d = [42; 128];
1723
1724        let frame = Frame::MaxData { max: 128_318_273 };
1725
1726        let wire_len = {
1727            let mut b = octets::OctetsMut::with_slice(&mut d);
1728            frame.to_bytes(&mut b).unwrap()
1729        };
1730
1731        assert_eq!(wire_len, 5);
1732
1733        let mut b = octets::Octets::with_slice(&d);
1734        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1735
1736        let mut b = octets::Octets::with_slice(&d);
1737        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1738
1739        let mut b = octets::Octets::with_slice(&d);
1740        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1741
1742        let mut b = octets::Octets::with_slice(&d);
1743        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1744    }
1745
1746    #[test]
1747    fn max_stream_data() {
1748        let mut d = [42; 128];
1749
1750        let frame = Frame::MaxStreamData {
1751            stream_id: 12_321,
1752            max: 128_318_273,
1753        };
1754
1755        let wire_len = {
1756            let mut b = octets::OctetsMut::with_slice(&mut d);
1757            frame.to_bytes(&mut b).unwrap()
1758        };
1759
1760        assert_eq!(wire_len, 7);
1761
1762        let mut b = octets::Octets::with_slice(&d);
1763        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1764
1765        let mut b = octets::Octets::with_slice(&d);
1766        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1767
1768        let mut b = octets::Octets::with_slice(&d);
1769        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1770
1771        let mut b = octets::Octets::with_slice(&d);
1772        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1773    }
1774
1775    #[test]
1776    fn max_streams_bidi() {
1777        let mut d = [42; 128];
1778
1779        let frame = Frame::MaxStreamsBidi { max: 128_318_273 };
1780
1781        let wire_len = {
1782            let mut b = octets::OctetsMut::with_slice(&mut d);
1783            frame.to_bytes(&mut b).unwrap()
1784        };
1785
1786        assert_eq!(wire_len, 5);
1787
1788        let mut b = octets::Octets::with_slice(&d);
1789        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1790
1791        let mut b = octets::Octets::with_slice(&d);
1792        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1793
1794        let mut b = octets::Octets::with_slice(&d);
1795        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1796
1797        let mut b = octets::Octets::with_slice(&d);
1798        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1799    }
1800
1801    #[test]
1802    fn max_streams_uni() {
1803        let mut d = [42; 128];
1804
1805        let frame = Frame::MaxStreamsUni { max: 128_318_273 };
1806
1807        let wire_len = {
1808            let mut b = octets::OctetsMut::with_slice(&mut d);
1809            frame.to_bytes(&mut b).unwrap()
1810        };
1811
1812        assert_eq!(wire_len, 5);
1813
1814        let mut b = octets::Octets::with_slice(&d);
1815        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1816
1817        let mut b = octets::Octets::with_slice(&d);
1818        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1819
1820        let mut b = octets::Octets::with_slice(&d);
1821        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1822
1823        let mut b = octets::Octets::with_slice(&d);
1824        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1825    }
1826
1827    #[test]
1828    fn data_blocked() {
1829        let mut d = [42; 128];
1830
1831        let frame = Frame::DataBlocked { limit: 128_318_273 };
1832
1833        let wire_len = {
1834            let mut b = octets::OctetsMut::with_slice(&mut d);
1835            frame.to_bytes(&mut b).unwrap()
1836        };
1837
1838        assert_eq!(wire_len, 5);
1839
1840        let mut b = octets::Octets::with_slice(&d);
1841        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1842
1843        let mut b = octets::Octets::with_slice(&d);
1844        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1845
1846        let mut b = octets::Octets::with_slice(&d);
1847        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1848
1849        let mut b = octets::Octets::with_slice(&d);
1850        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1851    }
1852
1853    #[test]
1854    fn stream_data_blocked() {
1855        let mut d = [42; 128];
1856
1857        let frame = Frame::StreamDataBlocked {
1858            stream_id: 12_321,
1859            limit: 128_318_273,
1860        };
1861
1862        let wire_len = {
1863            let mut b = octets::OctetsMut::with_slice(&mut d);
1864            frame.to_bytes(&mut b).unwrap()
1865        };
1866
1867        assert_eq!(wire_len, 7);
1868
1869        let mut b = octets::Octets::with_slice(&d);
1870        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1871
1872        let mut b = octets::Octets::with_slice(&d);
1873        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1874
1875        let mut b = octets::Octets::with_slice(&d);
1876        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1877
1878        let mut b = octets::Octets::with_slice(&d);
1879        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1880    }
1881
1882    #[test]
1883    fn streams_blocked_bidi() {
1884        let mut d = [42; 128];
1885
1886        let frame = Frame::StreamsBlockedBidi { limit: 128_318_273 };
1887
1888        let wire_len = {
1889            let mut b = octets::OctetsMut::with_slice(&mut d);
1890            frame.to_bytes(&mut b).unwrap()
1891        };
1892
1893        assert_eq!(wire_len, 5);
1894
1895        let mut b = octets::Octets::with_slice(&d);
1896        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1897
1898        let mut b = octets::Octets::with_slice(&d);
1899        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1900
1901        let mut b = octets::Octets::with_slice(&d);
1902        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1903
1904        let mut b = octets::Octets::with_slice(&d);
1905        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1906    }
1907
1908    #[test]
1909    fn streams_blocked_uni() {
1910        let mut d = [42; 128];
1911
1912        let frame = Frame::StreamsBlockedUni { limit: 128_318_273 };
1913
1914        let wire_len = {
1915            let mut b = octets::OctetsMut::with_slice(&mut d);
1916            frame.to_bytes(&mut b).unwrap()
1917        };
1918
1919        assert_eq!(wire_len, 5);
1920
1921        let mut b = octets::Octets::with_slice(&d);
1922        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1923
1924        let mut b = octets::Octets::with_slice(&d);
1925        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1926
1927        let mut b = octets::Octets::with_slice(&d);
1928        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1929
1930        let mut b = octets::Octets::with_slice(&d);
1931        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1932    }
1933
1934    #[test]
1935    fn new_connection_id() {
1936        let mut d = [42; 128];
1937
1938        let frame = Frame::NewConnectionId {
1939            seq_num: 123_213,
1940            retire_prior_to: 122_211,
1941            conn_id: vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
1942            reset_token: [0x42; 16],
1943        };
1944
1945        let wire_len = {
1946            let mut b = octets::OctetsMut::with_slice(&mut d);
1947            frame.to_bytes(&mut b).unwrap()
1948        };
1949
1950        assert_eq!(wire_len, 41);
1951
1952        let mut b = octets::Octets::with_slice(&d);
1953        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1954
1955        let mut b = octets::Octets::with_slice(&d);
1956        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
1957
1958        let mut b = octets::Octets::with_slice(&d);
1959        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1960
1961        let mut b = octets::Octets::with_slice(&d);
1962        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1963    }
1964
1965    #[test]
1966    fn retire_connection_id() {
1967        let mut d = [42; 128];
1968
1969        let frame = Frame::RetireConnectionId { seq_num: 123_213 };
1970
1971        let wire_len = {
1972            let mut b = octets::OctetsMut::with_slice(&mut d);
1973            frame.to_bytes(&mut b).unwrap()
1974        };
1975
1976        assert_eq!(wire_len, 5);
1977
1978        let mut b = octets::Octets::with_slice(&d);
1979        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
1980
1981        let mut b = octets::Octets::with_slice(&d);
1982        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
1983
1984        let mut b = octets::Octets::with_slice(&d);
1985        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
1986
1987        let mut b = octets::Octets::with_slice(&d);
1988        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
1989    }
1990
1991    #[test]
1992    fn path_challenge() {
1993        let mut d = [42; 128];
1994
1995        let frame = Frame::PathChallenge {
1996            data: [1, 2, 3, 4, 5, 6, 7, 8],
1997        };
1998
1999        let wire_len = {
2000            let mut b = octets::OctetsMut::with_slice(&mut d);
2001            frame.to_bytes(&mut b).unwrap()
2002        };
2003
2004        assert_eq!(wire_len, 9);
2005
2006        let mut b = octets::Octets::with_slice(&d);
2007        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
2008
2009        let mut b = octets::Octets::with_slice(&d);
2010        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
2011
2012        let mut b = octets::Octets::with_slice(&d);
2013        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
2014
2015        let mut b = octets::Octets::with_slice(&d);
2016        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
2017    }
2018
2019    #[test]
2020    fn path_response() {
2021        let mut d = [42; 128];
2022
2023        let frame = Frame::PathResponse {
2024            data: [1, 2, 3, 4, 5, 6, 7, 8],
2025        };
2026
2027        let wire_len = {
2028            let mut b = octets::OctetsMut::with_slice(&mut d);
2029            frame.to_bytes(&mut b).unwrap()
2030        };
2031
2032        assert_eq!(wire_len, 9);
2033
2034        let mut b = octets::Octets::with_slice(&d);
2035        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
2036
2037        let mut b = octets::Octets::with_slice(&d);
2038        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
2039
2040        let mut b = octets::Octets::with_slice(&d);
2041        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
2042
2043        let mut b = octets::Octets::with_slice(&d);
2044        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
2045    }
2046
2047    #[test]
2048    fn connection_close() {
2049        let mut d = [42; 128];
2050
2051        let frame = Frame::ConnectionClose {
2052            error_code: 0xbeef,
2053            frame_type: 523_423,
2054            reason: vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
2055        };
2056
2057        let wire_len = {
2058            let mut b = octets::OctetsMut::with_slice(&mut d);
2059            frame.to_bytes(&mut b).unwrap()
2060        };
2061
2062        assert_eq!(wire_len, 22);
2063
2064        let mut b = octets::Octets::with_slice(&d);
2065        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
2066
2067        let mut b = octets::Octets::with_slice(&d);
2068        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_ok());
2069
2070        let mut b = octets::Octets::with_slice(&d);
2071        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
2072
2073        let mut b = octets::Octets::with_slice(&d);
2074        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_ok());
2075    }
2076
2077    #[test]
2078    fn application_close() {
2079        let mut d = [42; 128];
2080
2081        let frame = Frame::ApplicationClose {
2082            error_code: 0xbeef,
2083            reason: vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
2084        };
2085
2086        let wire_len = {
2087            let mut b = octets::OctetsMut::with_slice(&mut d);
2088            frame.to_bytes(&mut b).unwrap()
2089        };
2090
2091        assert_eq!(wire_len, 18);
2092
2093        let mut b = octets::Octets::with_slice(&d);
2094        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
2095
2096        let mut b = octets::Octets::with_slice(&d);
2097        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
2098
2099        let mut b = octets::Octets::with_slice(&d);
2100        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
2101
2102        let mut b = octets::Octets::with_slice(&d);
2103        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
2104    }
2105
2106    #[test]
2107    fn handshake_done() {
2108        let mut d = [42; 128];
2109
2110        let frame = Frame::HandshakeDone;
2111
2112        let wire_len = {
2113            let mut b = octets::OctetsMut::with_slice(&mut d);
2114            frame.to_bytes(&mut b).unwrap()
2115        };
2116
2117        assert_eq!(wire_len, 1);
2118
2119        let mut b = octets::Octets::with_slice(&d);
2120        assert_eq!(Frame::from_bytes(&mut b, packet::Type::Short), Ok(frame));
2121
2122        let mut b = octets::Octets::with_slice(&d);
2123        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
2124
2125        let mut b = octets::Octets::with_slice(&d);
2126        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_err());
2127
2128        let mut b = octets::Octets::with_slice(&d);
2129        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
2130    }
2131
2132    #[test]
2133    fn datagram() {
2134        let mut d = [42; 128];
2135
2136        let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
2137
2138        let frame = Frame::Datagram { data: data.clone() };
2139
2140        let wire_len = {
2141            let mut b = octets::OctetsMut::with_slice(&mut d);
2142            frame.to_bytes(&mut b).unwrap()
2143        };
2144
2145        assert_eq!(wire_len, 15);
2146
2147        let mut b = octets::Octets::with_slice(&d);
2148        assert_eq!(
2149            Frame::from_bytes(&mut b, packet::Type::Short),
2150            Ok(frame.clone())
2151        );
2152
2153        let mut b = octets::Octets::with_slice(&d);
2154        assert!(Frame::from_bytes(&mut b, packet::Type::Initial).is_err());
2155
2156        let mut b = octets::Octets::with_slice(&d);
2157        assert!(Frame::from_bytes(&mut b, packet::Type::ZeroRTT).is_ok());
2158
2159        let mut b = octets::Octets::with_slice(&d);
2160        assert!(Frame::from_bytes(&mut b, packet::Type::Handshake).is_err());
2161
2162        let frame_data = match &frame {
2163            Frame::Datagram { data } => data.clone(),
2164
2165            _ => unreachable!(),
2166        };
2167
2168        assert_eq!(frame_data, data);
2169    }
2170}