blob: a05ad8f96cda12a9e97f87687eafde3427b67713 [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
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h"
14#include "net/third_party/quiche/src/quic/core/crypto/quic_encrypter.h"
15#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
dschinazi244f6dc2019-05-06 15:45:16 -070016#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050017#include "net/third_party/quiche/src/quic/core/quic_packets.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050018#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
20
21namespace quic {
22
23namespace test {
24class QuicFramerPeer;
25} // namespace test
26
27class QuicDataReader;
28class QuicDataWriter;
29class QuicFramer;
30class QuicStreamFrameDataProducer;
31
32// Number of bytes reserved for the frame type preceding each frame.
33const size_t kQuicFrameTypeSize = 1;
34// Number of bytes reserved for error code.
35const size_t kQuicErrorCodeSize = 4;
36// Number of bytes reserved to denote the length of error details field.
37const size_t kQuicErrorDetailsLengthSize = 2;
38
39// Maximum number of bytes reserved for stream id.
40const size_t kQuicMaxStreamIdSize = 4;
41// Maximum number of bytes reserved for byte offset in stream frame.
42const size_t kQuicMaxStreamOffsetSize = 8;
43// Number of bytes reserved to store payload length in stream frame.
44const size_t kQuicStreamPayloadLengthSize = 2;
45// Number of bytes to reserve for IQ Error codes (for the Connection Close,
46// Application Close, and Reset Stream frames).
47const size_t kQuicIetfQuicErrorCodeSize = 2;
48// Minimum size of the IETF QUIC Error Phrase's length field
49const size_t kIetfQuicMinErrorPhraseLengthSize = 1;
50
51// Size in bytes reserved for the delta time of the largest observed
52// packet number in ack frames.
53const size_t kQuicDeltaTimeLargestObservedSize = 2;
54// Size in bytes reserved for the number of received packets with timestamps.
55const size_t kQuicNumTimestampsSize = 1;
56// Size in bytes reserved for the number of missing packets in ack frames.
57const size_t kNumberOfNackRangesSize = 1;
58// Size in bytes reserved for the number of ack blocks in ack frames.
59const size_t kNumberOfAckBlocksSize = 1;
60// Maximum number of missing packet ranges that can fit within an ack frame.
61const size_t kMaxNackRanges = (1 << (kNumberOfNackRangesSize * 8)) - 1;
62// Maximum number of ack blocks that can fit within an ack frame.
63const size_t kMaxAckBlocks = (1 << (kNumberOfAckBlocksSize * 8)) - 1;
64
65// This class receives callbacks from the framer when packets
66// are processed.
67class QUIC_EXPORT_PRIVATE QuicFramerVisitorInterface {
68 public:
69 virtual ~QuicFramerVisitorInterface() {}
70
71 // Called if an error is detected in the QUIC protocol.
72 virtual void OnError(QuicFramer* framer) = 0;
73
74 // Called only when |perspective_| is IS_SERVER and the framer gets a
75 // packet with version flag true and the version on the packet doesn't match
76 // |quic_version_|. The visitor should return true after it updates the
77 // version of the |framer_| to |received_version| or false to stop processing
78 // this packet.
fayang8aba1ff2019-06-21 12:00:54 -070079 virtual bool OnProtocolVersionMismatch(
80 ParsedQuicVersion received_version) = 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -050081
82 // Called when a new packet has been received, before it
83 // has been validated or processed.
84 virtual void OnPacket() = 0;
85
86 // Called when a public reset packet has been parsed but has not yet
87 // been validated.
88 virtual void OnPublicResetPacket(const QuicPublicResetPacket& packet) = 0;
89
90 // Called only when |perspective_| is IS_CLIENT and a version negotiation
91 // packet has been parsed.
92 virtual void OnVersionNegotiationPacket(
93 const QuicVersionNegotiationPacket& packet) = 0;
94
dschinazi244f6dc2019-05-06 15:45:16 -070095 // Called only when |perspective_| is IS_CLIENT and a retry packet has been
96 // parsed.
97 virtual void OnRetryPacket(QuicConnectionId original_connection_id,
98 QuicConnectionId new_connection_id,
99 QuicStringPiece retry_token) = 0;
100
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 // Called when all fields except packet number has been parsed, but has not
102 // been authenticated. If it returns false, framing for this packet will
103 // cease.
104 virtual bool OnUnauthenticatedPublicHeader(
105 const QuicPacketHeader& header) = 0;
106
107 // Called when the unauthenticated portion of the header has been parsed.
108 // If OnUnauthenticatedHeader returns false, framing for this packet will
109 // cease.
110 virtual bool OnUnauthenticatedHeader(const QuicPacketHeader& header) = 0;
111
112 // Called when a packet has been decrypted. |level| is the encryption level
113 // of the packet.
114 virtual void OnDecryptedPacket(EncryptionLevel level) = 0;
115
116 // Called when the complete header of a packet had been parsed.
117 // If OnPacketHeader returns false, framing for this packet will cease.
118 virtual bool OnPacketHeader(const QuicPacketHeader& header) = 0;
119
120 // Called when the packet being processed contains multiple IETF QUIC packets,
121 // which is due to there being more data after what is covered by the length
122 // field. |packet| contains the remaining data which can be processed.
123 // Note that this is called when the framer parses the length field, before
124 // it attempts to decrypt the first payload. It is the visitor's
125 // responsibility to buffer the packet and call ProcessPacket on it
126 // after the framer is done parsing the current payload. |packet| does not
127 // own its internal buffer, the visitor should make a copy of it.
128 virtual void OnCoalescedPacket(const QuicEncryptedPacket& packet) = 0;
129
130 // Called when a StreamFrame has been parsed.
131 virtual bool OnStreamFrame(const QuicStreamFrame& frame) = 0;
132
133 // Called when a CRYPTO frame has been parsed.
134 virtual bool OnCryptoFrame(const QuicCryptoFrame& frame) = 0;
135
136 // Called when largest acked of an AckFrame has been parsed.
137 virtual bool OnAckFrameStart(QuicPacketNumber largest_acked,
138 QuicTime::Delta ack_delay_time) = 0;
139
140 // Called when ack range [start, end) of an AckFrame has been parsed.
141 virtual bool OnAckRange(QuicPacketNumber start, QuicPacketNumber end) = 0;
142
143 // Called when a timestamp in the AckFrame has been parsed.
144 virtual bool OnAckTimestamp(QuicPacketNumber packet_number,
145 QuicTime timestamp) = 0;
146
147 // Called after the last ack range in an AckFrame has been parsed.
148 // |start| is the starting value of the last ack range.
149 virtual bool OnAckFrameEnd(QuicPacketNumber start) = 0;
150
151 // Called when a StopWaitingFrame has been parsed.
152 virtual bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) = 0;
153
154 // Called when a QuicPaddingFrame has been parsed.
155 virtual bool OnPaddingFrame(const QuicPaddingFrame& frame) = 0;
156
157 // Called when a PingFrame has been parsed.
158 virtual bool OnPingFrame(const QuicPingFrame& frame) = 0;
159
160 // Called when a RstStreamFrame has been parsed.
161 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) = 0;
162
fkastenholz04bd4f32019-04-16 12:24:38 -0700163 // Called when a ConnectionCloseFrame, of any type, has been parsed.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500164 virtual bool OnConnectionCloseFrame(
165 const QuicConnectionCloseFrame& frame) = 0;
166
QUICHE teama6ef0a62019-03-07 20:34:33 -0500167 // Called when a StopSendingFrame has been parsed.
168 virtual bool OnStopSendingFrame(const QuicStopSendingFrame& frame) = 0;
169
170 // Called when a PathChallengeFrame has been parsed.
171 virtual bool OnPathChallengeFrame(const QuicPathChallengeFrame& frame) = 0;
172
173 // Called when a PathResponseFrame has been parsed.
174 virtual bool OnPathResponseFrame(const QuicPathResponseFrame& frame) = 0;
175
176 // Called when a GoAwayFrame has been parsed.
177 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) = 0;
178
179 // Called when a WindowUpdateFrame has been parsed.
180 virtual bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) = 0;
181
182 // Called when a BlockedFrame has been parsed.
183 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) = 0;
184
185 // Called when a NewConnectionIdFrame has been parsed.
186 virtual bool OnNewConnectionIdFrame(
187 const QuicNewConnectionIdFrame& frame) = 0;
188
189 // Called when a RetireConnectionIdFrame has been parsed.
190 virtual bool OnRetireConnectionIdFrame(
191 const QuicRetireConnectionIdFrame& frame) = 0;
192
193 // Called when a NewTokenFrame has been parsed.
194 virtual bool OnNewTokenFrame(const QuicNewTokenFrame& frame) = 0;
195
196 // Called when a message frame has been parsed.
197 virtual bool OnMessageFrame(const QuicMessageFrame& frame) = 0;
198
199 // Called when a packet has been completely processed.
200 virtual void OnPacketComplete() = 0;
201
202 // Called to check whether |token| is a valid stateless reset token.
203 virtual bool IsValidStatelessResetToken(QuicUint128 token) const = 0;
204
205 // Called when an IETF stateless reset packet has been parsed and validated
206 // with the stateless reset token.
207 virtual void OnAuthenticatedIetfStatelessResetPacket(
208 const QuicIetfStatelessResetPacket& packet) = 0;
209
fkastenholz3c4eabf2019-04-22 07:49:59 -0700210 // Called when an IETF MaxStreams frame has been parsed.
211 virtual bool OnMaxStreamsFrame(const QuicMaxStreamsFrame& frame) = 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500212
fkastenholz3c4eabf2019-04-22 07:49:59 -0700213 // Called when an IETF StreamsBlocked frame has been parsed.
214 virtual bool OnStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame) = 0;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500215};
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
QUICHE team6987b4a2019-03-15 16:23:04 -0700222 // QuicDecrypter for level ENCRYPTION_INITIAL. |supported_versions| specifies
223 // the list of supported QUIC versions. |quic_version_| is set to the maximum
QUICHE teama6ef0a62019-03-07 20:34:33 -0500224 // version in |supported_versions|.
225 QuicFramer(const ParsedQuicVersionVector& supported_versions,
226 QuicTime creation_time,
227 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -0700228 uint8_t expected_server_connection_id_length);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 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.
dschinazi244f6dc2019-05-06 15:45:16 -0700272 // Return true if the packet was processed successfully. |packet| must be a
QUICHE teama6ef0a62019-03-07 20:34:33 -0500273 // 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);
fkastenholza037b8b2019-05-07 06:00:05 -0700303 // Size in bytes of all connection close frame fields, including the error
304 // details.
305 static size_t GetConnectionCloseFrameSize(
QUICHE teama6ef0a62019-03-07 20:34:33 -0500306 QuicTransportVersion version,
307 const QuicConnectionCloseFrame& frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 // Size in bytes of all GoAway frame fields without the reason phrase.
309 static size_t GetMinGoAwayFrameSize();
310 // Size in bytes of all WindowUpdate frame fields.
311 // For version 99, determines whether a MAX DATA or MAX STREAM DATA frame will
312 // be generated and calculates the appropriate size.
313 static size_t GetWindowUpdateFrameSize(QuicTransportVersion version,
314 const QuicWindowUpdateFrame& frame);
315 // Size in bytes of all MaxStreams frame fields.
316 static size_t GetMaxStreamsFrameSize(QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700317 const QuicMaxStreamsFrame& frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500318 // Size in bytes of all StreamsBlocked frame fields.
319 static size_t GetStreamsBlockedFrameSize(
320 QuicTransportVersion version,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700321 const QuicStreamsBlockedFrame& frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500322 // Size in bytes of all Blocked frame fields.
323 static size_t GetBlockedFrameSize(QuicTransportVersion version,
324 const QuicBlockedFrame& frame);
325 // Size in bytes of PathChallenge frame.
326 static size_t GetPathChallengeFrameSize(const QuicPathChallengeFrame& frame);
327 // Size in bytes of PathResponse frame.
328 static size_t GetPathResponseFrameSize(const QuicPathResponseFrame& frame);
329 // Size in bytes required to serialize the stream id.
330 static size_t GetStreamIdSize(QuicStreamId stream_id);
331 // Size in bytes required to serialize the stream offset.
332 static size_t GetStreamOffsetSize(QuicTransportVersion version,
333 QuicStreamOffset offset);
334 // Size in bytes for a serialized new connection id frame
335 static size_t GetNewConnectionIdFrameSize(
336 const QuicNewConnectionIdFrame& frame);
337
338 // Size in bytes for a serialized retire connection id frame
339 static size_t GetRetireConnectionIdFrameSize(
340 const QuicRetireConnectionIdFrame& frame);
341
342 // Size in bytes for a serialized new token frame
343 static size_t GetNewTokenFrameSize(const QuicNewTokenFrame& frame);
344
345 // Size in bytes required for a serialized stop sending frame.
346 static size_t GetStopSendingFrameSize(const QuicStopSendingFrame& frame);
347
348 // Size in bytes required for a serialized retransmittable control |frame|.
349 static size_t GetRetransmittableControlFrameSize(QuicTransportVersion version,
350 const QuicFrame& frame);
351
352 // Returns the number of bytes added to the packet for the specified frame,
353 // and 0 if the frame doesn't fit. Includes the header size for the first
354 // frame.
355 size_t GetSerializedFrameLength(const QuicFrame& frame,
356 size_t free_bytes,
357 bool first_frame_in_packet,
358 bool last_frame_in_packet,
359 QuicPacketNumberLength packet_number_length);
360
361 // Returns the associated data from the encrypted packet |encrypted| as a
362 // stringpiece.
363 static QuicStringPiece GetAssociatedDataFromEncryptedPacket(
364 QuicTransportVersion version,
365 const QuicEncryptedPacket& encrypted,
366 QuicConnectionIdLength destination_connection_id_length,
367 QuicConnectionIdLength source_connection_id_length,
368 bool includes_version,
369 bool includes_diversification_nonce,
370 QuicPacketNumberLength packet_number_length,
371 QuicVariableLengthIntegerLength retry_token_length_length,
372 uint64_t retry_token_length,
373 QuicVariableLengthIntegerLength length_length);
374
fayangccbab732019-05-13 10:11:25 -0700375 // Lightweight parsing of |packet| and populates |format|, |version_flag|,
dschinazib42a8c52019-05-30 09:45:01 -0700376 // |version_label|, |destination_connection_id|, |source_connection_id| and
377 // |detailed_error|. Please note, |expected_destination_connection_id_length|
378 // is only used to determine IETF short header packet's destination
379 // connection ID length.
fayangccbab732019-05-13 10:11:25 -0700380 static QuicErrorCode ProcessPacketDispatcher(
381 const QuicEncryptedPacket& packet,
dschinazib42a8c52019-05-30 09:45:01 -0700382 uint8_t expected_destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -0700383 PacketHeaderFormat* format,
384 bool* version_flag,
385 QuicVersionLabel* version_label,
fayangccbab732019-05-13 10:11:25 -0700386 QuicConnectionId* destination_connection_id,
dschinazib42a8c52019-05-30 09:45:01 -0700387 QuicConnectionId* source_connection_id,
fayangccbab732019-05-13 10:11:25 -0700388 std::string* detailed_error);
389
dschinazi48ac9192019-07-31 00:07:26 -0700390 // Parses the unencryoted fields in a QUIC header using |reader| as input,
391 // stores the result in the other parameters.
392 // |expected_destination_connection_id_length| is only used for short headers.
393 static QuicErrorCode ParsePublicHeader(
394 QuicDataReader* reader,
395 uint8_t expected_destination_connection_id_length,
396 bool ietf_format,
397 uint8_t* first_byte,
398 PacketHeaderFormat* format,
399 bool* version_present,
400 bool* has_length_prefix,
401 QuicVersionLabel* version_label,
402 ParsedQuicVersion* parsed_version,
403 QuicConnectionId* destination_connection_id,
404 QuicConnectionId* source_connection_id,
405 QuicLongHeaderType* long_packet_type,
406 QuicVariableLengthIntegerLength* retry_token_length_length,
407 QuicStringPiece* retry_token,
408 std::string* detailed_error);
409
410 // Parses the unencryoted fields in |packet| and stores them in the other
411 // parameters. This can only be called on the server.
412 // |expected_destination_connection_id_length| is only used for short headers.
413 static QuicErrorCode ParsePublicHeaderDispatcher(
414 const QuicEncryptedPacket& packet,
415 uint8_t expected_destination_connection_id_length,
416 PacketHeaderFormat* format,
417 bool* version_present,
418 bool* has_length_prefix,
419 QuicVersionLabel* version_label,
420 ParsedQuicVersion* parsed_version,
421 QuicConnectionId* destination_connection_id,
422 QuicConnectionId* source_connection_id,
423 bool* retry_token_present,
424 QuicStringPiece* retry_token,
425 std::string* detailed_error);
426
QUICHE teama6ef0a62019-03-07 20:34:33 -0500427 // Serializes a packet containing |frames| into |buffer|.
428 // Returns the length of the packet, which must not be longer than
429 // |packet_length|. Returns 0 if it fails to serialize.
430 size_t BuildDataPacket(const QuicPacketHeader& header,
431 const QuicFrames& frames,
432 char* buffer,
433 size_t packet_length,
434 EncryptionLevel level);
435
436 // Serializes a probing packet, which is a padded PING packet. Returns the
437 // length of the packet. Returns 0 if it fails to serialize.
438 size_t BuildConnectivityProbingPacket(const QuicPacketHeader& header,
439 char* buffer,
440 size_t packet_length,
441 EncryptionLevel level);
442
QUICHE teama6ef0a62019-03-07 20:34:33 -0500443 // Serialize a probing packet that uses IETF QUIC's PATH CHALLENGE frame. Also
444 // fills the packet with padding.
445 size_t BuildPaddedPathChallengePacket(const QuicPacketHeader& header,
446 char* buffer,
447 size_t packet_length,
448 QuicPathFrameBuffer* payload,
449 QuicRandom* randomizer,
450 EncryptionLevel level);
451
452 // Serialize a probing response packet that uses IETF QUIC's PATH RESPONSE
453 // frame. Also fills the packet with padding if |is_padded| is
454 // true. |payloads| is always emptied, even if the packet can not be
455 // successfully built.
456 size_t BuildPathResponsePacket(const QuicPacketHeader& header,
457 char* buffer,
458 size_t packet_length,
459 const QuicDeque<QuicPathFrameBuffer>& payloads,
460 const bool is_padded,
461 EncryptionLevel level);
462
463 // Returns a new public reset packet.
464 static std::unique_ptr<QuicEncryptedPacket> BuildPublicResetPacket(
465 const QuicPublicResetPacket& packet);
466
467 // Returns a new IETF stateless reset packet.
468 static std::unique_ptr<QuicEncryptedPacket> BuildIetfStatelessResetPacket(
469 QuicConnectionId connection_id,
470 QuicUint128 stateless_reset_token);
471
472 // Returns a new version negotiation packet.
473 static std::unique_ptr<QuicEncryptedPacket> BuildVersionNegotiationPacket(
dschinazib417d602019-05-29 13:08:45 -0700474 QuicConnectionId server_connection_id,
475 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500476 bool ietf_quic,
dschinazi48ac9192019-07-31 00:07:26 -0700477 bool use_length_prefix,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500478 const ParsedQuicVersionVector& versions);
479
480 // Returns a new IETF version negotiation packet.
481 static std::unique_ptr<QuicEncryptedPacket> BuildIetfVersionNegotiationPacket(
dschinazi48ac9192019-07-31 00:07:26 -0700482 bool use_length_prefix,
dschinazib417d602019-05-29 13:08:45 -0700483 QuicConnectionId server_connection_id,
484 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500485 const ParsedQuicVersionVector& versions);
486
487 // If header.version_flag is set, the version in the
488 // packet will be set -- but it will be set from version_ not
489 // header.versions.
490 bool AppendPacketHeader(const QuicPacketHeader& header,
491 QuicDataWriter* writer,
492 size_t* length_field_offset);
493 bool AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
494 QuicDataWriter* writer);
495 bool AppendIetfPacketHeader(const QuicPacketHeader& header,
496 QuicDataWriter* writer,
497 size_t* length_field_offset);
498 bool WriteIetfLongHeaderLength(const QuicPacketHeader& header,
499 QuicDataWriter* writer,
500 size_t length_field_offset,
501 EncryptionLevel level);
502 bool AppendTypeByte(const QuicFrame& frame,
503 bool last_frame_in_packet,
504 QuicDataWriter* writer);
505 bool AppendIetfTypeByte(const QuicFrame& frame,
506 bool last_frame_in_packet,
507 QuicDataWriter* writer);
508 size_t AppendIetfFrames(const QuicFrames& frames, QuicDataWriter* writer);
509 bool AppendStreamFrame(const QuicStreamFrame& frame,
510 bool last_frame_in_packet,
511 QuicDataWriter* writer);
512 bool AppendCryptoFrame(const QuicCryptoFrame& frame, QuicDataWriter* writer);
513
514 // SetDecrypter sets the primary decrypter, replacing any that already exists.
515 // If an alternative decrypter is in place then the function DCHECKs. This is
516 // intended for cases where one knows that future packets will be using the
517 // new decrypter and the previous decrypter is now obsolete. |level| indicates
518 // the encryption level of the new decrypter.
519 void SetDecrypter(EncryptionLevel level,
520 std::unique_ptr<QuicDecrypter> decrypter);
521
522 // SetAlternativeDecrypter sets a decrypter that may be used to decrypt
523 // future packets. |level| indicates the encryption level of the decrypter. If
524 // |latch_once_used| is true, then the first time that the decrypter is
525 // successful it will replace the primary decrypter. Otherwise both
526 // decrypters will remain active and the primary decrypter will be the one
527 // last used.
528 void SetAlternativeDecrypter(EncryptionLevel level,
529 std::unique_ptr<QuicDecrypter> decrypter,
530 bool latch_once_used);
531
zhongyi546cc452019-04-12 15:27:49 -0700532 void InstallDecrypter(EncryptionLevel level,
533 std::unique_ptr<QuicDecrypter> decrypter);
534 void RemoveDecrypter(EncryptionLevel level);
535
536 const QuicDecrypter* GetDecrypter(EncryptionLevel level) const;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537 const QuicDecrypter* decrypter() const;
538 const QuicDecrypter* alternative_decrypter() const;
539
540 // Changes the encrypter used for level |level| to |encrypter|.
541 void SetEncrypter(EncryptionLevel level,
542 std::unique_ptr<QuicEncrypter> encrypter);
543
544 // Encrypts a payload in |buffer|. |ad_len| is the length of the associated
545 // data. |total_len| is the length of the associated data plus plaintext.
546 // |buffer_len| is the full length of the allocated buffer.
547 size_t EncryptInPlace(EncryptionLevel level,
548 QuicPacketNumber packet_number,
549 size_t ad_len,
550 size_t total_len,
551 size_t buffer_len,
552 char* buffer);
553
554 // Returns the length of the data encrypted into |buffer| if |buffer_len| is
555 // long enough, and otherwise 0.
556 size_t EncryptPayload(EncryptionLevel level,
557 QuicPacketNumber packet_number,
558 const QuicPacket& packet,
559 char* buffer,
560 size_t buffer_len);
561
562 // Returns the length of the ciphertext that would be generated by encrypting
563 // to plaintext of size |plaintext_size| at the given level.
564 size_t GetCiphertextSize(EncryptionLevel level, size_t plaintext_size) const;
565
566 // Returns the maximum length of plaintext that can be encrypted
567 // to ciphertext no larger than |ciphertext_size|.
568 size_t GetMaxPlaintextSize(size_t ciphertext_size);
569
vasilvvc48c8712019-03-11 13:38:16 -0700570 const std::string& detailed_error() { return detailed_error_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571
572 // The minimum packet number length required to represent |packet_number|.
573 static QuicPacketNumberLength GetMinPacketNumberLength(
574 QuicTransportVersion version,
575 QuicPacketNumber packet_number);
576
577 void SetSupportedVersions(const ParsedQuicVersionVector& versions) {
578 supported_versions_ = versions;
579 version_ = versions[0];
580 }
581
582 // Tell framer to infer packet header type from version_.
583 void InferPacketHeaderTypeFromVersion();
584
QUICHE teama6ef0a62019-03-07 20:34:33 -0500585 // Returns true if |header| is considered as an stateless reset packet.
586 bool IsIetfStatelessResetPacket(const QuicPacketHeader& header) const;
587
588 // Returns true if encrypter of |level| is available.
589 bool HasEncrypterOfEncryptionLevel(EncryptionLevel level) const;
590
591 void set_validate_flags(bool value) { validate_flags_ = value; }
592
593 Perspective perspective() const { return perspective_; }
594
QUICHE teama6ef0a62019-03-07 20:34:33 -0500595 void set_data_producer(QuicStreamFrameDataProducer* data_producer) {
596 data_producer_ = data_producer;
597 }
598
QUICHE teama6ef0a62019-03-07 20:34:33 -0500599 QuicTime creation_time() const { return creation_time_; }
600
601 QuicPacketNumber first_sending_packet_number() const {
602 return first_sending_packet_number_;
603 }
604
dschinazi8ff74822019-05-28 16:37:20 -0700605 // The connection ID length the framer expects on incoming IETF short headers
606 // on the server.
607 uint8_t GetExpectedServerConnectionIdLength() {
608 return expected_server_connection_id_length_;
QUICHE team8e2e4532019-03-14 14:37:56 -0700609 }
610
dschinazi346b7ce2019-06-05 01:38:18 -0700611 // Change the expected destination connection ID length for short headers on
612 // the client.
613 void SetExpectedClientConnectionIdLength(
614 uint8_t expected_client_connection_id_length) {
615 expected_client_connection_id_length_ =
616 expected_client_connection_id_length;
617 }
618
QUICHE team10b22a12019-03-21 15:31:42 -0700619 void EnableMultiplePacketNumberSpacesSupport();
620
dschinazide0f6dc2019-05-15 16:10:11 -0700621 // Writes an array of bytes that, if sent as a UDP datagram, will trigger
622 // IETF QUIC Version Negotiation on servers. The bytes will be written to
623 // |packet_bytes|, which must point to |packet_length| bytes of memory.
624 // |packet_length| must be in the range [1200, 65535].
625 // |destination_connection_id_bytes| will be sent as the destination
626 // connection ID, and must point to |destination_connection_id_length| bytes
dschinazi19dc2b52019-07-17 19:54:43 -0700627 // of memory. |destination_connection_id_length| must be in the range [8,18].
628 // When targeting Google servers, it is recommended to use a
dschinazide0f6dc2019-05-15 16:10:11 -0700629 // |destination_connection_id_length| of 8.
630 static bool WriteClientVersionNegotiationProbePacket(
631 char* packet_bytes,
632 QuicByteCount packet_length,
633 const char* destination_connection_id_bytes,
634 uint8_t destination_connection_id_length);
635
636 // Parses a packet which a QUIC server sent in response to a packet sent by
637 // WriteClientVersionNegotiationProbePacket. |packet_bytes| must point to
638 // |packet_length| bytes in memory which represent the response.
639 // |packet_length| must be greater or equal to 6. This method will fill in
640 // |source_connection_id_bytes| which must point to at least 18 bytes in
641 // memory. |source_connection_id_length_out| will contain the length of the
642 // received source connection ID, which on success will match the contents of
643 // the destination connection ID passed in to
644 // WriteClientVersionNegotiationProbePacket. In the case of a failure,
645 // |detailed_error| will be filled in with an explanation of what failed.
646 static bool ParseServerVersionNegotiationProbeResponse(
647 const char* packet_bytes,
648 QuicByteCount packet_length,
649 char* source_connection_id_bytes,
650 uint8_t* source_connection_id_length_out,
651 std::string* detailed_error);
652
fkastenholz4dc4ba32019-07-30 09:55:25 -0700653 void set_local_ack_delay_exponent(uint32_t exponent) {
654 local_ack_delay_exponent_ = exponent;
655 }
656 uint32_t local_ack_delay_exponent() const {
657 return local_ack_delay_exponent_;
658 }
659
660 void set_peer_ack_delay_exponent(uint32_t exponent) {
661 peer_ack_delay_exponent_ = exponent;
662 }
663 uint32_t peer_ack_delay_exponent() const { return peer_ack_delay_exponent_; }
664
QUICHE teama6ef0a62019-03-07 20:34:33 -0500665 private:
666 friend class test::QuicFramerPeer;
667
668 typedef std::map<QuicPacketNumber, uint8_t> NackRangeMap;
669
670 struct AckFrameInfo {
671 AckFrameInfo();
672 AckFrameInfo(const AckFrameInfo& other);
673 ~AckFrameInfo();
674
675 // The maximum ack block length.
676 QuicPacketCount max_block_length;
677 // Length of first ack block.
678 QuicPacketCount first_block_length;
679 // Number of ACK blocks needed for the ACK frame.
680 size_t num_ack_blocks;
681 };
682
nharper55fa6132019-05-07 19:37:21 -0700683 // Applies header protection to an IETF QUIC packet header in |buffer| using
684 // the encrypter for level |level|. The buffer has |buffer_len| bytes of data,
685 // with the first protected packet bytes starting at |ad_len|.
686 bool ApplyHeaderProtection(EncryptionLevel level,
687 char* buffer,
688 size_t buffer_len,
689 size_t ad_len);
690
691 // Removes header protection from an IETF QUIC packet header.
692 //
693 // The packet number from the header is read from |reader|, where the packet
694 // number is the next contents in |reader|. |reader| is only advanced by the
695 // length of the packet number, but it is also used to peek the sample needed
696 // for removing header protection.
697 //
698 // Properties needed for removing header protection are read from |header|.
699 // The packet number length and type byte are written to |header|.
700 //
701 // The packet number, after removing header protection and decoding it, is
702 // written to |full_packet_number|. Finally, the header, with header
703 // protection removed, is written to |associated_data| to be used in packet
704 // decryption. |packet| is used in computing the asociated data.
705 bool RemoveHeaderProtection(QuicDataReader* reader,
706 const QuicEncryptedPacket& packet,
707 QuicPacketHeader* header,
708 uint64_t* full_packet_number,
709 std::vector<char>* associated_data);
710
QUICHE teama6ef0a62019-03-07 20:34:33 -0500711 bool ProcessDataPacket(QuicDataReader* reader,
712 QuicPacketHeader* header,
713 const QuicEncryptedPacket& packet,
714 char* decrypted_buffer,
715 size_t buffer_length);
716
717 bool ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
718 QuicPacketHeader* header,
719 const QuicEncryptedPacket& packet,
720 char* decrypted_buffer,
721 size_t buffer_length);
722
723 bool ProcessPublicResetPacket(QuicDataReader* reader,
724 const QuicPacketHeader& header);
725
726 bool ProcessVersionNegotiationPacket(QuicDataReader* reader,
727 const QuicPacketHeader& header);
728
dschinazi244f6dc2019-05-06 15:45:16 -0700729 bool ProcessRetryPacket(QuicDataReader* reader,
730 const QuicPacketHeader& header);
731
QUICHE teama6ef0a62019-03-07 20:34:33 -0500732 void MaybeProcessCoalescedPacket(const QuicDataReader& encrypted_reader,
733 uint64_t remaining_bytes_length,
734 const QuicPacketHeader& header);
735
736 bool MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
737 QuicPacketHeader* header);
738
739 bool ProcessPublicHeader(QuicDataReader* reader,
740 bool packet_has_ietf_packet_header,
741 QuicPacketHeader* header);
742
743 // Processes the unauthenticated portion of the header into |header| from
744 // the current QuicDataReader. Returns true on success, false on failure.
745 bool ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
746 QuicPacketHeader* header);
747
fayang40315542019-05-09 09:19:09 -0700748 // Processes the version label in the packet header.
749 static bool ProcessVersionLabel(QuicDataReader* reader,
750 QuicVersionLabel* version_label);
751
752 // Validates and updates |destination_connection_id_length| and
dschinazi334f0232019-05-29 16:08:53 -0700753 // |source_connection_id_length|. When
754 // |should_update_expected_server_connection_id_length| is true, length
755 // validation is disabled and |expected_server_connection_id_length| is set
756 // to the appropriate length.
757 // TODO(b/133873272) refactor this method.
fayangccbab732019-05-13 10:11:25 -0700758 static bool ProcessAndValidateIetfConnectionIdLength(
759 QuicDataReader* reader,
fayang40315542019-05-09 09:19:09 -0700760 ParsedQuicVersion version,
dschinazi334f0232019-05-29 16:08:53 -0700761 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -0700762 bool should_update_expected_server_connection_id_length,
763 uint8_t* expected_server_connection_id_length,
fayang40315542019-05-09 09:19:09 -0700764 uint8_t* destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -0700765 uint8_t* source_connection_id_length,
766 std::string* detailed_error);
fayang40315542019-05-09 09:19:09 -0700767
QUICHE teama6ef0a62019-03-07 20:34:33 -0500768 bool ProcessIetfHeaderTypeByte(QuicDataReader* reader,
769 QuicPacketHeader* header);
770 bool ProcessIetfPacketHeader(QuicDataReader* reader,
771 QuicPacketHeader* header);
772
773 // First processes possibly truncated packet number. Calculates the full
774 // packet number from the truncated one and the last seen packet number, and
775 // stores it to |packet_number|.
776 bool ProcessAndCalculatePacketNumber(
777 QuicDataReader* reader,
778 QuicPacketNumberLength packet_number_length,
779 QuicPacketNumber base_packet_number,
780 uint64_t* packet_number);
781 bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header);
782 bool ProcessIetfFrameData(QuicDataReader* reader,
783 const QuicPacketHeader& header);
784 bool ProcessStreamFrame(QuicDataReader* reader,
785 uint8_t frame_type,
786 QuicStreamFrame* frame);
787 bool ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type);
788 bool ProcessTimestampsInAckFrame(uint8_t num_received_packets,
789 QuicPacketNumber largest_acked,
790 QuicDataReader* reader);
791 bool ProcessIetfAckFrame(QuicDataReader* reader,
792 uint64_t frame_type,
793 QuicAckFrame* ack_frame);
794 bool ProcessStopWaitingFrame(QuicDataReader* reader,
795 const QuicPacketHeader& header,
796 QuicStopWaitingFrame* stop_waiting);
797 bool ProcessRstStreamFrame(QuicDataReader* reader, QuicRstStreamFrame* frame);
798 bool ProcessConnectionCloseFrame(QuicDataReader* reader,
799 QuicConnectionCloseFrame* frame);
800 bool ProcessGoAwayFrame(QuicDataReader* reader, QuicGoAwayFrame* frame);
801 bool ProcessWindowUpdateFrame(QuicDataReader* reader,
802 QuicWindowUpdateFrame* frame);
803 bool ProcessBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
804 void ProcessPaddingFrame(QuicDataReader* reader, QuicPaddingFrame* frame);
805 bool ProcessMessageFrame(QuicDataReader* reader,
806 bool no_message_length,
807 QuicMessageFrame* frame);
808
809 bool DecryptPayload(QuicStringPiece encrypted,
810 QuicStringPiece associated_data,
811 const QuicPacketHeader& header,
812 char* decrypted_buffer,
813 size_t buffer_length,
QUICHE team10b22a12019-03-21 15:31:42 -0700814 size_t* decrypted_length,
815 EncryptionLevel* decrypted_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500816
817 // Returns the full packet number from the truncated
818 // wire format version and the last seen packet number.
819 uint64_t CalculatePacketNumberFromWire(
820 QuicPacketNumberLength packet_number_length,
821 QuicPacketNumber base_packet_number,
822 uint64_t packet_number) const;
823
824 // Returns the QuicTime::Delta corresponding to the time from when the framer
825 // was created.
826 const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us);
827
828 // Computes the wire size in bytes of time stamps in |ack|.
829 size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack);
830
831 // Computes the wire size in bytes of the |ack| frame.
832 size_t GetAckFrameSize(const QuicAckFrame& ack,
833 QuicPacketNumberLength packet_number_length);
834 // Computes the wire-size, in bytes, of the |frame| ack frame, for IETF Quic.
835 size_t GetIetfAckFrameSize(const QuicAckFrame& frame);
836
837 // Computes the wire size in bytes of the |ack| frame.
838 size_t GetAckFrameSize(const QuicAckFrame& ack);
839
840 // Computes the wire size in bytes of the payload of |frame|.
841 size_t ComputeFrameLength(const QuicFrame& frame,
842 bool last_frame_in_packet,
843 QuicPacketNumberLength packet_number_length);
844
845 static bool AppendPacketNumber(QuicPacketNumberLength packet_number_length,
846 QuicPacketNumber packet_number,
847 QuicDataWriter* writer);
848 static bool AppendStreamId(size_t stream_id_length,
849 QuicStreamId stream_id,
850 QuicDataWriter* writer);
851 static bool AppendStreamOffset(size_t offset_length,
852 QuicStreamOffset offset,
853 QuicDataWriter* writer);
854
855 // Appends a single ACK block to |writer| and returns true if the block was
856 // successfully appended.
857 static bool AppendAckBlock(uint8_t gap,
858 QuicPacketNumberLength length_length,
859 uint64_t length,
860 QuicDataWriter* writer);
861
862 static uint8_t GetPacketNumberFlags(
863 QuicPacketNumberLength packet_number_length);
864
865 static AckFrameInfo GetAckFrameInfo(const QuicAckFrame& frame);
866
dschinazi48ac9192019-07-31 00:07:26 -0700867 static QuicErrorCode ParsePublicHeaderGoogleQuic(
868 QuicDataReader* reader,
869 uint8_t* first_byte,
870 PacketHeaderFormat* format,
871 bool* version_present,
872 QuicVersionLabel* version_label,
873 QuicConnectionId* destination_connection_id,
874 std::string* detailed_error);
875
QUICHE teama6ef0a62019-03-07 20:34:33 -0500876 // The Append* methods attempt to write the provided header or frame using the
877 // |writer|, and return true if successful.
878
879 bool AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
880 QuicDataWriter* builder);
881 bool AppendTimestampsToAckFrame(const QuicAckFrame& frame,
882 QuicDataWriter* writer);
883
884 // Append IETF format ACK frame.
885 //
886 // AppendIetfAckFrameAndTypeByte adds the IETF type byte and the body
887 // of the frame.
888 bool AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
889 QuicDataWriter* writer);
890
891 // Used by AppendIetfAckFrameAndTypeByte to figure out how many ack
892 // blocks can be included.
893 int CalculateIetfAckBlockCount(const QuicAckFrame& frame,
894 QuicDataWriter* writer,
895 size_t available_space);
896 bool AppendStopWaitingFrame(const QuicPacketHeader& header,
897 const QuicStopWaitingFrame& frame,
898 QuicDataWriter* builder);
899 bool AppendRstStreamFrame(const QuicRstStreamFrame& frame,
900 QuicDataWriter* builder);
901 bool AppendConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
902 QuicDataWriter* builder);
903 bool AppendGoAwayFrame(const QuicGoAwayFrame& frame, QuicDataWriter* writer);
904 bool AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
905 QuicDataWriter* writer);
906 bool AppendBlockedFrame(const QuicBlockedFrame& frame,
907 QuicDataWriter* writer);
908 bool AppendPaddingFrame(const QuicPaddingFrame& frame,
909 QuicDataWriter* writer);
910 bool AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
911 bool last_frame_in_packet,
912 QuicDataWriter* writer);
913
914 // IETF frame processing methods.
915 bool ProcessIetfStreamFrame(QuicDataReader* reader,
916 uint8_t frame_type,
917 QuicStreamFrame* frame);
918 bool ProcessIetfConnectionCloseFrame(QuicDataReader* reader,
fkastenholze9d71a82019-04-09 05:12:13 -0700919 QuicConnectionCloseType type,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500920 QuicConnectionCloseFrame* frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500921 bool ProcessPathChallengeFrame(QuicDataReader* reader,
922 QuicPathChallengeFrame* frame);
923 bool ProcessPathResponseFrame(QuicDataReader* reader,
924 QuicPathResponseFrame* frame);
925 bool ProcessIetfResetStreamFrame(QuicDataReader* reader,
926 QuicRstStreamFrame* frame);
927 bool ProcessStopSendingFrame(QuicDataReader* reader,
928 QuicStopSendingFrame* stop_sending_frame);
929 bool ProcessCryptoFrame(QuicDataReader* reader, QuicCryptoFrame* frame);
930
931 // IETF frame appending methods. All methods append the type byte as well.
932 bool AppendIetfStreamFrame(const QuicStreamFrame& frame,
933 bool last_frame_in_packet,
934 QuicDataWriter* writer);
935 bool AppendIetfConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
936 QuicDataWriter* writer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500937 bool AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
938 QuicDataWriter* writer);
939 bool AppendPathResponseFrame(const QuicPathResponseFrame& frame,
940 QuicDataWriter* writer);
941 bool AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
942 QuicDataWriter* writer);
943 bool AppendStopSendingFrame(const QuicStopSendingFrame& stop_sending_frame,
944 QuicDataWriter* writer);
945
946 // Append/consume IETF-Format MAX_DATA and MAX_STREAM_DATA frames
947 bool AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
948 QuicDataWriter* writer);
949 bool AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
950 QuicDataWriter* writer);
951 bool ProcessMaxDataFrame(QuicDataReader* reader,
952 QuicWindowUpdateFrame* frame);
953 bool ProcessMaxStreamDataFrame(QuicDataReader* reader,
954 QuicWindowUpdateFrame* frame);
955
fkastenholz3c4eabf2019-04-22 07:49:59 -0700956 bool AppendMaxStreamsFrame(const QuicMaxStreamsFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500957 QuicDataWriter* writer);
958 bool ProcessMaxStreamsFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700959 QuicMaxStreamsFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500960 uint64_t frame_type);
961
962 bool AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
963 QuicDataWriter* writer);
964 bool ProcessIetfBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
965
966 bool AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
967 QuicDataWriter* writer);
968 bool ProcessStreamBlockedFrame(QuicDataReader* reader,
969 QuicBlockedFrame* frame);
970
fkastenholz3c4eabf2019-04-22 07:49:59 -0700971 bool AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500972 QuicDataWriter* writer);
973 bool ProcessStreamsBlockedFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700974 QuicStreamsBlockedFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500975 uint64_t frame_type);
976
977 bool AppendNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame,
978 QuicDataWriter* writer);
979 bool ProcessNewConnectionIdFrame(QuicDataReader* reader,
980 QuicNewConnectionIdFrame* frame);
981 bool AppendRetireConnectionIdFrame(const QuicRetireConnectionIdFrame& frame,
982 QuicDataWriter* writer);
983 bool ProcessRetireConnectionIdFrame(QuicDataReader* reader,
984 QuicRetireConnectionIdFrame* frame);
985
986 bool AppendNewTokenFrame(const QuicNewTokenFrame& frame,
987 QuicDataWriter* writer);
988 bool ProcessNewTokenFrame(QuicDataReader* reader, QuicNewTokenFrame* frame);
989
990 bool RaiseError(QuicErrorCode error);
991
992 // Returns true if |header| indicates a version negotiation packet.
993 bool IsVersionNegotiation(const QuicPacketHeader& header,
994 bool packet_has_ietf_packet_header) const;
995
996 // Calculates and returns type byte of stream frame.
997 uint8_t GetStreamFrameTypeByte(const QuicStreamFrame& frame,
998 bool last_frame_in_packet) const;
999 uint8_t GetIetfStreamFrameTypeByte(const QuicStreamFrame& frame,
1000 bool last_frame_in_packet) const;
1001
1002 void set_error(QuicErrorCode error) { error_ = error; }
1003
1004 void set_detailed_error(const char* error) { detailed_error_ = error; }
dschinazi48ac9192019-07-31 00:07:26 -07001005 void set_detailed_error(std::string error) { detailed_error_ = error; }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001006
vasilvvc48c8712019-03-11 13:38:16 -07001007 std::string detailed_error_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001008 QuicFramerVisitorInterface* visitor_;
1009 QuicErrorCode error_;
1010 // Updated by ProcessPacketHeader when it succeeds decrypting a larger packet.
1011 QuicPacketNumber largest_packet_number_;
QUICHE team10b22a12019-03-21 15:31:42 -07001012 // Largest successfully decrypted packet number per packet number space. Only
1013 // used when supports_multiple_packet_number_spaces_ is true.
1014 QuicPacketNumber largest_decrypted_packet_numbers_[NUM_PACKET_NUMBER_SPACES];
dschinazi7b9278c2019-05-20 07:36:21 -07001015 // Last server connection ID seen on the wire.
1016 QuicConnectionId last_serialized_server_connection_id_;
dschinazi346b7ce2019-06-05 01:38:18 -07001017 // Last client connection ID seen on the wire.
1018 QuicConnectionId last_serialized_client_connection_id_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001019 // Version of the protocol being used.
1020 ParsedQuicVersion version_;
1021 // This vector contains QUIC versions which we currently support.
1022 // This should be ordered such that the highest supported version is the first
1023 // element, with subsequent elements in descending order (versions can be
1024 // skipped as necessary).
1025 ParsedQuicVersionVector supported_versions_;
QUICHE team76086e42019-03-25 15:12:29 -07001026 // Decrypters used to decrypt packets during parsing.
1027 std::unique_ptr<QuicDecrypter> decrypter_[NUM_ENCRYPTION_LEVELS];
1028 // The encryption level of the primary decrypter to use in |decrypter_|.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001029 EncryptionLevel decrypter_level_;
QUICHE team76086e42019-03-25 15:12:29 -07001030 // The encryption level of the alternative decrypter to use in |decrypter_|.
1031 // When set to NUM_ENCRYPTION_LEVELS, indicates that there is no alternative
QUICHE teama6ef0a62019-03-07 20:34:33 -05001032 // decrypter.
QUICHE team76086e42019-03-25 15:12:29 -07001033 EncryptionLevel alternative_decrypter_level_;
1034 // |alternative_decrypter_latch_| is true if, when the decrypter at
1035 // |alternative_decrypter_level_| successfully decrypts a packet, we should
1036 // install it as the only decrypter.
QUICHE teama6ef0a62019-03-07 20:34:33 -05001037 bool alternative_decrypter_latch_;
1038 // Encrypters used to encrypt packets via EncryptPayload().
1039 std::unique_ptr<QuicEncrypter> encrypter_[NUM_ENCRYPTION_LEVELS];
1040 // Tracks if the framer is being used by the entity that received the
1041 // connection or the entity that initiated it.
1042 Perspective perspective_;
1043 // If false, skip validation that the public flags are set to legal values.
1044 bool validate_flags_;
1045 // The diversification nonce from the last received packet.
1046 DiversificationNonce last_nonce_;
1047 // If true, send and process timestamps in the ACK frame.
1048 bool process_timestamps_;
1049 // The creation time of the connection, used to calculate timestamps.
1050 QuicTime creation_time_;
1051 // The last timestamp received if process_timestamps_ is true.
1052 QuicTime::Delta last_timestamp_;
1053
1054 // If this is a framer of a connection, this is the packet number of first
1055 // sending packet. If this is a framer of a framer of dispatcher, this is the
1056 // packet number of sent packets (for those which have packet number).
1057 const QuicPacketNumber first_sending_packet_number_;
1058
1059 // If not null, framer asks data_producer_ to write stream frame data. Not
1060 // owned. TODO(fayang): Consider add data producer to framer's constructor.
1061 QuicStreamFrameDataProducer* data_producer_;
1062
1063 // If true, framer infers packet header type (IETF/GQUIC) from version_.
1064 // Otherwise, framer infers packet header type from first byte of a received
1065 // packet.
1066 bool infer_packet_header_type_from_version_;
1067
1068 // IETF short headers contain a destination connection ID but do not
dschinazi346b7ce2019-06-05 01:38:18 -07001069 // encode its length. These variables contains the length we expect to read.
1070 // This is also used to validate the long header destination connection ID
1071 // lengths in older versions of QUIC.
dschinazi8ff74822019-05-28 16:37:20 -07001072 uint8_t expected_server_connection_id_length_;
dschinazi346b7ce2019-06-05 01:38:18 -07001073 uint8_t expected_client_connection_id_length_;
QUICHE team4d9d6292019-03-11 14:25:33 -07001074
QUICHE team10b22a12019-03-21 15:31:42 -07001075 // Indicates whether this framer supports multiple packet number spaces.
1076 bool supports_multiple_packet_number_spaces_;
nharper55fa6132019-05-07 19:37:21 -07001077
1078 // The length in bytes of the last packet number written to an IETF-framed
1079 // packet.
1080 size_t last_written_packet_number_length_;
fkastenholz4dc4ba32019-07-30 09:55:25 -07001081
1082 // The amount to shift the ack timestamp in ACK frames. The default is 3.
1083 // Local_ is the amount this node shifts timestamps in ACK frames it
1084 // generates. it is sent to the peer in a transport parameter negotiation.
1085 // Peer_ is the amount the peer shifts timestamps when it sends ACK frames to
1086 // this node. This node "unshifts" by this amount. The value is received from
1087 // the peer in the transport parameter negotiation. IETF QUIC only.
1088 uint32_t peer_ack_delay_exponent_;
1089 uint32_t local_ack_delay_exponent_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001090};
1091
1092} // namespace quic
1093
1094#endif // QUICHE_QUIC_CORE_QUIC_FRAMER_H_