1use 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 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 (_, Frame::Padding { .. }) | (_, Frame::Ping { .. }) => true,
340
341 (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 (_, Frame::ACK { .. }) => true,
354 (_, Frame::Crypto { .. }) => true,
355 (_, Frame::ConnectionClose { .. }) => true,
356
357 (packet::Type::Short, _) => true,
359 (packet::Type::ZeroRTT, _) => true,
360
361 (..) => 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 + octets::varint_len(first.end - 1) + octets::varint_len(*ack_delay) + octets::varint_len(it.len() as u64) + octets::varint_len(ack_block); 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) + octets::varint_len(ack_block); 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 + octets::varint_len(*stream_id) + octets::varint_len(*error_code) + octets::varint_len(*final_size) },
654
655 Frame::StopSending {
656 stream_id,
657 error_code,
658 } => {
659 1 + octets::varint_len(*stream_id) + octets::varint_len(*error_code) },
663
664 Frame::Crypto { data } => {
665 1 + octets::varint_len(data.off()) + 2 + data.len() },
670
671 Frame::CryptoHeader { offset, length, .. } => {
672 1 + octets::varint_len(*offset) + 2 + length },
677
678 Frame::NewToken { token } => {
679 1 + octets::varint_len(token.len() as u64) + token.len() },
683
684 Frame::Stream { stream_id, data } => {
685 1 + octets::varint_len(*stream_id) + octets::varint_len(data.off()) + 2 + data.len() },
691
692 Frame::StreamHeader {
693 stream_id,
694 offset,
695 length,
696 ..
697 } => {
698 1 + octets::varint_len(*stream_id) + octets::varint_len(*offset) + 2 + length },
704
705 Frame::MaxData { max } => {
706 1 + octets::varint_len(*max) },
709
710 Frame::MaxStreamData { stream_id, max } => {
711 1 + octets::varint_len(*stream_id) + octets::varint_len(*max) },
715
716 Frame::MaxStreamsBidi { max } => {
717 1 + octets::varint_len(*max) },
720
721 Frame::MaxStreamsUni { max } => {
722 1 + octets::varint_len(*max) },
725
726 Frame::DataBlocked { limit } => {
727 1 + octets::varint_len(*limit) },
730
731 Frame::StreamDataBlocked { stream_id, limit } => {
732 1 + octets::varint_len(*stream_id) + octets::varint_len(*limit) },
736
737 Frame::StreamsBlockedBidi { limit } => {
738 1 + octets::varint_len(*limit) },
741
742 Frame::StreamsBlockedUni { limit } => {
743 1 + octets::varint_len(*limit) },
746
747 Frame::NewConnectionId {
748 seq_num,
749 retire_prior_to,
750 conn_id,
751 reset_token,
752 } => {
753 1 + octets::varint_len(*seq_num) + octets::varint_len(*retire_prior_to) + 1 + conn_id.len() + reset_token.len() },
760
761 Frame::RetireConnectionId { seq_num } => {
762 1 + octets::varint_len(*seq_num) },
765
766 Frame::PathChallenge { .. } => {
767 1 + 8 },
770
771 Frame::PathResponse { .. } => {
772 1 + 8 },
775
776 Frame::ConnectionClose {
777 frame_type,
778 error_code,
779 reason,
780 ..
781 } => {
782 1 + octets::varint_len(*error_code) + octets::varint_len(*frame_type) + octets::varint_len(reason.len() as u64) + reason.len() },
788
789 Frame::ApplicationClose { reason, error_code } => {
790 1 + octets::varint_len(*error_code) + octets::varint_len(reason.len() as u64) + reason.len() },
795
796 Frame::HandshakeDone => {
797 1 },
799
800 Frame::Datagram { data } => {
801 1 + 2 + data.len() },
805
806 Frame::DatagramHeader { length } => {
807 1 + 2 + *length },
811 }
812 }
813
814 pub fn ack_eliciting(&self) -> bool {
815 !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 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 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, },
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, }
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 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 ty |= 0x04;
1334
1335 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 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 ty |= 0x01;
1358
1359 b.put_varint(u64::from(ty))?;
1360
1361 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}