quic_protocol.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/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)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum Retransmission {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NOT_RETRANSMISSION = 0,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  IS_RETRANSMISSION = 1,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum HasRetransmittableData {
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HAS_RETRANSMITTABLE_DATA = 0,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NO_RETRANSMITTABLE_DATA = 1,
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PADDING_FRAME = 0,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STREAM_FRAME,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CONGESTION_FEEDBACK_FRAME,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GOAWAY_FRAME,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPublicFlags {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_NONE = 0,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,  // Packet header contains version info.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_RST = 1 << 1,  // Packet is a public reset packet.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_MAX = (1 << 2) - 1  // All bits set.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPrivateFlags {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_NONE = 0,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC = 1 << 0,  // Payload is FEC as opposed to frames.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 1,
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC_ENTROPY = 1 << 2,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1  // All bits set.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicRstStreamErrorCode {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_NO_ERROR = 0,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stream closed due to connection error. No reset frame is sent when this
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // happens.
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_CONNECTION_ERROR,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GoAway frame sent. No more stream can be created.
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_PEER_GOING_AWAY,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_LAST_ERROR,
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicErrorCode {
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_NO_ERROR = 0,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connection has reached an invalid state.
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_INTERNAL_ERROR,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There were data frames after the a fin or reset.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GoAway data is malformed.
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_GOAWAY_DATA,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version negotiation packet is malformed.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The peer is going away.  May be a client or server.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PEER_GOING_AWAY,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Received public reset for this connection.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PUBLIC_RESET,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invalid protocol version
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handshake message contained too many entries.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal message tag.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal parameter.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a mandatory parameter missing.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a parameter that has no overlap
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the local parameter.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received that contained a parameter with too few
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND,
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // An internal error occured in crypto processing.
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_INTERNAL_ERROR,
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto handshake message specified an unsupported version.
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_VERSION_NOT_SUPPORTED,
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There was no intersection between the crypto primitives supported by the
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // peer and ourselves.
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_NO_SUPPORT,
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The server rejected our client hello messages too many times.
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_REJECTS,
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The client rejected the server's certificate chain or signature.
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_PROOF_INVALID,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto message was received with a duplicate tag.
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_DUPLICATE_TAG,
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_LAST_ERROR,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Version and Crypto tags are written to the wire with a big-endian
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// representation of the name of the tag.  For example
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the client hello tag (CHLO) will be written as the
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stored in memory as a little endian uint32, we need
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to reverse the order of the bytes.
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The TAG macro is used in header files to ensure that we don't create static
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// initialisers. In normal code, the MakeQuicTag function should be used.
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define TAG(a, b, c, d) ((d << 24) + (c << 16) + (b << 8) + a)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicVersionTag kUnsupportedVersion = -1;
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const QuicVersionTag kQuicVersion1 = TAG('Q', '1', '.', '0');
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef TAG
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MakeQuicTag returns a value given the four bytes. For example:
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//   MakeQuicTag('C', 'H', 'L', 'O');
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint32 NET_EXPORT_PRIVATE MakeQuicTag(char a, char b, char c, char d);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicPacketPublicHeader();
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader& operator=(const QuicPacketPublicHeader& other);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Universal header. All QuicPacket headers will have a guid and public flags.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_flag;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool version_flag;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicVersionTagList versions;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Header for Data or FEC packets.
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketHeader {
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicPacketHeader();
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit QuicPacketHeader(const QuicPacketPublicHeader& header);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicPacketHeader& s);
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_flag;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_entropy_flag;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool entropy_flag;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPublicResetPacket {
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket() {}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rejected_sequence_number;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetNonceProof nonce_proof;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicVersionNegotiationState {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  START_NEGOTIATION = 0,
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SENT_NEGOTIATION_PACKET,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NEGOTIATED_VERSION
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A padding frame contains no payload.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPaddingFrame {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamOffset offset,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamOffset offset;  // Location of this data in the stream.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is finalized.
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pwestin): Add a way to enforce the max size of this map.
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const ReceivedPacketInfo& s);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to largest observed not including missing
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packets.
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The highest packet sequence number we've observed from the peer.
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general, this should be the largest packet number we've received.  In
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the case of truncated acks, we may have to advertise a lower "upper bound"
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // than largest received, to avoid implicitly acking missing packets that
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't fit in the missing packet list due to size limitations.  In this
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, largest_observed may be a packet which is also in the missing packets
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // list.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Time elapsed since largest_observed was received until this Ack frame was
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sent.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime::Delta delta_time_largest_observed;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(satyamshekhar): Can be optimized using an interval set like data
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // structure.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if the sequence number is greater than largest_observed or is listed
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as missing.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Always returns false for sequence numbers less than least_unacked.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NET_EXPORT_PRIVATE IsAwaitingPacket(
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReceivedPacketInfo& received_info,
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inserts missing packets between [lower, higher).
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReceivedPacketInfo* received_info,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber lower,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber higher);
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const SentPacketInfo& s);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to, but not including, the least unacked
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packet.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame() {}
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Testing convenience method to construct a QuicAckFrame with all packets
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from least_unacked to largest_observed acked.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_observed,
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicTime largest_observed_receive_time,
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicPacketSequenceNumber least_unacked);
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicAckFrame& s);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SentPacketInfo sent_info;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReceivedPacketInfo received_info;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kTCP MUST be supported by all QUIC implementations to guarentee 100%
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount receive_window;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival();
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CongestionFeedbackMessageInterArrival();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The set of received packets since the last feedback was sent, along with
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their arrival times.
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TimeMap received_packet_times;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate();
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicBandwidth bitrate;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicCongestionFeedbackFrame();
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicCongestionFeedbackFrame& c);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackType type;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should really be a union, but since the inter arrival struct
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is non-trivial, C++ prohibits it.
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageTCP tcp;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival inter_arrival;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate fix_rate;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, QuicRstStreamErrorCode error_code)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : stream_id(stream_id), error_code(error_code) {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamErrorCode error_code;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_frame;
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame() {}
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame(QuicErrorCode error_code,
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamId last_good_stream_id,
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  const std::string& reason);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicErrorCode error_code;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamId last_good_stream_id;
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reason_phrase;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EncryptionLevel enumerates the stages of encryption that a QUIC connection
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// progresses through. When retransmitting a packet, the encryption level needs
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to be specified so that it is retransmitted at a level which the peer can
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// understand.
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum EncryptionLevel {
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_NONE = 0,
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_INITIAL = 1,
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_FORWARD_SECURE = 2,
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NUM_ENCRYPTION_LEVELS,
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicPaddingFrame* padding_frame)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(PADDING_FRAME),
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        padding_frame(padding_frame) {
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(STREAM_FRAME),
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_frame(stream_frame) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(ACK_FRAME),
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ack_frame(frame) {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicCongestionFeedbackFrame* frame)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(CONGESTION_FEEDBACK_FRAME),
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        congestion_feedback_frame(frame) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicGoAwayFrame* frame)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(GOAWAY_FRAME),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goaway_frame(frame) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPaddingFrame* padding_frame;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame* congestion_feedback_frame;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicGoAwayFrame* goaway_frame;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const QuicFecData& other) const;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The FEC group number is also the sequence number of the first
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FEC protected packet.  The last protected packet's sequence number will
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be one less than the sequence number of the FEC packet.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(false) {}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewDataPacket(char* buffer,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   size_t length,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool owns_buffer,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool includes_version) {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, false);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewFecPacket(char* buffer,
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  size_t length,
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool owns_buffer,
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool includes_version) {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, true);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece FecProtectedData() const;
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece AssociatedData() const;
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece BeforePlaintext() const;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece Plaintext() const;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_fec_packet() const { return is_fec_packet_; }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool includes_version() const { return includes_version_; }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket(char* buffer,
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             size_t length,
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool owns_buffer,
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool includes_version,
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool is_fec_packet)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer_(buffer),
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        is_fec_packet_(is_fec_packet),
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        includes_version_(includes_version) {}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool is_fec_packet_;
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool includes_version_;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length) {}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member (in the base class QuicData) causes this object to have padding
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bytes, which causes the default gtest object printer to read
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninitialize memory. So we need to teach gtest how to print this object.
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicEncryptedPacket& s);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE RetransmittableFrames {
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames();
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~RetransmittableFrames();
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use it.
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of |stream_frame|.
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of the frame inside |frame|.
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrames& frames() const { return frames_; }
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_encryption_level(EncryptionLevel level);
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level() const {
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return encryption_level_;
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames_;
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level_;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data referenced by the StringPiece of a QuicStreamFrame.
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string*> stream_data_;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE SerializedPacket {
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SerializedPacket(QuicPacketSequenceNumber sequence_number,
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacket* packet,
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacketEntropyHash entropy_hash,
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   RetransmittableFrames* retransmittable_frames)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : sequence_number(sequence_number),
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        packet(packet),
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entropy_hash(entropy_hash),
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        retransmittable_frames(retransmittable_frames) {}
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet;
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames* retransmittable_frames;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A struct for functions which consume data payloads and fins.
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The first member of the pair indicates bytes consumed.
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The second member of the pair indicates if an incoming fin was consumed.
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicConsumedData {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData(size_t bytes_consumed, bool fin_consumed)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : bytes_consumed(bytes_consumed),
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_consumed(fin_consumed) {}
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member causes this object to have padding bytes, which causes the
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default gtest object printer to read uninitialize memory. So we need
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to teach gtest how to print this object.
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicConsumedData& s);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t bytes_consumed;
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_consumed;
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
697