blob: 0c65dc226e4e27894a566d5e5dbbf02776c7192f [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_framer.h"
6
7#include <cstddef>
8#include <cstdint>
9#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070010#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050011
12#include "net/third_party/quiche/src/quic/core/crypto/crypto_framer.h"
13#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h"
14#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
15#include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h"
17#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
18#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
19#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
20#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
21#include "net/third_party/quiche/src/quic/core/quic_constants.h"
22#include "net/third_party/quiche/src/quic/core/quic_data_reader.h"
23#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
24#include "net/third_party/quiche/src/quic/core/quic_socket_address_coder.h"
25#include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h"
26#include "net/third_party/quiche/src/quic/core/quic_types.h"
27#include "net/third_party/quiche/src/quic/core/quic_utils.h"
28#include "net/third_party/quiche/src/quic/core/quic_versions.h"
29#include "net/third_party/quiche/src/quic/platform/api/quic_aligned.h"
dschinazie8d7fa72019-04-05 14:44:40 -070030#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050031#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
32#include "net/third_party/quiche/src/quic/platform/api/quic_client_stats.h"
33#include "net/third_party/quiche/src/quic/platform/api/quic_endian.h"
34#include "net/third_party/quiche/src/quic/platform/api/quic_fallthrough.h"
35#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
36#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
37#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
38#include "net/third_party/quiche/src/quic/platform/api/quic_map_util.h"
39#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
40#include "net/third_party/quiche/src/quic/platform/api/quic_stack_trace.h"
41#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050042#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
43
44namespace quic {
45
46namespace {
47
48#define ENDPOINT \
49 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
50
51// How much to shift the timestamp in the IETF Ack frame.
52// TODO(fkastenholz) when we get real IETF QUIC, need to get
53// the currect shift from the transport parameters.
54const int kIetfAckTimestampShift = 3;
55
56// Number of bits the packet number length bits are shifted from the right
57// edge of the header.
58const uint8_t kPublicHeaderSequenceNumberShift = 4;
59
60// There are two interpretations for the Frame Type byte in the QUIC protocol,
61// resulting in two Frame Types: Special Frame Types and Regular Frame Types.
62//
63// Regular Frame Types use the Frame Type byte simply. Currently defined
64// Regular Frame Types are:
65// Padding : 0b 00000000 (0x00)
66// ResetStream : 0b 00000001 (0x01)
67// ConnectionClose : 0b 00000010 (0x02)
68// GoAway : 0b 00000011 (0x03)
69// WindowUpdate : 0b 00000100 (0x04)
70// Blocked : 0b 00000101 (0x05)
71//
72// Special Frame Types encode both a Frame Type and corresponding flags
73// all in the Frame Type byte. Currently defined Special Frame Types
74// are:
75// Stream : 0b 1xxxxxxx
76// Ack : 0b 01xxxxxx
77//
78// Semantics of the flag bits above (the x bits) depends on the frame type.
79
80// Masks to determine if the frame type is a special use
81// and for specific special frame types.
82const uint8_t kQuicFrameTypeBrokenMask = 0xE0; // 0b 11100000
83const uint8_t kQuicFrameTypeSpecialMask = 0xC0; // 0b 11000000
84const uint8_t kQuicFrameTypeStreamMask = 0x80;
85const uint8_t kQuicFrameTypeAckMask = 0x40;
86static_assert(kQuicFrameTypeSpecialMask ==
87 (kQuicFrameTypeStreamMask | kQuicFrameTypeAckMask),
88 "Invalid kQuicFrameTypeSpecialMask");
89
90// The stream type format is 1FDOOOSS, where
91// F is the fin bit.
92// D is the data length bit (0 or 2 bytes).
93// OO/OOO are the size of the offset.
94// SS is the size of the stream ID.
95// Note that the stream encoding can not be determined by inspection. It can
96// be determined only by knowing the QUIC Version.
97// Stream frame relative shifts and masks for interpreting the stream flags.
98// StreamID may be 1, 2, 3, or 4 bytes.
99const uint8_t kQuicStreamIdShift = 2;
100const uint8_t kQuicStreamIDLengthMask = 0x03;
101
102// Offset may be 0, 2, 4, or 8 bytes.
103const uint8_t kQuicStreamShift = 3;
104const uint8_t kQuicStreamOffsetMask = 0x07;
105
106// Data length may be 0 or 2 bytes.
107const uint8_t kQuicStreamDataLengthShift = 1;
108const uint8_t kQuicStreamDataLengthMask = 0x01;
109
110// Fin bit may be set or not.
111const uint8_t kQuicStreamFinShift = 1;
112const uint8_t kQuicStreamFinMask = 0x01;
113
114// The format is 01M0LLOO, where
115// M if set, there are multiple ack blocks in the frame.
116// LL is the size of the largest ack field.
117// OO is the size of the ack blocks offset field.
118// packet number size shift used in AckFrames.
119const uint8_t kQuicSequenceNumberLengthNumBits = 2;
120const uint8_t kActBlockLengthOffset = 0;
121const uint8_t kLargestAckedOffset = 2;
122
123// Acks may have only one ack block.
124const uint8_t kQuicHasMultipleAckBlocksOffset = 5;
125
126// Timestamps are 4 bytes followed by 2 bytes.
127const uint8_t kQuicNumTimestampsLength = 1;
128const uint8_t kQuicFirstTimestampLength = 4;
129const uint8_t kQuicTimestampLength = 2;
130// Gaps between packet numbers are 1 byte.
131const uint8_t kQuicTimestampPacketNumberGapLength = 1;
132
133// Maximum length of encoded error strings.
134const int kMaxErrorStringLength = 256;
135
136const uint8_t kConnectionIdLengthAdjustment = 3;
137const uint8_t kDestinationConnectionIdLengthMask = 0xF0;
138const uint8_t kSourceConnectionIdLengthMask = 0x0F;
139
140// Returns the absolute value of the difference between |a| and |b|.
141uint64_t Delta(uint64_t a, uint64_t b) {
142 // Since these are unsigned numbers, we can't just return abs(a - b)
143 if (a < b) {
144 return b - a;
145 }
146 return a - b;
147}
148
149uint64_t ClosestTo(uint64_t target, uint64_t a, uint64_t b) {
150 return (Delta(target, a) < Delta(target, b)) ? a : b;
151}
152
153uint64_t PacketNumberIntervalLength(
154 const QuicInterval<QuicPacketNumber>& interval) {
155 if (interval.Empty()) {
156 return 0u;
157 }
158 return interval.max() - interval.min();
159}
160
161QuicPacketNumberLength ReadSequenceNumberLength(uint8_t flags) {
162 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
163 case PACKET_FLAGS_8BYTE_PACKET:
164 return PACKET_6BYTE_PACKET_NUMBER;
165 case PACKET_FLAGS_4BYTE_PACKET:
166 return PACKET_4BYTE_PACKET_NUMBER;
167 case PACKET_FLAGS_2BYTE_PACKET:
168 return PACKET_2BYTE_PACKET_NUMBER;
169 case PACKET_FLAGS_1BYTE_PACKET:
170 return PACKET_1BYTE_PACKET_NUMBER;
171 default:
172 QUIC_BUG << "Unreachable case statement.";
173 return PACKET_6BYTE_PACKET_NUMBER;
174 }
175}
176
177QuicPacketNumberLength ReadAckPacketNumberLength(QuicTransportVersion version,
178 uint8_t flags) {
179 switch (flags & PACKET_FLAGS_8BYTE_PACKET) {
180 case PACKET_FLAGS_8BYTE_PACKET:
181 return PACKET_6BYTE_PACKET_NUMBER;
182 case PACKET_FLAGS_4BYTE_PACKET:
183 return PACKET_4BYTE_PACKET_NUMBER;
184 case PACKET_FLAGS_2BYTE_PACKET:
185 return PACKET_2BYTE_PACKET_NUMBER;
186 case PACKET_FLAGS_1BYTE_PACKET:
187 return PACKET_1BYTE_PACKET_NUMBER;
188 default:
189 QUIC_BUG << "Unreachable case statement.";
190 return PACKET_6BYTE_PACKET_NUMBER;
191 }
192}
193
194uint8_t PacketNumberLengthToOnWireValue(
195 QuicTransportVersion version,
196 QuicPacketNumberLength packet_number_length) {
197 if (version > QUIC_VERSION_44) {
198 return packet_number_length - 1;
199 }
200 switch (packet_number_length) {
201 case PACKET_1BYTE_PACKET_NUMBER:
202 return 0;
203 case PACKET_2BYTE_PACKET_NUMBER:
204 return 1;
205 case PACKET_4BYTE_PACKET_NUMBER:
206 return 2;
207 default:
208 QUIC_BUG << "Invalid packet number length.";
209 return 0;
210 }
211}
212
213bool GetShortHeaderPacketNumberLength(
214 QuicTransportVersion version,
215 uint8_t type,
216 bool infer_packet_header_type_from_version,
217 QuicPacketNumberLength* packet_number_length) {
218 DCHECK(!(type & FLAGS_LONG_HEADER));
219 const bool two_bits_packet_number_length =
220 infer_packet_header_type_from_version ? version > QUIC_VERSION_44
221 : (type & FLAGS_FIXED_BIT);
222 if (two_bits_packet_number_length) {
223 *packet_number_length =
224 static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
225 return true;
226 }
227 switch (type & 0x07) {
228 case 0:
229 *packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
230 break;
231 case 1:
232 *packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
233 break;
234 case 2:
235 *packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
236 break;
237 default:
238 *packet_number_length = PACKET_6BYTE_PACKET_NUMBER;
239 return false;
240 }
241 return true;
242}
243
244uint8_t LongHeaderTypeToOnWireValue(QuicTransportVersion version,
245 QuicLongHeaderType type) {
246 switch (type) {
247 case INITIAL:
248 return version > QUIC_VERSION_44 ? 0 : 0x7F;
249 case ZERO_RTT_PROTECTED:
250 return version > QUIC_VERSION_44 ? 1 << 4 : 0x7C;
251 case HANDSHAKE:
252 return version > QUIC_VERSION_44 ? 2 << 4 : 0x7D;
253 case RETRY:
254 return version > QUIC_VERSION_44 ? 3 << 4 : 0x7E;
255 case VERSION_NEGOTIATION:
256 return 0xF0; // Value does not matter
257 default:
258 QUIC_BUG << "Invalid long header type: " << type;
259 return 0xFF;
260 }
261}
262
263bool GetLongHeaderType(QuicTransportVersion version,
264 uint8_t type,
265 QuicLongHeaderType* long_header_type) {
266 DCHECK((type & FLAGS_LONG_HEADER) && version != QUIC_VERSION_UNSUPPORTED);
267 if (version > QUIC_VERSION_44) {
268 switch ((type & 0x30) >> 4) {
269 case 0:
270 *long_header_type = INITIAL;
271 break;
272 case 1:
273 *long_header_type = ZERO_RTT_PROTECTED;
274 break;
275 case 2:
276 *long_header_type = HANDSHAKE;
277 break;
278 case 3:
279 *long_header_type = RETRY;
280 break;
281 default:
282 QUIC_BUG << "Unreachable statement";
283 *long_header_type = VERSION_NEGOTIATION;
284 return false;
285 }
286 return true;
287 }
288
289 switch (type & 0x7F) {
290 case 0x7F:
291 *long_header_type = INITIAL;
292 break;
293 case 0x7C:
294 *long_header_type = ZERO_RTT_PROTECTED;
295 break;
296 case 0x7D:
297 *long_header_type = HANDSHAKE;
298 break;
299 case 0x7E:
300 *long_header_type = RETRY;
301 break;
302 default:
303 // Invalid packet header type. Whether a packet is version negotiation is
304 // determined by the version field.
305 *long_header_type = INVALID_PACKET_TYPE;
306 return false;
307 }
308 return true;
309}
310
311QuicPacketNumberLength GetLongHeaderPacketNumberLength(
312 QuicTransportVersion version,
313 uint8_t type) {
314 if (version > QUIC_VERSION_44) {
315 return static_cast<QuicPacketNumberLength>((type & 0x03) + 1);
316 }
317 return PACKET_4BYTE_PACKET_NUMBER;
318}
319
QUICHE team10b22a12019-03-21 15:31:42 -0700320// Used to get packet number space before packet gets decrypted.
321PacketNumberSpace GetPacketNumberSpace(const QuicPacketHeader& header) {
322 switch (header.form) {
323 case GOOGLE_QUIC_PACKET:
324 QUIC_BUG << "Try to get packet number space of Google QUIC packet";
325 break;
326 case IETF_QUIC_SHORT_HEADER_PACKET:
327 return APPLICATION_DATA;
328 case IETF_QUIC_LONG_HEADER_PACKET:
329 switch (header.long_packet_type) {
330 case INITIAL:
331 return INITIAL_DATA;
332 case HANDSHAKE:
333 return HANDSHAKE_DATA;
334 case ZERO_RTT_PROTECTED:
335 return APPLICATION_DATA;
336 case VERSION_NEGOTIATION:
337 case RETRY:
338 case INVALID_PACKET_TYPE:
339 QUIC_BUG << "Try to get packet number space of long header type: "
340 << QuicUtils::QuicLongHeaderTypetoString(
341 header.long_packet_type);
342 break;
343 }
344 }
345
346 return NUM_PACKET_NUMBER_SPACES;
347}
348
zhongyi546cc452019-04-12 15:27:49 -0700349EncryptionLevel GetEncryptionLevel(const QuicPacketHeader& header) {
350 switch (header.form) {
351 case GOOGLE_QUIC_PACKET:
352 QUIC_BUG << "Cannot determine EncryptionLevel from Google QUIC header";
353 break;
354 case IETF_QUIC_SHORT_HEADER_PACKET:
355 return ENCRYPTION_FORWARD_SECURE;
356 case IETF_QUIC_LONG_HEADER_PACKET:
357 switch (header.long_packet_type) {
358 case INITIAL:
359 return ENCRYPTION_INITIAL;
360 case HANDSHAKE:
361 return ENCRYPTION_HANDSHAKE;
362 case ZERO_RTT_PROTECTED:
363 return ENCRYPTION_ZERO_RTT;
364 case VERSION_NEGOTIATION:
365 case RETRY:
366 case INVALID_PACKET_TYPE:
367 QUIC_BUG << "No encryption used with type "
368 << QuicUtils::QuicLongHeaderTypetoString(
369 header.long_packet_type);
370 }
371 }
372 return NUM_ENCRYPTION_LEVELS;
373}
374
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375QuicStringPiece TruncateErrorString(QuicStringPiece error) {
376 if (error.length() <= kMaxErrorStringLength) {
377 return error;
378 }
379 return QuicStringPiece(error.data(), kMaxErrorStringLength);
380}
381
382size_t TruncatedErrorStringSize(const QuicStringPiece& error) {
383 if (error.length() < kMaxErrorStringLength) {
384 return error.length();
385 }
386 return kMaxErrorStringLength;
387}
388
389uint8_t GetConnectionIdLengthValue(QuicConnectionIdLength length) {
390 if (length == 0) {
391 return 0;
392 }
393 return static_cast<uint8_t>(length - kConnectionIdLengthAdjustment);
394}
395
396bool IsValidPacketNumberLength(QuicPacketNumberLength packet_number_length) {
397 size_t length = packet_number_length;
398 return length == 1 || length == 2 || length == 4 || length == 6 ||
399 length == 8;
400}
401
402bool IsValidFullPacketNumber(uint64_t full_packet_number,
403 QuicTransportVersion version) {
QUICHE team577718a2019-03-20 09:00:59 -0700404 return full_packet_number > 0 || version == QUIC_VERSION_99;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405}
406
407// Convert a stream ID to a count of streams, for IETF QUIC/Version 99 only.
408// There is no need to take into account whether the ID is for uni- or
409// bi-directional streams, or whether it's server- or client- initiated. It
410// always returns a valid count.
411QuicStreamId StreamIdToCount(QuicTransportVersion version,
412 QuicStreamId stream_id) {
413 DCHECK_EQ(QUIC_VERSION_99, version);
414 if ((stream_id & 0x3) == 0) {
415 return (stream_id / QuicUtils::StreamIdDelta(version));
416 }
417 return (stream_id / QuicUtils::StreamIdDelta(version)) + 1;
418}
419
420// Returns the maximum value that a stream count may have, taking into account
421// the fact that bidirectional, client initiated, streams have one fewer stream
422// available than the others. This is because the old crypto streams, with ID ==
423// 0 are not included in the count.
424// The version is not included in the call, nor does the method take the version
425// into account, because this is called only from code used for IETF QUIC.
426// TODO(fkastenholz): Remove this method and replace calls to it with direct
427// references to kMaxQuicStreamIdCount when streamid 0 becomes a normal stream
428// id.
429QuicStreamId GetMaxStreamCount(bool unidirectional, Perspective perspective) {
430 if (!unidirectional && perspective == Perspective::IS_CLIENT) {
431 return kMaxQuicStreamId >> 2;
432 }
433 return (kMaxQuicStreamId >> 2) + 1;
434}
435
436// Convert a stream count to the maximum stream ID for that count.
437// Needs to know whether the resulting stream ID should be uni-directional,
438// bi-directional, server-initiated, or client-initiated.
439// Returns true if it works, false if not. The only error condition is that
440// the stream_count is too big and it would generate a stream id that is larger
441// than the implementation's maximum stream id value.
442bool StreamCountToId(QuicStreamId stream_count,
443 bool unidirectional,
444 Perspective perspective,
445 QuicTransportVersion version,
446 QuicStreamId* generated_stream_id) {
447 DCHECK_EQ(QUIC_VERSION_99, version);
448 // TODO(fkastenholz): when the MAX_STREAMS and STREAMS_BLOCKED frames
449 // are connected all the way up to the stream_id_manager, handle count==0
450 // properly (interpret it as "can open 0 streams") and the count being too
451 // large (close the connection).
452 if ((stream_count == 0) ||
453 (stream_count > GetMaxStreamCount(unidirectional, perspective))) {
454 return false;
455 }
456 *generated_stream_id =
457 ((unidirectional)
458 ? QuicUtils::GetFirstUnidirectionalStreamId(version, perspective)
459 : QuicUtils::GetFirstBidirectionalStreamId(version, perspective)) +
460 ((stream_count - 1) * QuicUtils::StreamIdDelta(version));
461 return true;
462}
463
464bool AppendIetfConnectionIdsNew(bool version_flag,
465 QuicConnectionId destination_connection_id,
466 QuicConnectionId source_connection_id,
467 QuicDataWriter* writer) {
468 if (!version_flag) {
469 return writer->WriteConnectionId(destination_connection_id);
470 }
471
472 // Compute connection ID length byte.
473 uint8_t dcil = GetConnectionIdLengthValue(
474 static_cast<QuicConnectionIdLength>(destination_connection_id.length()));
475 uint8_t scil = GetConnectionIdLengthValue(
476 static_cast<QuicConnectionIdLength>(source_connection_id.length()));
477 uint8_t connection_id_length = dcil << 4 | scil;
478
479 return writer->WriteUInt8(connection_id_length) &&
480 writer->WriteConnectionId(destination_connection_id) &&
481 writer->WriteConnectionId(source_connection_id);
482}
483
484enum class DroppedPacketReason {
485 // General errors
486 INVALID_PUBLIC_HEADER,
487 VERSION_MISMATCH,
488 // Version negotiation packet errors
489 INVALID_VERSION_NEGOTIATION_PACKET,
490 // Public reset packet errors, pre-v44
491 INVALID_PUBLIC_RESET_PACKET,
492 // Data packet errors
493 INVALID_PACKET_NUMBER,
494 INVALID_DIVERSIFICATION_NONCE,
495 DECRYPTION_FAILURE,
496 NUM_REASONS,
497};
498
499void RecordDroppedPacketReason(DroppedPacketReason reason) {
500 QUIC_CLIENT_HISTOGRAM_ENUM("QuicDroppedPacketReason", reason,
501 DroppedPacketReason::NUM_REASONS,
502 "The reason a packet was not processed. Recorded "
503 "each time such a packet is dropped");
504}
505
506} // namespace
507
508QuicFramer::QuicFramer(const ParsedQuicVersionVector& supported_versions,
509 QuicTime creation_time,
510 Perspective perspective,
511 uint8_t expected_connection_id_length)
512 : visitor_(nullptr),
513 error_(QUIC_NO_ERROR),
514 last_serialized_connection_id_(EmptyQuicConnectionId()),
515 last_version_label_(0),
516 version_(PROTOCOL_UNSUPPORTED, QUIC_VERSION_UNSUPPORTED),
517 supported_versions_(supported_versions),
QUICHE team6987b4a2019-03-15 16:23:04 -0700518 decrypter_level_(ENCRYPTION_INITIAL),
QUICHE team76086e42019-03-25 15:12:29 -0700519 alternative_decrypter_level_(NUM_ENCRYPTION_LEVELS),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500520 alternative_decrypter_latch_(false),
521 perspective_(perspective),
522 validate_flags_(true),
523 process_timestamps_(false),
524 creation_time_(creation_time),
525 last_timestamp_(QuicTime::Delta::Zero()),
526 first_sending_packet_number_(FirstSendingPacketNumber()),
527 data_producer_(nullptr),
528 infer_packet_header_type_from_version_(perspective ==
529 Perspective::IS_CLIENT),
QUICHE team4d9d6292019-03-11 14:25:33 -0700530 expected_connection_id_length_(expected_connection_id_length),
QUICHE team10b22a12019-03-21 15:31:42 -0700531 should_update_expected_connection_id_length_(false),
532 supports_multiple_packet_number_spaces_(false) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500533 DCHECK(!supported_versions.empty());
534 version_ = supported_versions_[0];
QUICHE team76086e42019-03-25 15:12:29 -0700535 decrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullDecrypter>(perspective);
QUICHE team6987b4a2019-03-15 16:23:04 -0700536 encrypter_[ENCRYPTION_INITIAL] = QuicMakeUnique<NullEncrypter>(perspective);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537}
538
539QuicFramer::~QuicFramer() {}
540
541// static
542size_t QuicFramer::GetMinStreamFrameSize(QuicTransportVersion version,
543 QuicStreamId stream_id,
544 QuicStreamOffset offset,
545 bool last_frame_in_packet,
546 QuicPacketLength data_length) {
547 if (version == QUIC_VERSION_99) {
548 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_id) +
549 (last_frame_in_packet
550 ? 0
551 : QuicDataWriter::GetVarInt62Len(data_length)) +
552 (offset != 0 ? QuicDataWriter::GetVarInt62Len(offset) : 0);
553 }
554 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
555 GetStreamOffsetSize(version, offset) +
556 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize);
557}
558
559// static
560size_t QuicFramer::GetMinCryptoFrameSize(QuicStreamOffset offset,
561 QuicPacketLength data_length) {
562 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(offset) +
563 QuicDataWriter::GetVarInt62Len(data_length);
564}
565
566// static
567size_t QuicFramer::GetMessageFrameSize(QuicTransportVersion version,
568 bool last_frame_in_packet,
569 QuicByteCount length) {
570 QUIC_BUG_IF(version <= QUIC_VERSION_44)
571 << "Try to serialize MESSAGE frame in " << version;
572 return kQuicFrameTypeSize +
573 (last_frame_in_packet ? 0 : QuicDataWriter::GetVarInt62Len(length)) +
574 length;
575}
576
577// static
578size_t QuicFramer::GetMinAckFrameSize(
579 QuicTransportVersion version,
580 QuicPacketNumberLength largest_observed_length) {
581 if (version == QUIC_VERSION_99) {
582 // The minimal ack frame consists of the following four fields: Largest
583 // Acknowledged, ACK Delay, ACK Block Count, and First ACK Block. Minimum
584 // size of each is 1 byte.
585 return kQuicFrameTypeSize + 4;
586 }
587 size_t min_size = kQuicFrameTypeSize + largest_observed_length +
588 kQuicDeltaTimeLargestObservedSize;
589 return min_size + kQuicNumTimestampsSize;
590}
591
592// static
593size_t QuicFramer::GetStopWaitingFrameSize(
594 QuicTransportVersion version,
595 QuicPacketNumberLength packet_number_length) {
596 size_t min_size = kQuicFrameTypeSize + packet_number_length;
597 return min_size;
598}
599
600// static
601size_t QuicFramer::GetRstStreamFrameSize(QuicTransportVersion version,
602 const QuicRstStreamFrame& frame) {
603 if (version == QUIC_VERSION_99) {
604 return QuicDataWriter::GetVarInt62Len(frame.stream_id) +
605 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
606 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
607 }
608 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize +
609 kQuicErrorCodeSize;
610}
611
612// static
613size_t QuicFramer::GetMinConnectionCloseFrameSize(
614 QuicTransportVersion version,
615 const QuicConnectionCloseFrame& frame) {
616 if (version == QUIC_VERSION_99) {
fkastenholz72f509b2019-04-10 09:17:49 -0700617 // TODO(fkastenholz): For complete support of IETF QUIC CONNECTION_CLOSE,
618 // check if the frame is a Transport close and if the frame's
619 // extracted_error_code is not QUIC_IETF_GQUIC_ERROR_MISSING. If so,
620 // extend the error string to include " QuicErrorCode: #"
621 if (frame.close_type == IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
622 // Application close variant does not include the transport close frame
623 // type field.
624 return QuicDataWriter::GetVarInt62Len(
625 TruncatedErrorStringSize(frame.error_details)) +
626 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
627 }
628 QUIC_BUG_IF(frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE)
629 << "IETF QUIC Connection close and QuicConnectionCloseFrame type is "
630 "not IETF ConnectionClose";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500631 return QuicDataWriter::GetVarInt62Len(
632 TruncatedErrorStringSize(frame.error_details)) +
fkastenholze9d71a82019-04-09 05:12:13 -0700633 QuicDataWriter::GetVarInt62Len(frame.transport_close_frame_type) +
QUICHE teama6ef0a62019-03-07 20:34:33 -0500634 kQuicFrameTypeSize + kQuicIetfQuicErrorCodeSize;
635 }
fkastenholz72f509b2019-04-10 09:17:49 -0700636 // Not version 99/IETF QUIC, return Google QUIC CONNECTION CLOSE frame size.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500637 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize;
638}
639
640// static
QUICHE teama6ef0a62019-03-07 20:34:33 -0500641size_t QuicFramer::GetMinGoAwayFrameSize() {
642 return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
643 kQuicMaxStreamIdSize;
644}
645
646// static
647size_t QuicFramer::GetWindowUpdateFrameSize(
648 QuicTransportVersion version,
649 const QuicWindowUpdateFrame& frame) {
650 if (version != QUIC_VERSION_99) {
651 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
652 }
653 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
654 // Frame would be a MAX DATA frame, which has only a Maximum Data field.
655 return kQuicFrameTypeSize +
656 QuicDataWriter::GetVarInt62Len(frame.byte_offset);
657 }
658 // Frame would be MAX STREAM DATA, has Maximum Stream Data and Stream ID
659 // fields.
660 return kQuicFrameTypeSize +
661 QuicDataWriter::GetVarInt62Len(frame.byte_offset) +
662 QuicDataWriter::GetVarInt62Len(frame.stream_id);
663}
664
665// static
666size_t QuicFramer::GetMaxStreamsFrameSize(QuicTransportVersion version,
667 const QuicMaxStreamIdFrame& frame) {
668 if (version != QUIC_VERSION_99) {
669 QUIC_BUG << "In version " << version
670 << " - not 99 - and tried to serialize MaxStreamId Frame.";
671 }
672
673 // Convert from the stream id on which the connection is blocked to a count
674 QuicStreamId stream_count = StreamIdToCount(version, frame.max_stream_id);
675
676 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_count);
677}
678
679// static
680size_t QuicFramer::GetStreamsBlockedFrameSize(
681 QuicTransportVersion version,
682 const QuicStreamIdBlockedFrame& frame) {
683 if (version != QUIC_VERSION_99) {
684 QUIC_BUG << "In version " << version
685 << " - not 99 - and tried to serialize StreamIdBlocked Frame.";
686 }
687
688 // Convert from the stream id on which the connection is blocked to a count
689 QuicStreamId stream_count = StreamIdToCount(version, frame.stream_id);
690
691 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(stream_count);
692}
693
694// static
695size_t QuicFramer::GetBlockedFrameSize(QuicTransportVersion version,
696 const QuicBlockedFrame& frame) {
697 if (version != QUIC_VERSION_99) {
698 return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
699 }
700 if (frame.stream_id == QuicUtils::GetInvalidStreamId(version)) {
701 // return size of IETF QUIC Blocked frame
702 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset);
703 }
704 // return size of IETF QUIC Stream Blocked frame.
705 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.offset) +
706 QuicDataWriter::GetVarInt62Len(frame.stream_id);
707}
708
709// static
710size_t QuicFramer::GetStopSendingFrameSize(const QuicStopSendingFrame& frame) {
711 return kQuicFrameTypeSize + QuicDataWriter::GetVarInt62Len(frame.stream_id) +
712 sizeof(QuicApplicationErrorCode);
713}
714
715// static
716size_t QuicFramer::GetPathChallengeFrameSize(
717 const QuicPathChallengeFrame& frame) {
718 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
719}
720
721// static
722size_t QuicFramer::GetPathResponseFrameSize(
723 const QuicPathResponseFrame& frame) {
724 return kQuicFrameTypeSize + sizeof(frame.data_buffer);
725}
726
727// static
728size_t QuicFramer::GetRetransmittableControlFrameSize(
729 QuicTransportVersion version,
730 const QuicFrame& frame) {
731 switch (frame.type) {
732 case PING_FRAME:
733 // Ping has no payload.
734 return kQuicFrameTypeSize;
735 case RST_STREAM_FRAME:
736 return GetRstStreamFrameSize(version, *frame.rst_stream_frame);
737 case CONNECTION_CLOSE_FRAME:
738 return GetMinConnectionCloseFrameSize(version,
739 *frame.connection_close_frame) +
740 TruncatedErrorStringSize(
741 frame.connection_close_frame->error_details);
742 case GOAWAY_FRAME:
743 return GetMinGoAwayFrameSize() +
744 TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
745 case WINDOW_UPDATE_FRAME:
746 // For version 99, this could be either a MAX DATA or MAX STREAM DATA.
747 // GetWindowUpdateFrameSize figures this out and returns the correct
748 // length.
749 return GetWindowUpdateFrameSize(version, *frame.window_update_frame);
750 case BLOCKED_FRAME:
751 return GetBlockedFrameSize(version, *frame.blocked_frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500752 case NEW_CONNECTION_ID_FRAME:
753 return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
754 case RETIRE_CONNECTION_ID_FRAME:
755 return GetRetireConnectionIdFrameSize(*frame.retire_connection_id_frame);
756 case NEW_TOKEN_FRAME:
757 return GetNewTokenFrameSize(*frame.new_token_frame);
758 case MAX_STREAM_ID_FRAME:
759 return GetMaxStreamsFrameSize(version, frame.max_stream_id_frame);
760 case STREAM_ID_BLOCKED_FRAME:
761 return GetStreamsBlockedFrameSize(version, frame.stream_id_blocked_frame);
762 case PATH_RESPONSE_FRAME:
763 return GetPathResponseFrameSize(*frame.path_response_frame);
764 case PATH_CHALLENGE_FRAME:
765 return GetPathChallengeFrameSize(*frame.path_challenge_frame);
766 case STOP_SENDING_FRAME:
767 return GetStopSendingFrameSize(*frame.stop_sending_frame);
768
769 case STREAM_FRAME:
770 case ACK_FRAME:
771 case STOP_WAITING_FRAME:
772 case MTU_DISCOVERY_FRAME:
773 case PADDING_FRAME:
774 case MESSAGE_FRAME:
775 case CRYPTO_FRAME:
776 case NUM_FRAME_TYPES:
777 DCHECK(false);
778 return 0;
779 }
780
781 // Not reachable, but some Chrome compilers can't figure that out. *sigh*
782 DCHECK(false);
783 return 0;
784}
785
786// static
787size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
788 // Sizes are 1 through 4 bytes.
789 for (int i = 1; i <= 4; ++i) {
790 stream_id >>= 8;
791 if (stream_id == 0) {
792 return i;
793 }
794 }
795 QUIC_BUG << "Failed to determine StreamIDSize.";
796 return 4;
797}
798
799// static
800size_t QuicFramer::GetStreamOffsetSize(QuicTransportVersion version,
801 QuicStreamOffset offset) {
802 // 0 is a special case.
803 if (offset == 0) {
804 return 0;
805 }
806 // 2 through 8 are the remaining sizes.
807 offset >>= 8;
808 for (int i = 2; i <= 8; ++i) {
809 offset >>= 8;
810 if (offset == 0) {
811 return i;
812 }
813 }
814 QUIC_BUG << "Failed to determine StreamOffsetSize.";
815 return 8;
816}
817
818// static
819size_t QuicFramer::GetNewConnectionIdFrameSize(
820 const QuicNewConnectionIdFrame& frame) {
821 return kQuicFrameTypeSize +
822 QuicDataWriter::GetVarInt62Len(frame.sequence_number) +
823 kConnectionIdLengthSize + frame.connection_id.length() +
824 sizeof(frame.stateless_reset_token);
825}
826
827// static
828size_t QuicFramer::GetRetireConnectionIdFrameSize(
829 const QuicRetireConnectionIdFrame& frame) {
830 return kQuicFrameTypeSize +
831 QuicDataWriter::GetVarInt62Len(frame.sequence_number);
832}
833
834// static
835size_t QuicFramer::GetNewTokenFrameSize(const QuicNewTokenFrame& frame) {
836 return kQuicFrameTypeSize +
837 QuicDataWriter::GetVarInt62Len(frame.token.length()) +
838 frame.token.length();
839}
840
841// TODO(nharper): Change this method to take a ParsedQuicVersion.
842bool QuicFramer::IsSupportedTransportVersion(
843 const QuicTransportVersion version) const {
844 for (ParsedQuicVersion supported_version : supported_versions_) {
845 if (version == supported_version.transport_version) {
846 return true;
847 }
848 }
849 return false;
850}
851
852bool QuicFramer::IsSupportedVersion(const ParsedQuicVersion version) const {
853 for (const ParsedQuicVersion& supported_version : supported_versions_) {
854 if (version == supported_version) {
855 return true;
856 }
857 }
858 return false;
859}
860
861size_t QuicFramer::GetSerializedFrameLength(
862 const QuicFrame& frame,
863 size_t free_bytes,
864 bool first_frame,
865 bool last_frame,
866 QuicPacketNumberLength packet_number_length) {
867 // Prevent a rare crash reported in b/19458523.
868 if (frame.type == ACK_FRAME && frame.ack_frame == nullptr) {
869 QUIC_BUG << "Cannot compute the length of a null ack frame. free_bytes:"
870 << free_bytes << " first_frame:" << first_frame
871 << " last_frame:" << last_frame
872 << " seq num length:" << packet_number_length;
873 set_error(QUIC_INTERNAL_ERROR);
874 visitor_->OnError(this);
875 return 0;
876 }
877 if (frame.type == PADDING_FRAME) {
878 if (frame.padding_frame.num_padding_bytes == -1) {
879 // Full padding to the end of the packet.
880 return free_bytes;
881 } else {
882 // Lite padding.
883 return free_bytes <
884 static_cast<size_t>(frame.padding_frame.num_padding_bytes)
885 ? free_bytes
886 : frame.padding_frame.num_padding_bytes;
887 }
888 }
889
890 size_t frame_len =
891 ComputeFrameLength(frame, last_frame, packet_number_length);
892 if (frame_len <= free_bytes) {
893 // Frame fits within packet. Note that acks may be truncated.
894 return frame_len;
895 }
896 // Only truncate the first frame in a packet, so if subsequent ones go
897 // over, stop including more frames.
898 if (!first_frame) {
899 return 0;
900 }
901 bool can_truncate =
902 frame.type == ACK_FRAME &&
903 free_bytes >= GetMinAckFrameSize(version_.transport_version,
904 PACKET_6BYTE_PACKET_NUMBER);
905 if (can_truncate) {
dschinazi66dea072019-04-09 11:41:06 -0700906 // Truncate the frame so the packet will not exceed kMaxOutgoingPacketSize.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500907 // Note that we may not use every byte of the writer in this case.
908 QUIC_DLOG(INFO) << ENDPOINT
909 << "Truncating large frame, free bytes: " << free_bytes;
910 return free_bytes;
911 }
912 return 0;
913}
914
915QuicFramer::AckFrameInfo::AckFrameInfo()
916 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {}
917
918QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default;
919
920QuicFramer::AckFrameInfo::~AckFrameInfo() {}
921
922bool QuicFramer::WriteIetfLongHeaderLength(const QuicPacketHeader& header,
923 QuicDataWriter* writer,
924 size_t length_field_offset,
925 EncryptionLevel level) {
926 if (!QuicVersionHasLongHeaderLengths(transport_version()) ||
927 !header.version_flag || length_field_offset == 0) {
928 return true;
929 }
930 if (writer->length() < length_field_offset ||
931 writer->length() - length_field_offset <
932 kQuicDefaultLongHeaderLengthLength) {
933 set_detailed_error("Invalid length_field_offset.");
934 QUIC_BUG << "Invalid length_field_offset.";
935 return false;
936 }
937 size_t length_to_write = writer->length() - length_field_offset -
938 kQuicDefaultLongHeaderLengthLength;
939 // Add length of auth tag.
940 length_to_write = GetCiphertextSize(level, length_to_write);
941
942 QuicDataWriter length_writer(writer->length() - length_field_offset,
943 writer->data() + length_field_offset);
944 if (!length_writer.WriteVarInt62(length_to_write,
945 kQuicDefaultLongHeaderLengthLength)) {
946 set_detailed_error("Failed to overwrite long header length.");
947 QUIC_BUG << "Failed to overwrite long header length.";
948 return false;
949 }
950 return true;
951}
952
953size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header,
954 const QuicFrames& frames,
955 char* buffer,
956 size_t packet_length,
957 EncryptionLevel level) {
958 QuicDataWriter writer(packet_length, buffer);
959 size_t length_field_offset = 0;
960 if (!AppendPacketHeader(header, &writer, &length_field_offset)) {
961 QUIC_BUG << "AppendPacketHeader failed";
962 return 0;
963 }
964
965 if (transport_version() == QUIC_VERSION_99) {
966 if (AppendIetfFrames(frames, &writer) == 0) {
967 return 0;
968 }
969 if (!WriteIetfLongHeaderLength(header, &writer, length_field_offset,
970 level)) {
971 return 0;
972 }
973 return writer.length();
974 }
975 // TODO(dschinazi) if we enable long header lengths before v99, we need to
976 // add support for fixing up lengths in QuicFramer::BuildDataPacket.
977 DCHECK(!QuicVersionHasLongHeaderLengths(transport_version()));
978
979 size_t i = 0;
980 for (const QuicFrame& frame : frames) {
981 // Determine if we should write stream frame length in header.
982 const bool last_frame_in_packet = i == frames.size() - 1;
983 if (!AppendTypeByte(frame, last_frame_in_packet, &writer)) {
984 QUIC_BUG << "AppendTypeByte failed";
985 return 0;
986 }
987
988 switch (frame.type) {
989 case PADDING_FRAME:
990 if (!AppendPaddingFrame(frame.padding_frame, &writer)) {
991 QUIC_BUG << "AppendPaddingFrame of "
992 << frame.padding_frame.num_padding_bytes << " failed";
993 return 0;
994 }
995 break;
996 case STREAM_FRAME:
997 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
998 &writer)) {
999 QUIC_BUG << "AppendStreamFrame failed";
1000 return 0;
1001 }
1002 break;
1003 case ACK_FRAME:
1004 if (!AppendAckFrameAndTypeByte(*frame.ack_frame, &writer)) {
1005 QUIC_BUG << "AppendAckFrameAndTypeByte failed: " << detailed_error_;
1006 return 0;
1007 }
1008 break;
1009 case STOP_WAITING_FRAME:
1010 if (!AppendStopWaitingFrame(header, frame.stop_waiting_frame,
1011 &writer)) {
1012 QUIC_BUG << "AppendStopWaitingFrame failed";
1013 return 0;
1014 }
1015 break;
1016 case MTU_DISCOVERY_FRAME:
1017 // MTU discovery frames are serialized as ping frames.
1018 QUIC_FALLTHROUGH_INTENDED;
1019 case PING_FRAME:
1020 // Ping has no payload.
1021 break;
1022 case RST_STREAM_FRAME:
1023 if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
1024 QUIC_BUG << "AppendRstStreamFrame failed";
1025 return 0;
1026 }
1027 break;
1028 case CONNECTION_CLOSE_FRAME:
1029 if (!AppendConnectionCloseFrame(*frame.connection_close_frame,
1030 &writer)) {
1031 QUIC_BUG << "AppendConnectionCloseFrame failed";
1032 return 0;
1033 }
1034 break;
1035 case GOAWAY_FRAME:
1036 if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
1037 QUIC_BUG << "AppendGoAwayFrame failed";
1038 return 0;
1039 }
1040 break;
1041 case WINDOW_UPDATE_FRAME:
1042 if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) {
1043 QUIC_BUG << "AppendWindowUpdateFrame failed";
1044 return 0;
1045 }
1046 break;
1047 case BLOCKED_FRAME:
1048 if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) {
1049 QUIC_BUG << "AppendBlockedFrame failed";
1050 return 0;
1051 }
1052 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001053 case NEW_CONNECTION_ID_FRAME:
1054 set_detailed_error(
1055 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
1056 return RaiseError(QUIC_INTERNAL_ERROR);
1057 case RETIRE_CONNECTION_ID_FRAME:
1058 set_detailed_error(
1059 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
1060 "99.");
1061 return RaiseError(QUIC_INTERNAL_ERROR);
1062 case NEW_TOKEN_FRAME:
1063 set_detailed_error(
1064 "Attempt to append NEW_TOKEN_ID frame and not in version 99.");
1065 return RaiseError(QUIC_INTERNAL_ERROR);
1066 case MAX_STREAM_ID_FRAME:
1067 set_detailed_error(
1068 "Attempt to append MAX_STREAM_ID frame and not in version 99.");
1069 return RaiseError(QUIC_INTERNAL_ERROR);
1070 case STREAM_ID_BLOCKED_FRAME:
1071 set_detailed_error(
1072 "Attempt to append STREAM_ID_BLOCKED frame and not in version 99.");
1073 return RaiseError(QUIC_INTERNAL_ERROR);
1074 case PATH_RESPONSE_FRAME:
1075 set_detailed_error(
1076 "Attempt to append PATH_RESPONSE frame and not in version 99.");
1077 return RaiseError(QUIC_INTERNAL_ERROR);
1078 case PATH_CHALLENGE_FRAME:
1079 set_detailed_error(
1080 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
1081 return RaiseError(QUIC_INTERNAL_ERROR);
1082 case STOP_SENDING_FRAME:
1083 set_detailed_error(
1084 "Attempt to append STOP_SENDING frame and not in version 99.");
1085 return RaiseError(QUIC_INTERNAL_ERROR);
1086 case MESSAGE_FRAME:
1087 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1088 last_frame_in_packet, &writer)) {
1089 QUIC_BUG << "AppendMessageFrame failed";
1090 return 0;
1091 }
1092 break;
1093 case CRYPTO_FRAME:
QUICHE teamea740082019-03-11 17:58:43 -07001094 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001095 set_detailed_error(
1096 "Attempt to append CRYPTO frame in version prior to 47.");
1097 return RaiseError(QUIC_INTERNAL_ERROR);
1098 }
1099 if (!AppendCryptoFrame(*frame.crypto_frame, &writer)) {
1100 QUIC_BUG << "AppendCryptoFrame failed";
1101 return 0;
1102 }
1103 break;
1104 default:
1105 RaiseError(QUIC_INVALID_FRAME_DATA);
1106 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1107 return 0;
1108 }
1109 ++i;
1110 }
1111
1112 return writer.length();
1113}
1114
1115size_t QuicFramer::AppendIetfFrames(const QuicFrames& frames,
1116 QuicDataWriter* writer) {
1117 size_t i = 0;
1118 for (const QuicFrame& frame : frames) {
1119 // Determine if we should write stream frame length in header.
1120 const bool last_frame_in_packet = i == frames.size() - 1;
1121 if (!AppendIetfTypeByte(frame, last_frame_in_packet, writer)) {
1122 QUIC_BUG << "AppendIetfTypeByte failed: " << detailed_error();
1123 return 0;
1124 }
1125
1126 switch (frame.type) {
1127 case PADDING_FRAME:
1128 if (!AppendPaddingFrame(frame.padding_frame, writer)) {
1129 QUIC_BUG << "AppendPaddingFrame of "
1130 << frame.padding_frame.num_padding_bytes
1131 << " failed: " << detailed_error();
1132 return 0;
1133 }
1134 break;
1135 case STREAM_FRAME:
1136 if (!AppendStreamFrame(frame.stream_frame, last_frame_in_packet,
1137 writer)) {
1138 QUIC_BUG << "AppendStreamFrame failed: " << detailed_error();
1139 return 0;
1140 }
1141 break;
1142 case ACK_FRAME:
1143 if (!AppendIetfAckFrameAndTypeByte(*frame.ack_frame, writer)) {
QUICHE team4fe0b942019-03-08 09:25:06 -05001144 QUIC_BUG << "AppendIetfAckFrameAndTypeByte failed: "
1145 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001146 return 0;
1147 }
1148 break;
1149 case STOP_WAITING_FRAME:
1150 set_detailed_error(
1151 "Attempt to append STOP WAITING frame in version 99.");
1152 return RaiseError(QUIC_INTERNAL_ERROR);
1153 case MTU_DISCOVERY_FRAME:
1154 // MTU discovery frames are serialized as ping frames.
1155 QUIC_FALLTHROUGH_INTENDED;
1156 case PING_FRAME:
1157 // Ping has no payload.
1158 break;
1159 case RST_STREAM_FRAME:
1160 if (!AppendRstStreamFrame(*frame.rst_stream_frame, writer)) {
1161 QUIC_BUG << "AppendRstStreamFrame failed: " << detailed_error();
1162 return 0;
1163 }
1164 break;
1165 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07001166 if (!AppendIetfConnectionCloseFrame(*frame.connection_close_frame,
1167 writer)) {
1168 QUIC_BUG << "AppendIetfConnectionCloseFrame failed: "
1169 << detailed_error();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001170 return 0;
1171 }
1172 break;
1173 case GOAWAY_FRAME:
1174 set_detailed_error("Attempt to append GOAWAY frame in version 99.");
1175 return RaiseError(QUIC_INTERNAL_ERROR);
1176 case WINDOW_UPDATE_FRAME:
1177 // Depending on whether there is a stream ID or not, will be either a
1178 // MAX STREAM DATA frame or a MAX DATA frame.
1179 if (frame.window_update_frame->stream_id ==
1180 QuicUtils::GetInvalidStreamId(transport_version())) {
1181 if (!AppendMaxDataFrame(*frame.window_update_frame, writer)) {
1182 QUIC_BUG << "AppendMaxDataFrame failed: " << detailed_error();
1183 return 0;
1184 }
1185 } else {
1186 if (!AppendMaxStreamDataFrame(*frame.window_update_frame, writer)) {
1187 QUIC_BUG << "AppendMaxStreamDataFrame failed: " << detailed_error();
1188 return 0;
1189 }
1190 }
1191 break;
1192 case BLOCKED_FRAME:
1193 if (!AppendBlockedFrame(*frame.blocked_frame, writer)) {
1194 QUIC_BUG << "AppendBlockedFrame failed: " << detailed_error();
1195 return 0;
1196 }
1197 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001198 case MAX_STREAM_ID_FRAME:
1199 if (!AppendMaxStreamsFrame(frame.max_stream_id_frame, writer)) {
1200 QUIC_BUG << "AppendMaxStreamsFrame failed" << detailed_error();
1201 return 0;
1202 }
1203 break;
1204 case STREAM_ID_BLOCKED_FRAME:
1205 if (!AppendStreamsBlockedFrame(frame.stream_id_blocked_frame, writer)) {
1206 QUIC_BUG << "AppendStreamsBlockedFrame failed" << detailed_error();
1207 return 0;
1208 }
1209 break;
1210 case NEW_CONNECTION_ID_FRAME:
1211 if (!AppendNewConnectionIdFrame(*frame.new_connection_id_frame,
1212 writer)) {
1213 QUIC_BUG << "AppendNewConnectionIdFrame failed: " << detailed_error();
1214 return 0;
1215 }
1216 break;
1217 case RETIRE_CONNECTION_ID_FRAME:
1218 if (!AppendRetireConnectionIdFrame(*frame.retire_connection_id_frame,
1219 writer)) {
1220 QUIC_BUG << "AppendRetireConnectionIdFrame failed: "
1221 << detailed_error();
1222 return 0;
1223 }
1224 break;
1225 case NEW_TOKEN_FRAME:
1226 if (!AppendNewTokenFrame(*frame.new_token_frame, writer)) {
1227 QUIC_BUG << "AppendNewTokenFrame failed: " << detailed_error();
1228 return 0;
1229 }
1230 break;
1231 case STOP_SENDING_FRAME:
1232 if (!AppendStopSendingFrame(*frame.stop_sending_frame, writer)) {
1233 QUIC_BUG << "AppendStopSendingFrame failed: " << detailed_error();
1234 return 0;
1235 }
1236 break;
1237 case PATH_CHALLENGE_FRAME:
1238 if (!AppendPathChallengeFrame(*frame.path_challenge_frame, writer)) {
1239 QUIC_BUG << "AppendPathChallengeFrame failed: " << detailed_error();
1240 return 0;
1241 }
1242 break;
1243 case PATH_RESPONSE_FRAME:
1244 if (!AppendPathResponseFrame(*frame.path_response_frame, writer)) {
1245 QUIC_BUG << "AppendPathResponseFrame failed: " << detailed_error();
1246 return 0;
1247 }
1248 break;
1249 case MESSAGE_FRAME:
1250 if (!AppendMessageFrameAndTypeByte(*frame.message_frame,
1251 last_frame_in_packet, writer)) {
1252 QUIC_BUG << "AppendMessageFrame failed: " << detailed_error();
1253 return 0;
1254 }
1255 break;
1256 case CRYPTO_FRAME:
1257 if (!AppendCryptoFrame(*frame.crypto_frame, writer)) {
1258 QUIC_BUG << "AppendCryptoFrame failed: " << detailed_error();
1259 return 0;
1260 }
1261 break;
1262 default:
1263 RaiseError(QUIC_INVALID_FRAME_DATA);
1264 set_detailed_error("Tried to append unknown frame type.");
1265 QUIC_BUG << "QUIC_INVALID_FRAME_DATA";
1266 return 0;
1267 }
1268 ++i;
1269 }
1270
1271 return writer->length();
1272}
1273
rch67cb9df2019-03-26 16:52:07 -07001274size_t QuicFramer::BuildConnectivityProbingPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05001275 const QuicPacketHeader& header,
1276 char* buffer,
1277 size_t packet_length,
1278 EncryptionLevel level) {
1279 QuicFrames frames;
1280
1281 // Write a PING frame, which has no data payload.
1282 QuicPingFrame ping_frame;
1283 frames.push_back(QuicFrame(ping_frame));
1284
1285 // Add padding to the rest of the packet.
1286 QuicPaddingFrame padding_frame;
1287 frames.push_back(QuicFrame(padding_frame));
1288
1289 return BuildDataPacket(header, frames, buffer, packet_length, level);
1290}
1291
QUICHE teama6ef0a62019-03-07 20:34:33 -05001292size_t QuicFramer::BuildPaddedPathChallengePacket(
1293 const QuicPacketHeader& header,
1294 char* buffer,
1295 size_t packet_length,
1296 QuicPathFrameBuffer* payload,
1297 QuicRandom* randomizer,
1298 EncryptionLevel level) {
1299 if (version_.transport_version != QUIC_VERSION_99) {
1300 QUIC_BUG << "Attempt to build a PATH_CHALLENGE Connectivity Probing "
1301 "packet and not doing IETF QUIC";
1302 return 0;
1303 }
1304 QuicFrames frames;
1305
1306 // Write a PATH_CHALLENGE frame, which has a random 8-byte payload
1307 randomizer->RandBytes(payload->data(), payload->size());
1308
1309 QuicPathChallengeFrame path_challenge_frame(0, *payload);
1310 frames.push_back(QuicFrame(&path_challenge_frame));
1311
1312 // Add padding to the rest of the packet in order to assess Path MTU
1313 // characteristics.
1314 QuicPaddingFrame padding_frame;
1315 frames.push_back(QuicFrame(padding_frame));
1316
1317 return BuildDataPacket(header, frames, buffer, packet_length, level);
1318}
1319
1320size_t QuicFramer::BuildPathResponsePacket(
1321 const QuicPacketHeader& header,
1322 char* buffer,
1323 size_t packet_length,
1324 const QuicDeque<QuicPathFrameBuffer>& payloads,
1325 const bool is_padded,
1326 EncryptionLevel level) {
1327 if (payloads.empty()) {
1328 QUIC_BUG
1329 << "Attempt to generate connectivity response with no request payloads";
1330 return 0;
1331 }
1332 if (version_.transport_version != QUIC_VERSION_99) {
1333 QUIC_BUG << "Attempt to build a PATH_RESPONSE Connectivity Probing "
1334 "packet and not doing IETF QUIC";
1335 return 0;
1336 }
1337
1338 std::vector<std::unique_ptr<QuicPathResponseFrame>> path_response_frames;
1339 for (const QuicPathFrameBuffer& payload : payloads) {
1340 // Note that the control frame ID can be 0 since this is not retransmitted.
1341 path_response_frames.push_back(
1342 QuicMakeUnique<QuicPathResponseFrame>(0, payload));
1343 }
1344
1345 QuicFrames frames;
1346 for (const std::unique_ptr<QuicPathResponseFrame>& path_response_frame :
1347 path_response_frames) {
1348 frames.push_back(QuicFrame(path_response_frame.get()));
1349 }
1350
1351 if (is_padded) {
1352 // Add padding to the rest of the packet in order to assess Path MTU
1353 // characteristics.
1354 QuicPaddingFrame padding_frame;
1355 frames.push_back(QuicFrame(padding_frame));
1356 }
1357
1358 return BuildDataPacket(header, frames, buffer, packet_length, level);
1359}
1360
1361// static
1362std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket(
1363 const QuicPublicResetPacket& packet) {
1364 CryptoHandshakeMessage reset;
1365 reset.set_tag(kPRST);
1366 reset.SetValue(kRNON, packet.nonce_proof);
1367 if (packet.client_address.host().address_family() !=
1368 IpAddressFamily::IP_UNSPEC) {
1369 // packet.client_address is non-empty.
1370 QuicSocketAddressCoder address_coder(packet.client_address);
vasilvvc48c8712019-03-11 13:38:16 -07001371 std::string serialized_address = address_coder.Encode();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001372 if (serialized_address.empty()) {
1373 return nullptr;
1374 }
1375 reset.SetStringPiece(kCADR, serialized_address);
1376 }
1377 if (!packet.endpoint_id.empty()) {
1378 reset.SetStringPiece(kEPID, packet.endpoint_id);
1379 }
1380 const QuicData& reset_serialized = reset.GetSerialized();
1381
1382 size_t len = kPublicFlagsSize + packet.connection_id.length() +
1383 reset_serialized.length();
1384 std::unique_ptr<char[]> buffer(new char[len]);
1385 // Endianness is not a concern here, as writer is not going to write integers
1386 // or floating numbers.
1387 QuicDataWriter writer(len, buffer.get());
1388
1389 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST |
1390 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
1391 // This hack makes post-v33 public reset packet look like pre-v33 packets.
1392 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1393 if (!writer.WriteUInt8(flags)) {
1394 return nullptr;
1395 }
1396
1397 if (!writer.WriteConnectionId(packet.connection_id)) {
1398 return nullptr;
1399 }
1400
1401 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
1402 return nullptr;
1403 }
1404
1405 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1406}
1407
1408// static
1409std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildIetfStatelessResetPacket(
1410 QuicConnectionId connection_id,
1411 QuicUint128 stateless_reset_token) {
1412 QUIC_DVLOG(1) << "Building IETF stateless reset packet.";
1413 size_t len = kPacketHeaderTypeSize + kMinRandomBytesLengthInStatelessReset +
1414 sizeof(stateless_reset_token);
1415 std::unique_ptr<char[]> buffer(new char[len]);
1416 QuicDataWriter writer(len, buffer.get());
1417
1418 uint8_t type = 0;
1419 type |= FLAGS_FIXED_BIT;
1420 type |= FLAGS_SHORT_HEADER_RESERVED_1;
1421 type |= FLAGS_SHORT_HEADER_RESERVED_2;
1422 type |= PacketNumberLengthToOnWireValue(QUIC_VERSION_UNSUPPORTED,
1423 PACKET_1BYTE_PACKET_NUMBER);
1424
1425 // Append type byte.
1426 if (!writer.WriteUInt8(type)) {
1427 return nullptr;
1428 }
1429 // Append random bytes.
1430 if (!writer.WriteRandomBytes(QuicRandom::GetInstance(),
1431 kMinRandomBytesLengthInStatelessReset)) {
1432 return nullptr;
1433 }
1434
1435 // Append stateless reset token.
1436 if (!writer.WriteBytes(&stateless_reset_token,
1437 sizeof(stateless_reset_token))) {
1438 return nullptr;
1439 }
1440 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1441}
1442
1443// static
1444std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket(
1445 QuicConnectionId connection_id,
1446 bool ietf_quic,
1447 const ParsedQuicVersionVector& versions) {
1448 if (ietf_quic) {
1449 return BuildIetfVersionNegotiationPacket(connection_id, versions);
1450 }
1451 DCHECK(!versions.empty());
1452 size_t len = kPublicFlagsSize + connection_id.length() +
1453 versions.size() * kQuicVersionSize;
1454 std::unique_ptr<char[]> buffer(new char[len]);
1455 // Endianness is not a concern here, version negotiation packet does not have
1456 // integers or floating numbers.
1457 QuicDataWriter writer(len, buffer.get());
1458
1459 uint8_t flags = static_cast<uint8_t>(
1460 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID |
1461 // TODO(rch): Remove this QUIC_VERSION_32 is retired.
1462 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD);
1463 if (!writer.WriteUInt8(flags)) {
1464 return nullptr;
1465 }
1466
1467 if (!writer.WriteConnectionId(connection_id)) {
1468 return nullptr;
1469 }
1470
1471 for (const ParsedQuicVersion& version : versions) {
1472 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
1473 if (!writer.WriteTag(
1474 QuicEndian::HostToNet32(CreateQuicVersionLabel(version)))) {
1475 return nullptr;
1476 }
1477 }
1478
1479 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1480}
1481
1482// static
1483std::unique_ptr<QuicEncryptedPacket>
1484QuicFramer::BuildIetfVersionNegotiationPacket(
1485 QuicConnectionId connection_id,
1486 const ParsedQuicVersionVector& versions) {
1487 QUIC_DVLOG(1) << "Building IETF version negotiation packet.";
1488 DCHECK(!versions.empty());
1489 size_t len = kPacketHeaderTypeSize + kConnectionIdLengthSize +
1490 connection_id.length() +
1491 (versions.size() + 1) * kQuicVersionSize;
1492 std::unique_ptr<char[]> buffer(new char[len]);
1493 QuicDataWriter writer(len, buffer.get());
1494
1495 // TODO(fayang): Randomly select a value for the type.
1496 uint8_t type = static_cast<uint8_t>(FLAGS_LONG_HEADER | VERSION_NEGOTIATION);
1497 if (!writer.WriteUInt8(type)) {
1498 return nullptr;
1499 }
1500
1501 if (!writer.WriteUInt32(0)) {
1502 return nullptr;
1503 }
1504
1505 if (!GetQuicReloadableFlag(quic_use_new_append_connection_id)) {
1506 if (!AppendIetfConnectionId(true, EmptyQuicConnectionId(),
1507 PACKET_0BYTE_CONNECTION_ID, connection_id,
1508 PACKET_8BYTE_CONNECTION_ID, &writer)) {
1509 return nullptr;
1510 }
1511 } else {
1512 QUIC_RELOADABLE_FLAG_COUNT_N(quic_use_new_append_connection_id, 1, 2);
1513 if (!AppendIetfConnectionIdsNew(true, EmptyQuicConnectionId(),
1514 connection_id, &writer)) {
1515 return nullptr;
1516 }
1517 }
1518
1519 for (const ParsedQuicVersion& version : versions) {
1520 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
1521 if (!writer.WriteTag(
1522 QuicEndian::HostToNet32(CreateQuicVersionLabel(version)))) {
1523 return nullptr;
1524 }
1525 }
1526
1527 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true);
1528}
1529
1530bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
1531 QuicDataReader reader(packet.data(), packet.length());
1532
1533 bool packet_has_ietf_packet_header = false;
1534 if (infer_packet_header_type_from_version_) {
1535 packet_has_ietf_packet_header =
1536 version_.transport_version > QUIC_VERSION_43;
1537 } else if (!reader.IsDoneReading()) {
1538 uint8_t type = reader.PeekByte();
1539 packet_has_ietf_packet_header = QuicUtils::IsIetfPacketHeader(type);
1540 }
1541 if (packet_has_ietf_packet_header) {
1542 QUIC_DVLOG(1) << ENDPOINT << "Processing IETF QUIC packet.";
1543 }
1544
1545 visitor_->OnPacket();
1546
1547 QuicPacketHeader header;
1548 if (!ProcessPublicHeader(&reader, packet_has_ietf_packet_header, &header)) {
1549 DCHECK_NE("", detailed_error_);
1550 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: "
1551 << detailed_error_;
1552 DCHECK_NE("", detailed_error_);
1553 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_HEADER);
1554 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1555 }
1556
1557 if (!visitor_->OnUnauthenticatedPublicHeader(header)) {
1558 // The visitor suppresses further processing of the packet.
1559 return true;
1560 }
1561
1562 if (perspective_ == Perspective::IS_SERVER && header.version_flag &&
1563 header.version != version_) {
1564 if (!visitor_->OnProtocolVersionMismatch(header.version, header.form)) {
1565 RecordDroppedPacketReason(DroppedPacketReason::VERSION_MISMATCH);
1566 return true;
1567 }
1568 }
1569
1570 bool rv;
1571 if (IsVersionNegotiation(header, packet_has_ietf_packet_header)) {
1572 QUIC_DVLOG(1) << ENDPOINT << "Received version negotiation packet";
1573 rv = ProcessVersionNegotiationPacket(&reader, header);
1574 } else if (header.reset_flag) {
1575 rv = ProcessPublicResetPacket(&reader, header);
dschinazie8d7fa72019-04-05 14:44:40 -07001576 } else if (packet.length() <= kMaxIncomingPacketSize) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001577 // The optimized decryption algorithm implementations run faster when
1578 // operating on aligned memory.
dschinazie8d7fa72019-04-05 14:44:40 -07001579 QUIC_CACHELINE_ALIGNED char buffer[kMaxIncomingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -05001580 if (packet_has_ietf_packet_header) {
1581 rv = ProcessIetfDataPacket(&reader, &header, packet, buffer,
dschinazie8d7fa72019-04-05 14:44:40 -07001582 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001583 } else {
dschinazie8d7fa72019-04-05 14:44:40 -07001584 rv = ProcessDataPacket(&reader, &header, packet, buffer,
1585 QUIC_ARRAYSIZE(buffer));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001586 }
1587 } else {
1588 std::unique_ptr<char[]> large_buffer(new char[packet.length()]);
1589 if (packet_has_ietf_packet_header) {
1590 rv = ProcessIetfDataPacket(&reader, &header, packet, large_buffer.get(),
1591 packet.length());
1592 } else {
1593 rv = ProcessDataPacket(&reader, &header, packet, large_buffer.get(),
1594 packet.length());
1595 }
1596 QUIC_BUG_IF(rv) << "QUIC should never successfully process packets larger"
dschinazie8d7fa72019-04-05 14:44:40 -07001597 << "than kMaxIncomingPacketSize. packet size:"
1598 << packet.length();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 }
1600 return rv;
1601}
1602
1603bool QuicFramer::ProcessVersionNegotiationPacket(
1604 QuicDataReader* reader,
1605 const QuicPacketHeader& header) {
1606 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
1607
1608 QuicVersionNegotiationPacket packet(header.destination_connection_id);
1609 // Try reading at least once to raise error if the packet is invalid.
1610 do {
1611 QuicVersionLabel version_label;
1612 if (!reader->ReadTag(&version_label)) {
1613 set_detailed_error("Unable to read supported version in negotiation.");
1614 RecordDroppedPacketReason(
1615 DroppedPacketReason::INVALID_VERSION_NEGOTIATION_PACKET);
1616 return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
1617 }
1618 // TODO(rch): Use ReadUInt32() once QUIC_VERSION_35 is removed.
1619 version_label = QuicEndian::NetToHost32(version_label);
1620 packet.versions.push_back(ParseQuicVersionLabel(version_label));
1621 } while (!reader->IsDoneReading());
1622
1623 visitor_->OnVersionNegotiationPacket(packet);
1624 return true;
1625}
1626
1627bool QuicFramer::MaybeProcessIetfInitialRetryToken(
1628 QuicDataReader* encrypted_reader,
1629 QuicPacketHeader* header) {
1630 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1631 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1632 header->long_packet_type != INITIAL) {
1633 return true;
1634 }
1635 uint64_t retry_token_length = 0;
1636 header->retry_token_length_length = encrypted_reader->PeekVarInt62Length();
1637 if (!encrypted_reader->ReadVarInt62(&retry_token_length)) {
1638 set_detailed_error("Unable to read INITIAL retry token length.");
1639 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1640 }
1641 header->retry_token = encrypted_reader->PeekRemainingPayload();
1642 // Safety check to avoid spending ressources if malformed.
1643 // At this point header->retry_token contains the rest of the packet
1644 // so its length() is the amount of data remaining in the packet.
1645 if (retry_token_length > header->retry_token.length()) {
1646 set_detailed_error("INITIAL token length longer than packet.");
1647 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1648 }
1649 // Resize retry_token to make it only contain the retry token.
1650 header->retry_token.remove_suffix(header->retry_token.length() -
1651 retry_token_length);
1652 // Advance encrypted_reader by retry_token_length.
1653 uint8_t wasted_byte;
1654 for (uint64_t i = 0; i < retry_token_length; ++i) {
1655 if (!encrypted_reader->ReadUInt8(&wasted_byte)) {
1656 set_detailed_error("Unable to read INITIAL retry token.");
1657 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1658 }
1659 }
1660 return true;
1661}
1662
1663// Seeks the current packet to check for a coalesced packet at the end.
1664// If the IETF length field only spans part of the outer packet,
1665// then there is a coalesced packet after this one.
1666void QuicFramer::MaybeProcessCoalescedPacket(
1667 const QuicDataReader& encrypted_reader,
1668 uint64_t remaining_bytes_length,
1669 const QuicPacketHeader& header) {
1670 if (header.remaining_packet_length >= remaining_bytes_length) {
1671 // There is no coalesced packet.
1672 return;
1673 }
1674
1675 QuicStringPiece remaining_data = encrypted_reader.PeekRemainingPayload();
1676 DCHECK_EQ(remaining_data.length(), remaining_bytes_length);
1677
1678 const char* coalesced_data =
1679 remaining_data.data() + header.remaining_packet_length;
1680 uint64_t coalesced_data_length =
1681 remaining_bytes_length - header.remaining_packet_length;
1682 QuicDataReader coalesced_reader(coalesced_data, coalesced_data_length);
1683
1684 QuicPacketHeader coalesced_header;
1685 if (!ProcessIetfPacketHeader(&coalesced_reader, &coalesced_header)) {
1686 QUIC_PEER_BUG << ENDPOINT
1687 << "Failed to parse received coalesced header of length "
1688 << coalesced_data_length << ": "
1689 << QuicTextUtils::HexEncode(coalesced_data,
1690 coalesced_data_length)
1691 << " previous header was " << header;
1692 return;
1693 }
1694
1695 if (coalesced_header.destination_connection_id !=
1696 header.destination_connection_id ||
1697 (coalesced_header.form != IETF_QUIC_SHORT_HEADER_PACKET &&
1698 coalesced_header.version != header.version)) {
1699 QUIC_PEER_BUG << ENDPOINT << "Received mismatched coalesced header "
1700 << coalesced_header << " previous header was " << header;
1701 return;
1702 }
1703
1704 QuicEncryptedPacket coalesced_packet(coalesced_data, coalesced_data_length,
1705 /*owns_buffer=*/false);
1706 visitor_->OnCoalescedPacket(coalesced_packet);
1707}
1708
1709bool QuicFramer::MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
1710 QuicPacketHeader* header) {
1711 if (!QuicVersionHasLongHeaderLengths(header->version.transport_version) ||
1712 header->form != IETF_QUIC_LONG_HEADER_PACKET ||
1713 (header->long_packet_type != INITIAL &&
1714 header->long_packet_type != HANDSHAKE &&
1715 header->long_packet_type != ZERO_RTT_PROTECTED)) {
1716 return true;
1717 }
1718 header->length_length = encrypted_reader->PeekVarInt62Length();
1719 if (!encrypted_reader->ReadVarInt62(&header->remaining_packet_length)) {
1720 set_detailed_error("Unable to read long header payload length.");
1721 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1722 }
1723 uint64_t remaining_bytes_length = encrypted_reader->BytesRemaining();
1724 if (header->remaining_packet_length > remaining_bytes_length) {
1725 set_detailed_error("Long header payload length longer than packet.");
1726 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1727 }
1728
1729 MaybeProcessCoalescedPacket(*encrypted_reader, remaining_bytes_length,
1730 *header);
1731
1732 if (!encrypted_reader->TruncateRemaining(header->remaining_packet_length)) {
1733 set_detailed_error("Length TruncateRemaining failed.");
1734 QUIC_BUG << "Length TruncateRemaining failed.";
1735 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1736 }
1737 return true;
1738}
1739
1740bool QuicFramer::ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
1741 QuicPacketHeader* header,
1742 const QuicEncryptedPacket& packet,
1743 char* decrypted_buffer,
1744 size_t buffer_length) {
1745 DCHECK_NE(GOOGLE_QUIC_PACKET, header->form);
1746 DCHECK(!header->has_possible_stateless_reset_token);
1747 header->retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1748 header->retry_token = QuicStringPiece();
1749 header->length_length = VARIABLE_LENGTH_INTEGER_LENGTH_0;
1750 header->remaining_packet_length = 0;
1751 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET &&
1752 perspective_ == Perspective::IS_CLIENT) {
1753 // Peek possible stateless reset token. Will only be used on decryption
1754 // failure.
1755 QuicStringPiece remaining = encrypted_reader->PeekRemainingPayload();
1756 if (remaining.length() >= sizeof(header->possible_stateless_reset_token)) {
1757 header->has_possible_stateless_reset_token = true;
1758 memcpy(&header->possible_stateless_reset_token,
1759 &remaining.data()[remaining.length() -
1760 sizeof(header->possible_stateless_reset_token)],
1761 sizeof(header->possible_stateless_reset_token));
1762 }
1763 }
1764
1765 if (!MaybeProcessIetfInitialRetryToken(encrypted_reader, header)) {
1766 return false;
1767 }
1768
1769 if (!MaybeProcessIetfLength(encrypted_reader, header)) {
1770 return false;
1771 }
1772
1773 if (header->form == IETF_QUIC_SHORT_HEADER_PACKET ||
1774 header->long_packet_type != VERSION_NEGOTIATION) {
1775 // Process packet number.
QUICHE team10b22a12019-03-21 15:31:42 -07001776 QuicPacketNumber base_packet_number;
1777 if (supports_multiple_packet_number_spaces_) {
1778 base_packet_number =
1779 largest_decrypted_packet_numbers_[GetPacketNumberSpace(*header)];
1780 } else {
1781 base_packet_number = largest_packet_number_;
1782 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001783 uint64_t full_packet_number;
1784 if (!ProcessAndCalculatePacketNumber(
1785 encrypted_reader, header->packet_number_length, base_packet_number,
1786 &full_packet_number)) {
1787 set_detailed_error("Unable to read packet number.");
1788 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1789 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1790 }
1791
1792 if (!IsValidFullPacketNumber(full_packet_number, transport_version())) {
1793 if (IsIetfStatelessResetPacket(*header)) {
1794 // This is a stateless reset packet.
1795 QuicIetfStatelessResetPacket packet(
1796 *header, header->possible_stateless_reset_token);
1797 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1798 return true;
1799 }
1800 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1801 set_detailed_error("packet numbers cannot be 0.");
1802 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1803 }
1804 header->packet_number = QuicPacketNumber(full_packet_number);
1805 }
1806
1807 // A nonce should only present in SHLO from the server to the client when
1808 // using QUIC crypto.
1809 if (header->form == IETF_QUIC_LONG_HEADER_PACKET &&
1810 header->long_packet_type == ZERO_RTT_PROTECTED &&
1811 perspective_ == Perspective::IS_CLIENT &&
1812 version_.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
1813 if (!encrypted_reader->ReadBytes(
1814 reinterpret_cast<uint8_t*>(last_nonce_.data()),
1815 last_nonce_.size())) {
1816 set_detailed_error("Unable to read nonce.");
1817 RecordDroppedPacketReason(
1818 DroppedPacketReason::INVALID_DIVERSIFICATION_NONCE);
1819 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1820 }
1821
1822 header->nonce = &last_nonce_;
1823 } else {
1824 header->nonce = nullptr;
1825 }
1826
1827 if (!visitor_->OnUnauthenticatedHeader(*header)) {
1828 set_detailed_error(
1829 "Visitor asked to stop processing of unauthenticated header.");
1830 return false;
1831 }
1832
1833 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
1834 QuicStringPiece associated_data = GetAssociatedDataFromEncryptedPacket(
1835 version_.transport_version, packet,
1836 GetIncludedDestinationConnectionIdLength(*header),
1837 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1838 header->nonce != nullptr, header->packet_number_length,
1839 header->retry_token_length_length, header->retry_token.length(),
1840 header->length_length);
1841
1842 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001843 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001844 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001845 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001846 if (IsIetfStatelessResetPacket(*header)) {
1847 // This is a stateless reset packet.
1848 QuicIetfStatelessResetPacket packet(
1849 *header, header->possible_stateless_reset_token);
1850 visitor_->OnAuthenticatedIetfStatelessResetPacket(packet);
1851 return true;
1852 }
1853 set_detailed_error("Unable to decrypt payload.");
1854 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1855 return RaiseError(QUIC_DECRYPTION_FAILURE);
1856 }
1857 QuicDataReader reader(decrypted_buffer, decrypted_length);
1858
1859 // Update the largest packet number after we have decrypted the packet
1860 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001861 if (supports_multiple_packet_number_spaces_) {
1862 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1863 decrypted_level)]
1864 .UpdateMax(header->packet_number);
1865 } else {
1866 largest_packet_number_.UpdateMax(header->packet_number);
1867 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001868
1869 if (!visitor_->OnPacketHeader(*header)) {
1870 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1871 // The visitor suppresses further processing of the packet.
1872 return true;
1873 }
1874
dschinazie8d7fa72019-04-05 14:44:40 -07001875 if (packet.length() > kMaxIncomingPacketSize) {
1876 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001877 return RaiseError(QUIC_PACKET_TOO_LARGE);
1878 }
1879
1880 // Handle the payload.
1881 if (version_.transport_version == QUIC_VERSION_99) {
1882 if (!ProcessIetfFrameData(&reader, *header)) {
1883 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessIetfFrameData sets the error.
1884 DCHECK_NE("", detailed_error_);
1885 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1886 << detailed_error_;
1887 return false;
1888 }
1889 } else {
1890 if (!ProcessFrameData(&reader, *header)) {
1891 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1892 DCHECK_NE("", detailed_error_);
1893 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1894 << detailed_error_;
1895 return false;
1896 }
1897 }
1898
1899 visitor_->OnPacketComplete();
1900 return true;
1901}
1902
1903bool QuicFramer::ProcessDataPacket(QuicDataReader* encrypted_reader,
1904 QuicPacketHeader* header,
1905 const QuicEncryptedPacket& packet,
1906 char* decrypted_buffer,
1907 size_t buffer_length) {
1908 if (!ProcessUnauthenticatedHeader(encrypted_reader, header)) {
1909 DCHECK_NE("", detailed_error_);
1910 QUIC_DVLOG(1)
1911 << ENDPOINT
1912 << "Unable to process packet header. Stopping parsing. Error: "
1913 << detailed_error_;
1914 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PACKET_NUMBER);
1915 return false;
1916 }
1917
1918 QuicStringPiece encrypted = encrypted_reader->ReadRemainingPayload();
1919 QuicStringPiece associated_data = GetAssociatedDataFromEncryptedPacket(
1920 version_.transport_version, packet,
1921 GetIncludedDestinationConnectionIdLength(*header),
1922 GetIncludedSourceConnectionIdLength(*header), header->version_flag,
1923 header->nonce != nullptr, header->packet_number_length,
1924 header->retry_token_length_length, header->retry_token.length(),
1925 header->length_length);
1926
1927 size_t decrypted_length = 0;
QUICHE team10b22a12019-03-21 15:31:42 -07001928 EncryptionLevel decrypted_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001929 if (!DecryptPayload(encrypted, associated_data, *header, decrypted_buffer,
QUICHE team10b22a12019-03-21 15:31:42 -07001930 buffer_length, &decrypted_length, &decrypted_level)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001931 RecordDroppedPacketReason(DroppedPacketReason::DECRYPTION_FAILURE);
1932 set_detailed_error("Unable to decrypt payload.");
1933 return RaiseError(QUIC_DECRYPTION_FAILURE);
1934 }
1935
1936 QuicDataReader reader(decrypted_buffer, decrypted_length);
1937
1938 // Update the largest packet number after we have decrypted the packet
1939 // so we are confident is not attacker controlled.
QUICHE team10b22a12019-03-21 15:31:42 -07001940 if (supports_multiple_packet_number_spaces_) {
1941 largest_decrypted_packet_numbers_[QuicUtils::GetPacketNumberSpace(
1942 decrypted_level)]
1943 .UpdateMax(header->packet_number);
1944 } else {
1945 largest_packet_number_.UpdateMax(header->packet_number);
1946 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001947
1948 if (!visitor_->OnPacketHeader(*header)) {
1949 // The visitor suppresses further processing of the packet.
1950 return true;
1951 }
1952
dschinazie8d7fa72019-04-05 14:44:40 -07001953 if (packet.length() > kMaxIncomingPacketSize) {
1954 set_detailed_error("Packet too large.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05001955 return RaiseError(QUIC_PACKET_TOO_LARGE);
1956 }
1957
1958 // Handle the payload.
1959 if (!ProcessFrameData(&reader, *header)) {
1960 DCHECK_NE(QUIC_NO_ERROR, error_); // ProcessFrameData sets the error.
1961 DCHECK_NE("", detailed_error_);
1962 QUIC_DLOG(WARNING) << ENDPOINT << "Unable to process frame data. Error: "
1963 << detailed_error_;
1964 return false;
1965 }
1966
1967 visitor_->OnPacketComplete();
1968 return true;
1969}
1970
1971bool QuicFramer::ProcessPublicResetPacket(QuicDataReader* reader,
1972 const QuicPacketHeader& header) {
1973 QuicPublicResetPacket packet(header.destination_connection_id);
1974
1975 std::unique_ptr<CryptoHandshakeMessage> reset(
1976 CryptoFramer::ParseMessage(reader->ReadRemainingPayload()));
1977 if (!reset.get()) {
1978 set_detailed_error("Unable to read reset message.");
1979 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1980 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1981 }
1982 if (reset->tag() != kPRST) {
1983 set_detailed_error("Incorrect message tag.");
1984 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1985 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1986 }
1987
1988 if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) {
1989 set_detailed_error("Unable to read nonce proof.");
1990 RecordDroppedPacketReason(DroppedPacketReason::INVALID_PUBLIC_RESET_PACKET);
1991 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
1992 }
1993 // TODO(satyamshekhar): validate nonce to protect against DoS.
1994
1995 QuicStringPiece address;
1996 if (reset->GetStringPiece(kCADR, &address)) {
1997 QuicSocketAddressCoder address_coder;
1998 if (address_coder.Decode(address.data(), address.length())) {
1999 packet.client_address =
2000 QuicSocketAddress(address_coder.ip(), address_coder.port());
2001 }
2002 }
2003
2004 QuicStringPiece endpoint_id;
2005 if (perspective_ == Perspective::IS_CLIENT &&
2006 reset->GetStringPiece(kEPID, &endpoint_id)) {
vasilvvc48c8712019-03-11 13:38:16 -07002007 packet.endpoint_id = std::string(endpoint_id);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002008 packet.endpoint_id += '\0';
2009 }
2010
2011 visitor_->OnPublicResetPacket(packet);
2012 return true;
2013}
2014
2015bool QuicFramer::IsIetfStatelessResetPacket(
2016 const QuicPacketHeader& header) const {
2017 QUIC_BUG_IF(header.has_possible_stateless_reset_token &&
2018 perspective_ != Perspective::IS_CLIENT)
2019 << "has_possible_stateless_reset_token can only be true at client side.";
2020 return header.form == IETF_QUIC_SHORT_HEADER_PACKET &&
2021 header.has_possible_stateless_reset_token &&
2022 visitor_->IsValidStatelessResetToken(
2023 header.possible_stateless_reset_token);
2024}
2025
2026bool QuicFramer::HasEncrypterOfEncryptionLevel(EncryptionLevel level) const {
2027 return encrypter_[level] != nullptr;
2028}
2029
2030bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
2031 QuicDataWriter* writer,
2032 size_t* length_field_offset) {
2033 if (transport_version() > QUIC_VERSION_43) {
2034 return AppendIetfPacketHeader(header, writer, length_field_offset);
2035 }
2036 QUIC_DVLOG(1) << ENDPOINT << "Appending header: " << header;
2037 uint8_t public_flags = 0;
2038 if (header.reset_flag) {
2039 public_flags |= PACKET_PUBLIC_FLAGS_RST;
2040 }
2041 if (header.version_flag) {
2042 public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
2043 }
2044
2045 public_flags |= GetPacketNumberFlags(header.packet_number_length)
2046 << kPublicHeaderSequenceNumberShift;
2047
2048 if (header.nonce != nullptr) {
2049 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2050 public_flags |= PACKET_PUBLIC_FLAGS_NONCE;
2051 }
2052 DCHECK_EQ(CONNECTION_ID_ABSENT, header.source_connection_id_included);
2053 switch (header.destination_connection_id_included) {
2054 case CONNECTION_ID_ABSENT:
2055 if (!writer->WriteUInt8(public_flags |
2056 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) {
2057 return false;
2058 }
2059 break;
2060 case CONNECTION_ID_PRESENT:
2061 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(
2062 header.destination_connection_id, transport_version()))
2063 << "AppendPacketHeader: attempted to use connection ID "
2064 << header.destination_connection_id
2065 << " which is invalid with version "
2066 << QuicVersionToString(transport_version());
2067
2068 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID;
2069 if (perspective_ == Perspective::IS_CLIENT) {
2070 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
2071 }
2072 if (!writer->WriteUInt8(public_flags) ||
2073 !writer->WriteConnectionId(header.destination_connection_id)) {
2074 return false;
2075 }
2076 break;
2077 }
2078 last_serialized_connection_id_ = header.destination_connection_id;
2079
2080 if (header.version_flag) {
2081 DCHECK_EQ(Perspective::IS_CLIENT, perspective_);
2082 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
2083 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
2084 if (!writer->WriteTag(QuicEndian::NetToHost32(version_label))) {
2085 return false;
2086 }
2087
2088 QUIC_DVLOG(1) << ENDPOINT << "label = '"
2089 << QuicVersionLabelToString(version_label) << "'";
2090 }
2091
2092 if (header.nonce != nullptr &&
2093 !writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2094 return false;
2095 }
2096
2097 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2098 writer)) {
2099 return false;
2100 }
2101
2102 return true;
2103}
2104
2105bool QuicFramer::AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
2106 QuicDataWriter* writer) {
2107 uint8_t type = 0;
2108 if (transport_version() > QUIC_VERSION_44) {
2109 if (header.version_flag) {
2110 type = static_cast<uint8_t>(
2111 FLAGS_LONG_HEADER | FLAGS_FIXED_BIT |
2112 LongHeaderTypeToOnWireValue(transport_version(),
2113 header.long_packet_type) |
2114 PacketNumberLengthToOnWireValue(transport_version(),
2115 header.packet_number_length));
2116 } else {
2117 type = static_cast<uint8_t>(
2118 FLAGS_FIXED_BIT |
2119 PacketNumberLengthToOnWireValue(transport_version(),
2120 header.packet_number_length));
2121 }
2122 return writer->WriteUInt8(type);
2123 }
2124
2125 if (header.version_flag) {
2126 type = static_cast<uint8_t>(
2127 FLAGS_LONG_HEADER | LongHeaderTypeToOnWireValue(
2128 transport_version(), header.long_packet_type));
2129 DCHECK_EQ(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length);
2130 } else {
2131 type |= FLAGS_SHORT_HEADER_RESERVED_1;
2132 type |= FLAGS_SHORT_HEADER_RESERVED_2;
2133 DCHECK_GE(PACKET_4BYTE_PACKET_NUMBER, header.packet_number_length);
2134 type |= PacketNumberLengthToOnWireValue(transport_version(),
2135 header.packet_number_length);
2136 }
2137 return writer->WriteUInt8(type);
2138}
2139
2140bool QuicFramer::AppendIetfPacketHeader(const QuicPacketHeader& header,
2141 QuicDataWriter* writer,
2142 size_t* length_field_offset) {
2143 QUIC_DVLOG(1) << ENDPOINT << "Appending IETF header: " << header;
2144 QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(
2145 header.destination_connection_id, transport_version()))
2146 << "AppendIetfPacketHeader: attempted to use connection ID "
2147 << header.destination_connection_id << " which is invalid with version "
2148 << QuicVersionToString(transport_version());
2149 if (!AppendIetfHeaderTypeByte(header, writer)) {
2150 return false;
2151 }
2152
2153 if (header.version_flag) {
2154 // Append version for long header.
2155 QuicVersionLabel version_label = CreateQuicVersionLabel(version_);
2156 // TODO(rch): Use WriteUInt32() once QUIC_VERSION_35 is removed.
2157 if (!writer->WriteTag(QuicEndian::NetToHost32(version_label))) {
2158 return false;
2159 }
2160 }
2161
2162 // Append connection ID.
2163 if (!QuicUtils::VariableLengthConnectionIdAllowedForVersion(
2164 transport_version()) &&
2165 !GetQuicReloadableFlag(quic_use_new_append_connection_id)) {
2166 if (!AppendIetfConnectionId(
2167 header.version_flag, header.destination_connection_id,
2168 GetIncludedDestinationConnectionIdLength(header),
2169 header.source_connection_id,
2170 GetIncludedSourceConnectionIdLength(header), writer)) {
2171 return false;
2172 }
2173 } else {
2174 QUIC_RELOADABLE_FLAG_COUNT_N(quic_use_new_append_connection_id, 2, 2);
2175 if (!AppendIetfConnectionIdsNew(
2176 header.version_flag,
2177 header.destination_connection_id_included != CONNECTION_ID_ABSENT
2178 ? header.destination_connection_id
2179 : EmptyQuicConnectionId(),
2180 header.source_connection_id_included != CONNECTION_ID_ABSENT
2181 ? header.source_connection_id
2182 : EmptyQuicConnectionId(),
2183 writer)) {
2184 return false;
2185 }
2186 }
2187 last_serialized_connection_id_ = header.destination_connection_id;
2188
2189 if (QuicVersionHasLongHeaderLengths(transport_version()) &&
2190 header.version_flag) {
2191 if (header.long_packet_type == INITIAL) {
2192 // Write retry token length.
2193 if (!writer->WriteVarInt62(header.retry_token.length(),
2194 header.retry_token_length_length)) {
2195 return false;
2196 }
2197 // Write retry token.
2198 if (!header.retry_token.empty() &&
2199 !writer->WriteStringPiece(header.retry_token)) {
2200 return false;
2201 }
2202 }
2203 if (length_field_offset != nullptr) {
2204 *length_field_offset = writer->length();
2205 }
2206 // Add fake length to reserve two bytes to add length in later.
2207 writer->WriteVarInt62(256);
2208 } else if (length_field_offset != nullptr) {
2209 *length_field_offset = 0;
2210 }
2211
2212 // Append packet number.
2213 if (!AppendPacketNumber(header.packet_number_length, header.packet_number,
2214 writer)) {
2215 return false;
2216 }
2217
2218 if (!header.version_flag) {
2219 return true;
2220 }
2221
2222 if (header.nonce != nullptr) {
2223 DCHECK(header.version_flag);
2224 DCHECK_EQ(ZERO_RTT_PROTECTED, header.long_packet_type);
2225 DCHECK_EQ(Perspective::IS_SERVER, perspective_);
2226 if (!writer->WriteBytes(header.nonce, kDiversificationNonceSize)) {
2227 return false;
2228 }
2229 }
2230
2231 return true;
2232}
2233
2234const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
2235 uint32_t time_delta_us) {
2236 // The new time_delta might have wrapped to the next epoch, or it
2237 // might have reverse wrapped to the previous epoch, or it might
2238 // remain in the same epoch. Select the time closest to the previous
2239 // time.
2240 //
2241 // epoch_delta is the delta between epochs. A delta is 4 bytes of
2242 // microseconds.
2243 const uint64_t epoch_delta = UINT64_C(1) << 32;
2244 uint64_t epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1);
2245 // Wrapping is safe here because a wrapped value will not be ClosestTo below.
2246 uint64_t prev_epoch = epoch - epoch_delta;
2247 uint64_t next_epoch = epoch + epoch_delta;
2248
2249 uint64_t time = ClosestTo(
2250 last_timestamp_.ToMicroseconds(), epoch + time_delta_us,
2251 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us,
2252 next_epoch + time_delta_us));
2253
2254 return QuicTime::Delta::FromMicroseconds(time);
2255}
2256
2257uint64_t QuicFramer::CalculatePacketNumberFromWire(
2258 QuicPacketNumberLength packet_number_length,
2259 QuicPacketNumber base_packet_number,
2260 uint64_t packet_number) const {
2261 // The new packet number might have wrapped to the next epoch, or
2262 // it might have reverse wrapped to the previous epoch, or it might
2263 // remain in the same epoch. Select the packet number closest to the
2264 // next expected packet number, the previous packet number plus 1.
2265
2266 // epoch_delta is the delta between epochs the packet number was serialized
2267 // with, so the correct value is likely the same epoch as the last sequence
2268 // number or an adjacent epoch.
2269 if (!base_packet_number.IsInitialized()) {
2270 return packet_number;
2271 }
2272 const uint64_t epoch_delta = UINT64_C(1) << (8 * packet_number_length);
2273 uint64_t next_packet_number = base_packet_number.ToUint64() + 1;
2274 uint64_t epoch = base_packet_number.ToUint64() & ~(epoch_delta - 1);
2275 uint64_t prev_epoch = epoch - epoch_delta;
2276 uint64_t next_epoch = epoch + epoch_delta;
2277
2278 return ClosestTo(next_packet_number, epoch + packet_number,
2279 ClosestTo(next_packet_number, prev_epoch + packet_number,
2280 next_epoch + packet_number));
2281}
2282
2283bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader,
2284 bool packet_has_ietf_packet_header,
2285 QuicPacketHeader* header) {
2286 if (packet_has_ietf_packet_header) {
2287 return ProcessIetfPacketHeader(reader, header);
2288 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002289 uint8_t public_flags;
2290 if (!reader->ReadBytes(&public_flags, 1)) {
2291 set_detailed_error("Unable to read public flags.");
2292 return false;
2293 }
2294
2295 header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
2296 header->version_flag = (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
2297
2298 if (validate_flags_ && !header->version_flag &&
2299 public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2300 set_detailed_error("Illegal public flags value.");
2301 return false;
2302 }
2303
2304 if (header->reset_flag && header->version_flag) {
2305 set_detailed_error("Got version flag in reset packet");
2306 return false;
2307 }
2308
2309 switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
2310 case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
2311 if (!reader->ReadConnectionId(&header->destination_connection_id,
2312 kQuicDefaultConnectionIdLength)) {
2313 set_detailed_error("Unable to read ConnectionId.");
2314 return false;
2315 }
2316 header->destination_connection_id_included = CONNECTION_ID_PRESENT;
2317 break;
2318 case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID:
2319 header->destination_connection_id_included = CONNECTION_ID_ABSENT;
2320 header->destination_connection_id = last_serialized_connection_id_;
2321 break;
2322 }
2323
2324 header->packet_number_length = ReadSequenceNumberLength(
2325 public_flags >> kPublicHeaderSequenceNumberShift);
2326
2327 // Read the version only if the packet is from the client.
2328 // version flag from the server means version negotiation packet.
2329 if (header->version_flag && perspective_ == Perspective::IS_SERVER) {
2330 QuicVersionLabel version_label;
2331 if (!reader->ReadTag(&version_label)) {
2332 set_detailed_error("Unable to read protocol version.");
2333 return false;
2334 }
2335 // TODO(rch): Use ReadUInt32() once QUIC_VERSION_35 is removed.
2336 version_label = QuicEndian::NetToHost32(version_label);
2337
2338 // If the version from the new packet is the same as the version of this
2339 // framer, then the public flags should be set to something we understand.
2340 // If not, this raises an error.
2341 last_version_label_ = version_label;
2342 ParsedQuicVersion version = ParseQuicVersionLabel(version_label);
2343 if (version == version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
2344 set_detailed_error("Illegal public flags value.");
2345 return false;
2346 }
2347 header->version = version;
2348 }
2349
2350 // A nonce should only be present in packets from the server to the client,
2351 // which are neither version negotiation nor public reset packets.
2352 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE &&
2353 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) &&
2354 !(public_flags & PACKET_PUBLIC_FLAGS_RST) &&
2355 // The nonce flag from a client is ignored and is assumed to be an older
2356 // client indicating an eight-byte connection ID.
2357 perspective_ == Perspective::IS_CLIENT) {
2358 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()),
2359 last_nonce_.size())) {
2360 set_detailed_error("Unable to read nonce.");
2361 return false;
2362 }
2363 header->nonce = &last_nonce_;
2364 } else {
2365 header->nonce = nullptr;
2366 }
2367
2368 return true;
2369}
2370
2371// static
2372QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength(
2373 QuicTransportVersion version,
2374 QuicPacketNumber packet_number) {
2375 DCHECK(packet_number.IsInitialized());
2376 if (packet_number < QuicPacketNumber(1 << (PACKET_1BYTE_PACKET_NUMBER * 8))) {
2377 return PACKET_1BYTE_PACKET_NUMBER;
2378 } else if (packet_number <
2379 QuicPacketNumber(1 << (PACKET_2BYTE_PACKET_NUMBER * 8))) {
2380 return PACKET_2BYTE_PACKET_NUMBER;
2381 } else if (packet_number <
2382 QuicPacketNumber(UINT64_C(1)
2383 << (PACKET_4BYTE_PACKET_NUMBER * 8))) {
2384 return PACKET_4BYTE_PACKET_NUMBER;
2385 } else {
2386 return PACKET_6BYTE_PACKET_NUMBER;
2387 }
2388}
2389
2390// static
2391uint8_t QuicFramer::GetPacketNumberFlags(
2392 QuicPacketNumberLength packet_number_length) {
2393 switch (packet_number_length) {
2394 case PACKET_1BYTE_PACKET_NUMBER:
2395 return PACKET_FLAGS_1BYTE_PACKET;
2396 case PACKET_2BYTE_PACKET_NUMBER:
2397 return PACKET_FLAGS_2BYTE_PACKET;
2398 case PACKET_4BYTE_PACKET_NUMBER:
2399 return PACKET_FLAGS_4BYTE_PACKET;
2400 case PACKET_6BYTE_PACKET_NUMBER:
2401 case PACKET_8BYTE_PACKET_NUMBER:
2402 return PACKET_FLAGS_8BYTE_PACKET;
2403 default:
2404 QUIC_BUG << "Unreachable case statement.";
2405 return PACKET_FLAGS_8BYTE_PACKET;
2406 }
2407}
2408
2409// static
2410QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
2411 const QuicAckFrame& frame) {
2412 AckFrameInfo new_ack_info;
2413 if (frame.packets.Empty()) {
2414 return new_ack_info;
2415 }
2416 // The first block is the last interval. It isn't encoded with the gap-length
2417 // encoding, so skip it.
2418 new_ack_info.first_block_length = frame.packets.LastIntervalLength();
2419 auto itr = frame.packets.rbegin();
2420 QuicPacketNumber previous_start = itr->min();
2421 new_ack_info.max_block_length = PacketNumberIntervalLength(*itr);
2422 ++itr;
2423
2424 // Don't do any more work after getting information for 256 ACK blocks; any
2425 // more can't be encoded anyway.
2426 for (; itr != frame.packets.rend() &&
2427 new_ack_info.num_ack_blocks < std::numeric_limits<uint8_t>::max();
2428 previous_start = itr->min(), ++itr) {
2429 const auto& interval = *itr;
2430 const QuicPacketCount total_gap = previous_start - interval.max();
2431 new_ack_info.num_ack_blocks +=
2432 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
2433 std::numeric_limits<uint8_t>::max();
2434 new_ack_info.max_block_length = std::max(
2435 new_ack_info.max_block_length, PacketNumberIntervalLength(interval));
2436 }
2437 return new_ack_info;
2438}
2439
2440bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
2441 QuicPacketHeader* header) {
QUICHE team10b22a12019-03-21 15:31:42 -07002442 QuicPacketNumber base_packet_number;
2443 if (supports_multiple_packet_number_spaces_) {
2444 base_packet_number =
2445 largest_decrypted_packet_numbers_[GetPacketNumberSpace(*header)];
2446 } else {
2447 base_packet_number = largest_packet_number_;
2448 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002449 uint64_t full_packet_number;
2450 if (!ProcessAndCalculatePacketNumber(
2451 encrypted_reader, header->packet_number_length, base_packet_number,
2452 &full_packet_number)) {
2453 set_detailed_error("Unable to read packet number.");
2454 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2455 }
2456
2457 if (!IsValidFullPacketNumber(full_packet_number, transport_version())) {
2458 set_detailed_error("packet numbers cannot be 0.");
2459 return RaiseError(QUIC_INVALID_PACKET_HEADER);
2460 }
2461 header->packet_number = QuicPacketNumber(full_packet_number);
2462
2463 if (!visitor_->OnUnauthenticatedHeader(*header)) {
2464 set_detailed_error(
2465 "Visitor asked to stop processing of unauthenticated header.");
2466 return false;
2467 }
2468 return true;
2469}
2470
2471bool QuicFramer::ProcessIetfHeaderTypeByte(QuicDataReader* reader,
2472 QuicPacketHeader* header) {
2473 uint8_t type;
2474 if (!reader->ReadBytes(&type, 1)) {
2475 set_detailed_error("Unable to read type.");
2476 return false;
2477 }
2478 // Determine whether this is a long or short header.
2479 header->form = type & FLAGS_LONG_HEADER ? IETF_QUIC_LONG_HEADER_PACKET
2480 : IETF_QUIC_SHORT_HEADER_PACKET;
2481 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2482 // Version is always present in long headers.
2483 header->version_flag = true;
2484 // Long header packets received by client must include 8-byte source
2485 // connection ID, and those received by server must include 8-byte
2486 // destination connection ID.
2487 header->destination_connection_id_included =
2488 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2489 : CONNECTION_ID_PRESENT;
2490 header->source_connection_id_included =
2491 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_PRESENT
2492 : CONNECTION_ID_ABSENT;
2493 // Read version tag.
2494 QuicVersionLabel version_label;
2495 if (!reader->ReadTag(&version_label)) {
2496 set_detailed_error("Unable to read protocol version.");
2497 return false;
2498 }
2499 // TODO(rch): Use ReadUInt32() once QUIC_VERSION_35 is removed.
2500 version_label = QuicEndian::NetToHost32(version_label);
2501 if (!version_label) {
2502 // Version label is 0 indicating this is a version negotiation packet.
2503 header->long_packet_type = VERSION_NEGOTIATION;
2504 } else {
2505 header->version = ParseQuicVersionLabel(version_label);
2506 if (header->version.transport_version != QUIC_VERSION_UNSUPPORTED) {
2507 if (header->version.transport_version > QUIC_VERSION_44 &&
2508 !(type & FLAGS_FIXED_BIT)) {
2509 set_detailed_error("Fixed bit is 0 in long header.");
2510 return false;
2511 }
2512 if (!GetLongHeaderType(header->version.transport_version, type,
2513 &header->long_packet_type)) {
2514 set_detailed_error("Illegal long header type value.");
2515 return false;
2516 }
2517 header->packet_number_length = GetLongHeaderPacketNumberLength(
2518 header->version.transport_version, type);
2519 }
2520 }
2521 if (header->long_packet_type != VERSION_NEGOTIATION) {
2522 // Do not save version of version negotiation packet.
2523 last_version_label_ = version_label;
2524 }
2525
2526 QUIC_DVLOG(1) << ENDPOINT << "Received IETF long header: "
2527 << QuicUtils::QuicLongHeaderTypetoString(
2528 header->long_packet_type);
2529 return true;
2530 }
2531
2532 QUIC_DVLOG(1) << ENDPOINT << "Received IETF short header";
2533 // Version is not present in short headers.
2534 header->version_flag = false;
2535 // Connection ID length depends on the perspective. Client does not expect
2536 // destination connection ID, and server expects destination connection ID.
2537 header->destination_connection_id_included =
2538 perspective_ == Perspective::IS_CLIENT ? CONNECTION_ID_ABSENT
2539 : CONNECTION_ID_PRESENT;
2540 header->source_connection_id_included = CONNECTION_ID_ABSENT;
2541 if (infer_packet_header_type_from_version_ &&
2542 transport_version() > QUIC_VERSION_44 && !(type & FLAGS_FIXED_BIT)) {
2543 set_detailed_error("Fixed bit is 0 in short header.");
2544 return false;
2545 }
2546 if (!GetShortHeaderPacketNumberLength(transport_version(), type,
2547 infer_packet_header_type_from_version_,
2548 &header->packet_number_length)) {
2549 set_detailed_error("Illegal short header type value.");
2550 return false;
2551 }
2552 QUIC_DVLOG(1) << "packet_number_length = " << header->packet_number_length;
2553 return true;
2554}
2555
2556bool QuicFramer::ProcessIetfPacketHeader(QuicDataReader* reader,
2557 QuicPacketHeader* header) {
2558 if (!ProcessIetfHeaderTypeByte(reader, header)) {
2559 return false;
2560 }
2561
2562 uint8_t destination_connection_id_length =
2563 header->destination_connection_id_included == CONNECTION_ID_PRESENT
2564 ? expected_connection_id_length_
2565 : 0;
2566 uint8_t source_connection_id_length =
2567 header->source_connection_id_included == CONNECTION_ID_PRESENT
2568 ? expected_connection_id_length_
2569 : 0;
2570 if (header->form == IETF_QUIC_LONG_HEADER_PACKET) {
2571 // Read and validate connection ID length.
2572 uint8_t connection_id_lengths_byte;
2573 if (!reader->ReadBytes(&connection_id_lengths_byte, 1)) {
2574 set_detailed_error("Unable to read ConnectionId length.");
2575 return false;
2576 }
2577 uint8_t dcil =
2578 (connection_id_lengths_byte & kDestinationConnectionIdLengthMask) >> 4;
2579 if (dcil != 0) {
2580 dcil += kConnectionIdLengthAdjustment;
2581 }
QUICHE team4d9d6292019-03-11 14:25:33 -07002582 if (should_update_expected_connection_id_length_ &&
2583 expected_connection_id_length_ != dcil) {
2584 QUIC_DVLOG(1) << ENDPOINT << "Updating expected_connection_id_length: "
2585 << static_cast<int>(expected_connection_id_length_)
2586 << " -> " << static_cast<int>(dcil);
2587 expected_connection_id_length_ = dcil;
2588 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002589 uint8_t scil = connection_id_lengths_byte & kSourceConnectionIdLengthMask;
2590 if (scil != 0) {
2591 scil += kConnectionIdLengthAdjustment;
2592 }
QUICHE team4d9d6292019-03-11 14:25:33 -07002593 if ((dcil != destination_connection_id_length ||
2594 scil != source_connection_id_length) &&
QUICHE team8e2e4532019-03-14 14:37:56 -07002595 !should_update_expected_connection_id_length_ &&
2596 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
2597 header->version.transport_version)) {
2598 // TODO(dschinazi): use the framer's version once the
2599 // OnProtocolVersionMismatch call is moved to before this is run.
QUICHE teama6ef0a62019-03-07 20:34:33 -05002600 QUIC_DVLOG(1) << "dcil: " << static_cast<uint32_t>(dcil)
2601 << ", scil: " << static_cast<uint32_t>(scil);
2602 set_detailed_error("Invalid ConnectionId length.");
2603 return false;
2604 }
2605 destination_connection_id_length = dcil;
2606 source_connection_id_length = scil;
2607 }
2608
QUICHE team0131a5b2019-03-20 15:23:27 -07002609 DCHECK_LE(destination_connection_id_length, kQuicMaxConnectionIdLength);
2610 DCHECK_LE(source_connection_id_length, kQuicMaxConnectionIdLength);
2611
QUICHE teama6ef0a62019-03-07 20:34:33 -05002612 // Read connection ID.
2613 if (!reader->ReadConnectionId(&header->destination_connection_id,
2614 destination_connection_id_length)) {
2615 set_detailed_error("Unable to read Destination ConnectionId.");
2616 return false;
2617 }
2618
2619 if (!reader->ReadConnectionId(&header->source_connection_id,
2620 source_connection_id_length)) {
2621 set_detailed_error("Unable to read Source ConnectionId.");
2622 return false;
2623 }
2624
2625 if (header->source_connection_id_included == CONNECTION_ID_PRESENT) {
2626 // Set destination connection ID to source connection ID.
2627 DCHECK_EQ(EmptyQuicConnectionId(), header->destination_connection_id);
2628 header->destination_connection_id = header->source_connection_id;
2629 } else if (header->destination_connection_id_included ==
2630 CONNECTION_ID_ABSENT) {
2631 header->destination_connection_id = last_serialized_connection_id_;
2632 }
2633
2634 return true;
2635}
2636
2637bool QuicFramer::ProcessAndCalculatePacketNumber(
2638 QuicDataReader* reader,
2639 QuicPacketNumberLength packet_number_length,
2640 QuicPacketNumber base_packet_number,
2641 uint64_t* packet_number) {
2642 uint64_t wire_packet_number;
2643 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) {
2644 return false;
2645 }
2646
2647 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
2648 // in case the first guess is incorrect.
2649 *packet_number = CalculatePacketNumberFromWire(
2650 packet_number_length, base_packet_number, wire_packet_number);
2651 return true;
2652}
2653
2654bool QuicFramer::ProcessFrameData(QuicDataReader* reader,
2655 const QuicPacketHeader& header) {
2656 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
2657 << "Version 99 negotiated, but not processing frames as version 99.";
2658 if (reader->IsDoneReading()) {
2659 set_detailed_error("Packet has no frames.");
2660 return RaiseError(QUIC_MISSING_PAYLOAD);
2661 }
2662 while (!reader->IsDoneReading()) {
2663 uint8_t frame_type;
2664 if (!reader->ReadBytes(&frame_type, 1)) {
2665 set_detailed_error("Unable to read frame type.");
2666 return RaiseError(QUIC_INVALID_FRAME_DATA);
2667 }
2668 const uint8_t special_mask = transport_version() <= QUIC_VERSION_44
2669 ? kQuicFrameTypeBrokenMask
2670 : kQuicFrameTypeSpecialMask;
2671 if (frame_type & special_mask) {
2672 // Stream Frame
2673 if (frame_type & kQuicFrameTypeStreamMask) {
2674 QuicStreamFrame frame;
2675 if (!ProcessStreamFrame(reader, frame_type, &frame)) {
2676 return RaiseError(QUIC_INVALID_STREAM_DATA);
2677 }
2678 if (!visitor_->OnStreamFrame(frame)) {
2679 QUIC_DVLOG(1) << ENDPOINT
2680 << "Visitor asked to stop further processing.";
2681 // Returning true since there was no parsing error.
2682 return true;
2683 }
2684 continue;
2685 }
2686
2687 // Ack Frame
2688 if (frame_type & kQuicFrameTypeAckMask) {
2689 if (!ProcessAckFrame(reader, frame_type)) {
2690 return RaiseError(QUIC_INVALID_ACK_DATA);
2691 }
2692 continue;
2693 }
2694
2695 // This was a special frame type that did not match any
2696 // of the known ones. Error.
2697 set_detailed_error("Illegal frame type.");
2698 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2699 << static_cast<int>(frame_type);
2700 return RaiseError(QUIC_INVALID_FRAME_DATA);
2701 }
2702
2703 switch (frame_type) {
2704 case PADDING_FRAME: {
2705 QuicPaddingFrame frame;
2706 ProcessPaddingFrame(reader, &frame);
2707 if (!visitor_->OnPaddingFrame(frame)) {
2708 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2709 // Returning true since there was no parsing error.
2710 return true;
2711 }
2712 continue;
2713 }
2714
2715 case RST_STREAM_FRAME: {
2716 QuicRstStreamFrame frame;
2717 if (!ProcessRstStreamFrame(reader, &frame)) {
2718 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2719 }
2720 if (!visitor_->OnRstStreamFrame(frame)) {
2721 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2722 // Returning true since there was no parsing error.
2723 return true;
2724 }
2725 continue;
2726 }
2727
2728 case CONNECTION_CLOSE_FRAME: {
2729 QuicConnectionCloseFrame frame;
2730 if (!ProcessConnectionCloseFrame(reader, &frame)) {
2731 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2732 }
2733
2734 if (!visitor_->OnConnectionCloseFrame(frame)) {
2735 QUIC_DVLOG(1) << ENDPOINT
2736 << "Visitor asked to stop further processing.";
2737 // Returning true since there was no parsing error.
2738 return true;
2739 }
2740 continue;
2741 }
2742
2743 case GOAWAY_FRAME: {
2744 QuicGoAwayFrame goaway_frame;
2745 if (!ProcessGoAwayFrame(reader, &goaway_frame)) {
2746 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
2747 }
2748 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
2749 QUIC_DVLOG(1) << ENDPOINT
2750 << "Visitor asked to stop further processing.";
2751 // Returning true since there was no parsing error.
2752 return true;
2753 }
2754 continue;
2755 }
2756
2757 case WINDOW_UPDATE_FRAME: {
2758 QuicWindowUpdateFrame window_update_frame;
2759 if (!ProcessWindowUpdateFrame(reader, &window_update_frame)) {
2760 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
2761 }
2762 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
2763 QUIC_DVLOG(1) << ENDPOINT
2764 << "Visitor asked to stop further processing.";
2765 // Returning true since there was no parsing error.
2766 return true;
2767 }
2768 continue;
2769 }
2770
2771 case BLOCKED_FRAME: {
2772 QuicBlockedFrame blocked_frame;
2773 if (!ProcessBlockedFrame(reader, &blocked_frame)) {
2774 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2775 }
2776 if (!visitor_->OnBlockedFrame(blocked_frame)) {
2777 QUIC_DVLOG(1) << ENDPOINT
2778 << "Visitor asked to stop further processing.";
2779 // Returning true since there was no parsing error.
2780 return true;
2781 }
2782 continue;
2783 }
2784
2785 case STOP_WAITING_FRAME: {
2786 QuicStopWaitingFrame stop_waiting_frame;
2787 if (!ProcessStopWaitingFrame(reader, header, &stop_waiting_frame)) {
2788 return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
2789 }
2790 if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
2791 QUIC_DVLOG(1) << ENDPOINT
2792 << "Visitor asked to stop further processing.";
2793 // Returning true since there was no parsing error.
2794 return true;
2795 }
2796 continue;
2797 }
2798 case PING_FRAME: {
2799 // Ping has no payload.
2800 QuicPingFrame ping_frame;
2801 if (!visitor_->OnPingFrame(ping_frame)) {
2802 QUIC_DVLOG(1) << ENDPOINT
2803 << "Visitor asked to stop further processing.";
2804 // Returning true since there was no parsing error.
2805 return true;
2806 }
2807 continue;
2808 }
2809 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
2810 QUIC_FALLTHROUGH_INTENDED;
2811 case IETF_EXTENSION_MESSAGE: {
2812 QuicMessageFrame message_frame;
2813 if (!ProcessMessageFrame(reader,
2814 frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
2815 &message_frame)) {
2816 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
2817 }
2818 if (!visitor_->OnMessageFrame(message_frame)) {
2819 QUIC_DVLOG(1) << ENDPOINT
2820 << "Visitor asked to stop further processing.";
2821 // Returning true since there was no parsing error.
2822 return true;
2823 }
2824 break;
2825 }
2826 case CRYPTO_FRAME: {
QUICHE teamea740082019-03-11 17:58:43 -07002827 if (!QuicVersionUsesCryptoFrames(version_.transport_version)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002828 set_detailed_error("Illegal frame type.");
2829 return RaiseError(QUIC_INVALID_FRAME_DATA);
2830 }
2831 QuicCryptoFrame frame;
2832 if (!ProcessCryptoFrame(reader, &frame)) {
2833 return RaiseError(QUIC_INVALID_FRAME_DATA);
2834 }
2835 if (!visitor_->OnCryptoFrame(frame)) {
2836 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2837 // Returning true since there was no parsing error.
2838 return true;
2839 }
2840 break;
2841 }
2842
2843 default:
2844 set_detailed_error("Illegal frame type.");
2845 QUIC_DLOG(WARNING) << ENDPOINT << "Illegal frame type: "
2846 << static_cast<int>(frame_type);
2847 return RaiseError(QUIC_INVALID_FRAME_DATA);
2848 }
2849 }
2850
2851 return true;
2852}
2853
2854bool QuicFramer::ProcessIetfFrameData(QuicDataReader* reader,
2855 const QuicPacketHeader& header) {
2856 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version)
2857 << "Attempt to process frames as IETF frames but version is "
2858 << version_.transport_version << ", not 99.";
2859 if (reader->IsDoneReading()) {
2860 set_detailed_error("Packet has no frames.");
2861 return RaiseError(QUIC_MISSING_PAYLOAD);
2862 }
2863 while (!reader->IsDoneReading()) {
2864 uint64_t frame_type;
2865 // Will be the number of bytes into which frame_type was encoded.
2866 size_t encoded_bytes = reader->BytesRemaining();
2867 if (!reader->ReadVarInt62(&frame_type)) {
2868 set_detailed_error("Unable to read frame type.");
2869 return RaiseError(QUIC_INVALID_FRAME_DATA);
2870 }
2871
2872 // Is now the number of bytes into which the frame type was encoded.
2873 encoded_bytes -= reader->BytesRemaining();
2874
2875 // Check that the frame type is minimally encoded.
2876 if (encoded_bytes !=
2877 static_cast<size_t>(QuicDataWriter::GetVarInt62Len(frame_type))) {
2878 // The frame type was not minimally encoded.
2879 set_detailed_error("Frame type not minimally encoded.");
2880 return RaiseError(IETF_QUIC_PROTOCOL_VIOLATION);
2881 }
2882
2883 if (IS_IETF_STREAM_FRAME(frame_type)) {
2884 QuicStreamFrame frame;
2885 if (!ProcessIetfStreamFrame(reader, frame_type, &frame)) {
2886 return RaiseError(QUIC_INVALID_STREAM_DATA);
2887 }
2888 if (!visitor_->OnStreamFrame(frame)) {
2889 QUIC_DVLOG(1) << ENDPOINT
2890 << "Visitor asked to stop further processing.";
2891 // Returning true since there was no parsing error.
2892 return true;
2893 }
2894 } else {
2895 switch (frame_type) {
2896 case IETF_PADDING: {
2897 QuicPaddingFrame frame;
2898 ProcessPaddingFrame(reader, &frame);
2899 if (!visitor_->OnPaddingFrame(frame)) {
2900 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2901 // Returning true since there was no parsing error.
2902 return true;
2903 }
2904 break;
2905 }
2906 case IETF_RST_STREAM: {
2907 QuicRstStreamFrame frame;
2908 if (!ProcessIetfResetStreamFrame(reader, &frame)) {
2909 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
2910 }
2911 if (!visitor_->OnRstStreamFrame(frame)) {
2912 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2913 // Returning true since there was no parsing error.
2914 return true;
2915 }
2916 break;
2917 }
fkastenholz04bd4f32019-04-16 12:24:38 -07002918 case IETF_APPLICATION_CLOSE:
QUICHE teama6ef0a62019-03-07 20:34:33 -05002919 case IETF_CONNECTION_CLOSE: {
2920 QuicConnectionCloseFrame frame;
fkastenholze9d71a82019-04-09 05:12:13 -07002921 if (!ProcessIetfConnectionCloseFrame(
fkastenholz04bd4f32019-04-16 12:24:38 -07002922 reader,
2923 (frame_type == IETF_CONNECTION_CLOSE)
2924 ? IETF_QUIC_TRANSPORT_CONNECTION_CLOSE
2925 : IETF_QUIC_APPLICATION_CONNECTION_CLOSE,
2926 &frame)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002927 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
2928 }
2929 if (!visitor_->OnConnectionCloseFrame(frame)) {
2930 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2931 // Returning true since there was no parsing error.
2932 return true;
2933 }
2934 break;
2935 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002936 case IETF_MAX_DATA: {
2937 QuicWindowUpdateFrame frame;
2938 if (!ProcessMaxDataFrame(reader, &frame)) {
2939 return RaiseError(QUIC_INVALID_MAX_DATA_FRAME_DATA);
2940 }
2941 // TODO(fkastenholz): Or should we create a new visitor function,
2942 // OnMaxDataFrame()?
2943 if (!visitor_->OnWindowUpdateFrame(frame)) {
2944 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2945 // Returning true since there was no parsing error.
2946 return true;
2947 }
2948 break;
2949 }
2950 case IETF_MAX_STREAM_DATA: {
2951 QuicWindowUpdateFrame frame;
2952 if (!ProcessMaxStreamDataFrame(reader, &frame)) {
2953 return RaiseError(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
2954 }
2955 // TODO(fkastenholz): Or should we create a new visitor function,
2956 // OnMaxStreamDataFrame()?
2957 if (!visitor_->OnWindowUpdateFrame(frame)) {
2958 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2959 // Returning true since there was no parsing error.
2960 return true;
2961 }
2962 break;
2963 }
2964 case IETF_MAX_STREAMS_BIDIRECTIONAL:
2965 case IETF_MAX_STREAMS_UNIDIRECTIONAL: {
2966 QuicMaxStreamIdFrame frame;
2967 if (!ProcessMaxStreamsFrame(reader, &frame, frame_type)) {
2968 return RaiseError(QUIC_MAX_STREAM_ID_DATA);
2969 }
2970 QUIC_CODE_COUNT_N(max_stream_id_received, 1, 2);
2971 if (!visitor_->OnMaxStreamIdFrame(frame)) {
2972 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2973 // Returning true since there was no parsing error.
2974 return true;
2975 }
2976 break;
2977 }
2978 case IETF_PING: {
2979 // Ping has no payload.
2980 QuicPingFrame ping_frame;
2981 if (!visitor_->OnPingFrame(ping_frame)) {
2982 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2983 // Returning true since there was no parsing error.
2984 return true;
2985 }
2986 break;
2987 }
2988 case IETF_BLOCKED: {
2989 QuicBlockedFrame frame;
2990 if (!ProcessIetfBlockedFrame(reader, &frame)) {
2991 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
2992 }
2993 if (!visitor_->OnBlockedFrame(frame)) {
2994 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
2995 // Returning true since there was no parsing error.
2996 return true;
2997 }
2998 break;
2999 }
3000 case IETF_STREAM_BLOCKED: {
3001 QuicBlockedFrame frame;
3002 if (!ProcessStreamBlockedFrame(reader, &frame)) {
3003 return RaiseError(QUIC_INVALID_STREAM_BLOCKED_DATA);
3004 }
3005 if (!visitor_->OnBlockedFrame(frame)) {
3006 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3007 // Returning true since there was no parsing error.
3008 return true;
3009 }
3010 break;
3011 }
3012 case IETF_STREAMS_BLOCKED_UNIDIRECTIONAL:
3013 case IETF_STREAMS_BLOCKED_BIDIRECTIONAL: {
3014 QuicStreamIdBlockedFrame frame;
3015 if (!ProcessStreamsBlockedFrame(reader, &frame, frame_type)) {
3016 return RaiseError(QUIC_STREAM_ID_BLOCKED_DATA);
3017 }
3018 QUIC_CODE_COUNT_N(stream_id_blocked_received, 1, 2);
3019 if (!visitor_->OnStreamIdBlockedFrame(frame)) {
3020 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3021 // Returning true since there was no parsing error.
3022 return true;
3023 }
3024 break;
3025 }
3026 case IETF_NEW_CONNECTION_ID: {
3027 QuicNewConnectionIdFrame frame;
3028 if (!ProcessNewConnectionIdFrame(reader, &frame)) {
3029 return RaiseError(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
3030 }
3031 if (!visitor_->OnNewConnectionIdFrame(frame)) {
3032 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3033 // Returning true since there was no parsing error.
3034 return true;
3035 }
3036 break;
3037 }
3038 case IETF_RETIRE_CONNECTION_ID: {
3039 QuicRetireConnectionIdFrame frame;
3040 if (!ProcessRetireConnectionIdFrame(reader, &frame)) {
3041 return RaiseError(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
3042 }
3043 if (!visitor_->OnRetireConnectionIdFrame(frame)) {
3044 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3045 // Returning true since there was no parsing error.
3046 return true;
3047 }
3048 break;
3049 }
3050 case IETF_NEW_TOKEN: {
3051 QuicNewTokenFrame frame;
3052 if (!ProcessNewTokenFrame(reader, &frame)) {
3053 return RaiseError(QUIC_INVALID_NEW_TOKEN);
3054 }
3055 if (!visitor_->OnNewTokenFrame(frame)) {
3056 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3057 // Returning true since there was no parsing error.
3058 return true;
3059 }
3060 break;
3061 }
3062 case IETF_STOP_SENDING: {
3063 QuicStopSendingFrame frame;
3064 if (!ProcessStopSendingFrame(reader, &frame)) {
3065 return RaiseError(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
3066 }
3067 if (!visitor_->OnStopSendingFrame(frame)) {
3068 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3069 // Returning true since there was no parsing error.
3070 return true;
3071 }
3072 break;
3073 }
3074 case IETF_ACK_ECN:
3075 case IETF_ACK: {
3076 QuicAckFrame frame;
3077 if (!ProcessIetfAckFrame(reader, frame_type, &frame)) {
3078 return RaiseError(QUIC_INVALID_ACK_DATA);
3079 }
3080 break;
3081 }
3082 case IETF_PATH_CHALLENGE: {
3083 QuicPathChallengeFrame frame;
3084 if (!ProcessPathChallengeFrame(reader, &frame)) {
3085 return RaiseError(QUIC_INVALID_PATH_CHALLENGE_DATA);
3086 }
3087 if (!visitor_->OnPathChallengeFrame(frame)) {
3088 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3089 // Returning true since there was no parsing error.
3090 return true;
3091 }
3092 break;
3093 }
3094 case IETF_PATH_RESPONSE: {
3095 QuicPathResponseFrame frame;
3096 if (!ProcessPathResponseFrame(reader, &frame)) {
3097 return RaiseError(QUIC_INVALID_PATH_RESPONSE_DATA);
3098 }
3099 if (!visitor_->OnPathResponseFrame(frame)) {
3100 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3101 // Returning true since there was no parsing error.
3102 return true;
3103 }
3104 break;
3105 }
3106 case IETF_EXTENSION_MESSAGE_NO_LENGTH:
3107 QUIC_FALLTHROUGH_INTENDED;
3108 case IETF_EXTENSION_MESSAGE: {
3109 QuicMessageFrame message_frame;
3110 if (!ProcessMessageFrame(
3111 reader, frame_type == IETF_EXTENSION_MESSAGE_NO_LENGTH,
3112 &message_frame)) {
3113 return RaiseError(QUIC_INVALID_MESSAGE_DATA);
3114 }
3115 if (!visitor_->OnMessageFrame(message_frame)) {
3116 QUIC_DVLOG(1) << ENDPOINT
3117 << "Visitor asked to stop further processing.";
3118 // Returning true since there was no parsing error.
3119 return true;
3120 }
3121 break;
3122 }
3123 case IETF_CRYPTO: {
3124 QuicCryptoFrame frame;
3125 if (!ProcessCryptoFrame(reader, &frame)) {
3126 return RaiseError(QUIC_INVALID_FRAME_DATA);
3127 }
3128 if (!visitor_->OnCryptoFrame(frame)) {
3129 QUIC_DVLOG(1) << "Visitor asked to stop further processing.";
3130 // Returning true since there was no parsing error.
3131 return true;
3132 }
3133 break;
3134 }
3135
3136 default:
3137 set_detailed_error("Illegal frame type.");
3138 QUIC_DLOG(WARNING)
3139 << ENDPOINT
3140 << "Illegal frame type: " << static_cast<int>(frame_type);
3141 return RaiseError(QUIC_INVALID_FRAME_DATA);
3142 }
3143 }
3144 }
3145 return true;
3146}
3147
3148namespace {
3149// Create a mask that sets the last |num_bits| to 1 and the rest to 0.
3150inline uint8_t GetMaskFromNumBits(uint8_t num_bits) {
3151 return (1u << num_bits) - 1;
3152}
3153
3154// Extract |num_bits| from |flags| offset by |offset|.
3155uint8_t ExtractBits(uint8_t flags, uint8_t num_bits, uint8_t offset) {
3156 return (flags >> offset) & GetMaskFromNumBits(num_bits);
3157}
3158
3159// Extract the bit at position |offset| from |flags| as a bool.
3160bool ExtractBit(uint8_t flags, uint8_t offset) {
3161 return ((flags >> offset) & GetMaskFromNumBits(1)) != 0;
3162}
3163
3164// Set |num_bits|, offset by |offset| to |val| in |flags|.
3165void SetBits(uint8_t* flags, uint8_t val, uint8_t num_bits, uint8_t offset) {
3166 DCHECK_LE(val, GetMaskFromNumBits(num_bits));
3167 *flags |= val << offset;
3168}
3169
3170// Set the bit at position |offset| to |val| in |flags|.
3171void SetBit(uint8_t* flags, bool val, uint8_t offset) {
3172 SetBits(flags, val ? 1 : 0, 1, offset);
3173}
3174} // namespace
3175
3176bool QuicFramer::ProcessStreamFrame(QuicDataReader* reader,
3177 uint8_t frame_type,
3178 QuicStreamFrame* frame) {
3179 uint8_t stream_flags = frame_type;
3180
3181 uint8_t stream_id_length = 0;
3182 uint8_t offset_length = 4;
3183 bool has_data_length = true;
3184 stream_flags &= ~kQuicFrameTypeStreamMask;
3185
3186 // Read from right to left: StreamID, Offset, Data Length, Fin.
3187 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
3188 stream_flags >>= kQuicStreamIdShift;
3189
3190 offset_length = (stream_flags & kQuicStreamOffsetMask);
3191 // There is no encoding for 1 byte, only 0 and 2 through 8.
3192 if (offset_length > 0) {
3193 offset_length += 1;
3194 }
3195 stream_flags >>= kQuicStreamShift;
3196
3197 has_data_length =
3198 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
3199 stream_flags >>= kQuicStreamDataLengthShift;
3200
3201 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
3202
3203 uint64_t stream_id;
3204 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) {
3205 set_detailed_error("Unable to read stream_id.");
3206 return false;
3207 }
3208 frame->stream_id = static_cast<QuicStreamId>(stream_id);
3209
3210 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) {
3211 set_detailed_error("Unable to read offset.");
3212 return false;
3213 }
3214
3215 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3216 QuicStringPiece data;
3217 if (has_data_length) {
3218 if (!reader->ReadStringPiece16(&data)) {
3219 set_detailed_error("Unable to read frame data.");
3220 return false;
3221 }
3222 } else {
3223 if (!reader->ReadStringPiece(&data, reader->BytesRemaining())) {
3224 set_detailed_error("Unable to read frame data.");
3225 return false;
3226 }
3227 }
3228 frame->data_buffer = data.data();
3229 frame->data_length = static_cast<uint16_t>(data.length());
3230
3231 return true;
3232}
3233
3234bool QuicFramer::ProcessIetfStreamFrame(QuicDataReader* reader,
3235 uint8_t frame_type,
3236 QuicStreamFrame* frame) {
3237 // Read stream id from the frame. It's always present.
3238 if (!reader->ReadVarIntStreamId(&frame->stream_id)) {
3239 set_detailed_error("Unable to read stream_id.");
3240 return false;
3241 }
3242
3243 // If we have a data offset, read it. If not, set to 0.
3244 if (frame_type & IETF_STREAM_FRAME_OFF_BIT) {
3245 if (!reader->ReadVarInt62(&frame->offset)) {
3246 set_detailed_error("Unable to read stream data offset.");
3247 return false;
3248 }
3249 } else {
3250 // no offset in the frame, ensure it's 0 in the Frame.
3251 frame->offset = 0;
3252 }
3253
3254 // If we have a data length, read it. If not, set to 0.
3255 if (frame_type & IETF_STREAM_FRAME_LEN_BIT) {
3256 QuicIetfStreamDataLength length;
3257 if (!reader->ReadVarInt62(&length)) {
3258 set_detailed_error("Unable to read stream data length.");
3259 return false;
3260 }
3261 if (length > 0xffff) {
3262 set_detailed_error("Stream data length is too large.");
3263 return false;
3264 }
3265 frame->data_length = length;
3266 } else {
3267 // no length in the frame, it is the number of bytes remaining in the
3268 // packet.
3269 frame->data_length = reader->BytesRemaining();
3270 }
3271
3272 if (frame_type & IETF_STREAM_FRAME_FIN_BIT) {
3273 frame->fin = true;
3274 } else {
3275 frame->fin = false;
3276 }
3277
3278 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3279 QuicStringPiece data;
3280 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3281 set_detailed_error("Unable to read frame data.");
3282 return false;
3283 }
3284 frame->data_buffer = data.data();
3285 frame->data_length = static_cast<QuicIetfStreamDataLength>(data.length());
3286
3287 return true;
3288}
3289
3290bool QuicFramer::ProcessCryptoFrame(QuicDataReader* reader,
3291 QuicCryptoFrame* frame) {
3292 if (!reader->ReadVarInt62(&frame->offset)) {
3293 set_detailed_error("Unable to read crypto data offset.");
3294 return false;
3295 }
3296 uint64_t len;
3297 if (!reader->ReadVarInt62(&len) ||
3298 len > std::numeric_limits<QuicPacketLength>::max()) {
3299 set_detailed_error("Invalid data length.");
3300 return false;
3301 }
3302 frame->data_length = len;
3303
3304 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
3305 QuicStringPiece data;
3306 if (!reader->ReadStringPiece(&data, frame->data_length)) {
3307 set_detailed_error("Unable to read frame data.");
3308 return false;
3309 }
3310 frame->data_buffer = data.data();
3311 return true;
3312}
3313
3314bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type) {
3315 const bool has_ack_blocks =
3316 ExtractBit(frame_type, kQuicHasMultipleAckBlocksOffset);
3317 uint8_t num_ack_blocks = 0;
3318 uint8_t num_received_packets = 0;
3319
3320 // Determine the two lengths from the frame type: largest acked length,
3321 // ack block length.
3322 const QuicPacketNumberLength ack_block_length = ReadAckPacketNumberLength(
3323 version_.transport_version,
3324 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3325 kActBlockLengthOffset));
3326 const QuicPacketNumberLength largest_acked_length = ReadAckPacketNumberLength(
3327 version_.transport_version,
3328 ExtractBits(frame_type, kQuicSequenceNumberLengthNumBits,
3329 kLargestAckedOffset));
3330
3331 uint64_t largest_acked;
3332 if (!reader->ReadBytesToUInt64(largest_acked_length, &largest_acked)) {
3333 set_detailed_error("Unable to read largest acked.");
3334 return false;
3335 }
3336
3337 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3338 // Connection always sends packet starting from kFirstSendingPacketNumber >
3339 // 0, peer has observed an unsent packet.
3340 set_detailed_error("Largest acked is 0.");
3341 return false;
3342 }
3343
3344 uint64_t ack_delay_time_us;
3345 if (!reader->ReadUFloat16(&ack_delay_time_us)) {
3346 set_detailed_error("Unable to read ack delay time.");
3347 return false;
3348 }
3349
3350 if (!visitor_->OnAckFrameStart(
3351 QuicPacketNumber(largest_acked),
3352 ack_delay_time_us == kUFloat16MaxValue
3353 ? QuicTime::Delta::Infinite()
3354 : QuicTime::Delta::FromMicroseconds(ack_delay_time_us))) {
3355 // The visitor suppresses further processing of the packet. Although this is
3356 // not a parsing error, returns false as this is in middle of processing an
3357 // ack frame,
3358 set_detailed_error("Visitor suppresses further processing of ack frame.");
3359 return false;
3360 }
3361
3362 if (has_ack_blocks && !reader->ReadUInt8(&num_ack_blocks)) {
3363 set_detailed_error("Unable to read num of ack blocks.");
3364 return false;
3365 }
3366
3367 uint64_t first_block_length;
3368 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) {
3369 set_detailed_error("Unable to read first ack block length.");
3370 return false;
3371 }
3372
3373 if (first_block_length == 0) {
3374 set_detailed_error("First block length is zero.");
3375 return false;
3376 }
3377 bool first_ack_block_underflow = first_block_length > largest_acked + 1;
3378 if (first_block_length + first_sending_packet_number_.ToUint64() >
3379 largest_acked + 1) {
3380 first_ack_block_underflow = true;
3381 }
3382 if (first_ack_block_underflow) {
3383 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3384 first_block_length, " largest acked is ",
3385 largest_acked, ".")
3386 .c_str());
3387 return false;
3388 }
3389
3390 uint64_t first_received = largest_acked + 1 - first_block_length;
3391 if (!visitor_->OnAckRange(QuicPacketNumber(first_received),
3392 QuicPacketNumber(largest_acked + 1))) {
3393 // The visitor suppresses further processing of the packet. Although
3394 // this is not a parsing error, returns false as this is in middle
3395 // of processing an ack frame,
3396 set_detailed_error("Visitor suppresses further processing of ack frame.");
3397 return false;
3398 }
3399
3400 if (num_ack_blocks > 0) {
3401 for (size_t i = 0; i < num_ack_blocks; ++i) {
3402 uint8_t gap = 0;
3403 if (!reader->ReadUInt8(&gap)) {
3404 set_detailed_error("Unable to read gap to next ack block.");
3405 return false;
3406 }
3407 uint64_t current_block_length;
3408 if (!reader->ReadBytesToUInt64(ack_block_length, &current_block_length)) {
3409 set_detailed_error("Unable to ack block length.");
3410 return false;
3411 }
3412 bool ack_block_underflow = first_received < gap + current_block_length;
3413 if (first_received < gap + current_block_length +
3414 first_sending_packet_number_.ToUint64()) {
3415 ack_block_underflow = true;
3416 }
3417 if (ack_block_underflow) {
3418 set_detailed_error(
3419 QuicStrCat("Underflow with ack block length ", current_block_length,
3420 ", end of block is ", first_received - gap, ".")
3421 .c_str());
3422 return false;
3423 }
3424
3425 first_received -= (gap + current_block_length);
3426 if (current_block_length > 0) {
3427 if (!visitor_->OnAckRange(
3428 QuicPacketNumber(first_received),
3429 QuicPacketNumber(first_received) + current_block_length)) {
3430 // The visitor suppresses further processing of the packet. Although
3431 // this is not a parsing error, returns false as this is in middle
3432 // of processing an ack frame,
3433 set_detailed_error(
3434 "Visitor suppresses further processing of ack frame.");
3435 return false;
3436 }
3437 }
3438 }
3439 }
3440
3441 if (!reader->ReadUInt8(&num_received_packets)) {
3442 set_detailed_error("Unable to read num received packets.");
3443 return false;
3444 }
3445
3446 if (!ProcessTimestampsInAckFrame(num_received_packets,
3447 QuicPacketNumber(largest_acked), reader)) {
3448 return false;
3449 }
3450
3451 // Done processing the ACK frame.
3452 return visitor_->OnAckFrameEnd(QuicPacketNumber(first_received));
3453}
3454
3455bool QuicFramer::ProcessTimestampsInAckFrame(uint8_t num_received_packets,
3456 QuicPacketNumber largest_acked,
3457 QuicDataReader* reader) {
3458 if (num_received_packets == 0) {
3459 return true;
3460 }
3461 uint8_t delta_from_largest_observed;
3462 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3463 set_detailed_error("Unable to read sequence delta in received packets.");
3464 return false;
3465 }
3466
3467 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3468 set_detailed_error(QuicStrCat("delta_from_largest_observed too high: ",
3469 delta_from_largest_observed,
3470 ", largest_acked: ", largest_acked.ToUint64())
3471 .c_str());
3472 return false;
3473 }
3474
3475 // Time delta from the framer creation.
3476 uint32_t time_delta_us;
3477 if (!reader->ReadUInt32(&time_delta_us)) {
3478 set_detailed_error("Unable to read time delta in received packets.");
3479 return false;
3480 }
3481
3482 QuicPacketNumber seq_num = largest_acked - delta_from_largest_observed;
3483 if (process_timestamps_) {
3484 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
3485
3486 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3487 }
3488
3489 for (uint8_t i = 1; i < num_received_packets; ++i) {
3490 if (!reader->ReadUInt8(&delta_from_largest_observed)) {
3491 set_detailed_error("Unable to read sequence delta in received packets.");
3492 return false;
3493 }
3494 if (largest_acked.ToUint64() <= delta_from_largest_observed) {
3495 set_detailed_error(
3496 QuicStrCat("delta_from_largest_observed too high: ",
3497 delta_from_largest_observed,
3498 ", largest_acked: ", largest_acked.ToUint64())
3499 .c_str());
3500 return false;
3501 }
3502 seq_num = largest_acked - delta_from_largest_observed;
3503
3504 // Time delta from the previous timestamp.
3505 uint64_t incremental_time_delta_us;
3506 if (!reader->ReadUFloat16(&incremental_time_delta_us)) {
3507 set_detailed_error(
3508 "Unable to read incremental time delta in received packets.");
3509 return false;
3510 }
3511
3512 if (process_timestamps_) {
3513 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds(
3514 incremental_time_delta_us);
3515 visitor_->OnAckTimestamp(seq_num, creation_time_ + last_timestamp_);
3516 }
3517 }
3518 return true;
3519}
3520
3521bool QuicFramer::ProcessIetfAckFrame(QuicDataReader* reader,
3522 uint64_t frame_type,
3523 QuicAckFrame* ack_frame) {
3524 uint64_t largest_acked;
3525 if (!reader->ReadVarInt62(&largest_acked)) {
3526 set_detailed_error("Unable to read largest acked.");
3527 return false;
3528 }
3529 if (largest_acked < first_sending_packet_number_.ToUint64()) {
3530 // Connection always sends packet starting from kFirstSendingPacketNumber >
3531 // 0, peer has observed an unsent packet.
3532 set_detailed_error("Largest acked is 0.");
3533 return false;
3534 }
3535 ack_frame->largest_acked = static_cast<QuicPacketNumber>(largest_acked);
3536 uint64_t ack_delay_time_in_us;
3537 if (!reader->ReadVarInt62(&ack_delay_time_in_us)) {
3538 set_detailed_error("Unable to read ack delay time.");
3539 return false;
3540 }
3541
3542 // TODO(fkastenholz) when we get real IETF QUIC, need to get
3543 // the currect shift from the transport parameters.
3544 if (ack_delay_time_in_us == kVarInt62MaxValue) {
3545 ack_frame->ack_delay_time = QuicTime::Delta::Infinite();
3546 } else {
3547 ack_delay_time_in_us = (ack_delay_time_in_us << kIetfAckTimestampShift);
3548 ack_frame->ack_delay_time =
3549 QuicTime::Delta::FromMicroseconds(ack_delay_time_in_us);
3550 }
3551 if (frame_type == IETF_ACK_ECN) {
3552 ack_frame->ecn_counters_populated = true;
3553 if (!reader->ReadVarInt62(&ack_frame->ect_0_count)) {
3554 set_detailed_error("Unable to read ack ect_0_count.");
3555 return false;
3556 }
3557 if (!reader->ReadVarInt62(&ack_frame->ect_1_count)) {
3558 set_detailed_error("Unable to read ack ect_1_count.");
3559 return false;
3560 }
3561 if (!reader->ReadVarInt62(&ack_frame->ecn_ce_count)) {
3562 set_detailed_error("Unable to read ack ecn_ce_count.");
3563 return false;
3564 }
3565 } else {
3566 ack_frame->ecn_counters_populated = false;
3567 ack_frame->ect_0_count = 0;
3568 ack_frame->ect_1_count = 0;
3569 ack_frame->ecn_ce_count = 0;
3570 }
3571 if (!visitor_->OnAckFrameStart(QuicPacketNumber(largest_acked),
3572 ack_frame->ack_delay_time)) {
3573 // The visitor suppresses further processing of the packet. Although this is
3574 // not a parsing error, returns false as this is in middle of processing an
3575 // ACK frame.
3576 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3577 return false;
3578 }
3579
3580 // Get number of ACK blocks from the packet.
3581 uint64_t ack_block_count;
3582 if (!reader->ReadVarInt62(&ack_block_count)) {
3583 set_detailed_error("Unable to read ack block count.");
3584 return false;
3585 }
3586 // There always is a first ACK block, which is the (number of packets being
3587 // acked)-1, up to and including the packet at largest_acked. Therefore if the
3588 // value is 0, then only largest is acked. If it is 1, then largest-1,
3589 // largest] are acked, etc
3590 uint64_t ack_block_value;
3591 if (!reader->ReadVarInt62(&ack_block_value)) {
3592 set_detailed_error("Unable to read first ack block length.");
3593 return false;
3594 }
3595 // Calculate the packets being acked in the first block.
3596 // +1 because AddRange implementation requires [low,high)
3597 uint64_t block_high = largest_acked + 1;
3598 uint64_t block_low = largest_acked - ack_block_value;
3599
3600 // ack_block_value is the number of packets preceding the
3601 // largest_acked packet which are in the block being acked. Thus,
3602 // its maximum value is largest_acked-1. Test this, reporting an
3603 // error if the value is wrong.
3604 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3605 largest_acked) {
3606 set_detailed_error(QuicStrCat("Underflow with first ack block length ",
3607 ack_block_value + 1, " largest acked is ",
3608 largest_acked, ".")
3609 .c_str());
3610 return false;
3611 }
3612
3613 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3614 QuicPacketNumber(block_high))) {
3615 // The visitor suppresses further processing of the packet. Although
3616 // this is not a parsing error, returns false as this is in middle
3617 // of processing an ACK frame.
3618 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3619 return false;
3620 }
3621
3622 while (ack_block_count != 0) {
3623 uint64_t gap_block_value;
3624 // Get the sizes of the gap and ack blocks,
3625 if (!reader->ReadVarInt62(&gap_block_value)) {
3626 set_detailed_error("Unable to read gap block value.");
3627 return false;
3628 }
3629 // It's an error if the gap is larger than the space from packet
3630 // number 0 to the start of the block that's just been acked, PLUS
3631 // there must be space for at least 1 packet to be acked. For
3632 // example, if block_low is 10 and gap_block_value is 9, it means
3633 // the gap block is 10 packets long, leaving no room for a packet
3634 // to be acked. Thus, gap_block_value+2 can not be larger than
3635 // block_low.
3636 // The test is written this way to detect wrap-arounds.
3637 if ((gap_block_value + 2) > block_low) {
3638 set_detailed_error(
3639 QuicStrCat("Underflow with gap block length ", gap_block_value + 1,
3640 " previous ack block start is ", block_low, ".")
3641 .c_str());
3642 return false;
3643 }
3644
3645 // Adjust block_high to be the top of the next ack block.
3646 // There is a gap of |gap_block_value| packets between the bottom
3647 // of ack block N and top of block N+1. Note that gap_block_value
3648 // is he size of the gap minus 1 (per the QUIC protocol), and
3649 // block_high is the packet number of the first packet of the gap
3650 // (per the implementation of OnAckRange/AddAckRange, below).
3651 block_high = block_low - 1 - gap_block_value;
3652
3653 if (!reader->ReadVarInt62(&ack_block_value)) {
3654 set_detailed_error("Unable to read ack block value.");
3655 return false;
3656 }
3657 if (ack_block_value + first_sending_packet_number_.ToUint64() >
3658 (block_high - 1)) {
3659 set_detailed_error(
3660 QuicStrCat("Underflow with ack block length ", ack_block_value + 1,
3661 " latest ack block end is ", block_high - 1, ".")
3662 .c_str());
3663 return false;
3664 }
3665 // Calculate the low end of the new nth ack block. The +1 is
3666 // because the encoded value is the blocksize-1.
3667 block_low = block_high - 1 - ack_block_value;
3668 if (!visitor_->OnAckRange(QuicPacketNumber(block_low),
3669 QuicPacketNumber(block_high))) {
3670 // The visitor suppresses further processing of the packet. Although
3671 // this is not a parsing error, returns false as this is in middle
3672 // of processing an ACK frame.
3673 set_detailed_error("Visitor suppresses further processing of ACK frame.");
3674 return false;
3675 }
3676
3677 // Another one done.
3678 ack_block_count--;
3679 }
3680
3681 return visitor_->OnAckFrameEnd(QuicPacketNumber(block_low));
3682}
3683
3684bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader,
3685 const QuicPacketHeader& header,
3686 QuicStopWaitingFrame* stop_waiting) {
3687 uint64_t least_unacked_delta;
3688 if (!reader->ReadBytesToUInt64(header.packet_number_length,
3689 &least_unacked_delta)) {
3690 set_detailed_error("Unable to read least unacked delta.");
3691 return false;
3692 }
3693 if (header.packet_number.ToUint64() <= least_unacked_delta) {
3694 set_detailed_error("Invalid unacked delta.");
3695 return false;
3696 }
3697 stop_waiting->least_unacked = header.packet_number - least_unacked_delta;
3698
3699 return true;
3700}
3701
3702bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader,
3703 QuicRstStreamFrame* frame) {
3704 if (!reader->ReadUInt32(&frame->stream_id)) {
3705 set_detailed_error("Unable to read stream_id.");
3706 return false;
3707 }
3708
3709 if (!reader->ReadUInt64(&frame->byte_offset)) {
3710 set_detailed_error("Unable to read rst stream sent byte offset.");
3711 return false;
3712 }
3713
3714 uint32_t error_code;
3715 if (!reader->ReadUInt32(&error_code)) {
3716 set_detailed_error("Unable to read rst stream error code.");
3717 return false;
3718 }
3719
3720 if (error_code >= QUIC_STREAM_LAST_ERROR) {
3721 // Ignore invalid stream error code if any.
3722 error_code = QUIC_STREAM_LAST_ERROR;
3723 }
3724
3725 frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
3726
3727 return true;
3728}
3729
3730bool QuicFramer::ProcessConnectionCloseFrame(QuicDataReader* reader,
3731 QuicConnectionCloseFrame* frame) {
3732 uint32_t error_code;
fkastenholze9d71a82019-04-09 05:12:13 -07003733 frame->close_type = GOOGLE_QUIC_CONNECTION_CLOSE;
3734
QUICHE teama6ef0a62019-03-07 20:34:33 -05003735 if (!reader->ReadUInt32(&error_code)) {
3736 set_detailed_error("Unable to read connection close error code.");
3737 return false;
3738 }
3739
3740 if (error_code >= QUIC_LAST_ERROR) {
3741 // Ignore invalid QUIC error code if any.
3742 error_code = QUIC_LAST_ERROR;
3743 }
3744
fkastenholze9d71a82019-04-09 05:12:13 -07003745 frame->quic_error_code = static_cast<QuicErrorCode>(error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003746
3747 QuicStringPiece error_details;
3748 if (!reader->ReadStringPiece16(&error_details)) {
3749 set_detailed_error("Unable to read connection close error details.");
3750 return false;
3751 }
vasilvvc48c8712019-03-11 13:38:16 -07003752 frame->error_details = std::string(error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003753
3754 return true;
3755}
3756
3757bool QuicFramer::ProcessGoAwayFrame(QuicDataReader* reader,
3758 QuicGoAwayFrame* frame) {
3759 uint32_t error_code;
3760 if (!reader->ReadUInt32(&error_code)) {
3761 set_detailed_error("Unable to read go away error code.");
3762 return false;
3763 }
3764
3765 if (error_code >= QUIC_LAST_ERROR) {
3766 // Ignore invalid QUIC error code if any.
3767 error_code = QUIC_LAST_ERROR;
3768 }
3769 frame->error_code = static_cast<QuicErrorCode>(error_code);
3770
3771 uint32_t stream_id;
3772 if (!reader->ReadUInt32(&stream_id)) {
3773 set_detailed_error("Unable to read last good stream id.");
3774 return false;
3775 }
3776 frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
3777
3778 QuicStringPiece reason_phrase;
3779 if (!reader->ReadStringPiece16(&reason_phrase)) {
3780 set_detailed_error("Unable to read goaway reason.");
3781 return false;
3782 }
vasilvvc48c8712019-03-11 13:38:16 -07003783 frame->reason_phrase = std::string(reason_phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003784
3785 return true;
3786}
3787
3788bool QuicFramer::ProcessWindowUpdateFrame(QuicDataReader* reader,
3789 QuicWindowUpdateFrame* frame) {
3790 if (!reader->ReadUInt32(&frame->stream_id)) {
3791 set_detailed_error("Unable to read stream_id.");
3792 return false;
3793 }
3794
3795 if (!reader->ReadUInt64(&frame->byte_offset)) {
3796 set_detailed_error("Unable to read window byte_offset.");
3797 return false;
3798 }
3799
3800 return true;
3801}
3802
3803bool QuicFramer::ProcessBlockedFrame(QuicDataReader* reader,
3804 QuicBlockedFrame* frame) {
3805 DCHECK_NE(QUIC_VERSION_99, version_.transport_version)
3806 << "Attempt to process non-IETF frames but version is 99";
3807
3808 if (!reader->ReadUInt32(&frame->stream_id)) {
3809 set_detailed_error("Unable to read stream_id.");
3810 return false;
3811 }
3812
3813 return true;
3814}
3815
3816void QuicFramer::ProcessPaddingFrame(QuicDataReader* reader,
3817 QuicPaddingFrame* frame) {
3818 // Type byte has been read.
3819 frame->num_padding_bytes = 1;
3820 uint8_t next_byte;
3821 while (!reader->IsDoneReading() && reader->PeekByte() == 0x00) {
3822 reader->ReadBytes(&next_byte, 1);
3823 DCHECK_EQ(0x00, next_byte);
3824 ++frame->num_padding_bytes;
3825 }
3826}
3827
3828bool QuicFramer::ProcessMessageFrame(QuicDataReader* reader,
3829 bool no_message_length,
3830 QuicMessageFrame* frame) {
3831 if (no_message_length) {
3832 QuicStringPiece remaining(reader->ReadRemainingPayload());
3833 frame->data = remaining.data();
3834 frame->message_length = remaining.length();
3835 return true;
3836 }
3837
3838 uint64_t message_length;
3839 if (!reader->ReadVarInt62(&message_length)) {
3840 set_detailed_error("Unable to read message length");
3841 return false;
3842 }
3843
3844 QuicStringPiece message_piece;
3845 if (!reader->ReadStringPiece(&message_piece, message_length)) {
3846 set_detailed_error("Unable to read message data");
3847 return false;
3848 }
3849
3850 frame->data = message_piece.data();
3851 frame->message_length = message_length;
3852
3853 return true;
3854}
3855
3856// static
3857QuicStringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
3858 QuicTransportVersion version,
3859 const QuicEncryptedPacket& encrypted,
3860 QuicConnectionIdLength destination_connection_id_length,
3861 QuicConnectionIdLength source_connection_id_length,
3862 bool includes_version,
3863 bool includes_diversification_nonce,
3864 QuicPacketNumberLength packet_number_length,
3865 QuicVariableLengthIntegerLength retry_token_length_length,
3866 uint64_t retry_token_length,
3867 QuicVariableLengthIntegerLength length_length) {
3868 // TODO(ianswett): This is identical to QuicData::AssociatedData.
3869 return QuicStringPiece(
3870 encrypted.data(),
3871 GetStartOfEncryptedData(version, destination_connection_id_length,
3872 source_connection_id_length, includes_version,
3873 includes_diversification_nonce,
3874 packet_number_length, retry_token_length_length,
3875 retry_token_length, length_length));
3876}
3877
3878void QuicFramer::SetDecrypter(EncryptionLevel level,
3879 std::unique_ptr<QuicDecrypter> decrypter) {
QUICHE team76086e42019-03-25 15:12:29 -07003880 DCHECK_EQ(alternative_decrypter_level_, NUM_ENCRYPTION_LEVELS);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003881 DCHECK_GE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07003882 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07003883 decrypter_[decrypter_level_] = nullptr;
3884 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003885 decrypter_level_ = level;
3886}
3887
3888void QuicFramer::SetAlternativeDecrypter(
3889 EncryptionLevel level,
3890 std::unique_ptr<QuicDecrypter> decrypter,
3891 bool latch_once_used) {
QUICHE team76086e42019-03-25 15:12:29 -07003892 DCHECK_NE(level, decrypter_level_);
zhongyi546cc452019-04-12 15:27:49 -07003893 DCHECK(!version_.KnowsWhichDecrypterToUse());
QUICHE team76086e42019-03-25 15:12:29 -07003894 if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
3895 decrypter_[alternative_decrypter_level_] = nullptr;
3896 }
3897 decrypter_[level] = std::move(decrypter);
QUICHE teama6ef0a62019-03-07 20:34:33 -05003898 alternative_decrypter_level_ = level;
3899 alternative_decrypter_latch_ = latch_once_used;
3900}
3901
zhongyi546cc452019-04-12 15:27:49 -07003902void QuicFramer::InstallDecrypter(EncryptionLevel level,
3903 std::unique_ptr<QuicDecrypter> decrypter) {
3904 DCHECK(version_.KnowsWhichDecrypterToUse());
3905 decrypter_[level] = std::move(decrypter);
3906}
3907
3908void QuicFramer::RemoveDecrypter(EncryptionLevel level) {
3909 DCHECK(version_.KnowsWhichDecrypterToUse());
3910 decrypter_[level] = nullptr;
3911}
3912
3913const QuicDecrypter* QuicFramer::GetDecrypter(EncryptionLevel level) const {
3914 DCHECK(version_.KnowsWhichDecrypterToUse());
3915 return decrypter_[level].get();
3916}
3917
QUICHE teama6ef0a62019-03-07 20:34:33 -05003918const QuicDecrypter* QuicFramer::decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07003919 return decrypter_[decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05003920}
3921
3922const QuicDecrypter* QuicFramer::alternative_decrypter() const {
QUICHE team76086e42019-03-25 15:12:29 -07003923 if (alternative_decrypter_level_ == NUM_ENCRYPTION_LEVELS) {
3924 return nullptr;
3925 }
3926 return decrypter_[alternative_decrypter_level_].get();
QUICHE teama6ef0a62019-03-07 20:34:33 -05003927}
3928
3929void QuicFramer::SetEncrypter(EncryptionLevel level,
3930 std::unique_ptr<QuicEncrypter> encrypter) {
3931 DCHECK_GE(level, 0);
3932 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
3933 encrypter_[level] = std::move(encrypter);
3934}
3935
3936size_t QuicFramer::EncryptInPlace(EncryptionLevel level,
3937 QuicPacketNumber packet_number,
3938 size_t ad_len,
3939 size_t total_len,
3940 size_t buffer_len,
3941 char* buffer) {
3942 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07003943 if (encrypter_[level] == nullptr) {
3944 QUIC_BUG << ENDPOINT
3945 << "Attempted to encrypt in place without encrypter at level "
3946 << QuicUtils::EncryptionLevelToString(level);
3947 RaiseError(QUIC_ENCRYPTION_FAILURE);
3948 return 0;
3949 }
3950
QUICHE teama6ef0a62019-03-07 20:34:33 -05003951 size_t output_length = 0;
3952 if (!encrypter_[level]->EncryptPacket(
3953 packet_number.ToUint64(),
3954 QuicStringPiece(buffer, ad_len), // Associated data
3955 QuicStringPiece(buffer + ad_len, total_len - ad_len), // Plaintext
3956 buffer + ad_len, // Destination buffer
3957 &output_length, buffer_len - ad_len)) {
3958 RaiseError(QUIC_ENCRYPTION_FAILURE);
3959 return 0;
3960 }
3961
3962 return ad_len + output_length;
3963}
3964
3965size_t QuicFramer::EncryptPayload(EncryptionLevel level,
3966 QuicPacketNumber packet_number,
3967 const QuicPacket& packet,
3968 char* buffer,
3969 size_t buffer_len) {
3970 DCHECK(packet_number.IsInitialized());
dschinazi2c5386e2019-04-16 16:37:37 -07003971 if (encrypter_[level] == nullptr) {
3972 QUIC_BUG << ENDPOINT << "Attempted to encrypt without encrypter at level "
3973 << QuicUtils::EncryptionLevelToString(level);
3974 RaiseError(QUIC_ENCRYPTION_FAILURE);
3975 return 0;
3976 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05003977
3978 QuicStringPiece associated_data =
3979 packet.AssociatedData(version_.transport_version);
3980 // Copy in the header, because the encrypter only populates the encrypted
3981 // plaintext content.
3982 const size_t ad_len = associated_data.length();
3983 memmove(buffer, associated_data.data(), ad_len);
3984 // Encrypt the plaintext into the buffer.
3985 size_t output_length = 0;
3986 if (!encrypter_[level]->EncryptPacket(
3987 packet_number.ToUint64(), associated_data,
3988 packet.Plaintext(version_.transport_version), buffer + ad_len,
3989 &output_length, buffer_len - ad_len)) {
3990 RaiseError(QUIC_ENCRYPTION_FAILURE);
3991 return 0;
3992 }
3993
3994 return ad_len + output_length;
3995}
3996
3997size_t QuicFramer::GetCiphertextSize(EncryptionLevel level,
3998 size_t plaintext_size) const {
3999 return encrypter_[level]->GetCiphertextSize(plaintext_size);
4000}
4001
4002size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
4003 // In order to keep the code simple, we don't have the current encryption
4004 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
4005 size_t min_plaintext_size = ciphertext_size;
4006
QUICHE team6987b4a2019-03-15 16:23:04 -07004007 for (int i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; i++) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004008 if (encrypter_[i] != nullptr) {
4009 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
4010 if (size < min_plaintext_size) {
4011 min_plaintext_size = size;
4012 }
4013 }
4014 }
4015
4016 return min_plaintext_size;
4017}
4018
4019bool QuicFramer::DecryptPayload(QuicStringPiece encrypted,
4020 QuicStringPiece associated_data,
4021 const QuicPacketHeader& header,
4022 char* decrypted_buffer,
4023 size_t buffer_length,
QUICHE team10b22a12019-03-21 15:31:42 -07004024 size_t* decrypted_length,
4025 EncryptionLevel* decrypted_level) {
zhongyi546cc452019-04-12 15:27:49 -07004026 EncryptionLevel level = decrypter_level_;
4027 QuicDecrypter* decrypter = decrypter_[level].get();
QUICHE team76086e42019-03-25 15:12:29 -07004028 QuicDecrypter* alternative_decrypter = nullptr;
zhongyi546cc452019-04-12 15:27:49 -07004029 if (version().KnowsWhichDecrypterToUse()) {
4030 level = GetEncryptionLevel(header);
4031 decrypter = decrypter_[level].get();
4032 if (decrypter == nullptr) {
4033 return false;
4034 }
4035 if (level == ENCRYPTION_ZERO_RTT &&
4036 perspective_ == Perspective::IS_CLIENT && header.nonce != nullptr) {
4037 decrypter->SetDiversificationNonce(*header.nonce);
4038 }
4039 } else if (alternative_decrypter_level_ != NUM_ENCRYPTION_LEVELS) {
QUICHE team76086e42019-03-25 15:12:29 -07004040 alternative_decrypter = decrypter_[alternative_decrypter_level_].get();
4041 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004042
zhongyi546cc452019-04-12 15:27:49 -07004043 DCHECK(decrypter != nullptr);
4044
4045 bool success = decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004046 header.packet_number.ToUint64(), associated_data, encrypted,
4047 decrypted_buffer, decrypted_length, buffer_length);
4048 if (success) {
zhongyi546cc452019-04-12 15:27:49 -07004049 visitor_->OnDecryptedPacket(level);
4050 *decrypted_level = level;
QUICHE team76086e42019-03-25 15:12:29 -07004051 } else if (alternative_decrypter != nullptr) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05004052 if (header.nonce != nullptr) {
4053 DCHECK_EQ(perspective_, Perspective::IS_CLIENT);
QUICHE team76086e42019-03-25 15:12:29 -07004054 alternative_decrypter->SetDiversificationNonce(*header.nonce);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004055 }
4056 bool try_alternative_decryption = true;
4057 if (alternative_decrypter_level_ == ENCRYPTION_ZERO_RTT) {
4058 if (perspective_ == Perspective::IS_CLIENT) {
4059 if (header.nonce == nullptr) {
4060 // Can not use INITIAL decryption without a diversification nonce.
4061 try_alternative_decryption = false;
4062 }
4063 } else {
4064 DCHECK(header.nonce == nullptr);
4065 }
4066 }
4067
4068 if (try_alternative_decryption) {
QUICHE team76086e42019-03-25 15:12:29 -07004069 success = alternative_decrypter->DecryptPacket(
QUICHE teama6ef0a62019-03-07 20:34:33 -05004070 header.packet_number.ToUint64(), associated_data, encrypted,
4071 decrypted_buffer, decrypted_length, buffer_length);
4072 }
4073 if (success) {
4074 visitor_->OnDecryptedPacket(alternative_decrypter_level_);
QUICHE team10b22a12019-03-21 15:31:42 -07004075 *decrypted_level = decrypter_level_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004076 if (alternative_decrypter_latch_) {
4077 // Switch to the alternative decrypter and latch so that we cannot
4078 // switch back.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004079 decrypter_level_ = alternative_decrypter_level_;
QUICHE team76086e42019-03-25 15:12:29 -07004080 decrypter_[decrypter_level_] =
4081 std::move(decrypter_[alternative_decrypter_level_]);
4082 alternative_decrypter_level_ = NUM_ENCRYPTION_LEVELS;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004083 } else {
4084 // Switch the alternative decrypter so that we use it first next time.
QUICHE teama6ef0a62019-03-07 20:34:33 -05004085 EncryptionLevel level = alternative_decrypter_level_;
4086 alternative_decrypter_level_ = decrypter_level_;
4087 decrypter_level_ = level;
4088 }
4089 }
4090 }
4091
4092 if (!success) {
4093 QUIC_DVLOG(1) << ENDPOINT << "DecryptPacket failed for packet_number:"
4094 << header.packet_number;
4095 return false;
4096 }
4097
4098 return true;
4099}
4100
4101size_t QuicFramer::GetIetfAckFrameSize(const QuicAckFrame& frame) {
4102 // Type byte, largest_acked, and delay_time are straight-forward.
4103 size_t ack_frame_size = kQuicFrameTypeSize;
4104 QuicPacketNumber largest_acked = LargestAcked(frame);
4105 ack_frame_size += QuicDataWriter::GetVarInt62Len(largest_acked.ToUint64());
4106 uint64_t ack_delay_time_us;
4107 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4108 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
4109 ack_frame_size += QuicDataWriter::GetVarInt62Len(ack_delay_time_us);
4110
4111 // If |ecn_counters_populated| is true and any of the ecn counters is non-0
4112 // then the ecn counters are included...
4113 if (frame.ecn_counters_populated &&
4114 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
4115 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_0_count);
4116 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ect_1_count);
4117 ack_frame_size += QuicDataWriter::GetVarInt62Len(frame.ecn_ce_count);
4118 }
4119
4120 // The rest (ack_block_count, first_ack_block, and additional ack
4121 // blocks, if any) depends:
4122 uint64_t ack_block_count = frame.packets.NumIntervals();
4123 if (ack_block_count == 0) {
4124 // If the QuicAckFrame has no Intervals, then it is interpreted
4125 // as an ack of a single packet at QuicAckFrame.largest_acked.
4126 // The resulting ack will consist of only the frame's
4127 // largest_ack & first_ack_block fields. The first ack block will be 0
4128 // (indicating a single packet) and the ack block_count will be 0.
4129 // Each 0 takes 1 byte when VarInt62 encoded.
4130 ack_frame_size += 2;
4131 return ack_frame_size;
4132 }
4133
4134 auto itr = frame.packets.rbegin();
4135 QuicPacketNumber ack_block_largest = largest_acked;
4136 QuicPacketNumber ack_block_smallest;
4137 if ((itr->max() - 1) == largest_acked) {
4138 // If largest_acked + 1 is equal to the Max() of the first Interval
4139 // in the QuicAckFrame then the first Interval is the first ack block of the
4140 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
4141 // first Interval is encoded in the frame's largest_acked/first_ack_block,
4142 // the remaining Intervals are encoded in additional ack blocks in the
4143 // frame, and the packet's ack_block_count is the number of QuicAckFrame
4144 // Intervals - 1.
4145 ack_block_smallest = itr->min();
4146 itr++;
4147 ack_block_count--;
4148 } else {
4149 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
4150 // the first Interval then it is interpreted as acking a single
4151 // packet at QuicAckFrame.largest_acked, with additional
4152 // Intervals indicating additional ack blocks. The encoding is
4153 // a) The packet's largest_acked is the QuicAckFrame's largest
4154 // acked,
4155 // b) the first ack block size is 0,
4156 // c) The packet's ack_block_count is the number of QuicAckFrame
4157 // Intervals, and
4158 // d) The QuicAckFrame Intervals are encoded in additional ack
4159 // blocks in the packet.
4160 ack_block_smallest = largest_acked;
4161 }
4162 size_t ack_block_count_size = QuicDataWriter::GetVarInt62Len(ack_block_count);
4163 ack_frame_size += ack_block_count_size;
4164
4165 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
4166 size_t first_ack_block_size = QuicDataWriter::GetVarInt62Len(first_ack_block);
4167 ack_frame_size += first_ack_block_size;
4168
4169 // Account for the remaining Intervals, if any.
4170 while (ack_block_count != 0) {
4171 uint64_t gap_size = ack_block_smallest - itr->max();
4172 // Decrement per the protocol specification
4173 size_t size_of_gap_size = QuicDataWriter::GetVarInt62Len(gap_size - 1);
4174 ack_frame_size += size_of_gap_size;
4175
4176 uint64_t block_size = itr->max() - itr->min();
4177 // Decrement per the protocol specification
4178 size_t size_of_block_size = QuicDataWriter::GetVarInt62Len(block_size - 1);
4179 ack_frame_size += size_of_block_size;
4180
4181 ack_block_smallest = itr->min();
4182 itr++;
4183 ack_block_count--;
4184 }
4185
4186 return ack_frame_size;
4187}
4188
4189size_t QuicFramer::GetAckFrameSize(
4190 const QuicAckFrame& ack,
4191 QuicPacketNumberLength packet_number_length) {
4192 DCHECK(!ack.packets.Empty());
4193 size_t ack_size = 0;
4194
4195 if (version_.transport_version == QUIC_VERSION_99) {
4196 return GetIetfAckFrameSize(ack);
4197 }
4198 AckFrameInfo ack_info = GetAckFrameInfo(ack);
4199 QuicPacketNumberLength largest_acked_length =
4200 GetMinPacketNumberLength(version_.transport_version, LargestAcked(ack));
4201 QuicPacketNumberLength ack_block_length = GetMinPacketNumberLength(
4202 version_.transport_version, QuicPacketNumber(ack_info.max_block_length));
4203
4204 ack_size =
4205 GetMinAckFrameSize(version_.transport_version, largest_acked_length);
4206 // First ack block length.
4207 ack_size += ack_block_length;
4208 if (ack_info.num_ack_blocks != 0) {
4209 ack_size += kNumberOfAckBlocksSize;
4210 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) *
4211 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
4212 }
4213
4214 // Include timestamps.
4215 if (process_timestamps_) {
4216 ack_size += GetAckFrameTimeStampSize(ack);
4217 }
4218
4219 return ack_size;
4220}
4221
4222size_t QuicFramer::GetAckFrameTimeStampSize(const QuicAckFrame& ack) {
4223 if (ack.received_packet_times.empty()) {
4224 return 0;
4225 }
4226
4227 return kQuicNumTimestampsLength + kQuicFirstTimestampLength +
4228 (kQuicTimestampLength + kQuicTimestampPacketNumberGapLength) *
4229 (ack.received_packet_times.size() - 1);
4230}
4231
4232size_t QuicFramer::ComputeFrameLength(
4233 const QuicFrame& frame,
4234 bool last_frame_in_packet,
4235 QuicPacketNumberLength packet_number_length) {
4236 switch (frame.type) {
4237 case STREAM_FRAME:
4238 return GetMinStreamFrameSize(
4239 version_.transport_version, frame.stream_frame.stream_id,
4240 frame.stream_frame.offset, last_frame_in_packet,
4241 frame.stream_frame.data_length) +
4242 frame.stream_frame.data_length;
4243 case CRYPTO_FRAME:
4244 return GetMinCryptoFrameSize(frame.crypto_frame->offset,
4245 frame.crypto_frame->data_length) +
4246 frame.crypto_frame->data_length;
4247 case ACK_FRAME: {
4248 return GetAckFrameSize(*frame.ack_frame, packet_number_length);
4249 }
4250 case STOP_WAITING_FRAME:
4251 return GetStopWaitingFrameSize(version_.transport_version,
4252 packet_number_length);
4253 case MTU_DISCOVERY_FRAME:
4254 // MTU discovery frames are serialized as ping frames.
4255 return kQuicFrameTypeSize;
4256 case MESSAGE_FRAME:
4257 return GetMessageFrameSize(version_.transport_version,
4258 last_frame_in_packet,
4259 frame.message_frame->message_length);
4260 case PADDING_FRAME:
4261 DCHECK(false);
4262 return 0;
4263 default:
4264 return GetRetransmittableControlFrameSize(version_.transport_version,
4265 frame);
4266 }
4267}
4268
4269bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
4270 bool last_frame_in_packet,
4271 QuicDataWriter* writer) {
4272 if (version_.transport_version == QUIC_VERSION_99) {
4273 return AppendIetfTypeByte(frame, last_frame_in_packet, writer);
4274 }
4275 uint8_t type_byte = 0;
4276 switch (frame.type) {
4277 case STREAM_FRAME:
4278 type_byte =
4279 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4280 break;
4281 case ACK_FRAME:
4282 return true;
4283 case MTU_DISCOVERY_FRAME:
4284 type_byte = static_cast<uint8_t>(PING_FRAME);
4285 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004286 case NEW_CONNECTION_ID_FRAME:
4287 set_detailed_error(
4288 "Attempt to append NEW_CONNECTION_ID frame and not in version 99.");
4289 return RaiseError(QUIC_INTERNAL_ERROR);
4290 case RETIRE_CONNECTION_ID_FRAME:
4291 set_detailed_error(
4292 "Attempt to append RETIRE_CONNECTION_ID frame and not in version "
4293 "99.");
4294 return RaiseError(QUIC_INTERNAL_ERROR);
4295 case NEW_TOKEN_FRAME:
4296 set_detailed_error(
4297 "Attempt to append NEW_TOKEN frame and not in version 99.");
4298 return RaiseError(QUIC_INTERNAL_ERROR);
4299 case MAX_STREAM_ID_FRAME:
4300 set_detailed_error(
4301 "Attempt to append MAX_STREAM_ID frame and not in version 99.");
4302 return RaiseError(QUIC_INTERNAL_ERROR);
4303 case STREAM_ID_BLOCKED_FRAME:
4304 set_detailed_error(
4305 "Attempt to append STREAM_ID_BLOCKED frame and not in version 99.");
4306 return RaiseError(QUIC_INTERNAL_ERROR);
4307 case PATH_RESPONSE_FRAME:
4308 set_detailed_error(
4309 "Attempt to append PATH_RESPONSE frame and not in version 99.");
4310 return RaiseError(QUIC_INTERNAL_ERROR);
4311 case PATH_CHALLENGE_FRAME:
4312 set_detailed_error(
4313 "Attempt to append PATH_CHALLENGE frame and not in version 99.");
4314 return RaiseError(QUIC_INTERNAL_ERROR);
4315 case STOP_SENDING_FRAME:
4316 set_detailed_error(
4317 "Attempt to append STOP_SENDING frame and not in version 99.");
4318 return RaiseError(QUIC_INTERNAL_ERROR);
4319 case MESSAGE_FRAME:
4320 return true;
4321
4322 default:
4323 type_byte = static_cast<uint8_t>(frame.type);
4324 break;
4325 }
4326
4327 return writer->WriteUInt8(type_byte);
4328}
4329
4330bool QuicFramer::AppendIetfTypeByte(const QuicFrame& frame,
4331 bool last_frame_in_packet,
4332 QuicDataWriter* writer) {
4333 uint8_t type_byte = 0;
4334 switch (frame.type) {
4335 case PADDING_FRAME:
4336 type_byte = IETF_PADDING;
4337 break;
4338 case RST_STREAM_FRAME:
4339 type_byte = IETF_RST_STREAM;
4340 break;
4341 case CONNECTION_CLOSE_FRAME:
fkastenholz72f509b2019-04-10 09:17:49 -07004342 switch (frame.connection_close_frame->close_type) {
4343 case IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
4344 type_byte = IETF_APPLICATION_CLOSE;
4345 break;
4346 case IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
4347 type_byte = IETF_CONNECTION_CLOSE;
4348 break;
4349 default:
4350 set_detailed_error("Invalid QuicConnectionCloseFrame type.");
4351 return RaiseError(QUIC_INTERNAL_ERROR);
4352 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05004353 break;
4354 case GOAWAY_FRAME:
4355 set_detailed_error(
4356 "Attempt to create non-version-99 GOAWAY frame in version 99.");
4357 return RaiseError(QUIC_INTERNAL_ERROR);
4358 case WINDOW_UPDATE_FRAME:
4359 // Depending on whether there is a stream ID or not, will be either a
4360 // MAX_STREAM_DATA frame or a MAX_DATA frame.
4361 if (frame.window_update_frame->stream_id ==
4362 QuicUtils::GetInvalidStreamId(transport_version())) {
4363 type_byte = IETF_MAX_DATA;
4364 } else {
4365 type_byte = IETF_MAX_STREAM_DATA;
4366 }
4367 break;
4368 case BLOCKED_FRAME:
4369 if (frame.blocked_frame->stream_id ==
4370 QuicUtils::GetInvalidStreamId(transport_version())) {
4371 type_byte = IETF_BLOCKED;
4372 } else {
4373 type_byte = IETF_STREAM_BLOCKED;
4374 }
4375 break;
4376 case STOP_WAITING_FRAME:
4377 set_detailed_error(
4378 "Attempt to append type byte of STOP WAITING frame in version 99.");
4379 return RaiseError(QUIC_INTERNAL_ERROR);
4380 case PING_FRAME:
4381 type_byte = IETF_PING;
4382 break;
4383 case STREAM_FRAME:
4384 type_byte =
4385 GetStreamFrameTypeByte(frame.stream_frame, last_frame_in_packet);
4386 break;
4387 case ACK_FRAME:
4388 // Do nothing here, AppendIetfAckFrameAndTypeByte() will put the type byte
4389 // in the buffer.
4390 return true;
4391 case MTU_DISCOVERY_FRAME:
4392 // The path MTU discovery frame is encoded as a PING frame on the wire.
4393 type_byte = IETF_PING;
4394 break;
QUICHE teama6ef0a62019-03-07 20:34:33 -05004395 case NEW_CONNECTION_ID_FRAME:
4396 type_byte = IETF_NEW_CONNECTION_ID;
4397 break;
4398 case RETIRE_CONNECTION_ID_FRAME:
4399 type_byte = IETF_RETIRE_CONNECTION_ID;
4400 break;
4401 case NEW_TOKEN_FRAME:
4402 type_byte = IETF_NEW_TOKEN;
4403 break;
4404 case MAX_STREAM_ID_FRAME:
4405 if (QuicUtils::IsBidirectionalStreamId(
4406 frame.max_stream_id_frame.max_stream_id)) {
4407 type_byte = IETF_MAX_STREAMS_BIDIRECTIONAL;
4408 } else {
4409 type_byte = IETF_MAX_STREAMS_UNIDIRECTIONAL;
4410 }
4411 break;
4412 case STREAM_ID_BLOCKED_FRAME:
4413 if (QuicUtils::IsBidirectionalStreamId(
4414 frame.max_stream_id_frame.max_stream_id)) {
4415 type_byte = IETF_STREAMS_BLOCKED_BIDIRECTIONAL;
4416 } else {
4417 type_byte = IETF_STREAMS_BLOCKED_UNIDIRECTIONAL;
4418 }
4419 break;
4420 case PATH_RESPONSE_FRAME:
4421 type_byte = IETF_PATH_RESPONSE;
4422 break;
4423 case PATH_CHALLENGE_FRAME:
4424 type_byte = IETF_PATH_CHALLENGE;
4425 break;
4426 case STOP_SENDING_FRAME:
4427 type_byte = IETF_STOP_SENDING;
4428 break;
4429 case MESSAGE_FRAME:
4430 return true;
4431 case CRYPTO_FRAME:
4432 type_byte = IETF_CRYPTO;
4433 break;
4434 default:
4435 QUIC_BUG << "Attempt to generate a frame type for an unsupported value: "
4436 << frame.type;
4437 return false;
4438 }
4439 return writer->WriteUInt8(type_byte);
4440}
4441
4442// static
4443bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length,
4444 QuicPacketNumber packet_number,
4445 QuicDataWriter* writer) {
4446 DCHECK(packet_number.IsInitialized());
4447 if (!IsValidPacketNumberLength(packet_number_length)) {
4448 QUIC_BUG << "Invalid packet_number_length: " << packet_number_length;
4449 return false;
4450 }
4451 return writer->WriteBytesToUInt64(packet_number_length,
4452 packet_number.ToUint64());
4453}
4454
4455// static
4456bool QuicFramer::AppendStreamId(size_t stream_id_length,
4457 QuicStreamId stream_id,
4458 QuicDataWriter* writer) {
4459 if (stream_id_length == 0 || stream_id_length > 4) {
4460 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length;
4461 return false;
4462 }
4463 return writer->WriteBytesToUInt64(stream_id_length, stream_id);
4464}
4465
4466// static
4467bool QuicFramer::AppendStreamOffset(size_t offset_length,
4468 QuicStreamOffset offset,
4469 QuicDataWriter* writer) {
4470 if (offset_length == 1 || offset_length > 8) {
4471 QUIC_BUG << "Invalid stream_offset_length: " << offset_length;
4472 return false;
4473 }
4474
4475 return writer->WriteBytesToUInt64(offset_length, offset);
4476}
4477
4478// static
4479bool QuicFramer::AppendAckBlock(uint8_t gap,
4480 QuicPacketNumberLength length_length,
4481 uint64_t length,
4482 QuicDataWriter* writer) {
4483 if (length == 0) {
4484 if (!IsValidPacketNumberLength(length_length)) {
4485 QUIC_BUG << "Invalid packet_number_length: " << length_length;
4486 return false;
4487 }
4488 return writer->WriteUInt8(gap) &&
4489 writer->WriteBytesToUInt64(length_length, length);
4490 }
4491 return writer->WriteUInt8(gap) &&
4492 AppendPacketNumber(length_length, QuicPacketNumber(length), writer);
4493}
4494
4495bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame,
4496 bool no_stream_frame_length,
4497 QuicDataWriter* writer) {
4498 if (version_.transport_version == QUIC_VERSION_99) {
4499 return AppendIetfStreamFrame(frame, no_stream_frame_length, writer);
4500 }
4501 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id,
4502 writer)) {
4503 QUIC_BUG << "Writing stream id size failed.";
4504 return false;
4505 }
4506 if (!AppendStreamOffset(
4507 GetStreamOffsetSize(version_.transport_version, frame.offset),
4508 frame.offset, writer)) {
4509 QUIC_BUG << "Writing offset size failed.";
4510 return false;
4511 }
4512 if (!no_stream_frame_length) {
4513 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) ||
4514 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) {
4515 QUIC_BUG << "Writing stream frame length failed";
4516 return false;
4517 }
4518 }
4519
4520 if (data_producer_ != nullptr) {
4521 DCHECK_EQ(nullptr, frame.data_buffer);
4522 if (frame.data_length == 0) {
4523 return true;
4524 }
4525 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4526 frame.data_length,
4527 writer) != WRITE_SUCCESS) {
4528 QUIC_BUG << "Writing frame data failed.";
4529 return false;
4530 }
4531 return true;
4532 }
4533
4534 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4535 QUIC_BUG << "Writing frame data failed.";
4536 return false;
4537 }
4538 return true;
4539}
4540
4541// static
4542bool QuicFramer::AppendIetfConnectionId(
4543 bool version_flag,
4544 QuicConnectionId destination_connection_id,
4545 QuicConnectionIdLength destination_connection_id_length,
4546 QuicConnectionId source_connection_id,
4547 QuicConnectionIdLength source_connection_id_length,
4548 QuicDataWriter* writer) {
4549 if (version_flag) {
4550 // Append connection ID length byte.
4551 uint8_t dcil = GetConnectionIdLengthValue(destination_connection_id_length);
4552 uint8_t scil = GetConnectionIdLengthValue(source_connection_id_length);
4553 uint8_t connection_id_length = dcil << 4 | scil;
4554 if (!writer->WriteBytes(&connection_id_length, 1)) {
4555 return false;
4556 }
4557 }
4558 if (destination_connection_id_length == PACKET_8BYTE_CONNECTION_ID &&
4559 !writer->WriteConnectionId(destination_connection_id)) {
4560 return false;
4561 }
4562 if (source_connection_id_length == PACKET_8BYTE_CONNECTION_ID &&
4563 !writer->WriteConnectionId(source_connection_id)) {
4564 return false;
4565 }
4566 return true;
4567}
4568
4569bool QuicFramer::AppendNewTokenFrame(const QuicNewTokenFrame& frame,
4570 QuicDataWriter* writer) {
4571 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.token.length()))) {
4572 set_detailed_error("Writing token length failed.");
4573 return false;
4574 }
4575 if (!writer->WriteBytes(frame.token.data(), frame.token.length())) {
4576 set_detailed_error("Writing token buffer failed.");
4577 return false;
4578 }
4579 return true;
4580}
4581
4582bool QuicFramer::ProcessNewTokenFrame(QuicDataReader* reader,
4583 QuicNewTokenFrame* frame) {
4584 uint64_t length;
4585 if (!reader->ReadVarInt62(&length)) {
4586 set_detailed_error("Unable to read new token length.");
4587 return false;
4588 }
4589 if (length > kMaxNewTokenTokenLength) {
4590 set_detailed_error("Token length larger than maximum.");
4591 return false;
4592 }
4593
4594 // TODO(ianswett): Don't use QuicStringPiece as an intermediary.
4595 QuicStringPiece data;
4596 if (!reader->ReadStringPiece(&data, length)) {
4597 set_detailed_error("Unable to read new token data.");
4598 return false;
4599 }
vasilvvc48c8712019-03-11 13:38:16 -07004600 frame->token = std::string(data);
QUICHE teama6ef0a62019-03-07 20:34:33 -05004601 return true;
4602}
4603
4604// Add a new ietf-format stream frame.
4605// Bits controlling whether there is a frame-length and frame-offset
4606// are in the QuicStreamFrame.
4607bool QuicFramer::AppendIetfStreamFrame(const QuicStreamFrame& frame,
4608 bool last_frame_in_packet,
4609 QuicDataWriter* writer) {
4610 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
4611 set_detailed_error("Writing stream id failed.");
4612 return false;
4613 }
4614
4615 if (frame.offset != 0) {
4616 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4617 set_detailed_error("Writing data offset failed.");
4618 return false;
4619 }
4620 }
4621
4622 if (!last_frame_in_packet) {
4623 if (!writer->WriteVarInt62(frame.data_length)) {
4624 set_detailed_error("Writing data length failed.");
4625 return false;
4626 }
4627 }
4628
4629 if (frame.data_length == 0) {
4630 return true;
4631 }
4632 if (data_producer_ == nullptr) {
4633 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4634 set_detailed_error("Writing frame data failed.");
4635 return false;
4636 }
4637 } else {
4638 DCHECK_EQ(nullptr, frame.data_buffer);
4639
4640 if (data_producer_->WriteStreamData(frame.stream_id, frame.offset,
4641 frame.data_length,
4642 writer) != WRITE_SUCCESS) {
4643 set_detailed_error("Writing frame data failed.");
4644 return false;
4645 }
4646 }
4647 return true;
4648}
4649
4650bool QuicFramer::AppendCryptoFrame(const QuicCryptoFrame& frame,
4651 QuicDataWriter* writer) {
4652 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.offset))) {
4653 set_detailed_error("Writing data offset failed.");
4654 return false;
4655 }
4656 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.data_length))) {
4657 set_detailed_error("Writing data length failed.");
4658 return false;
4659 }
4660 if (data_producer_ == nullptr) {
4661 if (frame.data_buffer == nullptr ||
4662 !writer->WriteBytes(frame.data_buffer, frame.data_length)) {
4663 set_detailed_error("Writing frame data failed.");
4664 return false;
4665 }
4666 } else {
4667 DCHECK_EQ(nullptr, frame.data_buffer);
4668 if (!data_producer_->WriteCryptoData(frame.level, frame.offset,
4669 frame.data_length, writer)) {
4670 return false;
4671 }
4672 }
4673 return true;
4674}
4675
4676void QuicFramer::set_version(const ParsedQuicVersion version) {
4677 DCHECK(IsSupportedVersion(version)) << ParsedQuicVersionToString(version);
4678 version_ = version;
4679}
4680
4681bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
4682 QuicDataWriter* writer) {
4683 if (transport_version() == QUIC_VERSION_99) {
4684 return AppendIetfAckFrameAndTypeByte(frame, writer);
4685 }
4686
4687 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame);
4688 QuicPacketNumber largest_acked = LargestAcked(frame);
4689 QuicPacketNumberLength largest_acked_length =
4690 GetMinPacketNumberLength(version_.transport_version, largest_acked);
4691 QuicPacketNumberLength ack_block_length =
4692 GetMinPacketNumberLength(version_.transport_version,
4693 QuicPacketNumber(new_ack_info.max_block_length));
4694 // Calculate available bytes for timestamps and ack blocks.
4695 int32_t available_timestamp_and_ack_block_bytes =
4696 writer->capacity() - writer->length() - ack_block_length -
4697 GetMinAckFrameSize(version_.transport_version, largest_acked_length) -
4698 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0);
4699 DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
4700
4701 // Write out the type byte by setting the low order bits and doing shifts
4702 // to make room for the next bit flags to be set.
4703 // Whether there are multiple ack blocks.
4704 uint8_t type_byte = 0;
4705 SetBit(&type_byte, new_ack_info.num_ack_blocks != 0,
4706 kQuicHasMultipleAckBlocksOffset);
4707
4708 SetBits(&type_byte, GetPacketNumberFlags(largest_acked_length),
4709 kQuicSequenceNumberLengthNumBits, kLargestAckedOffset);
4710
4711 SetBits(&type_byte, GetPacketNumberFlags(ack_block_length),
4712 kQuicSequenceNumberLengthNumBits, kActBlockLengthOffset);
4713
4714 type_byte |= kQuicFrameTypeAckMask;
4715
4716 if (!writer->WriteUInt8(type_byte)) {
4717 return false;
4718 }
4719
4720 size_t max_num_ack_blocks = available_timestamp_and_ack_block_bytes /
4721 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER);
4722
4723 // Number of ack blocks.
4724 size_t num_ack_blocks =
4725 std::min(new_ack_info.num_ack_blocks, max_num_ack_blocks);
4726 if (num_ack_blocks > std::numeric_limits<uint8_t>::max()) {
4727 num_ack_blocks = std::numeric_limits<uint8_t>::max();
4728 }
4729
4730 // Largest acked.
4731 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) {
4732 return false;
4733 }
4734
4735 // Largest acked delta time.
4736 uint64_t ack_delay_time_us = kUFloat16MaxValue;
4737 if (!frame.ack_delay_time.IsInfinite()) {
4738 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
4739 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4740 }
4741 if (!writer->WriteUFloat16(ack_delay_time_us)) {
4742 return false;
4743 }
4744
4745 if (num_ack_blocks > 0) {
4746 if (!writer->WriteBytes(&num_ack_blocks, 1)) {
4747 return false;
4748 }
4749 }
4750
4751 // First ack block length.
4752 if (!AppendPacketNumber(ack_block_length,
4753 QuicPacketNumber(new_ack_info.first_block_length),
4754 writer)) {
4755 return false;
4756 }
4757
4758 // Ack blocks.
4759 if (num_ack_blocks > 0) {
4760 size_t num_ack_blocks_written = 0;
4761 // Append, in descending order from the largest ACKed packet, a series of
4762 // ACK blocks that represents the successfully acknoweldged packets. Each
4763 // appended gap/block length represents a descending delta from the previous
4764 // block. i.e.:
4765 // |--- length ---|--- gap ---|--- length ---|--- gap ---|--- largest ---|
4766 // For gaps larger than can be represented by a single encoded gap, a 0
4767 // length gap of the maximum is used, i.e.:
4768 // |--- length ---|--- gap ---|- 0 -|--- gap ---|--- largest ---|
4769 auto itr = frame.packets.rbegin();
4770 QuicPacketNumber previous_start = itr->min();
4771 ++itr;
4772
4773 for (;
4774 itr != frame.packets.rend() && num_ack_blocks_written < num_ack_blocks;
4775 previous_start = itr->min(), ++itr) {
4776 const auto& interval = *itr;
4777 const uint64_t total_gap = previous_start - interval.max();
4778 const size_t num_encoded_gaps =
4779 (total_gap + std::numeric_limits<uint8_t>::max() - 1) /
4780 std::numeric_limits<uint8_t>::max();
4781 DCHECK_LE(0u, num_encoded_gaps);
4782
4783 // Append empty ACK blocks because the gap is longer than a single gap.
4784 for (size_t i = 1;
4785 i < num_encoded_gaps && num_ack_blocks_written < num_ack_blocks;
4786 ++i) {
4787 if (!AppendAckBlock(std::numeric_limits<uint8_t>::max(),
4788 ack_block_length, 0, writer)) {
4789 return false;
4790 }
4791 ++num_ack_blocks_written;
4792 }
4793 if (num_ack_blocks_written >= num_ack_blocks) {
4794 if (QUIC_PREDICT_FALSE(num_ack_blocks_written != num_ack_blocks)) {
4795 QUIC_BUG << "Wrote " << num_ack_blocks_written
4796 << ", expected to write " << num_ack_blocks;
4797 }
4798 break;
4799 }
4800
4801 const uint8_t last_gap =
4802 total_gap -
4803 (num_encoded_gaps - 1) * std::numeric_limits<uint8_t>::max();
4804 // Append the final ACK block with a non-empty size.
4805 if (!AppendAckBlock(last_gap, ack_block_length,
4806 PacketNumberIntervalLength(interval), writer)) {
4807 return false;
4808 }
4809 ++num_ack_blocks_written;
4810 }
4811 DCHECK_EQ(num_ack_blocks, num_ack_blocks_written);
4812 }
4813 // Timestamps.
4814 // If we don't process timestamps or if we don't have enough available space
4815 // to append all the timestamps, don't append any of them.
4816 if (process_timestamps_ && writer->capacity() - writer->length() >=
4817 GetAckFrameTimeStampSize(frame)) {
4818 if (!AppendTimestampsToAckFrame(frame, writer)) {
4819 return false;
4820 }
4821 } else {
4822 uint8_t num_received_packets = 0;
4823 if (!writer->WriteBytes(&num_received_packets, 1)) {
4824 return false;
4825 }
4826 }
4827
4828 return true;
4829}
4830
4831bool QuicFramer::AppendTimestampsToAckFrame(const QuicAckFrame& frame,
4832 QuicDataWriter* writer) {
4833 DCHECK_GE(std::numeric_limits<uint8_t>::max(),
4834 frame.received_packet_times.size());
4835 // num_received_packets is only 1 byte.
4836 if (frame.received_packet_times.size() >
4837 std::numeric_limits<uint8_t>::max()) {
4838 return false;
4839 }
4840
4841 uint8_t num_received_packets = frame.received_packet_times.size();
4842 if (!writer->WriteBytes(&num_received_packets, 1)) {
4843 return false;
4844 }
4845 if (num_received_packets == 0) {
4846 return true;
4847 }
4848
4849 auto it = frame.received_packet_times.begin();
4850 QuicPacketNumber packet_number = it->first;
4851 uint64_t delta_from_largest_observed = LargestAcked(frame) - packet_number;
4852
4853 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed);
4854 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
4855 return false;
4856 }
4857
4858 if (!writer->WriteUInt8(delta_from_largest_observed)) {
4859 return false;
4860 }
4861
4862 // Use the lowest 4 bytes of the time delta from the creation_time_.
4863 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32;
4864 uint32_t time_delta_us =
4865 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() &
4866 (time_epoch_delta_us - 1));
4867 if (!writer->WriteUInt32(time_delta_us)) {
4868 return false;
4869 }
4870
4871 QuicTime prev_time = it->second;
4872
4873 for (++it; it != frame.received_packet_times.end(); ++it) {
4874 packet_number = it->first;
4875 delta_from_largest_observed = LargestAcked(frame) - packet_number;
4876
4877 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) {
4878 return false;
4879 }
4880
4881 if (!writer->WriteUInt8(delta_from_largest_observed)) {
4882 return false;
4883 }
4884
4885 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds();
4886 prev_time = it->second;
4887 if (!writer->WriteUFloat16(frame_time_delta_us)) {
4888 return false;
4889 }
4890 }
4891 return true;
4892}
4893
4894bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header,
4895 const QuicStopWaitingFrame& frame,
4896 QuicDataWriter* writer) {
4897 DCHECK_GE(QUIC_VERSION_43, version_.transport_version);
4898 DCHECK(frame.least_unacked.IsInitialized() &&
4899 header.packet_number >= frame.least_unacked);
4900 const uint64_t least_unacked_delta =
4901 header.packet_number - frame.least_unacked;
4902 const uint64_t length_shift = header.packet_number_length * 8;
4903
4904 if (least_unacked_delta >> length_shift > 0) {
4905 QUIC_BUG << "packet_number_length " << header.packet_number_length
4906 << " is too small for least_unacked_delta: " << least_unacked_delta
4907 << " packet_number:" << header.packet_number
4908 << " least_unacked:" << frame.least_unacked
4909 << " version:" << version_.transport_version;
4910 return false;
4911 }
4912 if (least_unacked_delta == 0) {
4913 return writer->WriteBytesToUInt64(header.packet_number_length,
4914 least_unacked_delta);
4915 }
4916 if (!AppendPacketNumber(header.packet_number_length,
4917 QuicPacketNumber(least_unacked_delta), writer)) {
4918 QUIC_BUG << " seq failed: " << header.packet_number_length;
4919 return false;
4920 }
4921
4922 return true;
4923}
4924
4925int QuicFramer::CalculateIetfAckBlockCount(const QuicAckFrame& frame,
4926 QuicDataWriter* writer,
4927 size_t available_space) {
4928 // Number of blocks requested in the frame
4929 uint64_t ack_block_count = frame.packets.NumIntervals();
4930
4931 auto itr = frame.packets.rbegin();
4932
4933 int actual_block_count = 1;
4934 uint64_t block_length = itr->max() - itr->min();
4935 size_t encoded_size = QuicDataWriter::GetVarInt62Len(block_length);
4936 if (encoded_size > available_space) {
4937 return 0;
4938 }
4939 available_space -= encoded_size;
4940 QuicPacketNumber previous_ack_end = itr->min();
4941 ack_block_count--;
4942
4943 while (ack_block_count) {
4944 // Each block is a gap followed by another ACK. Calculate each value,
4945 // determine the encoded lengths, and check against the available space.
4946 itr++;
4947 size_t gap = previous_ack_end - itr->max() - 1;
4948 encoded_size = QuicDataWriter::GetVarInt62Len(gap);
4949
4950 // Add the ACK block.
4951 block_length = itr->max() - itr->min();
4952 encoded_size += QuicDataWriter::GetVarInt62Len(block_length);
4953
4954 if (encoded_size > available_space) {
4955 // No room for this block, so what we've
4956 // done up to now is all that can be done.
4957 return actual_block_count;
4958 }
4959 available_space -= encoded_size;
4960 actual_block_count++;
4961 previous_ack_end = itr->min();
4962 ack_block_count--;
4963 }
4964 // Ran through the whole thing! We can do all blocks.
4965 return actual_block_count;
4966}
4967
4968bool QuicFramer::AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
4969 QuicDataWriter* writer) {
4970 // Assume frame is an IETF_ACK frame. If |ecn_counters_populated| is true and
4971 // any of the ECN counters is non-0 then turn it into an IETF_ACK+ECN frame.
4972 uint8_t type = IETF_ACK;
4973 if (frame.ecn_counters_populated &&
4974 (frame.ect_0_count || frame.ect_1_count || frame.ecn_ce_count)) {
4975 type = IETF_ACK_ECN;
4976 }
4977
4978 if (!writer->WriteUInt8(type)) {
4979 set_detailed_error("No room for frame-type");
4980 return false;
4981 }
4982
4983 QuicPacketNumber largest_acked = LargestAcked(frame);
4984 if (!writer->WriteVarInt62(largest_acked.ToUint64())) {
4985 set_detailed_error("No room for largest-acked in ack frame");
4986 return false;
4987 }
4988
4989 uint64_t ack_delay_time_us = kVarInt62MaxValue;
4990 if (!frame.ack_delay_time.IsInfinite()) {
4991 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds());
4992 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds();
4993 // TODO(fkastenholz): Use the shift from TLS transport parameters.
4994 ack_delay_time_us = ack_delay_time_us >> kIetfAckTimestampShift;
4995 }
4996
4997 if (!writer->WriteVarInt62(ack_delay_time_us)) {
4998 set_detailed_error("No room for ack-delay in ack frame");
4999 return false;
5000 }
5001 if (type == IETF_ACK_ECN) {
5002 // Encode the ACK ECN fields
5003 if (!writer->WriteVarInt62(frame.ect_0_count)) {
5004 set_detailed_error("No room for ect_0_count in ack frame");
5005 return false;
5006 }
5007 if (!writer->WriteVarInt62(frame.ect_1_count)) {
5008 set_detailed_error("No room for ect_1_count in ack frame");
5009 return false;
5010 }
5011 if (!writer->WriteVarInt62(frame.ecn_ce_count)) {
5012 set_detailed_error("No room for ecn_ce_count in ack frame");
5013 return false;
5014 }
5015 }
5016
5017 uint64_t ack_block_count = frame.packets.NumIntervals();
5018 if (ack_block_count == 0) {
5019 // If the QuicAckFrame has no Intervals, then it is interpreted
5020 // as an ack of a single packet at QuicAckFrame.largest_acked.
5021 // The resulting ack will consist of only the frame's
5022 // largest_ack & first_ack_block fields. The first ack block will be 0
5023 // (indicating a single packet) and the ack block_count will be 0.
5024 if (!writer->WriteVarInt62(0)) {
5025 set_detailed_error("No room for ack block count in ack frame");
5026 return false;
5027 }
5028 // size of the first block is 1 packet
5029 if (!writer->WriteVarInt62(0)) {
5030 set_detailed_error("No room for first ack block in ack frame");
5031 return false;
5032 }
5033 return true;
5034 }
5035 // Case 2 or 3
5036 auto itr = frame.packets.rbegin();
5037
5038 QuicPacketNumber ack_block_largest(largest_acked);
5039 QuicPacketNumber ack_block_smallest;
5040 if ((itr->max() - 1) == QuicPacketNumber(largest_acked)) {
5041 // If largest_acked + 1 is equal to the Max() of the first Interval
5042 // in the QuicAckFrame then the first Interval is the first ack block of the
5043 // frame; remaining Intervals are additional ack blocks. The QuicAckFrame's
5044 // first Interval is encoded in the frame's largest_acked/first_ack_block,
5045 // the remaining Intervals are encoded in additional ack blocks in the
5046 // frame, and the packet's ack_block_count is the number of QuicAckFrame
5047 // Intervals - 1.
5048 ack_block_smallest = itr->min();
5049 itr++;
5050 ack_block_count--;
5051 } else {
5052 // If QuicAckFrame.largest_acked is NOT equal to the Max() of
5053 // the first Interval then it is interpreted as acking a single
5054 // packet at QuicAckFrame.largest_acked, with additional
5055 // Intervals indicating additional ack blocks. The encoding is
5056 // a) The packet's largest_acked is the QuicAckFrame's largest
5057 // acked,
5058 // b) the first ack block size is 0,
5059 // c) The packet's ack_block_count is the number of QuicAckFrame
5060 // Intervals, and
5061 // d) The QuicAckFrame Intervals are encoded in additional ack
5062 // blocks in the packet.
5063 ack_block_smallest = largest_acked;
5064 }
5065
5066 if (!writer->WriteVarInt62(ack_block_count)) {
5067 set_detailed_error("No room for ack block count in ack frame");
5068 return false;
5069 }
5070
5071 uint64_t first_ack_block = ack_block_largest - ack_block_smallest;
5072 if (!writer->WriteVarInt62(first_ack_block)) {
5073 set_detailed_error("No room for first ack block in ack frame");
5074 return false;
5075 }
5076
5077 // For the remaining QuicAckFrame Intervals, if any
5078 while (ack_block_count != 0) {
5079 uint64_t gap_size = ack_block_smallest - itr->max();
5080 if (!writer->WriteVarInt62(gap_size - 1)) {
5081 set_detailed_error("No room for gap block in ack frame");
5082 return false;
5083 }
5084
5085 uint64_t block_size = itr->max() - itr->min();
5086 if (!writer->WriteVarInt62(block_size - 1)) {
5087 set_detailed_error("No room for nth ack block in ack frame");
5088 return false;
5089 }
5090
5091 ack_block_smallest = itr->min();
5092 itr++;
5093 ack_block_count--;
5094 }
5095 return true;
5096}
5097
5098bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame,
5099 QuicDataWriter* writer) {
5100 if (version_.transport_version == QUIC_VERSION_99) {
5101 return AppendIetfResetStreamFrame(frame, writer);
5102 }
5103 if (!writer->WriteUInt32(frame.stream_id)) {
5104 return false;
5105 }
5106
5107 if (!writer->WriteUInt64(frame.byte_offset)) {
5108 return false;
5109 }
5110
5111 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5112 if (!writer->WriteUInt32(error_code)) {
5113 return false;
5114 }
5115
5116 return true;
5117}
5118
5119bool QuicFramer::AppendConnectionCloseFrame(
5120 const QuicConnectionCloseFrame& frame,
5121 QuicDataWriter* writer) {
5122 if (version_.transport_version == QUIC_VERSION_99) {
5123 return AppendIetfConnectionCloseFrame(frame, writer);
5124 }
fkastenholze9d71a82019-04-09 05:12:13 -07005125 uint32_t error_code = static_cast<uint32_t>(frame.quic_error_code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005126 if (!writer->WriteUInt32(error_code)) {
5127 return false;
5128 }
5129 if (!writer->WriteStringPiece16(TruncateErrorString(frame.error_details))) {
5130 return false;
5131 }
5132 return true;
5133}
5134
5135bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame,
5136 QuicDataWriter* writer) {
5137 uint32_t error_code = static_cast<uint32_t>(frame.error_code);
5138 if (!writer->WriteUInt32(error_code)) {
5139 return false;
5140 }
5141 uint32_t stream_id = static_cast<uint32_t>(frame.last_good_stream_id);
5142 if (!writer->WriteUInt32(stream_id)) {
5143 return false;
5144 }
5145 if (!writer->WriteStringPiece16(TruncateErrorString(frame.reason_phrase))) {
5146 return false;
5147 }
5148 return true;
5149}
5150
5151bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
5152 QuicDataWriter* writer) {
5153 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5154 if (!writer->WriteUInt32(stream_id)) {
5155 return false;
5156 }
5157 if (!writer->WriteUInt64(frame.byte_offset)) {
5158 return false;
5159 }
5160 return true;
5161}
5162
5163bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame,
5164 QuicDataWriter* writer) {
5165 if (version_.transport_version == QUIC_VERSION_99) {
5166 if (frame.stream_id == QuicUtils::GetInvalidStreamId(transport_version())) {
5167 return AppendIetfBlockedFrame(frame, writer);
5168 }
5169 return AppendStreamBlockedFrame(frame, writer);
5170 }
5171 uint32_t stream_id = static_cast<uint32_t>(frame.stream_id);
5172 if (!writer->WriteUInt32(stream_id)) {
5173 return false;
5174 }
5175 return true;
5176}
5177
5178bool QuicFramer::AppendPaddingFrame(const QuicPaddingFrame& frame,
5179 QuicDataWriter* writer) {
5180 if (frame.num_padding_bytes == 0) {
5181 return false;
5182 }
5183 if (frame.num_padding_bytes < 0) {
5184 QUIC_BUG_IF(frame.num_padding_bytes != -1);
5185 writer->WritePadding();
5186 return true;
5187 }
5188 // Please note, num_padding_bytes includes type byte which has been written.
5189 return writer->WritePaddingBytes(frame.num_padding_bytes - 1);
5190}
5191
5192bool QuicFramer::AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
5193 bool last_frame_in_packet,
5194 QuicDataWriter* writer) {
5195 uint8_t type_byte = last_frame_in_packet ? IETF_EXTENSION_MESSAGE_NO_LENGTH
5196 : IETF_EXTENSION_MESSAGE;
5197 if (!writer->WriteUInt8(type_byte)) {
5198 return false;
5199 }
5200 if (!last_frame_in_packet && !writer->WriteVarInt62(frame.message_length)) {
5201 return false;
5202 }
5203 for (const auto& slice : frame.message_data) {
5204 if (!writer->WriteBytes(slice.data(), slice.length())) {
5205 return false;
5206 }
5207 }
5208 return true;
5209}
5210
5211bool QuicFramer::RaiseError(QuicErrorCode error) {
5212 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error)
5213 << " detail: " << detailed_error_;
5214 set_error(error);
5215 visitor_->OnError(this);
5216 return false;
5217}
5218
5219bool QuicFramer::IsVersionNegotiation(
5220 const QuicPacketHeader& header,
5221 bool packet_has_ietf_packet_header) const {
5222 if (perspective_ == Perspective::IS_SERVER) {
5223 return false;
5224 }
5225 if (!packet_has_ietf_packet_header) {
5226 return header.version_flag;
5227 }
5228 if (header.form == IETF_QUIC_SHORT_HEADER_PACKET) {
5229 return false;
5230 }
5231 return header.long_packet_type == VERSION_NEGOTIATION;
5232}
5233
QUICHE teama6ef0a62019-03-07 20:34:33 -05005234bool QuicFramer::AppendIetfConnectionCloseFrame(
5235 const QuicConnectionCloseFrame& frame,
5236 QuicDataWriter* writer) {
fkastenholz72f509b2019-04-10 09:17:49 -07005237 if (frame.close_type != IETF_QUIC_TRANSPORT_CONNECTION_CLOSE &&
5238 frame.close_type != IETF_QUIC_APPLICATION_CONNECTION_CLOSE) {
5239 QUIC_BUG << "Invalid close_type for writing IETF CONNECTION CLOSE.";
5240 set_detailed_error("Invalid close_type for writing IETF CONNECTION CLOSE.");
5241 return false;
5242 }
5243
fkastenholze9d71a82019-04-09 05:12:13 -07005244 if (!writer->WriteUInt16(frame.application_error_code)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05005245 set_detailed_error("Can not write connection close frame error code");
5246 return false;
5247 }
fkastenholze9d71a82019-04-09 05:12:13 -07005248
fkastenholz72f509b2019-04-10 09:17:49 -07005249 if (frame.close_type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5250 // Write the frame-type of the frame causing the error only
5251 // if it's a CONNECTION_CLOSE/Transport.
5252 if (!writer->WriteVarInt62(frame.transport_close_frame_type)) {
5253 set_detailed_error("Writing frame type failed.");
5254 return false;
5255 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005256 }
5257
fkastenholz72f509b2019-04-10 09:17:49 -07005258 // TODO(fkastenholz): For full IETF CONNECTION CLOSE support,
5259 // if this is a Transport CONNECTION_CLOSE and the extended
5260 // error is not QUIC_IETF_GQUIC_ERROR_MISSING then append the extended
5261 // "QuicErrorCode: #" string to the phrase.
QUICHE teama6ef0a62019-03-07 20:34:33 -05005262 if (!writer->WriteStringPieceVarInt62(
5263 TruncateErrorString(frame.error_details))) {
5264 set_detailed_error("Can not write connection close phrase");
5265 return false;
5266 }
5267 return true;
5268}
5269
QUICHE teama6ef0a62019-03-07 20:34:33 -05005270bool QuicFramer::ProcessIetfConnectionCloseFrame(
5271 QuicDataReader* reader,
fkastenholze9d71a82019-04-09 05:12:13 -07005272 QuicConnectionCloseType type,
QUICHE teama6ef0a62019-03-07 20:34:33 -05005273 QuicConnectionCloseFrame* frame) {
fkastenholze9d71a82019-04-09 05:12:13 -07005274 frame->close_type = type;
QUICHE teama6ef0a62019-03-07 20:34:33 -05005275 uint16_t code;
5276 if (!reader->ReadUInt16(&code)) {
5277 set_detailed_error("Unable to read connection close error code.");
5278 return false;
5279 }
fkastenholze9d71a82019-04-09 05:12:13 -07005280 frame->transport_error_code = static_cast<QuicIetfTransportErrorCodes>(code);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005281
fkastenholz72f509b2019-04-10 09:17:49 -07005282 if (type == IETF_QUIC_TRANSPORT_CONNECTION_CLOSE) {
5283 // The frame-type of the frame causing the error is present only
5284 // if it's a CONNECTION_CLOSE/Transport.
5285 if (!reader->ReadVarInt62(&frame->transport_close_frame_type)) {
5286 set_detailed_error("Unable to read connection close frame type.");
5287 return false;
5288 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05005289 }
5290
5291 uint64_t phrase_length;
5292 if (!reader->ReadVarInt62(&phrase_length)) {
5293 set_detailed_error("Unable to read connection close error details.");
5294 return false;
5295 }
5296 QuicStringPiece phrase;
5297 if (!reader->ReadStringPiece(&phrase, static_cast<size_t>(phrase_length))) {
5298 set_detailed_error("Unable to read connection close error details.");
5299 return false;
5300 }
fkastenholz72f509b2019-04-10 09:17:49 -07005301 // TODO(fkastenholz): when full support is done, add code here
5302 // to extract the extended error code from the reason phrase
5303 // and set it into frame->extracted_error_code.
vasilvvc48c8712019-03-11 13:38:16 -07005304 frame->error_details = std::string(phrase);
QUICHE teama6ef0a62019-03-07 20:34:33 -05005305
5306 return true;
5307}
5308
5309// IETF Quic Path Challenge/Response frames.
5310bool QuicFramer::ProcessPathChallengeFrame(QuicDataReader* reader,
5311 QuicPathChallengeFrame* frame) {
5312 if (!reader->ReadBytes(frame->data_buffer.data(),
5313 frame->data_buffer.size())) {
5314 set_detailed_error("Can not read path challenge data.");
5315 return false;
5316 }
5317 return true;
5318}
5319
5320bool QuicFramer::ProcessPathResponseFrame(QuicDataReader* reader,
5321 QuicPathResponseFrame* frame) {
5322 if (!reader->ReadBytes(frame->data_buffer.data(),
5323 frame->data_buffer.size())) {
5324 set_detailed_error("Can not read path response data.");
5325 return false;
5326 }
5327 return true;
5328}
5329
5330bool QuicFramer::AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
5331 QuicDataWriter* writer) {
5332 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5333 set_detailed_error("Writing Path Challenge data failed.");
5334 return false;
5335 }
5336 return true;
5337}
5338
5339bool QuicFramer::AppendPathResponseFrame(const QuicPathResponseFrame& frame,
5340 QuicDataWriter* writer) {
5341 if (!writer->WriteBytes(frame.data_buffer.data(), frame.data_buffer.size())) {
5342 set_detailed_error("Writing Path Response data failed.");
5343 return false;
5344 }
5345 return true;
5346}
5347
5348// Add a new ietf-format stream reset frame.
5349// General format is
5350// stream id
5351// application error code
5352// final offset
5353bool QuicFramer::AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
5354 QuicDataWriter* writer) {
5355 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.stream_id))) {
5356 set_detailed_error("Writing reset-stream stream id failed.");
5357 return false;
5358 }
5359 if (!writer->WriteUInt16(frame.ietf_error_code)) {
5360 set_detailed_error("Writing reset-stream error code failed.");
5361 return false;
5362 }
5363 if (!writer->WriteVarInt62(static_cast<uint64_t>(frame.byte_offset))) {
5364 set_detailed_error("Writing reset-stream final-offset failed.");
5365 return false;
5366 }
5367 return true;
5368}
5369
5370bool QuicFramer::ProcessIetfResetStreamFrame(QuicDataReader* reader,
5371 QuicRstStreamFrame* frame) {
5372 // Get Stream ID from frame. ReadVarIntStreamID returns false
5373 // if either A) there is a read error or B) the resulting value of
5374 // the Stream ID is larger than the maximum allowed value.
5375 if (!reader->ReadVarIntStreamId(&frame->stream_id)) {
5376 set_detailed_error("Unable to read rst stream stream id.");
5377 return false;
5378 }
5379
5380 if (!reader->ReadUInt16(&frame->ietf_error_code)) {
5381 set_detailed_error("Unable to read rst stream error code.");
5382 return false;
5383 }
5384
5385 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5386 set_detailed_error("Unable to read rst stream sent byte offset.");
5387 return false;
5388 }
5389 return true;
5390}
5391
5392bool QuicFramer::ProcessStopSendingFrame(
5393 QuicDataReader* reader,
5394 QuicStopSendingFrame* stop_sending_frame) {
5395 if (!reader->ReadVarIntStreamId(&stop_sending_frame->stream_id)) {
5396 set_detailed_error("Unable to read stop sending stream id.");
5397 return false;
5398 }
5399
5400 if (!reader->ReadUInt16(&stop_sending_frame->application_error_code)) {
5401 set_detailed_error("Unable to read stop sending application error code.");
5402 return false;
5403 }
5404 return true;
5405}
5406
5407bool QuicFramer::AppendStopSendingFrame(
5408 const QuicStopSendingFrame& stop_sending_frame,
5409 QuicDataWriter* writer) {
5410 if (!writer->WriteVarInt62(stop_sending_frame.stream_id)) {
5411 set_detailed_error("Can not write stop sending stream id");
5412 return false;
5413 }
5414 if (!writer->WriteUInt16(stop_sending_frame.application_error_code)) {
5415 set_detailed_error("Can not write application error code");
5416 return false;
5417 }
5418 return true;
5419}
5420
5421// Append/process IETF-Format MAX_DATA Frame
5422bool QuicFramer::AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
5423 QuicDataWriter* writer) {
5424 if (!writer->WriteVarInt62(frame.byte_offset)) {
5425 set_detailed_error("Can not write MAX_DATA byte-offset");
5426 return false;
5427 }
5428 return true;
5429}
5430
5431bool QuicFramer::ProcessMaxDataFrame(QuicDataReader* reader,
5432 QuicWindowUpdateFrame* frame) {
5433 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5434 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5435 set_detailed_error("Can not read MAX_DATA byte-offset");
5436 return false;
5437 }
5438 return true;
5439}
5440
5441// Append/process IETF-Format MAX_STREAM_DATA Frame
5442bool QuicFramer::AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
5443 QuicDataWriter* writer) {
5444 if (!writer->WriteVarInt62(frame.stream_id)) {
5445 set_detailed_error("Can not write MAX_STREAM_DATA stream id");
5446 return false;
5447 }
5448 if (!writer->WriteVarInt62(frame.byte_offset)) {
5449 set_detailed_error("Can not write MAX_STREAM_DATA byte-offset");
5450 return false;
5451 }
5452 return true;
5453}
5454
5455bool QuicFramer::ProcessMaxStreamDataFrame(QuicDataReader* reader,
5456 QuicWindowUpdateFrame* frame) {
5457 if (!reader->ReadVarIntStreamId(&frame->stream_id)) {
5458 set_detailed_error("Can not read MAX_STREAM_DATA stream id");
5459 return false;
5460 }
5461 if (!reader->ReadVarInt62(&frame->byte_offset)) {
5462 set_detailed_error("Can not read MAX_STREAM_DATA byte-count");
5463 return false;
5464 }
5465 return true;
5466}
5467
5468bool QuicFramer::AppendMaxStreamsFrame(const QuicMaxStreamIdFrame& frame,
5469 QuicDataWriter* writer) {
5470 // Convert from the stream id on which the connection is blocked to a count
5471 QuicStreamId stream_count =
5472 StreamIdToCount(version_.transport_version, frame.max_stream_id);
5473
5474 if (!writer->WriteVarInt62(stream_count)) {
5475 set_detailed_error("Can not write MAX_STREAMS stream count");
5476 return false;
5477 }
5478 return true;
5479}
5480
5481bool QuicFramer::ProcessMaxStreamsFrame(QuicDataReader* reader,
5482 QuicMaxStreamIdFrame* frame,
5483 uint64_t frame_type) {
5484 QuicStreamId received_stream_count;
5485 if (!reader->ReadVarIntStreamId(&received_stream_count)) {
5486 set_detailed_error("Can not read MAX_STREAMS stream count.");
5487 return false;
5488 }
5489 // TODO(fkastenholz): handle properly when the STREAMS_BLOCKED
5490 // frame is implemented and passed up to the stream ID manager.
5491 if (received_stream_count == 0) {
5492 set_detailed_error("MAX_STREAMS stream count of 0 not supported.");
5493 return false;
5494 }
5495 // Note that this code assumes that the only possible error that
5496 // StreamCountToId can detect is that the stream count is too big or is 0.
5497 // Too big is prevented by passing in the minimum of the received count
5498 // and the maximum supported count, ensuring that the stream ID is
5499 // pegged at the maximum allowed ID.
5500 // count==0 is handled above, so that detailed_error_ may be set
5501 // properly.
5502 return StreamCountToId(
5503 std::min(
5504 received_stream_count,
5505 GetMaxStreamCount((frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL),
5506 perspective_)),
5507 /*unidirectional=*/(frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL),
5508 perspective_, version_.transport_version, &frame->max_stream_id);
5509}
5510
5511bool QuicFramer::AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
5512 QuicDataWriter* writer) {
5513 if (!writer->WriteVarInt62(frame.offset)) {
5514 set_detailed_error("Can not write blocked offset.");
5515 return false;
5516 }
5517 return true;
5518}
5519
5520bool QuicFramer::ProcessIetfBlockedFrame(QuicDataReader* reader,
5521 QuicBlockedFrame* frame) {
5522 // Indicates that it is a BLOCKED frame (as opposed to STREAM_BLOCKED).
5523 frame->stream_id = QuicUtils::GetInvalidStreamId(transport_version());
5524 if (!reader->ReadVarInt62(&frame->offset)) {
5525 set_detailed_error("Can not read blocked offset.");
5526 return false;
5527 }
5528 return true;
5529}
5530
5531bool QuicFramer::AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
5532 QuicDataWriter* writer) {
5533 if (!writer->WriteVarInt62(frame.stream_id)) {
5534 set_detailed_error("Can not write stream blocked stream id.");
5535 return false;
5536 }
5537 if (!writer->WriteVarInt62(frame.offset)) {
5538 set_detailed_error("Can not write stream blocked offset.");
5539 return false;
5540 }
5541 return true;
5542}
5543
5544bool QuicFramer::ProcessStreamBlockedFrame(QuicDataReader* reader,
5545 QuicBlockedFrame* frame) {
5546 if (!reader->ReadVarIntStreamId(&frame->stream_id)) {
5547 set_detailed_error("Can not read stream blocked stream id.");
5548 return false;
5549 }
5550 if (!reader->ReadVarInt62(&frame->offset)) {
5551 set_detailed_error("Can not read stream blocked offset.");
5552 return false;
5553 }
5554 return true;
5555}
5556
5557bool QuicFramer::AppendStreamsBlockedFrame(
5558 const QuicStreamIdBlockedFrame& frame,
5559 QuicDataWriter* writer) {
5560 // Convert from the stream id on which the connection is blocked to a count
5561 QuicStreamId stream_count =
5562 StreamIdToCount(version_.transport_version, frame.stream_id);
5563
5564 if (!writer->WriteVarInt62(stream_count)) {
5565 set_detailed_error("Can not write STREAMS_BLOCKED stream count");
5566 return false;
5567 }
5568 return true;
5569}
5570
5571bool QuicFramer::ProcessStreamsBlockedFrame(QuicDataReader* reader,
5572 QuicStreamIdBlockedFrame* frame,
5573 uint64_t frame_type) {
5574 QuicStreamId received_stream_count;
5575 if (!reader->ReadVarIntStreamId(&received_stream_count)) {
5576 set_detailed_error("Can not read STREAMS_BLOCKED stream id.");
5577 return false;
5578 }
5579 // TODO(fkastenholz): handle properly when the STREAMS_BLOCKED
5580 // frame is implemented and passed up to the stream ID manager.
5581 if (received_stream_count == 0) {
5582 set_detailed_error("STREAMS_BLOCKED stream count 0 not supported.");
5583 return false;
5584 }
5585 // TODO(fkastenholz): handle properly when the STREAMS_BLOCKED
5586 // frame is implemented and passed up to the stream ID manager.
5587 if (received_stream_count >
5588 GetMaxStreamCount((frame_type == IETF_MAX_STREAMS_UNIDIRECTIONAL),
5589 ((perspective_ == Perspective::IS_CLIENT)
5590 ? Perspective::IS_SERVER
5591 : Perspective::IS_CLIENT))) {
5592 // If stream count is such that the resulting stream ID would exceed our
5593 // implementation limit, generate an error.
5594 set_detailed_error(
5595 "STREAMS_BLOCKED stream count exceeds implementation limit.");
5596 return false;
5597 }
5598 // Convert the stream count to an ID that can be used.
5599 // The STREAMS_BLOCKED frame is a request for more streams
5600 // that the peer will initiate. If this node is a client, it
5601 // means that the peer is a server, and wants server-initiated
5602 // stream IDs.
5603 return StreamCountToId(
5604 received_stream_count,
5605 /*unidirectional=*/(frame_type == IETF_STREAMS_BLOCKED_UNIDIRECTIONAL),
5606 (perspective_ == Perspective::IS_CLIENT) ? Perspective::IS_SERVER
5607 : Perspective::IS_CLIENT,
5608 version_.transport_version, &frame->stream_id);
5609}
5610
5611bool QuicFramer::AppendNewConnectionIdFrame(
5612 const QuicNewConnectionIdFrame& frame,
5613 QuicDataWriter* writer) {
5614 if (!writer->WriteVarInt62(frame.sequence_number)) {
5615 set_detailed_error("Can not write New Connection ID sequence number");
5616 return false;
5617 }
5618 if (!writer->WriteUInt8(frame.connection_id.length())) {
5619 set_detailed_error(
5620 "Can not write New Connection ID frame connection ID Length");
5621 return false;
5622 }
5623 if (!writer->WriteConnectionId(frame.connection_id)) {
5624 set_detailed_error("Can not write New Connection ID frame connection ID");
5625 return false;
5626 }
5627
5628 if (!writer->WriteBytes(
5629 static_cast<const void*>(&frame.stateless_reset_token),
5630 sizeof(frame.stateless_reset_token))) {
5631 set_detailed_error("Can not write New Connection ID Reset Token");
5632 return false;
5633 }
5634 return true;
5635}
5636
5637bool QuicFramer::ProcessNewConnectionIdFrame(QuicDataReader* reader,
5638 QuicNewConnectionIdFrame* frame) {
5639 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5640 set_detailed_error(
5641 "Unable to read new connection ID frame sequence number.");
5642 return false;
5643 }
5644
5645 uint8_t connection_id_length;
5646 if (!reader->ReadUInt8(&connection_id_length)) {
5647 set_detailed_error(
5648 "Unable to read new connection ID frame connection id length.");
5649 return false;
5650 }
5651
QUICHE team0131a5b2019-03-20 15:23:27 -07005652 if (connection_id_length > kQuicMaxConnectionIdLength) {
5653 set_detailed_error("New connection ID length too high.");
5654 return false;
5655 }
5656
QUICHE team8e2e4532019-03-14 14:37:56 -07005657 if (connection_id_length != kQuicDefaultConnectionIdLength &&
5658 !QuicUtils::VariableLengthConnectionIdAllowedForVersion(
5659 transport_version())) {
QUICHE team0131a5b2019-03-20 15:23:27 -07005660 set_detailed_error("Invalid new connection ID length for version.");
QUICHE teama6ef0a62019-03-07 20:34:33 -05005661 return false;
5662 }
5663
5664 if (!reader->ReadConnectionId(&frame->connection_id, connection_id_length)) {
5665 set_detailed_error("Unable to read new connection ID frame connection id.");
5666 return false;
5667 }
5668
5669 if (!reader->ReadBytes(&frame->stateless_reset_token,
5670 sizeof(frame->stateless_reset_token))) {
5671 set_detailed_error("Can not read new connection ID frame reset token.");
5672 return false;
5673 }
5674 return true;
5675}
5676
5677bool QuicFramer::AppendRetireConnectionIdFrame(
5678 const QuicRetireConnectionIdFrame& frame,
5679 QuicDataWriter* writer) {
5680 if (!writer->WriteVarInt62(frame.sequence_number)) {
5681 set_detailed_error("Can not write Retire Connection ID sequence number");
5682 return false;
5683 }
5684 return true;
5685}
5686
5687bool QuicFramer::ProcessRetireConnectionIdFrame(
5688 QuicDataReader* reader,
5689 QuicRetireConnectionIdFrame* frame) {
5690 if (!reader->ReadVarInt62(&frame->sequence_number)) {
5691 set_detailed_error(
5692 "Unable to read retire connection ID frame sequence number.");
5693 return false;
5694 }
5695 return true;
5696}
5697
5698uint8_t QuicFramer::GetStreamFrameTypeByte(const QuicStreamFrame& frame,
5699 bool last_frame_in_packet) const {
5700 if (version_.transport_version == QUIC_VERSION_99) {
5701 return GetIetfStreamFrameTypeByte(frame, last_frame_in_packet);
5702 }
5703 uint8_t type_byte = 0;
5704 // Fin bit.
5705 type_byte |= frame.fin ? kQuicStreamFinMask : 0;
5706
5707 // Data Length bit.
5708 type_byte <<= kQuicStreamDataLengthShift;
5709 type_byte |= last_frame_in_packet ? 0 : kQuicStreamDataLengthMask;
5710
5711 // Offset 3 bits.
5712 type_byte <<= kQuicStreamShift;
5713 const size_t offset_len =
5714 GetStreamOffsetSize(version_.transport_version, frame.offset);
5715 if (offset_len > 0) {
5716 type_byte |= offset_len - 1;
5717 }
5718
5719 // stream id 2 bits.
5720 type_byte <<= kQuicStreamIdShift;
5721 type_byte |= GetStreamIdSize(frame.stream_id) - 1;
5722 type_byte |= kQuicFrameTypeStreamMask; // Set Stream Frame Type to 1.
5723
5724 return type_byte;
5725}
5726
5727uint8_t QuicFramer::GetIetfStreamFrameTypeByte(
5728 const QuicStreamFrame& frame,
5729 bool last_frame_in_packet) const {
5730 DCHECK_EQ(QUIC_VERSION_99, version_.transport_version);
5731 uint8_t type_byte = IETF_STREAM;
5732 if (!last_frame_in_packet) {
5733 type_byte |= IETF_STREAM_FRAME_LEN_BIT;
5734 }
5735 if (frame.offset != 0) {
5736 type_byte |= IETF_STREAM_FRAME_OFF_BIT;
5737 }
5738 if (frame.fin) {
5739 type_byte |= IETF_STREAM_FRAME_FIN_BIT;
5740 }
5741 return type_byte;
5742}
5743
5744void QuicFramer::InferPacketHeaderTypeFromVersion() {
5745 // This function should only be called when server connection negotiates the
5746 // version.
5747 DCHECK(perspective_ == Perspective::IS_SERVER &&
5748 !infer_packet_header_type_from_version_);
5749 infer_packet_header_type_from_version_ = true;
5750}
5751
QUICHE team10b22a12019-03-21 15:31:42 -07005752void QuicFramer::EnableMultiplePacketNumberSpacesSupport() {
5753 if (supports_multiple_packet_number_spaces_) {
5754 QUIC_BUG << "Multiple packet number spaces has already been enabled";
5755 return;
5756 }
5757 if (largest_packet_number_.IsInitialized()) {
5758 QUIC_BUG << "Try to enable multiple packet number spaces support after any "
5759 "packet has been received.";
5760 return;
5761 }
5762
5763 supports_multiple_packet_number_spaces_ = true;
5764}
5765
QUICHE teama6ef0a62019-03-07 20:34:33 -05005766#undef ENDPOINT // undef for jumbo builds
5767} // namespace quic