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