quic_protocol.h revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
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;
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef uint32 QuicHeaderId;
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// QuicTag is the type of a tag in the wire protocol.
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef uint32 QuicTag;
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef std::vector<QuicTag> QuicTagVector;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): Consider Quic specific names for these constants.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum size in bytes of a QUIC packet.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicByteCount kMaxPacketSize = 1200;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum number of open streams per connection.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kDefaultMaxStreamsPerConnection = 100;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for guid in the packet header.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kQuicGuidSize = 8;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for public flags in the packet header.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicFlagsSize = 1;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for version number in the packet header.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kQuicVersionSize = 4;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for sequence number in the packet header.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kSequenceNumberSize = 6;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for private flags in the packet header.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPrivateFlagsSize = 1;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for FEC group in the packet header.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kFecGroupSize = 1;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for the nonce proof in public reset packet.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicResetNonceSize = 8;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Signifies that the QuicPacket will contain version of the protocol.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kIncludeVersion = true;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size in bytes of the data or fec packet header.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(bool include_version);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size in bytes of the public reset packet.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPublicResetPacketSize();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of FEC protected data.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(bool include_version);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of encrypted data.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(bool include_version);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |version| is a supported protocol version.
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)NET_EXPORT_PRIVATE bool IsSupportedVersion(QuicTag version);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Index of the first byte in a QUIC packet which is used in hash calculation.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kStartOfHashData = 0;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limit on the delta between stream IDs.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kMaxStreamIdDelta = 100;
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Limit on the delta between header IDs.
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const QuicHeaderId kMaxHeaderIdDelta = 100;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reserved ID for the crypto stream.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): ensure that this is not usable by any other streams.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kCryptoStreamId = 1;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Value which indicates this packet is not FEC protected.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const uint8 kNoFecOffset = 0xFF;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kDefaultTimeoutUs = 600000000;  // 10 minutes.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum Retransmission {
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NOT_RETRANSMISSION,
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  IS_RETRANSMISSION,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum HasRetransmittableData {
104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NO_RETRANSMITTABLE_DATA,
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  HAS_RETRANSMITTABLE_DATA,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PADDING_FRAME = 0,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STREAM_FRAME,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CONGESTION_FEEDBACK_FRAME,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GOAWAY_FRAME,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPublicFlags {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_NONE = 0,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,  // Packet header contains version info.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_RST = 1 << 1,  // Packet is a public reset packet.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_MAX = (1 << 2) - 1  // All bits set.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPrivateFlags {
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_NONE = 0,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC = 1 << 0,  // Payload is FEC as opposed to frames.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 1,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC_ENTROPY = 1 << 2,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1  // All bits set.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicRstStreamErrorCode {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_NO_ERROR = 0,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stream closed due to connection error. No reset frame is sent when this
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // happens.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_CONNECTION_ERROR,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GoAway frame sent. No more stream can be created.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_PEER_GOING_AWAY,
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_LAST_ERROR,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicErrorCode {
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_NO_ERROR = 0,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connection has reached an invalid state.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_INTERNAL_ERROR,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There were data frames after the a fin or reset.
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GoAway data is malformed.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_GOAWAY_DATA,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version negotiation packet is malformed.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The peer is going away.  May be a client or server.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PEER_GOING_AWAY,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Received public reset for this connection.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PUBLIC_RESET,
192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Invalid protocol version.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION,
194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Stream reset before headers decompressed.
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED,
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The Header ID for a stream was too far from the previous.
197b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_INVALID_HEADER_ID,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handshake message contained too many entries.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal message tag.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal parameter.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a mandatory parameter missing.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a parameter that has no overlap
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the local parameter.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received that contained a parameter with too few
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND,
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // An internal error occured in crypto processing.
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_INTERNAL_ERROR,
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto handshake message specified an unsupported version.
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_VERSION_NOT_SUPPORTED,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There was no intersection between the crypto primitives supported by the
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // peer and ourselves.
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_NO_SUPPORT,
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The server rejected our client hello messages too many times.
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_REJECTS,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The client rejected the server's certificate chain or signature.
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_PROOF_INVALID,
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto message was received with a duplicate tag.
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_DUPLICATE_TAG,
237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // A crypto message was received with the wrong encryption level (i.e. it
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // should have been encrypted but was not.)
239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT,
240b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The server config for a server has expired.
241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_SERVER_CONFIG_EXPIRED,
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_LAST_ERROR,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Version and Crypto tags are written to the wire with a big-endian
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// representation of the name of the tag.  For example
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the client hello tag (CHLO) will be written as the
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stored in memory as a little endian uint32, we need
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to reverse the order of the bytes.
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The TAG macro is used in header files to ensure that we don't create static
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// initialisers. In normal code, the MakeQuicTag function should be used.
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define TAG(a, b, c, d) ((d << 24) + (c << 16) + (b << 8) + a)
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const QuicTag kUnsupportedVersion = -1;
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Each time the wire format changes, this need needs to be incremented.
259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// At some point, we will actually freeze the wire format and make an official
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// version number, but this works for now.
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const QuicTag kQuicVersion1 = TAG('Q', '0', '0', '1');
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef TAG
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MakeQuicTag returns a value given the four bytes. For example:
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//   MakeQuicTag('C', 'H', 'L', 'O');
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint32 NET_EXPORT_PRIVATE MakeQuicTag(char a, char b, char c, char d);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicPacketPublicHeader();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader& operator=(const QuicPacketPublicHeader& other);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Universal header. All QuicPacket headers will have a guid and public flags.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_flag;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool version_flag;
279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QuicTagVector versions;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Header for Data or FEC packets.
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketHeader {
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicPacketHeader();
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit QuicPacketHeader(const QuicPacketPublicHeader& header);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicPacketHeader& s);
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_flag;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_entropy_flag;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool entropy_flag;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPublicResetPacket {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket() {}
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rejected_sequence_number;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetNonceProof nonce_proof;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicVersionNegotiationState {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  START_NEGOTIATION = 0,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SENT_NEGOTIATION_PACKET,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NEGOTIATED_VERSION
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A padding frame contains no payload.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPaddingFrame {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamOffset offset,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamOffset offset;  // Location of this data in the stream.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is finalized.
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pwestin): Add a way to enforce the max size of this map.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const ReceivedPacketInfo& s);
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to largest observed not including missing
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packets.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The highest packet sequence number we've observed from the peer.
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general, this should be the largest packet number we've received.  In
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the case of truncated acks, we may have to advertise a lower "upper bound"
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // than largest received, to avoid implicitly acking missing packets that
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't fit in the missing packet list due to size limitations.  In this
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, largest_observed may be a packet which is also in the missing packets
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // list.
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Time elapsed since largest_observed was received until this Ack frame was
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sent.
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime::Delta delta_time_largest_observed;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(satyamshekhar): Can be optimized using an interval set like data
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // structure.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if the sequence number is greater than largest_observed or is listed
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as missing.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Always returns false for sequence numbers less than least_unacked.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NET_EXPORT_PRIVATE IsAwaitingPacket(
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReceivedPacketInfo& received_info,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inserts missing packets between [lower, higher).
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReceivedPacketInfo* received_info,
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber lower,
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber higher);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const SentPacketInfo& s);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to, but not including, the least unacked
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packet.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame() {}
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Testing convenience method to construct a QuicAckFrame with all packets
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from least_unacked to largest_observed acked.
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_observed,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicTime largest_observed_receive_time,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicPacketSequenceNumber least_unacked);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicAckFrame& s);
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SentPacketInfo sent_info;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReceivedPacketInfo received_info;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kTCP MUST be supported by all QUIC implementations to guarentee 100%
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount receive_window;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival();
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CongestionFeedbackMessageInterArrival();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The set of received packets since the last feedback was sent, along with
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their arrival times.
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TimeMap received_packet_times;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate();
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicBandwidth bitrate;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame();
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicCongestionFeedbackFrame();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicCongestionFeedbackFrame& c);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackType type;
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should really be a union, but since the inter arrival struct
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is non-trivial, C++ prohibits it.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageTCP tcp;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival inter_arrival;
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate fix_rate;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, QuicRstStreamErrorCode error_code)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : stream_id(stream_id), error_code(error_code) {
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamErrorCode error_code;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_frame;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame() {}
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame(QuicErrorCode error_code,
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamId last_good_stream_id,
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  const std::string& reason);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicErrorCode error_code;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamId last_good_stream_id;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reason_phrase;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EncryptionLevel enumerates the stages of encryption that a QUIC connection
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// progresses through. When retransmitting a packet, the encryption level needs
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to be specified so that it is retransmitted at a level which the peer can
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// understand.
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum EncryptionLevel {
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_NONE = 0,
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_INITIAL = 1,
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_FORWARD_SECURE = 2,
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NUM_ENCRYPTION_LEVELS,
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicPaddingFrame* padding_frame)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(PADDING_FRAME),
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        padding_frame(padding_frame) {
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(STREAM_FRAME),
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_frame(stream_frame) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(ACK_FRAME),
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ack_frame(frame) {
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicCongestionFeedbackFrame* frame)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(CONGESTION_FEEDBACK_FRAME),
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        congestion_feedback_frame(frame) {
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicGoAwayFrame* frame)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(GOAWAY_FRAME),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goaway_frame(frame) {
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPaddingFrame* padding_frame;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame* congestion_feedback_frame;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicGoAwayFrame* goaway_frame;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const QuicFecData& other) const;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The FEC group number is also the sequence number of the first
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FEC protected packet.  The last protected packet's sequence number will
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be one less than the sequence number of the FEC packet.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(false) {}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewDataPacket(char* buffer,
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   size_t length,
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool owns_buffer,
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool includes_version) {
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, false);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewFecPacket(char* buffer,
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  size_t length,
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool owns_buffer,
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool includes_version) {
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, true);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece FecProtectedData() const;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece AssociatedData() const;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece BeforePlaintext() const;
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece Plaintext() const;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_fec_packet() const { return is_fec_packet_; }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool includes_version() const { return includes_version_; }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket(char* buffer,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             size_t length,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool owns_buffer,
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool includes_version,
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool is_fec_packet)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer_(buffer),
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        is_fec_packet_(is_fec_packet),
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        includes_version_(includes_version) {}
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool is_fec_packet_;
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool includes_version_;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length) {}
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member (in the base class QuicData) causes this object to have padding
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bytes, which causes the default gtest object printer to read
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninitialize memory. So we need to teach gtest how to print this object.
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicEncryptedPacket& s);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE RetransmittableFrames {
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames();
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~RetransmittableFrames();
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use it.
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of |stream_frame|.
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of the frame inside |frame|.
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrames& frames() const { return frames_; }
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_encryption_level(EncryptionLevel level);
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level() const {
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return encryption_level_;
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames_;
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level_;
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data referenced by the StringPiece of a QuicStreamFrame.
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string*> stream_data_;
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE SerializedPacket {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SerializedPacket(QuicPacketSequenceNumber sequence_number,
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacket* packet,
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacketEntropyHash entropy_hash,
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   RetransmittableFrames* retransmittable_frames)
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : sequence_number(sequence_number),
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        packet(packet),
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entropy_hash(entropy_hash),
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        retransmittable_frames(retransmittable_frames) {}
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames* retransmittable_frames;
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A struct for functions which consume data payloads and fins.
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The first member of the pair indicates bytes consumed.
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The second member of the pair indicates if an incoming fin was consumed.
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicConsumedData {
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData(size_t bytes_consumed, bool fin_consumed)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : bytes_consumed(bytes_consumed),
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_consumed(fin_consumed) {}
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member causes this object to have padding bytes, which causes the
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default gtest object printer to read uninitialize memory. So we need
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to teach gtest how to print this object.
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicConsumedData& s);
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t bytes_consumed;
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_consumed;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
713