blob: fe3565e3436f9fcedf75746d477a40a322a81c98 [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#ifndef QUICHE_QUIC_CORE_QUIC_FRAMER_H_
6#define QUICHE_QUIC_CORE_QUIC_FRAMER_H_
7
8#include <cstddef>
9#include <cstdint>
10#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -070011#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050012
13#include "base/macros.h"
14#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
16#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
17#include "net/third_party/quiche/src/quic/core/quic_packets.h"
18#include "net/third_party/quiche/src/quic/platform/api/quic_endian.h"
19#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050020#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
21
22namespace quic {
23
24namespace test {
25class QuicFramerPeer;
26} // namespace test
27
28class QuicDataReader;
29class QuicDataWriter;
30class QuicFramer;
31class QuicStreamFrameDataProducer;
32
33// Number of bytes reserved for the frame type preceding each frame.
34const size_t kQuicFrameTypeSize = 1;
35// Number of bytes reserved for error code.
36const size_t kQuicErrorCodeSize = 4;
37// Number of bytes reserved to denote the length of error details field.
38const size_t kQuicErrorDetailsLengthSize = 2;
39
40// Maximum number of bytes reserved for stream id.
41const size_t kQuicMaxStreamIdSize = 4;
42// Maximum number of bytes reserved for byte offset in stream frame.
43const size_t kQuicMaxStreamOffsetSize = 8;
44// Number of bytes reserved to store payload length in stream frame.
45const size_t kQuicStreamPayloadLengthSize = 2;
46// Number of bytes to reserve for IQ Error codes (for the Connection Close,
47// Application Close, and Reset Stream frames).
48const size_t kQuicIetfQuicErrorCodeSize = 2;
49// Minimum size of the IETF QUIC Error Phrase's length field
50const size_t kIetfQuicMinErrorPhraseLengthSize = 1;
51
52// Size in bytes reserved for the delta time of the largest observed
53// packet number in ack frames.
54const size_t kQuicDeltaTimeLargestObservedSize = 2;
55// Size in bytes reserved for the number of received packets with timestamps.
56const size_t kQuicNumTimestampsSize = 1;
57// Size in bytes reserved for the number of missing packets in ack frames.
58const size_t kNumberOfNackRangesSize = 1;
59// Size in bytes reserved for the number of ack blocks in ack frames.
60const size_t kNumberOfAckBlocksSize = 1;
61// Maximum number of missing packet ranges that can fit within an ack frame.
62const size_t kMaxNackRanges = (1 << (kNumberOfNackRangesSize * 8)) - 1;
63// Maximum number of ack blocks that can fit within an ack frame.
64const size_t kMaxAckBlocks = (1 << (kNumberOfAckBlocksSize * 8)) - 1;
65
66// This class receives callbacks from the framer when packets
67// are processed.
68class QUIC_EXPORT_PRIVATE QuicFramerVisitorInterface {
69 public:
70 virtual ~QuicFramerVisitorInterface() {}
71
72 // Called if an error is detected in the QUIC protocol.
73 virtual void OnError(QuicFramer* framer) = 0;
74
75 // Called only when |perspective_| is IS_SERVER and the framer gets a
76 // packet with version flag true and the version on the packet doesn't match
77 // |quic_version_|. The visitor should return true after it updates the
78 // version of the |framer_| to |received_version| or false to stop processing
79 // this packet.
80 virtual bool OnProtocolVersionMismatch(ParsedQuicVersion received_version,
81 PacketHeaderFormat form) = 0;
82
83 // Called when a new packet has been received, before it
84 // has been validated or processed.
85 virtual void OnPacket() = 0;
86
87 // Called when a public reset packet has been parsed but has not yet
88 // been validated.
89 virtual void OnPublicResetPacket(const QuicPublicResetPacket& packet) = 0;
90
91 // Called only when |perspective_| is IS_CLIENT and a version negotiation
92 // packet has been parsed.
93 virtual void OnVersionNegotiationPacket(
94 const QuicVersionNegotiationPacket& packet) = 0;
95
96 // Called when all fields except packet number has been parsed, but has not
97 // been authenticated. If it returns false, framing for this packet will
98 // cease.
99 virtual bool OnUnauthenticatedPublicHeader(
100 const QuicPacketHeader& header) = 0;
101
102 // Called when the unauthenticated portion of the header has been parsed.
103 // If OnUnauthenticatedHeader returns false, framing for this packet will
104 // cease.
105 virtual bool OnUnauthenticatedHeader(const QuicPacketHeader& header) = 0;
106
107 // Called when a packet has been decrypted. |level| is the encryption level
108 // of the packet.
109 virtual void OnDecryptedPacket(EncryptionLevel level) = 0;
110
111 // Called when the complete header of a packet had been parsed.
112 // If OnPacketHeader returns false, framing for this packet will cease.
113 virtual bool OnPacketHeader(const QuicPacketHeader& header) = 0;
114
115 // Called when the packet being processed contains multiple IETF QUIC packets,
116 // which is due to there being more data after what is covered by the length
117 // field. |packet| contains the remaining data which can be processed.
118 // Note that this is called when the framer parses the length field, before
119 // it attempts to decrypt the first payload. It is the visitor's
120 // responsibility to buffer the packet and call ProcessPacket on it
121 // after the framer is done parsing the current payload. |packet| does not
122 // own its internal buffer, the visitor should make a copy of it.
123 virtual void OnCoalescedPacket(const QuicEncryptedPacket& packet) = 0;
124
125 // Called when a StreamFrame has been parsed.
126 virtual bool OnStreamFrame(const QuicStreamFrame& frame) = 0;
127
128 // Called when a CRYPTO frame has been parsed.
129 virtual bool OnCryptoFrame(const QuicCryptoFrame& frame) = 0;
130
131 // Called when largest acked of an AckFrame has been parsed.
132 virtual bool OnAckFrameStart(QuicPacketNumber largest_acked,
133 QuicTime::Delta ack_delay_time) = 0;
134
135 // Called when ack range [start, end) of an AckFrame has been parsed.
136 virtual bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) = 0;
137
138 // Called when a timestamp in the AckFrame has been parsed.
139 virtual bool OnAckTimestamp(QuicPacketNumber packet_number,
140 QuicTime timestamp) = 0;
141
142 // Called after the last ack range in an AckFrame has been parsed.
143 // |start| is the starting value of the last ack range.
144 virtual bool OnAckFrameEnd(QuicPacketNumber start) = 0;
145
146 // Called when a StopWaitingFrame has been parsed.
147 virtual bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) = 0;
148
149 // Called when a QuicPaddingFrame has been parsed.
150 virtual bool OnPaddingFrame(const QuicPaddingFrame& frame) = 0;
151
152 // Called when a PingFrame has been parsed.
153 virtual bool OnPingFrame(const QuicPingFrame& frame) = 0;
154
155 // Called when a RstStreamFrame has been parsed.
156 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) = 0;
157
158 // Called when a ConnectionCloseFrame has been parsed.
159 virtual bool OnConnectionCloseFrame(
160 const QuicConnectionCloseFrame& frame) = 0;
161
162 // Called when an IETF ApplicationCloseFrame has been parsed.
163 virtual bool OnApplicationCloseFrame(
164 const QuicApplicationCloseFrame& frame) = 0;
165
166 // Called when a StopSendingFrame has been parsed.
167 virtual bool OnStopSendingFrame(const QuicStopSendingFrame& frame) = 0;
168
169 // Called when a PathChallengeFrame has been parsed.
170 virtual bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) = 0;
171
172 // Called when a PathResponseFrame has been parsed.
173 virtual bool OnPathResponseFrame(const QuicPathResponseFrame& frame) = 0;
174
175 // Called when a GoAwayFrame has been parsed.
176 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) = 0;
177
178 // Called when a WindowUpdateFrame has been parsed.
179 virtual bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) = 0;
180
181 // Called when a BlockedFrame has been parsed.
182 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) = 0;
183
184 // Called when a NewConnectionIdFrame has been parsed.
185 virtual bool OnNewConnectionIdFrame(
186 const QuicNewConnectionIdFrame& frame) = 0;
187
188 // Called when a RetireConnectionIdFrame has been parsed.
189 virtual bool OnRetireConnectionIdFrame(
190 const QuicRetireConnectionIdFrame& frame) = 0;
191
192 // Called when a NewTokenFrame has been parsed.
193 virtual bool OnNewTokenFrame(const QuicNewTokenFrame& frame) = 0;
194
195 // Called when a message frame has been parsed.
196 virtual bool OnMessageFrame(const QuicMessageFrame& frame) = 0;
197
198 // Called when a packet has been completely processed.
199 virtual void OnPacketComplete() = 0;
200
201 // Called to check whether |token| is a valid stateless reset token.
202 virtual bool IsValidStatelessResetToken(QuicUint128 token) const = 0;
203
204 // Called when an IETF stateless reset packet has been parsed and validated
205 // with the stateless reset token.
206 virtual void OnAuthenticatedIetfStatelessResetPacket(
207 const QuicIetfStatelessResetPacket& packet) = 0;
208
209 // Called when an IETF MaxStreamId frame has been parsed.
210 virtual bool OnMaxStreamIdFrame(const QuicMaxStreamIdFrame& frame) = 0;
211
212 // Called when an IETF StreamIdBlocked frame has been parsed.
213 virtual bool OnStreamIdBlockedFrame(
214 const QuicStreamIdBlockedFrame& frame) = 0;
215};
216
217// Class for parsing and constructing QUIC packets. It has a
218// QuicFramerVisitorInterface that is called when packets are parsed.
219class QUIC_EXPORT_PRIVATE QuicFramer {
220 public:
221 // Constructs a new framer that installs a kNULL QuicEncrypter and
222 // QuicDecrypter for level ENCRYPTION_NONE. |supported_versions| specifies the
223 // list of supported QUIC versions. |quic_version_| is set to the maximum
224 // version in |supported_versions|.
225 QuicFramer(const ParsedQuicVersionVector& supported_versions,
226 QuicTime creation_time,
227 Perspective perspective,
228 uint8_t expected_connection_id_length);
229 QuicFramer(const QuicFramer&) = delete;
230 QuicFramer& operator=(const QuicFramer&) = delete;
231
232 virtual ~QuicFramer();
233
234 // Returns true if |version| is a supported transport version.
235 bool IsSupportedTransportVersion(const QuicTransportVersion version) const;
236
237 // Returns true if |version| is a supported protocol version.
238 bool IsSupportedVersion(const ParsedQuicVersion version) const;
239
240 // Set callbacks to be called from the framer. A visitor must be set, or
241 // else the framer will likely crash. It is acceptable for the visitor
242 // to do nothing. If this is called multiple times, only the last visitor
243 // will be used.
244 void set_visitor(QuicFramerVisitorInterface* visitor) { visitor_ = visitor; }
245
246 const ParsedQuicVersionVector& supported_versions() const {
247 return supported_versions_;
248 }
249
250 QuicTransportVersion transport_version() const {
251 return version_.transport_version;
252 }
253
254 ParsedQuicVersion version() const { return version_; }
255
256 void set_version(const ParsedQuicVersion version);
257
258 // Does not DCHECK for supported version. Used by tests to set unsupported
259 // version to trigger version negotiation.
260 void set_version_for_tests(const ParsedQuicVersion version) {
261 version_ = version;
262 }
263
264 QuicErrorCode error() const { return error_; }
265
266 // Allows enabling or disabling of timestamp processing and serialization.
267 void set_process_timestamps(bool process_timestamps) {
268 process_timestamps_ = process_timestamps;
269 }
270
271 // Pass a UDP packet into the framer for parsing.
272 // Return true if the packet was processed succesfully. |packet| must be a
273 // single, complete UDP packet (not a frame of a packet). This packet
274 // might be null padded past the end of the payload, which will be correctly
275 // ignored.
276 bool ProcessPacket(const QuicEncryptedPacket& packet);
277
278 // Largest size in bytes of all stream frame fields without the payload.
279 static size_t GetMinStreamFrameSize(QuicTransportVersion version,
280 QuicStreamId stream_id,
281 QuicStreamOffset offset,
282 bool last_frame_in_packet,
283 QuicPacketLength data_length);
284 // Returns the overhead of framing a CRYPTO frame with the specific offset and
285 // data length provided, but not counting the size of the data payload.
286 static size_t GetMinCryptoFrameSize(QuicStreamOffset offset,
287 QuicPacketLength data_length);
288 static size_t GetMessageFrameSize(QuicTransportVersion version,
289 bool last_frame_in_packet,
290 QuicByteCount length);
291 // Size in bytes of all ack frame fields without the missing packets or ack
292 // blocks.
293 static size_t GetMinAckFrameSize(
294 QuicTransportVersion version,
295 QuicPacketNumberLength largest_observed_length);
296 // Size in bytes of a stop waiting frame.
297 static size_t GetStopWaitingFrameSize(
298 QuicTransportVersion version,
299 QuicPacketNumberLength packet_number_length);
300 // Size in bytes of all reset stream frame fields.
301 static size_t GetRstStreamFrameSize(QuicTransportVersion version,
302 const QuicRstStreamFrame& frame);
303 // Size in bytes of all connection close frame fields without the error
304 // details and the missing packets from the enclosed ack frame.
305 static size_t GetMinConnectionCloseFrameSize(
306 QuicTransportVersion version,
307 const QuicConnectionCloseFrame& frame);
308 static size_t GetMinApplicationCloseFrameSize(
309 QuicTransportVersion version,
310 const QuicApplicationCloseFrame& frame);
311 // Size in bytes of all GoAway frame fields without the reason phrase.
312 static size_t GetMinGoAwayFrameSize();
313 // Size in bytes of all WindowUpdate frame fields.
314 // For version 99, determines whether a MAX DATA or MAX STREAM DATA frame will
315 // be generated and calculates the appropriate size.
316 static size_t GetWindowUpdateFrameSize(QuicTransportVersion version,
317 const QuicWindowUpdateFrame& frame);
318 // Size in bytes of all MaxStreams frame fields.
319 static size_t GetMaxStreamsFrameSize(QuicTransportVersion version,
320 const QuicMaxStreamIdFrame& frame);
321 // Size in bytes of all StreamsBlocked frame fields.
322 static size_t GetStreamsBlockedFrameSize(
323 QuicTransportVersion version,
324 const QuicStreamIdBlockedFrame& frame);
325 // Size in bytes of all Blocked frame fields.
326 static size_t GetBlockedFrameSize(QuicTransportVersion version,
327 const QuicBlockedFrame& frame);
328 // Size in bytes of PathChallenge frame.
329 static size_t GetPathChallengeFrameSize(const QuicPathChallengeFrame& frame);
330 // Size in bytes of PathResponse frame.
331 static size_t GetPathResponseFrameSize(const QuicPathResponseFrame& frame);
332 // Size in bytes required to serialize the stream id.
333 static size_t GetStreamIdSize(QuicStreamId stream_id);
334 // Size in bytes required to serialize the stream offset.
335 static size_t GetStreamOffsetSize(QuicTransportVersion version,
336 QuicStreamOffset offset);
337 // Size in bytes for a serialized new connection id frame
338 static size_t GetNewConnectionIdFrameSize(
339 const QuicNewConnectionIdFrame& frame);
340
341 // Size in bytes for a serialized retire connection id frame
342 static size_t GetRetireConnectionIdFrameSize(
343 const QuicRetireConnectionIdFrame& frame);
344
345 // Size in bytes for a serialized new token frame
346 static size_t GetNewTokenFrameSize(const QuicNewTokenFrame& frame);
347
348 // Size in bytes required for a serialized stop sending frame.
349 static size_t GetStopSendingFrameSize(const QuicStopSendingFrame& frame);
350
351 // Size in bytes required for a serialized retransmittable control |frame|.
352 static size_t GetRetransmittableControlFrameSize(QuicTransportVersion version,
353 const QuicFrame& frame);
354
355 // Returns the number of bytes added to the packet for the specified frame,
356 // and 0 if the frame doesn't fit. Includes the header size for the first
357 // frame.
358 size_t GetSerializedFrameLength(const QuicFrame& frame,
359 size_t free_bytes,
360 bool first_frame_in_packet,
361 bool last_frame_in_packet,
362 QuicPacketNumberLength packet_number_length);
363
364 // Returns the associated data from the encrypted packet |encrypted| as a
365 // stringpiece.
366 static QuicStringPiece GetAssociatedDataFromEncryptedPacket(
367 QuicTransportVersion version,
368 const QuicEncryptedPacket& encrypted,
369 QuicConnectionIdLength destination_connection_id_length,
370 QuicConnectionIdLength source_connection_id_length,
371 bool includes_version,
372 bool includes_diversification_nonce,
373 QuicPacketNumberLength packet_number_length,
374 QuicVariableLengthIntegerLength retry_token_length_length,
375 uint64_t retry_token_length,
376 QuicVariableLengthIntegerLength length_length);
377
378 // Serializes a packet containing |frames| into |buffer|.
379 // Returns the length of the packet, which must not be longer than
380 // |packet_length|. Returns 0 if it fails to serialize.
381 size_t BuildDataPacket(const QuicPacketHeader& header,
382 const QuicFrames& frames,
383 char* buffer,
384 size_t packet_length,
385 EncryptionLevel level);
386
387 // Serializes a probing packet, which is a padded PING packet. Returns the
388 // length of the packet. Returns 0 if it fails to serialize.
389 size_t BuildConnectivityProbingPacket(const QuicPacketHeader& header,
390 char* buffer,
391 size_t packet_length,
392 EncryptionLevel level);
393
394 // Serializes a probing packet, which is a padded PING packet. Returns the
395 // length of the packet. Returns 0 if it fails to serialize.
396 size_t BuildConnectivityProbingPacketNew(const QuicPacketHeader& header,
397 char* buffer,
398 size_t packet_length,
399 EncryptionLevel level);
400
401 // Serialize a probing packet that uses IETF QUIC's PATH CHALLENGE frame. Also
402 // fills the packet with padding.
403 size_t BuildPaddedPathChallengePacket(const QuicPacketHeader& header,
404 char* buffer,
405 size_t packet_length,
406 QuicPathFrameBuffer* payload,
407 QuicRandom* randomizer,
408 EncryptionLevel level);
409
410 // Serialize a probing response packet that uses IETF QUIC's PATH RESPONSE
411 // frame. Also fills the packet with padding if |is_padded| is
412 // true. |payloads| is always emptied, even if the packet can not be
413 // successfully built.
414 size_t BuildPathResponsePacket(const QuicPacketHeader& header,
415 char* buffer,
416 size_t packet_length,
417 const QuicDeque<QuicPathFrameBuffer>& payloads,
418 const bool is_padded,
419 EncryptionLevel level);
420
421 // Returns a new public reset packet.
422 static std::unique_ptr<QuicEncryptedPacket> BuildPublicResetPacket(
423 const QuicPublicResetPacket& packet);
424
425 // Returns a new IETF stateless reset packet.
426 static std::unique_ptr<QuicEncryptedPacket> BuildIetfStatelessResetPacket(
427 QuicConnectionId connection_id,
428 QuicUint128 stateless_reset_token);
429
430 // Returns a new version negotiation packet.
431 static std::unique_ptr<QuicEncryptedPacket> BuildVersionNegotiationPacket(
432 QuicConnectionId connection_id,
433 bool ietf_quic,
434 const ParsedQuicVersionVector& versions);
435
436 // Returns a new IETF version negotiation packet.
437 static std::unique_ptr<QuicEncryptedPacket> BuildIetfVersionNegotiationPacket(
438 QuicConnectionId connection_id,
439 const ParsedQuicVersionVector& versions);
440
441 // If header.version_flag is set, the version in the
442 // packet will be set -- but it will be set from version_ not
443 // header.versions.
444 bool AppendPacketHeader(const QuicPacketHeader& header,
445 QuicDataWriter* writer,
446 size_t* length_field_offset);
447 bool AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
448 QuicDataWriter* writer);
449 bool AppendIetfPacketHeader(const QuicPacketHeader& header,
450 QuicDataWriter* writer,
451 size_t* length_field_offset);
452 bool WriteIetfLongHeaderLength(const QuicPacketHeader& header,
453 QuicDataWriter* writer,
454 size_t length_field_offset,
455 EncryptionLevel level);
456 bool AppendTypeByte(const QuicFrame& frame,
457 bool last_frame_in_packet,
458 QuicDataWriter* writer);
459 bool AppendIetfTypeByte(const QuicFrame& frame,
460 bool last_frame_in_packet,
461 QuicDataWriter* writer);
462 size_t AppendIetfFrames(const QuicFrames& frames, QuicDataWriter* writer);
463 bool AppendStreamFrame(const QuicStreamFrame& frame,
464 bool last_frame_in_packet,
465 QuicDataWriter* writer);
466 bool AppendCryptoFrame(const QuicCryptoFrame& frame, QuicDataWriter* writer);
467
468 // SetDecrypter sets the primary decrypter, replacing any that already exists.
469 // If an alternative decrypter is in place then the function DCHECKs. This is
470 // intended for cases where one knows that future packets will be using the
471 // new decrypter and the previous decrypter is now obsolete. |level| indicates
472 // the encryption level of the new decrypter.
473 void SetDecrypter(EncryptionLevel level,
474 std::unique_ptr<QuicDecrypter> decrypter);
475
476 // SetAlternativeDecrypter sets a decrypter that may be used to decrypt
477 // future packets. |level| indicates the encryption level of the decrypter. If
478 // |latch_once_used| is true, then the first time that the decrypter is
479 // successful it will replace the primary decrypter. Otherwise both
480 // decrypters will remain active and the primary decrypter will be the one
481 // last used.
482 void SetAlternativeDecrypter(EncryptionLevel level,
483 std::unique_ptr<QuicDecrypter> decrypter,
484 bool latch_once_used);
485
486 const QuicDecrypter* decrypter() const;
487 const QuicDecrypter* alternative_decrypter() const;
488
489 // Changes the encrypter used for level |level| to |encrypter|.
490 void SetEncrypter(EncryptionLevel level,
491 std::unique_ptr<QuicEncrypter> encrypter);
492
493 // Encrypts a payload in |buffer|. |ad_len| is the length of the associated
494 // data. |total_len| is the length of the associated data plus plaintext.
495 // |buffer_len| is the full length of the allocated buffer.
496 size_t EncryptInPlace(EncryptionLevel level,
497 QuicPacketNumber packet_number,
498 size_t ad_len,
499 size_t total_len,
500 size_t buffer_len,
501 char* buffer);
502
503 // Returns the length of the data encrypted into |buffer| if |buffer_len| is
504 // long enough, and otherwise 0.
505 size_t EncryptPayload(EncryptionLevel level,
506 QuicPacketNumber packet_number,
507 const QuicPacket& packet,
508 char* buffer,
509 size_t buffer_len);
510
511 // Returns the length of the ciphertext that would be generated by encrypting
512 // to plaintext of size |plaintext_size| at the given level.
513 size_t GetCiphertextSize(EncryptionLevel level, size_t plaintext_size) const;
514
515 // Returns the maximum length of plaintext that can be encrypted
516 // to ciphertext no larger than |ciphertext_size|.
517 size_t GetMaxPlaintextSize(size_t ciphertext_size);
518
vasilvvc48c8712019-03-11 13:38:16 -0700519 const std::string& detailed_error() { return detailed_error_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500520
521 // The minimum packet number length required to represent |packet_number|.
522 static QuicPacketNumberLength GetMinPacketNumberLength(
523 QuicTransportVersion version,
524 QuicPacketNumber packet_number);
525
526 void SetSupportedVersions(const ParsedQuicVersionVector& versions) {
527 supported_versions_ = versions;
528 version_ = versions[0];
529 }
530
531 // Tell framer to infer packet header type from version_.
532 void InferPacketHeaderTypeFromVersion();
533
534 // Returns true if data with |offset| of stream |id| starts with 'CHLO'.
535 bool StartsWithChlo(QuicStreamId id, QuicStreamOffset offset) const;
536
537 // Returns true if |header| is considered as an stateless reset packet.
538 bool IsIetfStatelessResetPacket(const QuicPacketHeader& header) const;
539
540 // Returns true if encrypter of |level| is available.
541 bool HasEncrypterOfEncryptionLevel(EncryptionLevel level) const;
542
543 void set_validate_flags(bool value) { validate_flags_ = value; }
544
545 Perspective perspective() const { return perspective_; }
546
547 QuicVersionLabel last_version_label() const { return last_version_label_; }
548
549 void set_data_producer(QuicStreamFrameDataProducer* data_producer) {
550 data_producer_ = data_producer;
551 }
552
553 // Returns true if we are doing IETF-formatted packets.
554 // In the future this could encompass a wide variety of
555 // versions. Doing the test by name ("ietf format") rather
556 // than version number localizes the version/ietf-ness binding
557 // to this method.
558 bool is_ietf_format() {
559 return version_.transport_version == QUIC_VERSION_99;
560 }
561
562 QuicTime creation_time() const { return creation_time_; }
563
564 QuicPacketNumber first_sending_packet_number() const {
565 return first_sending_packet_number_;
566 }
567
QUICHE team4d9d6292019-03-11 14:25:33 -0700568 // If true, QuicFramer will change its expected connection ID length
569 // to the received destination connection ID length of all IETF long headers.
570 void SetShouldUpdateExpectedConnectionIdLength(
571 bool should_update_expected_connection_id_length) {
572 should_update_expected_connection_id_length_ =
573 should_update_expected_connection_id_length;
574 }
575
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 private:
577 friend class test::QuicFramerPeer;
578
579 typedef std::map<QuicPacketNumber, uint8_t> NackRangeMap;
580
581 struct AckFrameInfo {
582 AckFrameInfo();
583 AckFrameInfo(const AckFrameInfo& other);
584 ~AckFrameInfo();
585
586 // The maximum ack block length.
587 QuicPacketCount max_block_length;
588 // Length of first ack block.
589 QuicPacketCount first_block_length;
590 // Number of ACK blocks needed for the ACK frame.
591 size_t num_ack_blocks;
592 };
593
594 bool ProcessDataPacket(QuicDataReader* reader,
595 QuicPacketHeader* header,
596 const QuicEncryptedPacket& packet,
597 char* decrypted_buffer,
598 size_t buffer_length);
599
600 bool ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
601 QuicPacketHeader* header,
602 const QuicEncryptedPacket& packet,
603 char* decrypted_buffer,
604 size_t buffer_length);
605
606 bool ProcessPublicResetPacket(QuicDataReader* reader,
607 const QuicPacketHeader& header);
608
609 bool ProcessVersionNegotiationPacket(QuicDataReader* reader,
610 const QuicPacketHeader& header);
611
612 bool MaybeProcessIetfInitialRetryToken(QuicDataReader* encrypted_reader,
613 QuicPacketHeader* header);
614
615 void MaybeProcessCoalescedPacket(const QuicDataReader& encrypted_reader,
616 uint64_t remaining_bytes_length,
617 const QuicPacketHeader& header);
618
619 bool MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
620 QuicPacketHeader* header);
621
622 bool ProcessPublicHeader(QuicDataReader* reader,
623 bool packet_has_ietf_packet_header,
624 QuicPacketHeader* header);
625
626 // Processes the unauthenticated portion of the header into |header| from
627 // the current QuicDataReader. Returns true on success, false on failure.
628 bool ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
629 QuicPacketHeader* header);
630
631 bool ProcessIetfHeaderTypeByte(QuicDataReader* reader,
632 QuicPacketHeader* header);
633 bool ProcessIetfPacketHeader(QuicDataReader* reader,
634 QuicPacketHeader* header);
635
636 // First processes possibly truncated packet number. Calculates the full
637 // packet number from the truncated one and the last seen packet number, and
638 // stores it to |packet_number|.
639 bool ProcessAndCalculatePacketNumber(
640 QuicDataReader* reader,
641 QuicPacketNumberLength packet_number_length,
642 QuicPacketNumber base_packet_number,
643 uint64_t* packet_number);
644 bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header);
645 bool ProcessIetfFrameData(QuicDataReader* reader,
646 const QuicPacketHeader& header);
647 bool ProcessStreamFrame(QuicDataReader* reader,
648 uint8_t frame_type,
649 QuicStreamFrame* frame);
650 bool ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type);
651 bool ProcessTimestampsInAckFrame(uint8_t num_received_packets,
652 QuicPacketNumber largest_acked,
653 QuicDataReader* reader);
654 bool ProcessIetfAckFrame(QuicDataReader* reader,
655 uint64_t frame_type,
656 QuicAckFrame* ack_frame);
657 bool ProcessStopWaitingFrame(QuicDataReader* reader,
658 const QuicPacketHeader& header,
659 QuicStopWaitingFrame* stop_waiting);
660 bool ProcessRstStreamFrame(QuicDataReader* reader, QuicRstStreamFrame* frame);
661 bool ProcessConnectionCloseFrame(QuicDataReader* reader,
662 QuicConnectionCloseFrame* frame);
663 bool ProcessGoAwayFrame(QuicDataReader* reader, QuicGoAwayFrame* frame);
664 bool ProcessWindowUpdateFrame(QuicDataReader* reader,
665 QuicWindowUpdateFrame* frame);
666 bool ProcessBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
667 void ProcessPaddingFrame(QuicDataReader* reader, QuicPaddingFrame* frame);
668 bool ProcessMessageFrame(QuicDataReader* reader,
669 bool no_message_length,
670 QuicMessageFrame* frame);
671
672 bool DecryptPayload(QuicStringPiece encrypted,
673 QuicStringPiece associated_data,
674 const QuicPacketHeader& header,
675 char* decrypted_buffer,
676 size_t buffer_length,
677 size_t* decrypted_length);
678
679 // Returns the full packet number from the truncated
680 // wire format version and the last seen packet number.
681 uint64_t CalculatePacketNumberFromWire(
682 QuicPacketNumberLength packet_number_length,
683 QuicPacketNumber base_packet_number,
684 uint64_t packet_number) const;
685
686 // Returns the QuicTime::Delta corresponding to the time from when the framer
687 // was created.
688 const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us);
689
690 // Computes the wire size in bytes of time stamps in |ack|.
691 size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack);
692
693 // Computes the wire size in bytes of the |ack| frame.
694 size_t GetAckFrameSize(const QuicAckFrame& ack,
695 QuicPacketNumberLength packet_number_length);
696 // Computes the wire-size, in bytes, of the |frame| ack frame, for IETF Quic.
697 size_t GetIetfAckFrameSize(const QuicAckFrame& frame);
698
699 // Computes the wire size in bytes of the |ack| frame.
700 size_t GetAckFrameSize(const QuicAckFrame& ack);
701
702 // Computes the wire size in bytes of the payload of |frame|.
703 size_t ComputeFrameLength(const QuicFrame& frame,
704 bool last_frame_in_packet,
705 QuicPacketNumberLength packet_number_length);
706
707 static bool AppendPacketNumber(QuicPacketNumberLength packet_number_length,
708 QuicPacketNumber packet_number,
709 QuicDataWriter* writer);
710 static bool AppendStreamId(size_t stream_id_length,
711 QuicStreamId stream_id,
712 QuicDataWriter* writer);
713 static bool AppendStreamOffset(size_t offset_length,
714 QuicStreamOffset offset,
715 QuicDataWriter* writer);
716
717 // Appends a single ACK block to |writer| and returns true if the block was
718 // successfully appended.
719 static bool AppendAckBlock(uint8_t gap,
720 QuicPacketNumberLength length_length,
721 uint64_t length,
722 QuicDataWriter* writer);
723
724 static uint8_t GetPacketNumberFlags(
725 QuicPacketNumberLength packet_number_length);
726
727 static AckFrameInfo GetAckFrameInfo(const QuicAckFrame& frame);
728
729 static bool AppendIetfConnectionId(
730 bool version_flag,
731 QuicConnectionId destination_connection_id,
732 QuicConnectionIdLength destination_connection_id_length,
733 QuicConnectionId source_connection_id,
734 QuicConnectionIdLength source_connection_id_length,
735 QuicDataWriter* writer);
736
737 // The Append* methods attempt to write the provided header or frame using the
738 // |writer|, and return true if successful.
739
740 bool AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
741 QuicDataWriter* builder);
742 bool AppendTimestampsToAckFrame(const QuicAckFrame& frame,
743 QuicDataWriter* writer);
744
745 // Append IETF format ACK frame.
746 //
747 // AppendIetfAckFrameAndTypeByte adds the IETF type byte and the body
748 // of the frame.
749 bool AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
750 QuicDataWriter* writer);
751
752 // Used by AppendIetfAckFrameAndTypeByte to figure out how many ack
753 // blocks can be included.
754 int CalculateIetfAckBlockCount(const QuicAckFrame& frame,
755 QuicDataWriter* writer,
756 size_t available_space);
757 bool AppendStopWaitingFrame(const QuicPacketHeader& header,
758 const QuicStopWaitingFrame& frame,
759 QuicDataWriter* builder);
760 bool AppendRstStreamFrame(const QuicRstStreamFrame& frame,
761 QuicDataWriter* builder);
762 bool AppendConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
763 QuicDataWriter* builder);
764 bool AppendGoAwayFrame(const QuicGoAwayFrame& frame, QuicDataWriter* writer);
765 bool AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
766 QuicDataWriter* writer);
767 bool AppendBlockedFrame(const QuicBlockedFrame& frame,
768 QuicDataWriter* writer);
769 bool AppendPaddingFrame(const QuicPaddingFrame& frame,
770 QuicDataWriter* writer);
771 bool AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
772 bool last_frame_in_packet,
773 QuicDataWriter* writer);
774
775 // IETF frame processing methods.
776 bool ProcessIetfStreamFrame(QuicDataReader* reader,
777 uint8_t frame_type,
778 QuicStreamFrame* frame);
779 bool ProcessIetfConnectionCloseFrame(QuicDataReader* reader,
780 QuicConnectionCloseFrame* frame);
781 bool ProcessApplicationCloseFrame(QuicDataReader* reader,
782 QuicApplicationCloseFrame* frame);
783 bool ProcessPathChallengeFrame(QuicDataReader* reader,
784 QuicPathChallengeFrame* frame);
785 bool ProcessPathResponseFrame(QuicDataReader* reader,
786 QuicPathResponseFrame* frame);
787 bool ProcessIetfResetStreamFrame(QuicDataReader* reader,
788 QuicRstStreamFrame* frame);
789 bool ProcessStopSendingFrame(QuicDataReader* reader,
790 QuicStopSendingFrame* stop_sending_frame);
791 bool ProcessCryptoFrame(QuicDataReader* reader, QuicCryptoFrame* frame);
792
793 // IETF frame appending methods. All methods append the type byte as well.
794 bool AppendIetfStreamFrame(const QuicStreamFrame& frame,
795 bool last_frame_in_packet,
796 QuicDataWriter* writer);
797 bool AppendIetfConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
798 QuicDataWriter* writer);
799 bool AppendApplicationCloseFrame(const QuicApplicationCloseFrame& frame,
800 QuicDataWriter* writer);
801 bool AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
802 QuicDataWriter* writer);
803 bool AppendPathResponseFrame(const QuicPathResponseFrame& frame,
804 QuicDataWriter* writer);
805 bool AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
806 QuicDataWriter* writer);
807 bool AppendStopSendingFrame(const QuicStopSendingFrame& stop_sending_frame,
808 QuicDataWriter* writer);
809
810 // Append/consume IETF-Format MAX_DATA and MAX_STREAM_DATA frames
811 bool AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
812 QuicDataWriter* writer);
813 bool AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
814 QuicDataWriter* writer);
815 bool ProcessMaxDataFrame(QuicDataReader* reader,
816 QuicWindowUpdateFrame* frame);
817 bool ProcessMaxStreamDataFrame(QuicDataReader* reader,
818 QuicWindowUpdateFrame* frame);
819
820 bool AppendMaxStreamsFrame(const QuicMaxStreamIdFrame& frame,
821 QuicDataWriter* writer);
822 bool ProcessMaxStreamsFrame(QuicDataReader* reader,
823 QuicMaxStreamIdFrame* frame,
824 uint64_t frame_type);
825
826 bool AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
827 QuicDataWriter* writer);
828 bool ProcessIetfBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
829
830 bool AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
831 QuicDataWriter* writer);
832 bool ProcessStreamBlockedFrame(QuicDataReader* reader,
833 QuicBlockedFrame* frame);
834
835 bool AppendStreamsBlockedFrame(const QuicStreamIdBlockedFrame& frame,
836 QuicDataWriter* writer);
837 bool ProcessStreamsBlockedFrame(QuicDataReader* reader,
838 QuicStreamIdBlockedFrame* frame,
839 uint64_t frame_type);
840
841 bool AppendNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame,
842 QuicDataWriter* writer);
843 bool ProcessNewConnectionIdFrame(QuicDataReader* reader,
844 QuicNewConnectionIdFrame* frame);
845 bool AppendRetireConnectionIdFrame(const QuicRetireConnectionIdFrame& frame,
846 QuicDataWriter* writer);
847 bool ProcessRetireConnectionIdFrame(QuicDataReader* reader,
848 QuicRetireConnectionIdFrame* frame);
849
850 bool AppendNewTokenFrame(const QuicNewTokenFrame& frame,
851 QuicDataWriter* writer);
852 bool ProcessNewTokenFrame(QuicDataReader* reader, QuicNewTokenFrame* frame);
853
854 bool RaiseError(QuicErrorCode error);
855
856 // Returns true if |header| indicates a version negotiation packet.
857 bool IsVersionNegotiation(const QuicPacketHeader& header,
858 bool packet_has_ietf_packet_header) const;
859
860 // Calculates and returns type byte of stream frame.
861 uint8_t GetStreamFrameTypeByte(const QuicStreamFrame& frame,
862 bool last_frame_in_packet) const;
863 uint8_t GetIetfStreamFrameTypeByte(const QuicStreamFrame& frame,
864 bool last_frame_in_packet) const;
865
866 void set_error(QuicErrorCode error) { error_ = error; }
867
868 void set_detailed_error(const char* error) { detailed_error_ = error; }
869
vasilvvc48c8712019-03-11 13:38:16 -0700870 std::string detailed_error_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500871 QuicFramerVisitorInterface* visitor_;
872 QuicErrorCode error_;
873 // Updated by ProcessPacketHeader when it succeeds decrypting a larger packet.
874 QuicPacketNumber largest_packet_number_;
875 // Updated by WritePacketHeader.
876 QuicConnectionId last_serialized_connection_id_;
877 // The last QUIC version label received.
878 QuicVersionLabel last_version_label_;
879 // Version of the protocol being used.
880 ParsedQuicVersion version_;
881 // This vector contains QUIC versions which we currently support.
882 // This should be ordered such that the highest supported version is the first
883 // element, with subsequent elements in descending order (versions can be
884 // skipped as necessary).
885 ParsedQuicVersionVector supported_versions_;
886 // Primary decrypter used to decrypt packets during parsing.
887 std::unique_ptr<QuicDecrypter> decrypter_;
888 // Alternative decrypter that can also be used to decrypt packets.
889 std::unique_ptr<QuicDecrypter> alternative_decrypter_;
890 // The encryption level of |decrypter_|.
891 EncryptionLevel decrypter_level_;
892 // The encryption level of |alternative_decrypter_|.
893 EncryptionLevel alternative_decrypter_level_;
894 // |alternative_decrypter_latch_| is true if, when |alternative_decrypter_|
895 // successfully decrypts a packet, we should install it as the only
896 // decrypter.
897 bool alternative_decrypter_latch_;
898 // Encrypters used to encrypt packets via EncryptPayload().
899 std::unique_ptr<QuicEncrypter> encrypter_[NUM_ENCRYPTION_LEVELS];
900 // Tracks if the framer is being used by the entity that received the
901 // connection or the entity that initiated it.
902 Perspective perspective_;
903 // If false, skip validation that the public flags are set to legal values.
904 bool validate_flags_;
905 // The diversification nonce from the last received packet.
906 DiversificationNonce last_nonce_;
907 // If true, send and process timestamps in the ACK frame.
908 bool process_timestamps_;
909 // The creation time of the connection, used to calculate timestamps.
910 QuicTime creation_time_;
911 // The last timestamp received if process_timestamps_ is true.
912 QuicTime::Delta last_timestamp_;
913
914 // If this is a framer of a connection, this is the packet number of first
915 // sending packet. If this is a framer of a framer of dispatcher, this is the
916 // packet number of sent packets (for those which have packet number).
917 const QuicPacketNumber first_sending_packet_number_;
918
919 // If not null, framer asks data_producer_ to write stream frame data. Not
920 // owned. TODO(fayang): Consider add data producer to framer's constructor.
921 QuicStreamFrameDataProducer* data_producer_;
922
923 // If true, framer infers packet header type (IETF/GQUIC) from version_.
924 // Otherwise, framer infers packet header type from first byte of a received
925 // packet.
926 bool infer_packet_header_type_from_version_;
927
928 // IETF short headers contain a destination connection ID but do not
929 // encode its length. This variable contains the length we expect to read.
930 // This is also used to validate the long header connection ID lengths in
931 // older versions of QUIC.
QUICHE team4d9d6292019-03-11 14:25:33 -0700932 uint8_t expected_connection_id_length_;
933
934 // When this is true, QuicFramer will change expected_connection_id_length_
935 // to the received destination connection ID length of all IETF long headers.
936 bool should_update_expected_connection_id_length_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500937};
938
939} // namespace quic
940
941#endif // QUICHE_QUIC_CORE_QUIC_FRAMER_H_