@@ -10,10 +10,21 @@ use crate::protocols::stream::quic::QuicPacket;
10
10
// Currently only includes those seen in the Init and Handshake packets
11
11
#[ derive( Debug , Serialize , Clone ) ]
12
12
pub enum QuicFrame {
13
- Padding { length : usize } ,
13
+ Padding {
14
+ length : usize ,
15
+ } ,
14
16
Ping ,
15
- Ack { largest_acknowledged : u64 , ack_delay : u64 , first_ack_range : u64 , ack_ranges : Vec < AckRange > , ecn_counts : Option < EcnCounts > } ,
16
- Crypto { offset : u64 , data : Vec < u8 > } ,
17
+ Ack {
18
+ largest_acknowledged : u64 ,
19
+ ack_delay : u64 ,
20
+ first_ack_range : u64 ,
21
+ ack_ranges : Vec < AckRange > ,
22
+ ecn_counts : Option < EcnCounts > ,
23
+ } ,
24
+ Crypto {
25
+ offset : u64 ,
26
+ data : Vec < u8 > ,
27
+ } ,
17
28
}
18
29
19
30
// ACK Range field, part of ACK frame
@@ -41,87 +52,173 @@ impl QuicFrame {
41
52
// Iterate over plaintext payload bytes, this is a list of frames
42
53
while offset < data. len ( ) {
43
54
// Parse frame type
44
- let frame_type_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
45
- let frame_type = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+frame_type_len) ?) ?;
55
+ let frame_type_len =
56
+ QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ) ?;
57
+ let frame_type = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
58
+ data,
59
+ offset,
60
+ offset + frame_type_len,
61
+ ) ?) ?;
46
62
offset += frame_type_len;
47
63
match frame_type {
48
64
0x00 => {
49
65
// Handle PADDING
50
66
let mut length = 0 ;
51
- while offset+length+1 < data. len ( ) && QuicPacket :: access_data ( data, offset+length, offset+length+1 ) ?[ 0 ] == 0 {
52
- length += 1 ;
67
+ while offset + length + 1 < data. len ( )
68
+ && QuicPacket :: access_data ( data, offset + length, offset + length + 1 ) ?[ 0 ]
69
+ == 0
70
+ {
71
+ length += 1 ;
53
72
}
54
73
offset += length;
55
74
length += frame_type_len; // Add the original frame type bytes to length. Wireshark also does this
56
- frames. push ( QuicFrame :: Padding { length : length } ) ;
75
+ frames. push ( QuicFrame :: Padding { length } ) ;
57
76
}
58
77
0x01 => {
59
78
// Handle PING
60
79
frames. push ( QuicFrame :: Ping ) ;
61
- } ,
80
+ }
62
81
0x02 | 0x03 => {
63
82
// Handle ACK
64
83
// Parse Largest Acknowledged
65
- let largest_acknowledged_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
66
- let largest_acknowledged = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+largest_acknowledged_len) ?) ?;
84
+ let largest_acknowledged_len = QuicPacket :: get_var_len (
85
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
86
+ ) ?;
87
+ let largest_acknowledged = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
88
+ data,
89
+ offset,
90
+ offset + largest_acknowledged_len,
91
+ ) ?) ?;
67
92
offset += largest_acknowledged_len;
68
93
// Parse ACK Delay
69
- let ack_delay_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
70
- let ack_delay = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ack_delay_len) ?) ?;
94
+ let ack_delay_len = QuicPacket :: get_var_len (
95
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
96
+ ) ?;
97
+ let ack_delay = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
98
+ data,
99
+ offset,
100
+ offset + ack_delay_len,
101
+ ) ?) ?;
71
102
offset += ack_delay_len;
72
103
// Parse ACK Range Count
73
- let ack_range_count_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
74
- let ack_range_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ack_range_count_len) ?) ?;
104
+ let ack_range_count_len = QuicPacket :: get_var_len (
105
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
106
+ ) ?;
107
+ let ack_range_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
108
+ data,
109
+ offset,
110
+ offset + ack_range_count_len,
111
+ ) ?) ?;
75
112
offset += ack_range_count_len;
76
113
// Parse First ACK Range
77
- let first_ack_range_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
78
- let first_ack_range = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+first_ack_range_len) ?) ?;
114
+ let first_ack_range_len = QuicPacket :: get_var_len (
115
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
116
+ ) ?;
117
+ let first_ack_range = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
118
+ data,
119
+ offset,
120
+ offset + first_ack_range_len,
121
+ ) ?) ?;
79
122
// Parse ACK Range list field
80
123
let mut ack_ranges = Vec :: new ( ) ;
81
124
for _ in 0 ..ack_range_count {
82
- let gap_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
83
- let gap = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+gap_len) ?) ?;
125
+ let gap_len = QuicPacket :: get_var_len (
126
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
127
+ ) ?;
128
+ let gap = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
129
+ data,
130
+ offset,
131
+ offset + gap_len,
132
+ ) ?) ?;
84
133
offset += gap_len;
85
- let ack_range_len_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
86
- let ack_range_len = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ack_range_len_len) ?) ?;
134
+ let ack_range_len_len = QuicPacket :: get_var_len (
135
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
136
+ ) ?;
137
+ let ack_range_len = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
138
+ data,
139
+ offset,
140
+ offset + ack_range_len_len,
141
+ ) ?) ?;
87
142
offset += ack_range_len_len;
88
- ack_ranges. push ( AckRange { gap, ack_range_len} )
143
+ ack_ranges. push ( AckRange { gap, ack_range_len } )
89
144
}
90
145
// Parse ECN Counts, if the ACK frame contains them
91
- let ecn_counts: Option < EcnCounts > ;
92
- if frame_type == 0x03 {
93
- let ect0_count_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
94
- let ect0_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ect0_count_len) ?) ?;
146
+ let ecn_counts: Option < EcnCounts > = if frame_type == 0x03 {
147
+ let ect0_count_len = QuicPacket :: get_var_len (
148
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
149
+ ) ?;
150
+ let ect0_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
151
+ data,
152
+ offset,
153
+ offset + ect0_count_len,
154
+ ) ?) ?;
95
155
offset += ect0_count_len;
96
- let ect1_count_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
97
- let ect1_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ect1_count_len) ?) ?;
156
+ let ect1_count_len = QuicPacket :: get_var_len (
157
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
158
+ ) ?;
159
+ let ect1_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
160
+ data,
161
+ offset,
162
+ offset + ect1_count_len,
163
+ ) ?) ?;
98
164
offset += ect1_count_len;
99
- let ecn_ce_count_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
100
- let ecn_ce_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+ecn_ce_count_len) ?) ?;
101
- ecn_counts = Some ( EcnCounts { ect0_count, ect1_count, ecn_ce_count} ) ;
165
+ let ecn_ce_count_len = QuicPacket :: get_var_len (
166
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
167
+ ) ?;
168
+ let ecn_ce_count = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
169
+ data,
170
+ offset,
171
+ offset + ecn_ce_count_len,
172
+ ) ?) ?;
173
+ Some ( EcnCounts {
174
+ ect0_count,
175
+ ect1_count,
176
+ ecn_ce_count,
177
+ } )
102
178
} else {
103
- ecn_counts = None ;
104
- }
105
- frames. push ( QuicFrame :: Ack { largest_acknowledged, ack_delay, first_ack_range, ack_ranges, ecn_counts } )
179
+ None
180
+ } ;
181
+ frames. push ( QuicFrame :: Ack {
182
+ largest_acknowledged,
183
+ ack_delay,
184
+ first_ack_range,
185
+ ack_ranges,
186
+ ecn_counts,
187
+ } )
106
188
}
107
189
0x06 => {
108
190
// Handle CRYPTO frame
109
191
// Parse offset
110
- let crypto_offset_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
111
- let crypto_offset = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+crypto_offset_len) ?) ?;
192
+ let crypto_offset_len = QuicPacket :: get_var_len (
193
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
194
+ ) ?;
195
+ let crypto_offset = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
196
+ data,
197
+ offset,
198
+ offset + crypto_offset_len,
199
+ ) ?) ?;
112
200
offset += crypto_offset_len;
113
201
// Parse length
114
- let crypto_len_len = QuicPacket :: get_var_len ( QuicPacket :: access_data ( data, offset, offset+1 ) ?[ 0 ] ) ?;
115
- let crypto_len = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data ( data, offset, offset+crypto_len_len) ?) ? as usize ;
202
+ let crypto_len_len = QuicPacket :: get_var_len (
203
+ QuicPacket :: access_data ( data, offset, offset + 1 ) ?[ 0 ] ,
204
+ ) ?;
205
+ let crypto_len = QuicPacket :: slice_to_u64 ( QuicPacket :: access_data (
206
+ data,
207
+ offset,
208
+ offset + crypto_len_len,
209
+ ) ?) ? as usize ;
116
210
offset += crypto_len_len;
117
211
// Parse data
118
- let crypto_data = QuicPacket :: access_data ( data, offset, offset+crypto_len) ?;
119
- frames. push ( QuicFrame :: Crypto { offset : crypto_offset, data : crypto_data. to_vec ( ) } ) ;
212
+ let crypto_data = QuicPacket :: access_data ( data, offset, offset + crypto_len) ?;
213
+ frames. push ( QuicFrame :: Crypto {
214
+ offset : crypto_offset,
215
+ data : crypto_data. to_vec ( ) ,
216
+ } ) ;
120
217
offset += crypto_len;
121
- } ,
218
+ }
122
219
_ => return Err ( QuicError :: UnknownFrameType ) ,
123
220
}
124
221
}
125
222
Ok ( frames)
126
223
}
127
- }
224
+ }
0 commit comments