blob: 18420f13e517954a44589084fd018a37dd811551 [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.
79 virtual bool OnProtocolVersionMismatch(ParsedQuicVersion received_version,
80 PacketHeaderFormat form) = 0;
81
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
QUICHE teama6ef0a62019-03-07 20:34:33 -0500390 // Serializes a packet containing |frames| into |buffer|.
391 // Returns the length of the packet, which must not be longer than
392 // |packet_length|. Returns 0 if it fails to serialize.
393 size_t BuildDataPacket(const QuicPacketHeader& header,
394 const QuicFrames& frames,
395 char* buffer,
396 size_t packet_length,
397 EncryptionLevel level);
398
399 // Serializes a probing packet, which is a padded PING packet. Returns the
400 // length of the packet. Returns 0 if it fails to serialize.
401 size_t BuildConnectivityProbingPacket(const QuicPacketHeader& header,
402 char* buffer,
403 size_t packet_length,
404 EncryptionLevel level);
405
QUICHE teama6ef0a62019-03-07 20:34:33 -0500406 // Serialize a probing packet that uses IETF QUIC's PATH CHALLENGE frame. Also
407 // fills the packet with padding.
408 size_t BuildPaddedPathChallengePacket(const QuicPacketHeader& header,
409 char* buffer,
410 size_t packet_length,
411 QuicPathFrameBuffer* payload,
412 QuicRandom* randomizer,
413 EncryptionLevel level);
414
415 // Serialize a probing response packet that uses IETF QUIC's PATH RESPONSE
416 // frame. Also fills the packet with padding if |is_padded| is
417 // true. |payloads| is always emptied, even if the packet can not be
418 // successfully built.
419 size_t BuildPathResponsePacket(const QuicPacketHeader& header,
420 char* buffer,
421 size_t packet_length,
422 const QuicDeque<QuicPathFrameBuffer>& payloads,
423 const bool is_padded,
424 EncryptionLevel level);
425
426 // Returns a new public reset packet.
427 static std::unique_ptr<QuicEncryptedPacket> BuildPublicResetPacket(
428 const QuicPublicResetPacket& packet);
429
430 // Returns a new IETF stateless reset packet.
431 static std::unique_ptr<QuicEncryptedPacket> BuildIetfStatelessResetPacket(
432 QuicConnectionId connection_id,
433 QuicUint128 stateless_reset_token);
434
435 // Returns a new version negotiation packet.
436 static std::unique_ptr<QuicEncryptedPacket> BuildVersionNegotiationPacket(
dschinazib417d602019-05-29 13:08:45 -0700437 QuicConnectionId server_connection_id,
438 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500439 bool ietf_quic,
440 const ParsedQuicVersionVector& versions);
441
442 // Returns a new IETF version negotiation packet.
443 static std::unique_ptr<QuicEncryptedPacket> BuildIetfVersionNegotiationPacket(
dschinazib417d602019-05-29 13:08:45 -0700444 QuicConnectionId server_connection_id,
445 QuicConnectionId client_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500446 const ParsedQuicVersionVector& versions);
447
448 // If header.version_flag is set, the version in the
449 // packet will be set -- but it will be set from version_ not
450 // header.versions.
451 bool AppendPacketHeader(const QuicPacketHeader& header,
452 QuicDataWriter* writer,
453 size_t* length_field_offset);
454 bool AppendIetfHeaderTypeByte(const QuicPacketHeader& header,
455 QuicDataWriter* writer);
456 bool AppendIetfPacketHeader(const QuicPacketHeader& header,
457 QuicDataWriter* writer,
458 size_t* length_field_offset);
459 bool WriteIetfLongHeaderLength(const QuicPacketHeader& header,
460 QuicDataWriter* writer,
461 size_t length_field_offset,
462 EncryptionLevel level);
463 bool AppendTypeByte(const QuicFrame& frame,
464 bool last_frame_in_packet,
465 QuicDataWriter* writer);
466 bool AppendIetfTypeByte(const QuicFrame& frame,
467 bool last_frame_in_packet,
468 QuicDataWriter* writer);
469 size_t AppendIetfFrames(const QuicFrames& frames, QuicDataWriter* writer);
470 bool AppendStreamFrame(const QuicStreamFrame& frame,
471 bool last_frame_in_packet,
472 QuicDataWriter* writer);
473 bool AppendCryptoFrame(const QuicCryptoFrame& frame, QuicDataWriter* writer);
474
475 // SetDecrypter sets the primary decrypter, replacing any that already exists.
476 // If an alternative decrypter is in place then the function DCHECKs. This is
477 // intended for cases where one knows that future packets will be using the
478 // new decrypter and the previous decrypter is now obsolete. |level| indicates
479 // the encryption level of the new decrypter.
480 void SetDecrypter(EncryptionLevel level,
481 std::unique_ptr<QuicDecrypter> decrypter);
482
483 // SetAlternativeDecrypter sets a decrypter that may be used to decrypt
484 // future packets. |level| indicates the encryption level of the decrypter. If
485 // |latch_once_used| is true, then the first time that the decrypter is
486 // successful it will replace the primary decrypter. Otherwise both
487 // decrypters will remain active and the primary decrypter will be the one
488 // last used.
489 void SetAlternativeDecrypter(EncryptionLevel level,
490 std::unique_ptr<QuicDecrypter> decrypter,
491 bool latch_once_used);
492
zhongyi546cc452019-04-12 15:27:49 -0700493 void InstallDecrypter(EncryptionLevel level,
494 std::unique_ptr<QuicDecrypter> decrypter);
495 void RemoveDecrypter(EncryptionLevel level);
496
497 const QuicDecrypter* GetDecrypter(EncryptionLevel level) const;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500498 const QuicDecrypter* decrypter() const;
499 const QuicDecrypter* alternative_decrypter() const;
500
501 // Changes the encrypter used for level |level| to |encrypter|.
502 void SetEncrypter(EncryptionLevel level,
503 std::unique_ptr<QuicEncrypter> encrypter);
504
505 // Encrypts a payload in |buffer|. |ad_len| is the length of the associated
506 // data. |total_len| is the length of the associated data plus plaintext.
507 // |buffer_len| is the full length of the allocated buffer.
508 size_t EncryptInPlace(EncryptionLevel level,
509 QuicPacketNumber packet_number,
510 size_t ad_len,
511 size_t total_len,
512 size_t buffer_len,
513 char* buffer);
514
515 // Returns the length of the data encrypted into |buffer| if |buffer_len| is
516 // long enough, and otherwise 0.
517 size_t EncryptPayload(EncryptionLevel level,
518 QuicPacketNumber packet_number,
519 const QuicPacket& packet,
520 char* buffer,
521 size_t buffer_len);
522
523 // Returns the length of the ciphertext that would be generated by encrypting
524 // to plaintext of size |plaintext_size| at the given level.
525 size_t GetCiphertextSize(EncryptionLevel level, size_t plaintext_size) const;
526
527 // Returns the maximum length of plaintext that can be encrypted
528 // to ciphertext no larger than |ciphertext_size|.
529 size_t GetMaxPlaintextSize(size_t ciphertext_size);
530
vasilvvc48c8712019-03-11 13:38:16 -0700531 const std::string& detailed_error() { return detailed_error_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500532
533 // The minimum packet number length required to represent |packet_number|.
534 static QuicPacketNumberLength GetMinPacketNumberLength(
535 QuicTransportVersion version,
536 QuicPacketNumber packet_number);
537
538 void SetSupportedVersions(const ParsedQuicVersionVector& versions) {
539 supported_versions_ = versions;
540 version_ = versions[0];
541 }
542
543 // Tell framer to infer packet header type from version_.
544 void InferPacketHeaderTypeFromVersion();
545
QUICHE teama6ef0a62019-03-07 20:34:33 -0500546 // Returns true if |header| is considered as an stateless reset packet.
547 bool IsIetfStatelessResetPacket(const QuicPacketHeader& header) const;
548
549 // Returns true if encrypter of |level| is available.
550 bool HasEncrypterOfEncryptionLevel(EncryptionLevel level) const;
551
552 void set_validate_flags(bool value) { validate_flags_ = value; }
553
554 Perspective perspective() const { return perspective_; }
555
QUICHE teama6ef0a62019-03-07 20:34:33 -0500556 void set_data_producer(QuicStreamFrameDataProducer* data_producer) {
557 data_producer_ = data_producer;
558 }
559
QUICHE teama6ef0a62019-03-07 20:34:33 -0500560 QuicTime creation_time() const { return creation_time_; }
561
562 QuicPacketNumber first_sending_packet_number() const {
563 return first_sending_packet_number_;
564 }
565
dschinazi8ff74822019-05-28 16:37:20 -0700566 // The connection ID length the framer expects on incoming IETF short headers
567 // on the server.
568 uint8_t GetExpectedServerConnectionIdLength() {
569 return expected_server_connection_id_length_;
QUICHE team8e2e4532019-03-14 14:37:56 -0700570 }
571
dschinazi346b7ce2019-06-05 01:38:18 -0700572 // Change the expected destination connection ID length for short headers on
573 // the client.
574 void SetExpectedClientConnectionIdLength(
575 uint8_t expected_client_connection_id_length) {
576 expected_client_connection_id_length_ =
577 expected_client_connection_id_length;
578 }
579
QUICHE team10b22a12019-03-21 15:31:42 -0700580 void EnableMultiplePacketNumberSpacesSupport();
581
dschinazide0f6dc2019-05-15 16:10:11 -0700582 // Writes an array of bytes that, if sent as a UDP datagram, will trigger
583 // IETF QUIC Version Negotiation on servers. The bytes will be written to
584 // |packet_bytes|, which must point to |packet_length| bytes of memory.
585 // |packet_length| must be in the range [1200, 65535].
586 // |destination_connection_id_bytes| will be sent as the destination
587 // connection ID, and must point to |destination_connection_id_length| bytes
588 // of memory. |destination_connection_id_length| must be either 0 or in the
589 // range [4,18]. When targeting Google servers, it is recommended to use a
590 // |destination_connection_id_length| of 8.
591 static bool WriteClientVersionNegotiationProbePacket(
592 char* packet_bytes,
593 QuicByteCount packet_length,
594 const char* destination_connection_id_bytes,
595 uint8_t destination_connection_id_length);
596
597 // Parses a packet which a QUIC server sent in response to a packet sent by
598 // WriteClientVersionNegotiationProbePacket. |packet_bytes| must point to
599 // |packet_length| bytes in memory which represent the response.
600 // |packet_length| must be greater or equal to 6. This method will fill in
601 // |source_connection_id_bytes| which must point to at least 18 bytes in
602 // memory. |source_connection_id_length_out| will contain the length of the
603 // received source connection ID, which on success will match the contents of
604 // the destination connection ID passed in to
605 // WriteClientVersionNegotiationProbePacket. In the case of a failure,
606 // |detailed_error| will be filled in with an explanation of what failed.
607 static bool ParseServerVersionNegotiationProbeResponse(
608 const char* packet_bytes,
609 QuicByteCount packet_length,
610 char* source_connection_id_bytes,
611 uint8_t* source_connection_id_length_out,
612 std::string* detailed_error);
613
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614 private:
615 friend class test::QuicFramerPeer;
616
617 typedef std::map<QuicPacketNumber, uint8_t> NackRangeMap;
618
619 struct AckFrameInfo {
620 AckFrameInfo();
621 AckFrameInfo(const AckFrameInfo& other);
622 ~AckFrameInfo();
623
624 // The maximum ack block length.
625 QuicPacketCount max_block_length;
626 // Length of first ack block.
627 QuicPacketCount first_block_length;
628 // Number of ACK blocks needed for the ACK frame.
629 size_t num_ack_blocks;
630 };
631
nharper55fa6132019-05-07 19:37:21 -0700632 // Applies header protection to an IETF QUIC packet header in |buffer| using
633 // the encrypter for level |level|. The buffer has |buffer_len| bytes of data,
634 // with the first protected packet bytes starting at |ad_len|.
635 bool ApplyHeaderProtection(EncryptionLevel level,
636 char* buffer,
637 size_t buffer_len,
638 size_t ad_len);
639
640 // Removes header protection from an IETF QUIC packet header.
641 //
642 // The packet number from the header is read from |reader|, where the packet
643 // number is the next contents in |reader|. |reader| is only advanced by the
644 // length of the packet number, but it is also used to peek the sample needed
645 // for removing header protection.
646 //
647 // Properties needed for removing header protection are read from |header|.
648 // The packet number length and type byte are written to |header|.
649 //
650 // The packet number, after removing header protection and decoding it, is
651 // written to |full_packet_number|. Finally, the header, with header
652 // protection removed, is written to |associated_data| to be used in packet
653 // decryption. |packet| is used in computing the asociated data.
654 bool RemoveHeaderProtection(QuicDataReader* reader,
655 const QuicEncryptedPacket& packet,
656 QuicPacketHeader* header,
657 uint64_t* full_packet_number,
658 std::vector<char>* associated_data);
659
QUICHE teama6ef0a62019-03-07 20:34:33 -0500660 bool ProcessDataPacket(QuicDataReader* reader,
661 QuicPacketHeader* header,
662 const QuicEncryptedPacket& packet,
663 char* decrypted_buffer,
664 size_t buffer_length);
665
666 bool ProcessIetfDataPacket(QuicDataReader* encrypted_reader,
667 QuicPacketHeader* header,
668 const QuicEncryptedPacket& packet,
669 char* decrypted_buffer,
670 size_t buffer_length);
671
672 bool ProcessPublicResetPacket(QuicDataReader* reader,
673 const QuicPacketHeader& header);
674
675 bool ProcessVersionNegotiationPacket(QuicDataReader* reader,
676 const QuicPacketHeader& header);
677
dschinazi244f6dc2019-05-06 15:45:16 -0700678 bool ProcessRetryPacket(QuicDataReader* reader,
679 const QuicPacketHeader& header);
680
QUICHE teama6ef0a62019-03-07 20:34:33 -0500681 bool MaybeProcessIetfInitialRetryToken(QuicDataReader* encrypted_reader,
682 QuicPacketHeader* header);
683
684 void MaybeProcessCoalescedPacket(const QuicDataReader& encrypted_reader,
685 uint64_t remaining_bytes_length,
686 const QuicPacketHeader& header);
687
688 bool MaybeProcessIetfLength(QuicDataReader* encrypted_reader,
689 QuicPacketHeader* header);
690
691 bool ProcessPublicHeader(QuicDataReader* reader,
692 bool packet_has_ietf_packet_header,
693 QuicPacketHeader* header);
694
695 // Processes the unauthenticated portion of the header into |header| from
696 // the current QuicDataReader. Returns true on success, false on failure.
697 bool ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader,
698 QuicPacketHeader* header);
699
fayang40315542019-05-09 09:19:09 -0700700 // Processes the version label in the packet header.
701 static bool ProcessVersionLabel(QuicDataReader* reader,
702 QuicVersionLabel* version_label);
703
704 // Validates and updates |destination_connection_id_length| and
dschinazi334f0232019-05-29 16:08:53 -0700705 // |source_connection_id_length|. When
706 // |should_update_expected_server_connection_id_length| is true, length
707 // validation is disabled and |expected_server_connection_id_length| is set
708 // to the appropriate length.
709 // TODO(b/133873272) refactor this method.
fayangccbab732019-05-13 10:11:25 -0700710 static bool ProcessAndValidateIetfConnectionIdLength(
711 QuicDataReader* reader,
fayang40315542019-05-09 09:19:09 -0700712 ParsedQuicVersion version,
dschinazi334f0232019-05-29 16:08:53 -0700713 Perspective perspective,
dschinazi8ff74822019-05-28 16:37:20 -0700714 bool should_update_expected_server_connection_id_length,
715 uint8_t* expected_server_connection_id_length,
fayang40315542019-05-09 09:19:09 -0700716 uint8_t* destination_connection_id_length,
fayangccbab732019-05-13 10:11:25 -0700717 uint8_t* source_connection_id_length,
718 std::string* detailed_error);
fayang40315542019-05-09 09:19:09 -0700719
QUICHE teama6ef0a62019-03-07 20:34:33 -0500720 bool ProcessIetfHeaderTypeByte(QuicDataReader* reader,
721 QuicPacketHeader* header);
722 bool ProcessIetfPacketHeader(QuicDataReader* reader,
723 QuicPacketHeader* header);
724
725 // First processes possibly truncated packet number. Calculates the full
726 // packet number from the truncated one and the last seen packet number, and
727 // stores it to |packet_number|.
728 bool ProcessAndCalculatePacketNumber(
729 QuicDataReader* reader,
730 QuicPacketNumberLength packet_number_length,
731 QuicPacketNumber base_packet_number,
732 uint64_t* packet_number);
733 bool ProcessFrameData(QuicDataReader* reader, const QuicPacketHeader& header);
734 bool ProcessIetfFrameData(QuicDataReader* reader,
735 const QuicPacketHeader& header);
736 bool ProcessStreamFrame(QuicDataReader* reader,
737 uint8_t frame_type,
738 QuicStreamFrame* frame);
739 bool ProcessAckFrame(QuicDataReader* reader, uint8_t frame_type);
740 bool ProcessTimestampsInAckFrame(uint8_t num_received_packets,
741 QuicPacketNumber largest_acked,
742 QuicDataReader* reader);
743 bool ProcessIetfAckFrame(QuicDataReader* reader,
744 uint64_t frame_type,
745 QuicAckFrame* ack_frame);
746 bool ProcessStopWaitingFrame(QuicDataReader* reader,
747 const QuicPacketHeader& header,
748 QuicStopWaitingFrame* stop_waiting);
749 bool ProcessRstStreamFrame(QuicDataReader* reader, QuicRstStreamFrame* frame);
750 bool ProcessConnectionCloseFrame(QuicDataReader* reader,
751 QuicConnectionCloseFrame* frame);
752 bool ProcessGoAwayFrame(QuicDataReader* reader, QuicGoAwayFrame* frame);
753 bool ProcessWindowUpdateFrame(QuicDataReader* reader,
754 QuicWindowUpdateFrame* frame);
755 bool ProcessBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
756 void ProcessPaddingFrame(QuicDataReader* reader, QuicPaddingFrame* frame);
757 bool ProcessMessageFrame(QuicDataReader* reader,
758 bool no_message_length,
759 QuicMessageFrame* frame);
760
761 bool DecryptPayload(QuicStringPiece encrypted,
762 QuicStringPiece associated_data,
763 const QuicPacketHeader& header,
764 char* decrypted_buffer,
765 size_t buffer_length,
QUICHE team10b22a12019-03-21 15:31:42 -0700766 size_t* decrypted_length,
767 EncryptionLevel* decrypted_level);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500768
769 // Returns the full packet number from the truncated
770 // wire format version and the last seen packet number.
771 uint64_t CalculatePacketNumberFromWire(
772 QuicPacketNumberLength packet_number_length,
773 QuicPacketNumber base_packet_number,
774 uint64_t packet_number) const;
775
776 // Returns the QuicTime::Delta corresponding to the time from when the framer
777 // was created.
778 const QuicTime::Delta CalculateTimestampFromWire(uint32_t time_delta_us);
779
780 // Computes the wire size in bytes of time stamps in |ack|.
781 size_t GetAckFrameTimeStampSize(const QuicAckFrame& ack);
782
783 // Computes the wire size in bytes of the |ack| frame.
784 size_t GetAckFrameSize(const QuicAckFrame& ack,
785 QuicPacketNumberLength packet_number_length);
786 // Computes the wire-size, in bytes, of the |frame| ack frame, for IETF Quic.
787 size_t GetIetfAckFrameSize(const QuicAckFrame& frame);
788
789 // Computes the wire size in bytes of the |ack| frame.
790 size_t GetAckFrameSize(const QuicAckFrame& ack);
791
792 // Computes the wire size in bytes of the payload of |frame|.
793 size_t ComputeFrameLength(const QuicFrame& frame,
794 bool last_frame_in_packet,
795 QuicPacketNumberLength packet_number_length);
796
797 static bool AppendPacketNumber(QuicPacketNumberLength packet_number_length,
798 QuicPacketNumber packet_number,
799 QuicDataWriter* writer);
800 static bool AppendStreamId(size_t stream_id_length,
801 QuicStreamId stream_id,
802 QuicDataWriter* writer);
803 static bool AppendStreamOffset(size_t offset_length,
804 QuicStreamOffset offset,
805 QuicDataWriter* writer);
806
807 // Appends a single ACK block to |writer| and returns true if the block was
808 // successfully appended.
809 static bool AppendAckBlock(uint8_t gap,
810 QuicPacketNumberLength length_length,
811 uint64_t length,
812 QuicDataWriter* writer);
813
814 static uint8_t GetPacketNumberFlags(
815 QuicPacketNumberLength packet_number_length);
816
817 static AckFrameInfo GetAckFrameInfo(const QuicAckFrame& frame);
818
QUICHE teama6ef0a62019-03-07 20:34:33 -0500819 // The Append* methods attempt to write the provided header or frame using the
820 // |writer|, and return true if successful.
821
822 bool AppendAckFrameAndTypeByte(const QuicAckFrame& frame,
823 QuicDataWriter* builder);
824 bool AppendTimestampsToAckFrame(const QuicAckFrame& frame,
825 QuicDataWriter* writer);
826
827 // Append IETF format ACK frame.
828 //
829 // AppendIetfAckFrameAndTypeByte adds the IETF type byte and the body
830 // of the frame.
831 bool AppendIetfAckFrameAndTypeByte(const QuicAckFrame& frame,
832 QuicDataWriter* writer);
833
834 // Used by AppendIetfAckFrameAndTypeByte to figure out how many ack
835 // blocks can be included.
836 int CalculateIetfAckBlockCount(const QuicAckFrame& frame,
837 QuicDataWriter* writer,
838 size_t available_space);
839 bool AppendStopWaitingFrame(const QuicPacketHeader& header,
840 const QuicStopWaitingFrame& frame,
841 QuicDataWriter* builder);
842 bool AppendRstStreamFrame(const QuicRstStreamFrame& frame,
843 QuicDataWriter* builder);
844 bool AppendConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
845 QuicDataWriter* builder);
846 bool AppendGoAwayFrame(const QuicGoAwayFrame& frame, QuicDataWriter* writer);
847 bool AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
848 QuicDataWriter* writer);
849 bool AppendBlockedFrame(const QuicBlockedFrame& frame,
850 QuicDataWriter* writer);
851 bool AppendPaddingFrame(const QuicPaddingFrame& frame,
852 QuicDataWriter* writer);
853 bool AppendMessageFrameAndTypeByte(const QuicMessageFrame& frame,
854 bool last_frame_in_packet,
855 QuicDataWriter* writer);
856
857 // IETF frame processing methods.
858 bool ProcessIetfStreamFrame(QuicDataReader* reader,
859 uint8_t frame_type,
860 QuicStreamFrame* frame);
861 bool ProcessIetfConnectionCloseFrame(QuicDataReader* reader,
fkastenholze9d71a82019-04-09 05:12:13 -0700862 QuicConnectionCloseType type,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500863 QuicConnectionCloseFrame* frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500864 bool ProcessPathChallengeFrame(QuicDataReader* reader,
865 QuicPathChallengeFrame* frame);
866 bool ProcessPathResponseFrame(QuicDataReader* reader,
867 QuicPathResponseFrame* frame);
868 bool ProcessIetfResetStreamFrame(QuicDataReader* reader,
869 QuicRstStreamFrame* frame);
870 bool ProcessStopSendingFrame(QuicDataReader* reader,
871 QuicStopSendingFrame* stop_sending_frame);
872 bool ProcessCryptoFrame(QuicDataReader* reader, QuicCryptoFrame* frame);
873
874 // IETF frame appending methods. All methods append the type byte as well.
875 bool AppendIetfStreamFrame(const QuicStreamFrame& frame,
876 bool last_frame_in_packet,
877 QuicDataWriter* writer);
878 bool AppendIetfConnectionCloseFrame(const QuicConnectionCloseFrame& frame,
879 QuicDataWriter* writer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500880 bool AppendPathChallengeFrame(const QuicPathChallengeFrame& frame,
881 QuicDataWriter* writer);
882 bool AppendPathResponseFrame(const QuicPathResponseFrame& frame,
883 QuicDataWriter* writer);
884 bool AppendIetfResetStreamFrame(const QuicRstStreamFrame& frame,
885 QuicDataWriter* writer);
886 bool AppendStopSendingFrame(const QuicStopSendingFrame& stop_sending_frame,
887 QuicDataWriter* writer);
888
889 // Append/consume IETF-Format MAX_DATA and MAX_STREAM_DATA frames
890 bool AppendMaxDataFrame(const QuicWindowUpdateFrame& frame,
891 QuicDataWriter* writer);
892 bool AppendMaxStreamDataFrame(const QuicWindowUpdateFrame& frame,
893 QuicDataWriter* writer);
894 bool ProcessMaxDataFrame(QuicDataReader* reader,
895 QuicWindowUpdateFrame* frame);
896 bool ProcessMaxStreamDataFrame(QuicDataReader* reader,
897 QuicWindowUpdateFrame* frame);
898
fkastenholz3c4eabf2019-04-22 07:49:59 -0700899 bool AppendMaxStreamsFrame(const QuicMaxStreamsFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500900 QuicDataWriter* writer);
901 bool ProcessMaxStreamsFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700902 QuicMaxStreamsFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500903 uint64_t frame_type);
904
905 bool AppendIetfBlockedFrame(const QuicBlockedFrame& frame,
906 QuicDataWriter* writer);
907 bool ProcessIetfBlockedFrame(QuicDataReader* reader, QuicBlockedFrame* frame);
908
909 bool AppendStreamBlockedFrame(const QuicBlockedFrame& frame,
910 QuicDataWriter* writer);
911 bool ProcessStreamBlockedFrame(QuicDataReader* reader,
912 QuicBlockedFrame* frame);
913
fkastenholz3c4eabf2019-04-22 07:49:59 -0700914 bool AppendStreamsBlockedFrame(const QuicStreamsBlockedFrame& frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500915 QuicDataWriter* writer);
916 bool ProcessStreamsBlockedFrame(QuicDataReader* reader,
fkastenholz3c4eabf2019-04-22 07:49:59 -0700917 QuicStreamsBlockedFrame* frame,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500918 uint64_t frame_type);
919
920 bool AppendNewConnectionIdFrame(const QuicNewConnectionIdFrame& frame,
921 QuicDataWriter* writer);
922 bool ProcessNewConnectionIdFrame(QuicDataReader* reader,
923 QuicNewConnectionIdFrame* frame);
924 bool AppendRetireConnectionIdFrame(const QuicRetireConnectionIdFrame& frame,
925 QuicDataWriter* writer);
926 bool ProcessRetireConnectionIdFrame(QuicDataReader* reader,
927 QuicRetireConnectionIdFrame* frame);
928
929 bool AppendNewTokenFrame(const QuicNewTokenFrame& frame,
930 QuicDataWriter* writer);
931 bool ProcessNewTokenFrame(QuicDataReader* reader, QuicNewTokenFrame* frame);
932
933 bool RaiseError(QuicErrorCode error);
934
935 // Returns true if |header| indicates a version negotiation packet.
936 bool IsVersionNegotiation(const QuicPacketHeader& header,
937 bool packet_has_ietf_packet_header) const;
938
939 // Calculates and returns type byte of stream frame.
940 uint8_t GetStreamFrameTypeByte(const QuicStreamFrame& frame,
941 bool last_frame_in_packet) const;
942 uint8_t GetIetfStreamFrameTypeByte(const QuicStreamFrame& frame,
943 bool last_frame_in_packet) const;
944
945 void set_error(QuicErrorCode error) { error_ = error; }
946
947 void set_detailed_error(const char* error) { detailed_error_ = error; }
948
vasilvvc48c8712019-03-11 13:38:16 -0700949 std::string detailed_error_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500950 QuicFramerVisitorInterface* visitor_;
951 QuicErrorCode error_;
952 // Updated by ProcessPacketHeader when it succeeds decrypting a larger packet.
953 QuicPacketNumber largest_packet_number_;
QUICHE team10b22a12019-03-21 15:31:42 -0700954 // Largest successfully decrypted packet number per packet number space. Only
955 // used when supports_multiple_packet_number_spaces_ is true.
956 QuicPacketNumber largest_decrypted_packet_numbers_[NUM_PACKET_NUMBER_SPACES];
dschinazi7b9278c2019-05-20 07:36:21 -0700957 // Last server connection ID seen on the wire.
958 QuicConnectionId last_serialized_server_connection_id_;
dschinazi346b7ce2019-06-05 01:38:18 -0700959 // Last client connection ID seen on the wire.
960 QuicConnectionId last_serialized_client_connection_id_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500961 // Version of the protocol being used.
962 ParsedQuicVersion version_;
963 // This vector contains QUIC versions which we currently support.
964 // This should be ordered such that the highest supported version is the first
965 // element, with subsequent elements in descending order (versions can be
966 // skipped as necessary).
967 ParsedQuicVersionVector supported_versions_;
QUICHE team76086e42019-03-25 15:12:29 -0700968 // Decrypters used to decrypt packets during parsing.
969 std::unique_ptr<QuicDecrypter> decrypter_[NUM_ENCRYPTION_LEVELS];
970 // The encryption level of the primary decrypter to use in |decrypter_|.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971 EncryptionLevel decrypter_level_;
QUICHE team76086e42019-03-25 15:12:29 -0700972 // The encryption level of the alternative decrypter to use in |decrypter_|.
973 // When set to NUM_ENCRYPTION_LEVELS, indicates that there is no alternative
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974 // decrypter.
QUICHE team76086e42019-03-25 15:12:29 -0700975 EncryptionLevel alternative_decrypter_level_;
976 // |alternative_decrypter_latch_| is true if, when the decrypter at
977 // |alternative_decrypter_level_| successfully decrypts a packet, we should
978 // install it as the only decrypter.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500979 bool alternative_decrypter_latch_;
980 // Encrypters used to encrypt packets via EncryptPayload().
981 std::unique_ptr<QuicEncrypter> encrypter_[NUM_ENCRYPTION_LEVELS];
982 // Tracks if the framer is being used by the entity that received the
983 // connection or the entity that initiated it.
984 Perspective perspective_;
985 // If false, skip validation that the public flags are set to legal values.
986 bool validate_flags_;
987 // The diversification nonce from the last received packet.
988 DiversificationNonce last_nonce_;
989 // If true, send and process timestamps in the ACK frame.
990 bool process_timestamps_;
991 // The creation time of the connection, used to calculate timestamps.
992 QuicTime creation_time_;
993 // The last timestamp received if process_timestamps_ is true.
994 QuicTime::Delta last_timestamp_;
995
996 // If this is a framer of a connection, this is the packet number of first
997 // sending packet. If this is a framer of a framer of dispatcher, this is the
998 // packet number of sent packets (for those which have packet number).
999 const QuicPacketNumber first_sending_packet_number_;
1000
1001 // If not null, framer asks data_producer_ to write stream frame data. Not
1002 // owned. TODO(fayang): Consider add data producer to framer's constructor.
1003 QuicStreamFrameDataProducer* data_producer_;
1004
1005 // If true, framer infers packet header type (IETF/GQUIC) from version_.
1006 // Otherwise, framer infers packet header type from first byte of a received
1007 // packet.
1008 bool infer_packet_header_type_from_version_;
1009
1010 // IETF short headers contain a destination connection ID but do not
dschinazi346b7ce2019-06-05 01:38:18 -07001011 // encode its length. These variables contains the length we expect to read.
1012 // This is also used to validate the long header destination connection ID
1013 // lengths in older versions of QUIC.
dschinazi8ff74822019-05-28 16:37:20 -07001014 uint8_t expected_server_connection_id_length_;
dschinazi346b7ce2019-06-05 01:38:18 -07001015 uint8_t expected_client_connection_id_length_;
QUICHE team4d9d6292019-03-11 14:25:33 -07001016
QUICHE team10b22a12019-03-21 15:31:42 -07001017 // Indicates whether this framer supports multiple packet number spaces.
1018 bool supports_multiple_packet_number_spaces_;
nharper55fa6132019-05-07 19:37:21 -07001019
1020 // The length in bytes of the last packet number written to an IETF-framed
1021 // packet.
1022 size_t last_written_packet_number_length_;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001023};
1024
1025} // namespace quic
1026
1027#endif // QUICHE_QUIC_CORE_QUIC_FRAMER_H_