quic_protocol.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_PROTOCOL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_PROTOCOL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stddef.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/hash_tables.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_piece.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/int128.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/quic_bandwidth.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_time.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::operator<<;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicPacket;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicGuid;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 QuicStreamId;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicStreamOffset;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicPacketSequenceNumber;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketSequenceNumber QuicFecGroupNumber;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint64 QuicPublicResetNonceProof;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint8 QuicPacketEntropyHash;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32 QuicVersionTag;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::vector<QuicVersionTag> QuicVersionTagList;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): Consider Quic specific names for these constants.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum size in bytes of a QUIC packet.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicByteCount kMaxPacketSize = 1200;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum number of open streams per connection.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kDefaultMaxStreamsPerConnection = 100;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for guid in the packet header.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kQuicGuidSize = 8;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for public flags in the packet header.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicFlagsSize = 1;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for version number in the packet header.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kQuicVersionSize = 4;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for sequence number in the packet header.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kSequenceNumberSize = 6;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for private flags in the packet header.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPrivateFlagsSize = 1;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for FEC group in the packet header.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kFecGroupSize = 1;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for the nonce proof in public reset packet.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicResetNonceSize = 8;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Signifies that the QuicPacket will contain version of the protocol.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kIncludeVersion = true;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size in bytes of the data or fec packet header.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(bool include_version);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size in bytes of the public reset packet.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPublicResetPacketSize();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of FEC protected data.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(bool include_version);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of encrypted data.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(bool include_version);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |version| is a supported protocol version.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE bool IsSupportedVersion(QuicVersionTag version);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Index of the first byte in a QUIC packet which is used in hash calculation.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kStartOfHashData = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limit on the delta between stream IDs.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kMaxStreamIdDelta = 100;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reserved ID for the crypto stream.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): ensure that this is not usable by any other streams.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kCryptoStreamId = 1;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Value which indicates this packet is not FEC protected.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const uint8 kNoFecOffset = 0xFF;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kDefaultTimeoutUs = 600000000;  // 10 minutes.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PADDING_FRAME = 0,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STREAM_FRAME,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CONGESTION_FEEDBACK_FRAME,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GOAWAY_FRAME,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPublicFlags {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_NONE = 0,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,  // Packet header contains version info.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_RST = 1 << 1,  // Packet is a public reset packet.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_MAX = (1 << 2) - 1  // All bits set.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPrivateFlags {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_NONE = 0,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC = 1 << 0,  // Payload is FEC as opposed to frames.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 1,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC_ENTROPY = 1 << 2,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1  // All bits set.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicErrorCode {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream errors.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_NO_ERROR = 0,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Connection has reached an invalid state.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INTERNAL_ERROR,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There were data frames after the a fin or reset.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection errors.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GoAway data is malformed.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_GOAWAY_DATA,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version negotiation packet is malformed.
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The peer is going away.  May be a client or server.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PEER_GOING_AWAY,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Received public reset for this connection.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PUBLIC_RESET,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invalid protocol version
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handshake message contained too many entries.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal message tag.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal parameter.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a mandatory parameter missing.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a parameter that has no overlap
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the local parameter.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received that contained a parameter with too few
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Version and Crypto tags are written to the wire with a big-endian
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// representation of the name of the tag.  For example
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the client hello tag (CHLO) will be written as the
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stored in memory as a little endian uint32, we need
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to reverse the order of the bytes.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAKE_TAG(a, b, c, d) ((d << 24) + (c << 16) + (b << 8) + a)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicVersionTag kUnsupportedVersion = -1;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicVersionTag kQuicVersion1 = MAKE_TAG('Q', '1', '.', '0');
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader();
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicPacketPublicHeader();
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader& operator=(const QuicPacketPublicHeader& other);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Universal header. All QuicPacket headers will have a guid and public flags.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_flag;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool version_flag;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicVersionTagList versions;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Header for Data or FEC packets.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicPacketHeader {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketHeader() {}
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketHeader(const QuicPacketPublicHeader& header)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicPacketHeader& s);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_flag;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_entropy_flag;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool entropy_flag;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicPublicResetPacket {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket() {}
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rejected_sequence_number;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetNonceProof nonce_proof;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicVersionNegotiationState {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  START_NEGOTIATION = 0,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SENT_NEGOTIATION_PACKET,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NEGOTIATED_VERSION
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A padding frame contains no payload.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPaddingFrame {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamOffset offset,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamOffset offset;  // Location of this data in the stream.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is finalized.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pwestin): Add a way to enforce the max size of this map.
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const ReceivedPacketInfo& s);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to largest observed not including missing
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packets.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The highest packet sequence number we've observed from the peer.
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general, this should be the largest packet number we've received.  In
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the case of truncated acks, we may have to advertise a lower "upper bound"
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // than largest received, to avoid implicitly acking missing packets that
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't fit in the missing packet list due to size limitations.  In this
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, largest_observed may be a packet which is also in the missing packets
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // list.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Time elapsed since largest_observed was received until this Ack frame was
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sent.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime::Delta delta_time_largest_observed;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(satyamshekhar): Can be optimized using an interval set like data
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // structure.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if the sequence number is greater than largest_observed or is listed
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as missing.
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Always returns false for sequence numbers less than least_unacked.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NET_EXPORT_PRIVATE IsAwaitingPacket(
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReceivedPacketInfo& received_info,
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inserts missing packets between [lower, higher).
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReceivedPacketInfo* received_info,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber lower,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber higher);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const SentPacketInfo& s);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to, but not including, the least unacked
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packet.
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame() {}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Testing convenience method to construct a QuicAckFrame with all packets
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from least_unacked to largest_observed acked.
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_observed,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicTime largest_observed_receive_time,
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicPacketSequenceNumber least_unacked);
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicAckFrame& s);
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SentPacketInfo sent_info;
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReceivedPacketInfo received_info;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kTCP MUST be supported by all QUIC implementations to guarentee 100%
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount receive_window;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CongestionFeedbackMessageInterArrival();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The set of received packets since the last feedback was sent, along with
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their arrival times.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TimeMap received_packet_times;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate();
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicBandwidth bitrate;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame();
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicCongestionFeedbackFrame();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicCongestionFeedbackFrame& c);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackType type;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should really be a union, but since the inter arrival struct
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is non-trivial, C++ prohibits it.
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageTCP tcp;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival inter_arrival;
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate fix_rate;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, QuicErrorCode error_code)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : stream_id(stream_id), error_code(error_code) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_frame;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame() {}
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame(QuicErrorCode error_code,
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamId last_good_stream_id,
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  const std::string& reason);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicErrorCode error_code;
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamId last_good_stream_id;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reason_phrase;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicPaddingFrame* padding_frame)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(PADDING_FRAME),
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        padding_frame(padding_frame) {
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(STREAM_FRAME),
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_frame(stream_frame) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(ACK_FRAME),
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ack_frame(frame) {
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicCongestionFeedbackFrame* frame)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(CONGESTION_FEEDBACK_FRAME),
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        congestion_feedback_frame(frame) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicGoAwayFrame* frame)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(GOAWAY_FRAME),
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goaway_frame(frame) {
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPaddingFrame* padding_frame;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame* congestion_feedback_frame;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicGoAwayFrame* goaway_frame;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const QuicFecData& other) const;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The FEC group number is also the sequence number of the first
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FEC protected packet.  The last protected packet's sequence number will
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be one less than the sequence number of the FEC packet.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(false) {}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewDataPacket(char* buffer,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   size_t length,
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool owns_buffer,
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool includes_version) {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, false);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewFecPacket(char* buffer,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  size_t length,
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool owns_buffer,
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool includes_version) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, true);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece FecProtectedData() const;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece AssociatedData() const;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece BeforePlaintext() const;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece Plaintext() const;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_fec_packet() const { return is_fec_packet_; }
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool includes_version() const { return includes_version_; }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket(char* buffer,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             size_t length,
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool owns_buffer,
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool includes_version,
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool is_fec_packet)
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer_(buffer),
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        is_fec_packet_(is_fec_packet),
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        includes_version_(includes_version) {}
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool is_fec_packet_;
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool includes_version_;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length) {}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member (in the base class QuicData) causes this object to have padding
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bytes, which causes the default gtest object printer to read
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninitialize memory. So we need to teach gtest how to print this object.
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicEncryptedPacket& s);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE RetransmittableFrames {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames();
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~RetransmittableFrames();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use it.
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of |stream_frame|.
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of the frame inside |frame|.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrames& frames() const { return frames_; }
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames_;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data referenced by the StringPiece of a QuicStreamFrame.
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string*> stream_data_;
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE SerializedPacket {
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SerializedPacket(QuicPacketSequenceNumber sequence_number,
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacket* packet,
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacketEntropyHash entropy_hash,
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   RetransmittableFrames* retransmittable_frames)
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : sequence_number(sequence_number),
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        packet(packet),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entropy_hash(entropy_hash),
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        retransmittable_frames(retransmittable_frames) {}
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames* retransmittable_frames;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A struct for functions which consume data payloads and fins.
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The first member of the pair indicates bytes consumed.
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The second member of the pair indicates if an incoming fin was consumed.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicConsumedData {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData(size_t bytes_consumed, bool fin_consumed)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : bytes_consumed(bytes_consumed),
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_consumed(fin_consumed) {}
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member causes this object to have padding bytes, which causes the
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default gtest object printer to read uninitialize memory. So we need
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to teach gtest how to print this object.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicConsumedData& s);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t bytes_consumed;
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_consumed;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
639