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