• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 NET_QUIC_QUIC_PROTOCOL_H_
6 #define NET_QUIC_QUIC_PROTOCOL_H_
7 
8 #include <stddef.h>
9 #include <limits>
10 #include <map>
11 #include <ostream>
12 #include <set>
13 #include <string>
14 #include <utility>
15 #include <vector>
16 
17 #include "base/basictypes.h"
18 #include "base/containers/hash_tables.h"
19 #include "base/logging.h"
20 #include "base/strings/string_piece.h"
21 #include "net/base/int128.h"
22 #include "net/base/ip_endpoint.h"
23 #include "net/base/net_export.h"
24 #include "net/quic/iovector.h"
25 #include "net/quic/quic_bandwidth.h"
26 #include "net/quic/quic_time.h"
27 
28 namespace net {
29 
30 using ::operator<<;
31 
32 class QuicAckNotifier;
33 class QuicPacket;
34 struct QuicPacketHeader;
35 
36 typedef uint64 QuicConnectionId;
37 typedef uint32 QuicStreamId;
38 typedef uint64 QuicStreamOffset;
39 typedef uint64 QuicPacketSequenceNumber;
40 typedef QuicPacketSequenceNumber QuicFecGroupNumber;
41 typedef uint64 QuicPublicResetNonceProof;
42 typedef uint8 QuicPacketEntropyHash;
43 typedef uint32 QuicHeaderId;
44 // QuicTag is the type of a tag in the wire protocol.
45 typedef uint32 QuicTag;
46 typedef std::vector<QuicTag> QuicTagVector;
47 typedef std::map<QuicTag, std::string> QuicTagValueMap;
48 // TODO(rtenneti): Didn't use SpdyPriority because SpdyPriority is uint8 and
49 // QuicPriority is uint32. Use SpdyPriority when we change the QUIC_VERSION.
50 typedef uint32 QuicPriority;
51 
52 // TODO(rch): Consider Quic specific names for these constants.
53 // Default and initial maximum size in bytes of a QUIC packet.
54 const QuicByteCount kDefaultMaxPacketSize = 1200;
55 // The maximum packet size of any QUIC packet, based on ethernet's max size,
56 // minus the IP and UDP headers. IPv6 has a 40 byte header, UPD adds an
57 // additional 8 bytes.  This is a total overhead of 48 bytes.  Ethernet's
58 // max packet size is 1500 bytes,  1500 - 48 = 1452.
59 const QuicByteCount kMaxPacketSize = 1452;
60 // Default maximum packet size used in Linux TCP implementations.
61 const QuicByteCount kDefaultTCPMSS = 1460;
62 
63 // Maximum size of the initial congestion window in packets.
64 const size_t kDefaultInitialWindow = 10;
65 const uint32 kMaxInitialWindow = 100;
66 
67 // Default size of initial flow control window, for both stream and session.
68 const uint32 kDefaultFlowControlSendWindow = 16 * 1024;  // 16 KB
69 
70 // Maximum size of the congestion window, in packets, for TCP congestion control
71 // algorithms.
72 const size_t kMaxTcpCongestionWindow = 200;
73 
74 // Don't allow a client to suggest an RTT longer than 15 seconds.
75 const uint32 kMaxInitialRoundTripTimeUs = 15 * kNumMicrosPerSecond;
76 
77 // Maximum number of open streams per connection.
78 const size_t kDefaultMaxStreamsPerConnection = 100;
79 
80 // Number of bytes reserved for public flags in the packet header.
81 const size_t kPublicFlagsSize = 1;
82 // Number of bytes reserved for version number in the packet header.
83 const size_t kQuicVersionSize = 4;
84 // Number of bytes reserved for private flags in the packet header.
85 const size_t kPrivateFlagsSize = 1;
86 // Number of bytes reserved for FEC group in the packet header.
87 const size_t kFecGroupSize = 1;
88 
89 // Signifies that the QuicPacket will contain version of the protocol.
90 const bool kIncludeVersion = true;
91 
92 // Index of the first byte in a QUIC packet which is used in hash calculation.
93 const size_t kStartOfHashData = 0;
94 
95 // Limit on the delta between stream IDs.
96 const QuicStreamId kMaxStreamIdDelta = 200;
97 // Limit on the delta between header IDs.
98 const QuicHeaderId kMaxHeaderIdDelta = 200;
99 
100 // Reserved ID for the crypto stream.
101 const QuicStreamId kCryptoStreamId = 1;
102 
103 // Reserved ID for the headers stream.
104 const QuicStreamId kHeadersStreamId = 3;
105 
106 // This is the default network timeout a for connection till the crypto
107 // handshake succeeds and the negotiated timeout from the handshake is received.
108 const int64 kDefaultInitialTimeoutSecs = 120;  // 2 mins.
109 const int64 kDefaultTimeoutSecs = 60 * 10;  // 10 minutes.
110 const int64 kDefaultMaxTimeForCryptoHandshakeSecs = 5;  // 5 secs.
111 
112 // Default ping timeout.
113 const int64 kPingTimeoutSecs = 15;  // 15 secs.
114 
115 // We define an unsigned 16-bit floating point value, inspired by IEEE floats
116 // (http://en.wikipedia.org/wiki/Half_precision_floating-point_format),
117 // with 5-bit exponent (bias 1), 11-bit mantissa (effective 12 with hidden
118 // bit) and denormals, but without signs, transfinites or fractions. Wire format
119 // 16 bits (little-endian byte order) are split into exponent (high 5) and
120 // mantissa (low 11) and decoded as:
121 //   uint64 value;
122 //   if (exponent == 0) value = mantissa;
123 //   else value = (mantissa | 1 << 11) << (exponent - 1)
124 const int kUFloat16ExponentBits = 5;
125 const int kUFloat16MaxExponent = (1 << kUFloat16ExponentBits) - 2;  // 30
126 const int kUFloat16MantissaBits = 16 - kUFloat16ExponentBits;  // 11
127 const int kUFloat16MantissaEffectiveBits = kUFloat16MantissaBits + 1;  // 12
128 const uint64 kUFloat16MaxValue =  // 0x3FFC0000000
129     ((GG_UINT64_C(1) << kUFloat16MantissaEffectiveBits) - 1) <<
130     kUFloat16MaxExponent;
131 
132 enum TransmissionType {
133   NOT_RETRANSMISSION,
134   FIRST_TRANSMISSION_TYPE = NOT_RETRANSMISSION,
135   HANDSHAKE_RETRANSMISSION,  // Retransmits due to handshake timeouts.
136   ALL_UNACKED_RETRANSMISSION,  // Retransmits of all unacked packets.
137   LOSS_RETRANSMISSION,  // Retransmits due to loss detection.
138   RTO_RETRANSMISSION,  // Retransmits due to retransmit time out.
139   TLP_RETRANSMISSION,  // Tail loss probes.
140   LAST_TRANSMISSION_TYPE = TLP_RETRANSMISSION,
141 };
142 
143 enum RetransmissionType {
144   INITIAL_ENCRYPTION_ONLY,
145   ALL_PACKETS
146 };
147 
148 enum HasRetransmittableData {
149   NO_RETRANSMITTABLE_DATA,
150   HAS_RETRANSMITTABLE_DATA,
151 };
152 
153 enum IsHandshake {
154   NOT_HANDSHAKE,
155   IS_HANDSHAKE
156 };
157 
158 // Indicates FEC protection level for data being written.
159 enum FecProtection {
160   MUST_FEC_PROTECT,  // Callee must FEC protect this data.
161   MAY_FEC_PROTECT    // Callee does not have to but may FEC protect this data.
162 };
163 
164 // Indicates FEC policy.
165 enum FecPolicy {
166   FEC_PROTECT_ALWAYS,   // All data in the stream should be FEC protected.
167   FEC_PROTECT_OPTIONAL  // Data in the stream does not need FEC protection.
168 };
169 
170 enum QuicFrameType {
171   // Regular frame types. The values set here cannot change without the
172   // introduction of a new QUIC version.
173   PADDING_FRAME = 0,
174   RST_STREAM_FRAME = 1,
175   CONNECTION_CLOSE_FRAME = 2,
176   GOAWAY_FRAME = 3,
177   WINDOW_UPDATE_FRAME = 4,
178   BLOCKED_FRAME = 5,
179   STOP_WAITING_FRAME = 6,
180   PING_FRAME = 7,
181 
182   // STREAM, ACK, and CONGESTION_FEEDBACK frames are special frames. They are
183   // encoded differently on the wire and their values do not need to be stable.
184   STREAM_FRAME,
185   ACK_FRAME,
186   CONGESTION_FEEDBACK_FRAME,
187   NUM_FRAME_TYPES
188 };
189 
190 enum QuicConnectionIdLength {
191   PACKET_0BYTE_CONNECTION_ID = 0,
192   PACKET_1BYTE_CONNECTION_ID = 1,
193   PACKET_4BYTE_CONNECTION_ID = 4,
194   PACKET_8BYTE_CONNECTION_ID = 8
195 };
196 
197 enum InFecGroup {
198   NOT_IN_FEC_GROUP,
199   IN_FEC_GROUP,
200 };
201 
202 enum QuicSequenceNumberLength {
203   PACKET_1BYTE_SEQUENCE_NUMBER = 1,
204   PACKET_2BYTE_SEQUENCE_NUMBER = 2,
205   PACKET_4BYTE_SEQUENCE_NUMBER = 4,
206   PACKET_6BYTE_SEQUENCE_NUMBER = 6
207 };
208 
209 // Used to indicate a QuicSequenceNumberLength using two flag bits.
210 enum QuicSequenceNumberLengthFlags {
211   PACKET_FLAGS_1BYTE_SEQUENCE = 0,  // 00
212   PACKET_FLAGS_2BYTE_SEQUENCE = 1,  // 01
213   PACKET_FLAGS_4BYTE_SEQUENCE = 1 << 1,  // 10
214   PACKET_FLAGS_6BYTE_SEQUENCE = 1 << 1 | 1,  // 11
215 };
216 
217 // The public flags are specified in one byte.
218 enum QuicPacketPublicFlags {
219   PACKET_PUBLIC_FLAGS_NONE = 0,
220 
221   // Bit 0: Does the packet header contains version info?
222   PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,
223 
224   // Bit 1: Is this packet a public reset packet?
225   PACKET_PUBLIC_FLAGS_RST = 1 << 1,
226 
227   // Bits 2 and 3 specify the length of the ConnectionId as follows:
228   // ----00--: 0 bytes
229   // ----01--: 1 byte
230   // ----10--: 4 bytes
231   // ----11--: 8 bytes
232   PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID = 0,
233   PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID = 1 << 2,
234   PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID = 1 << 3,
235   PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID = 1 << 3 | 1 << 2,
236 
237   // Bits 4 and 5 describe the packet sequence number length as follows:
238   // --00----: 1 byte
239   // --01----: 2 bytes
240   // --10----: 4 bytes
241   // --11----: 6 bytes
242   PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE = PACKET_FLAGS_1BYTE_SEQUENCE << 4,
243   PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE = PACKET_FLAGS_2BYTE_SEQUENCE << 4,
244   PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE = PACKET_FLAGS_4BYTE_SEQUENCE << 4,
245   PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE = PACKET_FLAGS_6BYTE_SEQUENCE << 4,
246 
247   // All bits set (bits 6 and 7 are not currently used): 00111111
248   PACKET_PUBLIC_FLAGS_MAX = (1 << 6) - 1
249 };
250 
251 // The private flags are specified in one byte.
252 enum QuicPacketPrivateFlags {
253   PACKET_PRIVATE_FLAGS_NONE = 0,
254 
255   // Bit 0: Does this packet contain an entropy bit?
256   PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 0,
257 
258   // Bit 1: Payload is part of an FEC group?
259   PACKET_PRIVATE_FLAGS_FEC_GROUP = 1 << 1,
260 
261   // Bit 2: Payload is FEC as opposed to frames?
262   PACKET_PRIVATE_FLAGS_FEC = 1 << 2,
263 
264   // All bits set (bits 3-7 are not currently used): 00000111
265   PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1
266 };
267 
268 // The available versions of QUIC. Guaranteed that the integer value of the enum
269 // will match the version number.
270 // When adding a new version to this enum you should add it to
271 // kSupportedQuicVersions (if appropriate), and also add a new case to the
272 // helper methods QuicVersionToQuicTag, QuicTagToQuicVersion, and
273 // QuicVersionToString.
274 enum QuicVersion {
275   // Special case to indicate unknown/unsupported QUIC version.
276   QUIC_VERSION_UNSUPPORTED = 0,
277 
278   QUIC_VERSION_15 = 15,
279   QUIC_VERSION_16 = 16,
280   QUIC_VERSION_17 = 17,
281   QUIC_VERSION_18 = 18,
282   QUIC_VERSION_19 = 19,
283   QUIC_VERSION_20 = 20,  // Current version.
284 };
285 
286 // This vector contains QUIC versions which we currently support.
287 // This should be ordered such that the highest supported version is the first
288 // element, with subsequent elements in descending order (versions can be
289 // skipped as necessary).
290 //
291 // IMPORTANT: if you are addding to this list, follow the instructions at
292 // http://sites/quic/adding-and-removing-versions
293 static const QuicVersion kSupportedQuicVersions[] = {QUIC_VERSION_20,
294                                                      QUIC_VERSION_19,
295                                                      QUIC_VERSION_18,
296                                                      QUIC_VERSION_17,
297                                                      QUIC_VERSION_16,
298                                                      QUIC_VERSION_15};
299 
300 typedef std::vector<QuicVersion> QuicVersionVector;
301 
302 // Returns a vector of QUIC versions in kSupportedQuicVersions.
303 NET_EXPORT_PRIVATE QuicVersionVector QuicSupportedVersions();
304 
305 // QuicTag is written to and read from the wire, but we prefer to use
306 // the more readable QuicVersion at other levels.
307 // Helper function which translates from a QuicVersion to a QuicTag. Returns 0
308 // if QuicVersion is unsupported.
309 NET_EXPORT_PRIVATE QuicTag QuicVersionToQuicTag(const QuicVersion version);
310 
311 // Returns appropriate QuicVersion from a QuicTag.
312 // Returns QUIC_VERSION_UNSUPPORTED if version_tag cannot be understood.
313 NET_EXPORT_PRIVATE QuicVersion QuicTagToQuicVersion(const QuicTag version_tag);
314 
315 // Helper function which translates from a QuicVersion to a string.
316 // Returns strings corresponding to enum names (e.g. QUIC_VERSION_6).
317 NET_EXPORT_PRIVATE std::string QuicVersionToString(const QuicVersion version);
318 
319 // Returns comma separated list of string representations of QuicVersion enum
320 // values in the supplied |versions| vector.
321 NET_EXPORT_PRIVATE std::string QuicVersionVectorToString(
322     const QuicVersionVector& versions);
323 
324 // Version and Crypto tags are written to the wire with a big-endian
325 // representation of the name of the tag.  For example
326 // the client hello tag (CHLO) will be written as the
327 // following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
328 // stored in memory as a little endian uint32, we need
329 // to reverse the order of the bytes.
330 
331 // MakeQuicTag returns a value given the four bytes. For example:
332 //   MakeQuicTag('C', 'H', 'L', 'O');
333 NET_EXPORT_PRIVATE QuicTag MakeQuicTag(char a, char b, char c, char d);
334 
335 // Returns true if the tag vector contains the specified tag.
336 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag);
337 
338 // Size in bytes of the data or fec packet header.
339 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(const QuicPacketHeader& header);
340 
341 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(
342     QuicConnectionIdLength connection_id_length,
343     bool include_version,
344     QuicSequenceNumberLength sequence_number_length,
345     InFecGroup is_in_fec_group);
346 
347 // Index of the first byte in a QUIC packet of FEC protected data.
348 NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(
349     QuicConnectionIdLength connection_id_length,
350     bool include_version,
351     QuicSequenceNumberLength sequence_number_length);
352 // Index of the first byte in a QUIC packet of encrypted data.
353 NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(
354     QuicConnectionIdLength connection_id_length,
355     bool include_version,
356     QuicSequenceNumberLength sequence_number_length);
357 
358 enum QuicRstStreamErrorCode {
359   QUIC_STREAM_NO_ERROR = 0,
360 
361   // There was some error which halted stream processing.
362   QUIC_ERROR_PROCESSING_STREAM,
363   // We got two fin or reset offsets which did not match.
364   QUIC_MULTIPLE_TERMINATION_OFFSETS,
365   // We got bad payload and can not respond to it at the protocol level.
366   QUIC_BAD_APPLICATION_PAYLOAD,
367   // Stream closed due to connection error. No reset frame is sent when this
368   // happens.
369   QUIC_STREAM_CONNECTION_ERROR,
370   // GoAway frame sent. No more stream can be created.
371   QUIC_STREAM_PEER_GOING_AWAY,
372   // The stream has been cancelled.
373   QUIC_STREAM_CANCELLED,
374   // Sending a RST to allow for proper flow control accounting.
375   QUIC_RST_FLOW_CONTROL_ACCOUNTING,
376 
377   // No error. Used as bound while iterating.
378   QUIC_STREAM_LAST_ERROR,
379 };
380 
381 // Because receiving an unknown QuicRstStreamErrorCode results in connection
382 // teardown, we use this to make sure any errors predating a given version are
383 // downgraded to the most appropriate existing error.
384 NET_EXPORT_PRIVATE QuicRstStreamErrorCode AdjustErrorForVersion(
385     QuicRstStreamErrorCode error_code,
386     QuicVersion version);
387 
388 // These values must remain stable as they are uploaded to UMA histograms.
389 // To add a new error code, use the current value of QUIC_LAST_ERROR and
390 // increment QUIC_LAST_ERROR.
391 enum QuicErrorCode {
392   QUIC_NO_ERROR = 0,
393 
394   // Connection has reached an invalid state.
395   QUIC_INTERNAL_ERROR = 1,
396   // There were data frames after the a fin or reset.
397   QUIC_STREAM_DATA_AFTER_TERMINATION = 2,
398   // Control frame is malformed.
399   QUIC_INVALID_PACKET_HEADER = 3,
400   // Frame data is malformed.
401   QUIC_INVALID_FRAME_DATA = 4,
402   // The packet contained no payload.
403   QUIC_MISSING_PAYLOAD = 48,
404   // FEC data is malformed.
405   QUIC_INVALID_FEC_DATA = 5,
406   // STREAM frame data is malformed.
407   QUIC_INVALID_STREAM_DATA = 46,
408   // STREAM frame data is not encrypted.
409   QUIC_UNENCRYPTED_STREAM_DATA = 61,
410   // RST_STREAM frame data is malformed.
411   QUIC_INVALID_RST_STREAM_DATA = 6,
412   // CONNECTION_CLOSE frame data is malformed.
413   QUIC_INVALID_CONNECTION_CLOSE_DATA = 7,
414   // GOAWAY frame data is malformed.
415   QUIC_INVALID_GOAWAY_DATA = 8,
416   // WINDOW_UPDATE frame data is malformed.
417   QUIC_INVALID_WINDOW_UPDATE_DATA = 57,
418   // BLOCKED frame data is malformed.
419   QUIC_INVALID_BLOCKED_DATA = 58,
420   // STOP_WAITING frame data is malformed.
421   QUIC_INVALID_STOP_WAITING_DATA = 60,
422   // ACK frame data is malformed.
423   QUIC_INVALID_ACK_DATA = 9,
424   // CONGESTION_FEEDBACK frame data is malformed.
425   QUIC_INVALID_CONGESTION_FEEDBACK_DATA = 47,
426   // Version negotiation packet is malformed.
427   QUIC_INVALID_VERSION_NEGOTIATION_PACKET = 10,
428   // Public RST packet is malformed.
429   QUIC_INVALID_PUBLIC_RST_PACKET = 11,
430   // There was an error decrypting.
431   QUIC_DECRYPTION_FAILURE = 12,
432   // There was an error encrypting.
433   QUIC_ENCRYPTION_FAILURE = 13,
434   // The packet exceeded kMaxPacketSize.
435   QUIC_PACKET_TOO_LARGE = 14,
436   // Data was sent for a stream which did not exist.
437   QUIC_PACKET_FOR_NONEXISTENT_STREAM = 15,
438   // The peer is going away.  May be a client or server.
439   QUIC_PEER_GOING_AWAY = 16,
440   // A stream ID was invalid.
441   QUIC_INVALID_STREAM_ID = 17,
442   // A priority was invalid.
443   QUIC_INVALID_PRIORITY = 49,
444   // Too many streams already open.
445   QUIC_TOO_MANY_OPEN_STREAMS = 18,
446   // Received public reset for this connection.
447   QUIC_PUBLIC_RESET = 19,
448   // Invalid protocol version.
449   QUIC_INVALID_VERSION = 20,
450 
451   // deprecated: QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED = 21
452 
453   // The Header ID for a stream was too far from the previous.
454   QUIC_INVALID_HEADER_ID = 22,
455   // Negotiable parameter received during handshake had invalid value.
456   QUIC_INVALID_NEGOTIATED_VALUE = 23,
457   // There was an error decompressing data.
458   QUIC_DECOMPRESSION_FAILURE = 24,
459   // We hit our prenegotiated (or default) timeout
460   QUIC_CONNECTION_TIMED_OUT = 25,
461   // There was an error encountered migrating addresses
462   QUIC_ERROR_MIGRATING_ADDRESS = 26,
463   // There was an error while writing to the socket.
464   QUIC_PACKET_WRITE_ERROR = 27,
465   // There was an error while reading from the socket.
466   QUIC_PACKET_READ_ERROR = 51,
467   // We received a STREAM_FRAME with no data and no fin flag set.
468   QUIC_INVALID_STREAM_FRAME = 50,
469   // We received invalid data on the headers stream.
470   QUIC_INVALID_HEADERS_STREAM_DATA = 56,
471   // The peer received too much data, violating flow control.
472   QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA = 59,
473   // The peer sent too much data, violating flow control.
474   QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA = 63,
475   // The peer received an invalid flow control window.
476   QUIC_FLOW_CONTROL_INVALID_WINDOW = 64,
477   // The connection has been IP pooled into an existing connection.
478   QUIC_CONNECTION_IP_POOLED = 62,
479 
480   // Crypto errors.
481 
482   // Hanshake failed.
483   QUIC_HANDSHAKE_FAILED = 28,
484   // Handshake message contained out of order tags.
485   QUIC_CRYPTO_TAGS_OUT_OF_ORDER = 29,
486   // Handshake message contained too many entries.
487   QUIC_CRYPTO_TOO_MANY_ENTRIES = 30,
488   // Handshake message contained an invalid value length.
489   QUIC_CRYPTO_INVALID_VALUE_LENGTH = 31,
490   // A crypto message was received after the handshake was complete.
491   QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE = 32,
492   // A crypto message was received with an illegal message tag.
493   QUIC_INVALID_CRYPTO_MESSAGE_TYPE = 33,
494   // A crypto message was received with an illegal parameter.
495   QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER = 34,
496   // An invalid channel id signature was supplied.
497   QUIC_INVALID_CHANNEL_ID_SIGNATURE = 52,
498   // A crypto message was received with a mandatory parameter missing.
499   QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND = 35,
500   // A crypto message was received with a parameter that has no overlap
501   // with the local parameter.
502   QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP = 36,
503   // A crypto message was received that contained a parameter with too few
504   // values.
505   QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND = 37,
506   // An internal error occured in crypto processing.
507   QUIC_CRYPTO_INTERNAL_ERROR = 38,
508   // A crypto handshake message specified an unsupported version.
509   QUIC_CRYPTO_VERSION_NOT_SUPPORTED = 39,
510   // There was no intersection between the crypto primitives supported by the
511   // peer and ourselves.
512   QUIC_CRYPTO_NO_SUPPORT = 40,
513   // The server rejected our client hello messages too many times.
514   QUIC_CRYPTO_TOO_MANY_REJECTS = 41,
515   // The client rejected the server's certificate chain or signature.
516   QUIC_PROOF_INVALID = 42,
517   // A crypto message was received with a duplicate tag.
518   QUIC_CRYPTO_DUPLICATE_TAG = 43,
519   // A crypto message was received with the wrong encryption level (i.e. it
520   // should have been encrypted but was not.)
521   QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT = 44,
522   // The server config for a server has expired.
523   QUIC_CRYPTO_SERVER_CONFIG_EXPIRED = 45,
524   // We failed to setup the symmetric keys for a connection.
525   QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED = 53,
526   // A handshake message arrived, but we are still validating the
527   // previous handshake message.
528   QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO = 54,
529   // This connection involved a version negotiation which appears to have been
530   // tampered with.
531   QUIC_VERSION_NEGOTIATION_MISMATCH = 55,
532 
533   // No error. Used as bound while iterating.
534   QUIC_LAST_ERROR = 65,
535 };
536 
537 struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
538   QuicPacketPublicHeader();
539   explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
540   ~QuicPacketPublicHeader();
541 
542   // Universal header. All QuicPacket headers will have a connection_id and
543   // public flags.
544   QuicConnectionId connection_id;
545   QuicConnectionIdLength connection_id_length;
546   bool reset_flag;
547   bool version_flag;
548   QuicSequenceNumberLength sequence_number_length;
549   QuicVersionVector versions;
550 };
551 
552 // Header for Data or FEC packets.
553 struct NET_EXPORT_PRIVATE QuicPacketHeader {
554   QuicPacketHeader();
555   explicit QuicPacketHeader(const QuicPacketPublicHeader& header);
556 
557   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
558       std::ostream& os, const QuicPacketHeader& s);
559 
560   QuicPacketPublicHeader public_header;
561   bool fec_flag;
562   bool entropy_flag;
563   QuicPacketEntropyHash entropy_hash;
564   QuicPacketSequenceNumber packet_sequence_number;
565   InFecGroup is_in_fec_group;
566   QuicFecGroupNumber fec_group;
567 };
568 
569 struct NET_EXPORT_PRIVATE QuicPublicResetPacket {
570   QuicPublicResetPacket();
571   explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header);
572 
573   QuicPacketPublicHeader public_header;
574   QuicPublicResetNonceProof nonce_proof;
575   QuicPacketSequenceNumber rejected_sequence_number;
576   IPEndPoint client_address;
577 };
578 
579 enum QuicVersionNegotiationState {
580   START_NEGOTIATION = 0,
581   // Server-side this implies we've sent a version negotiation packet and are
582   // waiting on the client to select a compatible version.  Client-side this
583   // implies we've gotten a version negotiation packet, are retransmitting the
584   // initial packets with a supported version and are waiting for our first
585   // packet from the server.
586   NEGOTIATION_IN_PROGRESS,
587   // This indicates this endpoint has received a packet from the peer with a
588   // version this endpoint supports.  Version negotiation is complete, and the
589   // version number will no longer be sent with future packets.
590   NEGOTIATED_VERSION
591 };
592 
593 typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
594 
595 // A padding frame contains no payload.
596 struct NET_EXPORT_PRIVATE QuicPaddingFrame {
597 };
598 
599 // A ping frame contains no payload, though it is retransmittable,
600 // and ACK'd just like other normal frames.
601 struct NET_EXPORT_PRIVATE QuicPingFrame {
602 };
603 
604 struct NET_EXPORT_PRIVATE QuicStreamFrame {
605   QuicStreamFrame();
606   QuicStreamFrame(const QuicStreamFrame& frame);
607   QuicStreamFrame(QuicStreamId stream_id,
608                   bool fin,
609                   QuicStreamOffset offset,
610                   IOVector data);
611 
612   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
613       std::ostream& os, const QuicStreamFrame& s);
614 
615   // Returns a copy of the IOVector |data| as a heap-allocated string.
616   // Caller must take ownership of the returned string.
617   std::string* GetDataAsString() const;
618 
619   QuicStreamId stream_id;
620   bool fin;
621   QuicStreamOffset offset;  // Location of this data in the stream.
622   IOVector data;
623 
624   // If this is set, then when this packet is ACKed the AckNotifier will be
625   // informed.
626   QuicAckNotifier* notifier;
627 };
628 
629 // TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
630 // is finalized.
631 typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
632 // TODO(pwestin): Add a way to enforce the max size of this map.
633 typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
634 
635 struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
636   ReceivedPacketInfo();
637   ~ReceivedPacketInfo();
638 
639   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
640       std::ostream& os, const ReceivedPacketInfo& s);
641 
642   // Entropy hash of all packets up to largest observed not including missing
643   // packets.
644   QuicPacketEntropyHash entropy_hash;
645 
646   // The highest packet sequence number we've observed from the peer.
647   //
648   // In general, this should be the largest packet number we've received.  In
649   // the case of truncated acks, we may have to advertise a lower "upper bound"
650   // than largest received, to avoid implicitly acking missing packets that
651   // don't fit in the missing packet list due to size limitations.  In this
652   // case, largest_observed may be a packet which is also in the missing packets
653   // list.
654   QuicPacketSequenceNumber largest_observed;
655 
656   // Time elapsed since largest_observed was received until this Ack frame was
657   // sent.
658   QuicTime::Delta delta_time_largest_observed;
659 
660   // TODO(satyamshekhar): Can be optimized using an interval set like data
661   // structure.
662   // The set of packets which we're expecting and have not received.
663   SequenceNumberSet missing_packets;
664 
665   // Whether the ack had to be truncated when sent.
666   bool is_truncated;
667 
668   // Packets which have been revived via FEC.
669   // All of these must also be in missing_packets.
670   SequenceNumberSet revived_packets;
671 };
672 
673 // True if the sequence number is greater than largest_observed or is listed
674 // as missing.
675 // Always returns false for sequence numbers less than least_unacked.
676 bool NET_EXPORT_PRIVATE IsAwaitingPacket(
677     const ReceivedPacketInfo& received_info,
678     QuicPacketSequenceNumber sequence_number);
679 
680 // Inserts missing packets between [lower, higher).
681 void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
682     ReceivedPacketInfo* received_info,
683     QuicPacketSequenceNumber lower,
684     QuicPacketSequenceNumber higher);
685 
686 struct NET_EXPORT_PRIVATE QuicStopWaitingFrame {
687   QuicStopWaitingFrame();
688   ~QuicStopWaitingFrame();
689 
690   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
691       std::ostream& os, const QuicStopWaitingFrame& s);
692 
693   // Entropy hash of all packets up to, but not including, the least unacked
694   // packet.
695   QuicPacketEntropyHash entropy_hash;
696   // The lowest packet we've sent which is unacked, and we expect an ack for.
697   QuicPacketSequenceNumber least_unacked;
698 };
699 
700 struct NET_EXPORT_PRIVATE QuicAckFrame {
701   QuicAckFrame();
702 
703   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
704       std::ostream& os, const QuicAckFrame& s);
705 
706   QuicStopWaitingFrame sent_info;
707   ReceivedPacketInfo received_info;
708 };
709 
710 // Defines for all types of congestion feedback that will be negotiated in QUIC,
711 // kTCP MUST be supported by all QUIC implementations to guarantee 100%
712 // compatibility.
713 enum CongestionFeedbackType {
714   kTCP,  // Used to mimic TCP.
715   kInterArrival,  // Use additional inter arrival information.
716   kFixRate,  // Provided for testing.
717   kTCPBBR,  // BBR implementation based on TCP congestion feedback.
718 };
719 
720 enum LossDetectionType {
721   kNack,  // Used to mimic TCP's loss detection.
722   kTime,  // Time based loss detection.
723 };
724 
725 struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
726   CongestionFeedbackMessageTCP();
727 
728   QuicByteCount receive_window;
729 };
730 
731 struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
732   CongestionFeedbackMessageInterArrival();
733   ~CongestionFeedbackMessageInterArrival();
734 
735   // The set of received packets since the last feedback was sent, along with
736   // their arrival times.
737   TimeMap received_packet_times;
738 };
739 
740 struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
741   CongestionFeedbackMessageFixRate();
742   QuicBandwidth bitrate;
743 };
744 
745 struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
746   QuicCongestionFeedbackFrame();
747   ~QuicCongestionFeedbackFrame();
748 
749   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
750       std::ostream& os, const QuicCongestionFeedbackFrame& c);
751 
752   CongestionFeedbackType type;
753   // This should really be a union, but since the inter arrival struct
754   // is non-trivial, C++ prohibits it.
755   CongestionFeedbackMessageTCP tcp;
756   CongestionFeedbackMessageInterArrival inter_arrival;
757   CongestionFeedbackMessageFixRate fix_rate;
758 };
759 
760 struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
761   QuicRstStreamFrame();
762   QuicRstStreamFrame(QuicStreamId stream_id,
763                      QuicRstStreamErrorCode error_code,
764                      QuicStreamOffset bytes_written);
765 
766   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
767       std::ostream& os, const QuicRstStreamFrame& r);
768 
769   QuicStreamId stream_id;
770   QuicRstStreamErrorCode error_code;
771   std::string error_details;
772 
773   // Used to update flow control windows. On termination of a stream, both
774   // endpoints must inform the peer of the number of bytes they have sent on
775   // that stream. This can be done through normal termination (data packet with
776   // FIN) or through a RST.
777   QuicStreamOffset byte_offset;
778 };
779 
780 struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
781   QuicConnectionCloseFrame();
782 
783   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
784       std::ostream& os, const QuicConnectionCloseFrame& c);
785 
786   QuicErrorCode error_code;
787   std::string error_details;
788 };
789 
790 struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
791   QuicGoAwayFrame();
792   QuicGoAwayFrame(QuicErrorCode error_code,
793                   QuicStreamId last_good_stream_id,
794                   const std::string& reason);
795 
796   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
797       std::ostream& os, const QuicGoAwayFrame& g);
798 
799   QuicErrorCode error_code;
800   QuicStreamId last_good_stream_id;
801   std::string reason_phrase;
802 };
803 
804 // Flow control updates per-stream and at the connection levoel.
805 // Based on SPDY's WINDOW_UPDATE frame, but uses an absolute byte offset rather
806 // than a window delta.
807 // TODO(rjshade): A possible future optimization is to make stream_id and
808 //                byte_offset variable length, similar to stream frames.
809 struct NET_EXPORT_PRIVATE QuicWindowUpdateFrame {
QuicWindowUpdateFrameQuicWindowUpdateFrame810   QuicWindowUpdateFrame() {}
811   QuicWindowUpdateFrame(QuicStreamId stream_id, QuicStreamOffset byte_offset);
812 
813   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
814       std::ostream& os, const QuicWindowUpdateFrame& w);
815 
816   // The stream this frame applies to.  0 is a special case meaning the overall
817   // connection rather than a specific stream.
818   QuicStreamId stream_id;
819 
820   // Byte offset in the stream or connection. The receiver of this frame must
821   // not send data which would result in this offset being exceeded.
822   QuicStreamOffset byte_offset;
823 };
824 
825 // The BLOCKED frame is used to indicate to the remote endpoint that this
826 // endpoint believes itself to be flow-control blocked but otherwise ready to
827 // send data. The BLOCKED frame is purely advisory and optional.
828 // Based on SPDY's BLOCKED frame (undocumented as of 2014-01-28).
829 struct NET_EXPORT_PRIVATE QuicBlockedFrame {
QuicBlockedFrameQuicBlockedFrame830   QuicBlockedFrame() {}
831   explicit QuicBlockedFrame(QuicStreamId stream_id);
832 
833   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
834       std::ostream& os, const QuicBlockedFrame& b);
835 
836   // The stream this frame applies to.  0 is a special case meaning the overall
837   // connection rather than a specific stream.
838   QuicStreamId stream_id;
839 };
840 
841 // EncryptionLevel enumerates the stages of encryption that a QUIC connection
842 // progresses through. When retransmitting a packet, the encryption level needs
843 // to be specified so that it is retransmitted at a level which the peer can
844 // understand.
845 enum EncryptionLevel {
846   ENCRYPTION_NONE = 0,
847   ENCRYPTION_INITIAL = 1,
848   ENCRYPTION_FORWARD_SECURE = 2,
849 
850   NUM_ENCRYPTION_LEVELS,
851 };
852 
853 struct NET_EXPORT_PRIVATE QuicFrame {
854   QuicFrame();
855   explicit QuicFrame(QuicPaddingFrame* padding_frame);
856   explicit QuicFrame(QuicStreamFrame* stream_frame);
857   explicit QuicFrame(QuicAckFrame* frame);
858   explicit QuicFrame(QuicCongestionFeedbackFrame* frame);
859   explicit QuicFrame(QuicRstStreamFrame* frame);
860   explicit QuicFrame(QuicConnectionCloseFrame* frame);
861   explicit QuicFrame(QuicStopWaitingFrame* frame);
862   explicit QuicFrame(QuicPingFrame* frame);
863   explicit QuicFrame(QuicGoAwayFrame* frame);
864   explicit QuicFrame(QuicWindowUpdateFrame* frame);
865   explicit QuicFrame(QuicBlockedFrame* frame);
866 
867   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
868       std::ostream& os, const QuicFrame& frame);
869 
870   QuicFrameType type;
871   union {
872     QuicPaddingFrame* padding_frame;
873     QuicStreamFrame* stream_frame;
874     QuicAckFrame* ack_frame;
875     QuicCongestionFeedbackFrame* congestion_feedback_frame;
876     QuicStopWaitingFrame* stop_waiting_frame;
877     QuicPingFrame* ping_frame;
878     QuicRstStreamFrame* rst_stream_frame;
879     QuicConnectionCloseFrame* connection_close_frame;
880     QuicGoAwayFrame* goaway_frame;
881     QuicWindowUpdateFrame* window_update_frame;
882     QuicBlockedFrame* blocked_frame;
883   };
884 };
885 
886 typedef std::vector<QuicFrame> QuicFrames;
887 
888 struct NET_EXPORT_PRIVATE QuicFecData {
889   QuicFecData();
890 
891   // The FEC group number is also the sequence number of the first
892   // FEC protected packet.  The last protected packet's sequence number will
893   // be one less than the sequence number of the FEC packet.
894   QuicFecGroupNumber fec_group;
895   base::StringPiece redundancy;
896 };
897 
898 class NET_EXPORT_PRIVATE QuicData {
899  public:
900   QuicData(const char* buffer, size_t length);
901   QuicData(char* buffer, size_t length, bool owns_buffer);
902   virtual ~QuicData();
903 
AsStringPiece()904   base::StringPiece AsStringPiece() const {
905     return base::StringPiece(data(), length());
906   }
907 
data()908   const char* data() const { return buffer_; }
length()909   size_t length() const { return length_; }
910 
911  private:
912   const char* buffer_;
913   size_t length_;
914   bool owns_buffer_;
915 
916   DISALLOW_COPY_AND_ASSIGN(QuicData);
917 };
918 
919 class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
920  public:
NewDataPacket(char * buffer,size_t length,bool owns_buffer,QuicConnectionIdLength connection_id_length,bool includes_version,QuicSequenceNumberLength sequence_number_length)921   static QuicPacket* NewDataPacket(
922       char* buffer,
923       size_t length,
924       bool owns_buffer,
925       QuicConnectionIdLength connection_id_length,
926       bool includes_version,
927       QuicSequenceNumberLength sequence_number_length) {
928     return new QuicPacket(buffer, length, owns_buffer, connection_id_length,
929                           includes_version, sequence_number_length, false);
930   }
931 
NewFecPacket(char * buffer,size_t length,bool owns_buffer,QuicConnectionIdLength connection_id_length,bool includes_version,QuicSequenceNumberLength sequence_number_length)932   static QuicPacket* NewFecPacket(
933       char* buffer,
934       size_t length,
935       bool owns_buffer,
936       QuicConnectionIdLength connection_id_length,
937       bool includes_version,
938       QuicSequenceNumberLength sequence_number_length) {
939     return new QuicPacket(buffer, length, owns_buffer, connection_id_length,
940                           includes_version, sequence_number_length, true);
941   }
942 
943   base::StringPiece FecProtectedData() const;
944   base::StringPiece AssociatedData() const;
945   base::StringPiece BeforePlaintext() const;
946   base::StringPiece Plaintext() const;
947 
is_fec_packet()948   bool is_fec_packet() const { return is_fec_packet_; }
949 
mutable_data()950   char* mutable_data() { return buffer_; }
951 
952  private:
953   QuicPacket(char* buffer,
954              size_t length,
955              bool owns_buffer,
956              QuicConnectionIdLength connection_id_length,
957              bool includes_version,
958              QuicSequenceNumberLength sequence_number_length,
959              bool is_fec_packet);
960 
961   char* buffer_;
962   const bool is_fec_packet_;
963   const QuicConnectionIdLength connection_id_length_;
964   const bool includes_version_;
965   const QuicSequenceNumberLength sequence_number_length_;
966 
967   DISALLOW_COPY_AND_ASSIGN(QuicPacket);
968 };
969 
970 class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
971  public:
972   QuicEncryptedPacket(const char* buffer, size_t length);
973   QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer);
974 
975   // Clones the packet into a new packet which owns the buffer.
976   QuicEncryptedPacket* Clone() const;
977 
978   // By default, gtest prints the raw bytes of an object. The bool data
979   // member (in the base class QuicData) causes this object to have padding
980   // bytes, which causes the default gtest object printer to read
981   // uninitialize memory. So we need to teach gtest how to print this object.
982   NET_EXPORT_PRIVATE friend std::ostream& operator<<(
983       std::ostream& os, const QuicEncryptedPacket& s);
984 
985  private:
986   DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
987 };
988 
989 class NET_EXPORT_PRIVATE RetransmittableFrames {
990  public:
991   RetransmittableFrames();
992   ~RetransmittableFrames();
993 
994   // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
995   // use it.
996   // Takes ownership of |stream_frame|.
997   const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
998   // Takes ownership of the frame inside |frame|.
999   const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
frames()1000   const QuicFrames& frames() const { return frames_; }
1001 
1002   IsHandshake HasCryptoHandshake() const;
1003 
1004   void set_encryption_level(EncryptionLevel level);
encryption_level()1005   EncryptionLevel encryption_level() const {
1006     return encryption_level_;
1007   }
1008 
1009  private:
1010   QuicFrames frames_;
1011   EncryptionLevel encryption_level_;
1012   // Data referenced by the StringPiece of a QuicStreamFrame.
1013   std::vector<std::string*> stream_data_;
1014 
1015   DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
1016 };
1017 
1018 struct NET_EXPORT_PRIVATE SerializedPacket {
1019   SerializedPacket(QuicPacketSequenceNumber sequence_number,
1020                    QuicSequenceNumberLength sequence_number_length,
1021                    QuicPacket* packet,
1022                    QuicPacketEntropyHash entropy_hash,
1023                    RetransmittableFrames* retransmittable_frames);
1024   ~SerializedPacket();
1025 
1026   QuicPacketSequenceNumber sequence_number;
1027   QuicSequenceNumberLength sequence_number_length;
1028   QuicPacket* packet;
1029   QuicPacketEntropyHash entropy_hash;
1030   RetransmittableFrames* retransmittable_frames;
1031 
1032   // If set, these will be called when this packet is ACKed by the peer.
1033   std::set<QuicAckNotifier*> notifiers;
1034 };
1035 
1036 struct NET_EXPORT_PRIVATE TransmissionInfo {
1037   // Used by STL when assigning into a map.
1038   TransmissionInfo();
1039 
1040   // Constructs a Transmission with a new all_tranmissions set
1041   // containing |sequence_number|.
1042   TransmissionInfo(RetransmittableFrames* retransmittable_frames,
1043                    QuicPacketSequenceNumber sequence_number,
1044                    QuicSequenceNumberLength sequence_number_length);
1045 
1046   // Constructs a Transmission with the specified |all_tranmissions| set
1047   // and inserts |sequence_number| into it.
1048   TransmissionInfo(RetransmittableFrames* retransmittable_frames,
1049                    QuicPacketSequenceNumber sequence_number,
1050                    QuicSequenceNumberLength sequence_number_length,
1051                    TransmissionType transmission_type,
1052                    SequenceNumberSet* all_transmissions);
1053 
1054   RetransmittableFrames* retransmittable_frames;
1055   QuicSequenceNumberLength sequence_number_length;
1056   // Zero when the packet is serialized, non-zero once it's sent.
1057   QuicTime sent_time;
1058   // Zero when the packet is serialized, non-zero once it's sent.
1059   QuicByteCount bytes_sent;
1060   size_t nack_count;
1061   // Reason why this packet was transmitted.
1062   TransmissionType transmission_type;
1063   // Stores the sequence numbers of all transmissions of this packet.
1064   // Can never be null.
1065   SequenceNumberSet* all_transmissions;
1066   // In flight packets have not been abandoned or lost.
1067   bool in_flight;
1068 };
1069 
1070 }  // namespace net
1071 
1072 #endif  // NET_QUIC_QUIC_PROTOCOL_H_
1073