quic_protocol.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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 public flags in the packet header.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicFlagsSize = 1;
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Number of bytes reserved for guid in the packet header.
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const size_t kQuicGuidSize = 8;
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)
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This is the default network timeout a for connection till the crypto
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// handshake succeeds and the negotiated timeout from the handshake is received.
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int64 kDefaultInitialTimeoutSecs = 30;  // 30 secs.
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int64 kDefaultTimeoutSecs = 60 * 10;  // 10 minutes.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum Retransmission {
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NOT_RETRANSMISSION,
103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  IS_RETRANSMISSION,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum HasRetransmittableData {
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NO_RETRANSMITTABLE_DATA,
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  HAS_RETRANSMITTABLE_DATA,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PADDING_FRAME = 0,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STREAM_FRAME,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CONGESTION_FEEDBACK_FRAME,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GOAWAY_FRAME,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPublicFlags {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_NONE = 0,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,  // Packet header contains version info.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_RST = 1 << 1,  // Packet is a public reset packet.
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Packet header guid length in bytes.
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_0BYTE_GUID = 0,
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_1BYTE_GUID = 1 << 2,
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_4BYTE_GUID = 1 << 3,
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_8BYTE_GUID = 1 << 3 | 1 << 2,
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_MAX = (1 << 4) - 1  // All bits set.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPrivateFlags {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_NONE = 0,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC = 1 << 0,  // Payload is FEC as opposed to frames.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 1,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_FEC_ENTROPY = 1 << 2,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1  // All bits set.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicRstStreamErrorCode {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_NO_ERROR = 0,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stream closed due to connection error. No reset frame is sent when this
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // happens.
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_CONNECTION_ERROR,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GoAway frame sent. No more stream can be created.
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_PEER_GOING_AWAY,
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_LAST_ERROR,
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicErrorCode {
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_NO_ERROR = 0,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connection has reached an invalid state.
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_INTERNAL_ERROR,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There were data frames after the a fin or reset.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GoAway data is malformed.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_GOAWAY_DATA,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version negotiation packet is malformed.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Public RST packet is malformed.
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_INVALID_PUBLIC_RST_PACKET,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The peer is going away.  May be a client or server.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PEER_GOING_AWAY,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Received public reset for this connection.
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PUBLIC_RESET,
202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Invalid protocol version.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION,
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Stream reset before headers decompressed.
205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED,
206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The Header ID for a stream was too far from the previous.
207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_INVALID_HEADER_ID,
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Negotiable parameter received during handshake had invalid value.
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_INVALID_NEGOTIATED_VALUE,
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error decompressing data.
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_DECOMPRESSION_FAILURE,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error encountered migrating addresses
21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_ERROR_MIGRATING_ADDRESS,
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error while writing the packet.
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_PACKET_WRITE_ERROR,
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Hanshake failed.
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_HANDSHAKE_FAILED,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handshake message contained too many entries.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal message tag.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal parameter.
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a mandatory parameter missing.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a parameter that has no overlap
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the local parameter.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received that contained a parameter with too few
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND,
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // An internal error occured in crypto processing.
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_INTERNAL_ERROR,
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto handshake message specified an unsupported version.
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_VERSION_NOT_SUPPORTED,
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There was no intersection between the crypto primitives supported by the
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // peer and ourselves.
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_NO_SUPPORT,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The server rejected our client hello messages too many times.
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_REJECTS,
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The client rejected the server's certificate chain or signature.
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_PROOF_INVALID,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto message was received with a duplicate tag.
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_DUPLICATE_TAG,
257b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // A crypto message was received with the wrong encryption level (i.e. it
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // should have been encrypted but was not.)
259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT,
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The server config for a server has expired.
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_SERVER_CONFIG_EXPIRED,
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_LAST_ERROR,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Version and Crypto tags are written to the wire with a big-endian
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// representation of the name of the tag.  For example
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the client hello tag (CHLO) will be written as the
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// stored in memory as a little endian uint32, we need
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to reverse the order of the bytes.
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The TAG macro is used in header files to ensure that we don't create static
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// initialisers. In normal code, the MakeQuicTag function should be used.
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define TAG(a, b, c, d) ((d << 24) + (c << 16) + (b << 8) + a)
277b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const QuicTag kUnsupportedVersion = -1;
278b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Each time the wire format changes, this need needs to be incremented.
279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// At some point, we will actually freeze the wire format and make an official
280b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// version number, but this works for now.
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const QuicTag kQuicVersion1 = TAG('Q', '0', '0', '4');
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef TAG
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MakeQuicTag returns a value given the four bytes. For example:
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//   MakeQuicTag('C', 'H', 'L', 'O');
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint32 NET_EXPORT_PRIVATE MakeQuicTag(char a, char b, char c, char d);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader();
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicPacketPublicHeader();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader& operator=(const QuicPacketPublicHeader& other);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Universal header. All QuicPacket headers will have a guid and public flags.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_flag;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool version_flag;
299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QuicTagVector versions;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Header for Data or FEC packets.
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketHeader {
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicPacketHeader();
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit QuicPacketHeader(const QuicPacketPublicHeader& header);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicPacketHeader& s);
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_flag;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_entropy_flag;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool entropy_flag;
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPublicResetPacket {
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket() {}
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rejected_sequence_number;
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetNonceProof nonce_proof;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicVersionNegotiationState {
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  START_NEGOTIATION = 0,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SENT_NEGOTIATION_PACKET,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NEGOTIATED_VERSION
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A padding frame contains no payload.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPaddingFrame {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamOffset offset,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamOffset offset;  // Location of this data in the stream.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is finalized.
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pwestin): Add a way to enforce the max size of this map.
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const ReceivedPacketInfo& s);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to largest observed not including missing
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packets.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The highest packet sequence number we've observed from the peer.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general, this should be the largest packet number we've received.  In
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the case of truncated acks, we may have to advertise a lower "upper bound"
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // than largest received, to avoid implicitly acking missing packets that
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't fit in the missing packet list due to size limitations.  In this
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, largest_observed may be a packet which is also in the missing packets
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // list.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Time elapsed since largest_observed was received until this Ack frame was
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sent.
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime::Delta delta_time_largest_observed;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(satyamshekhar): Can be optimized using an interval set like data
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // structure.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if the sequence number is greater than largest_observed or is listed
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as missing.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Always returns false for sequence numbers less than least_unacked.
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NET_EXPORT_PRIVATE IsAwaitingPacket(
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReceivedPacketInfo& received_info,
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number);
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inserts missing packets between [lower, higher).
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReceivedPacketInfo* received_info,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber lower,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber higher);
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const SentPacketInfo& s);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to, but not including, the least unacked
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packet.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame() {}
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Testing convenience method to construct a QuicAckFrame with all packets
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from least_unacked to largest_observed acked.
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_observed,
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicTime largest_observed_receive_time,
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicPacketSequenceNumber least_unacked);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicAckFrame& s);
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SentPacketInfo sent_info;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReceivedPacketInfo received_info;
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kTCP MUST be supported by all QUIC implementations to guarentee 100%
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount receive_window;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival();
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CongestionFeedbackMessageInterArrival();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The set of received packets since the last feedback was sent, along with
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their arrival times.
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TimeMap received_packet_times;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicBandwidth bitrate;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame();
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicCongestionFeedbackFrame();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicCongestionFeedbackFrame& c);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackType type;
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should really be a union, but since the inter arrival struct
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is non-trivial, C++ prohibits it.
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageTCP tcp;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival inter_arrival;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate fix_rate;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, QuicRstStreamErrorCode error_code)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : stream_id(stream_id), error_code(error_code) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamErrorCode error_code;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_frame;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame() {}
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame(QuicErrorCode error_code,
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamId last_good_stream_id,
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  const std::string& reason);
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicErrorCode error_code;
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamId last_good_stream_id;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reason_phrase;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EncryptionLevel enumerates the stages of encryption that a QUIC connection
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// progresses through. When retransmitting a packet, the encryption level needs
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to be specified so that it is retransmitted at a level which the peer can
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// understand.
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum EncryptionLevel {
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_NONE = 0,
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_INITIAL = 1,
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_FORWARD_SECURE = 2,
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NUM_ENCRYPTION_LEVELS,
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicPaddingFrame* padding_frame)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(PADDING_FRAME),
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        padding_frame(padding_frame) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(STREAM_FRAME),
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_frame(stream_frame) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(ACK_FRAME),
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ack_frame(frame) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicCongestionFeedbackFrame* frame)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(CONGESTION_FEEDBACK_FRAME),
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        congestion_feedback_frame(frame) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicGoAwayFrame* frame)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(GOAWAY_FRAME),
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goaway_frame(frame) {
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPaddingFrame* padding_frame;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame* congestion_feedback_frame;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicGoAwayFrame* goaway_frame;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const QuicFecData& other) const;
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The FEC group number is also the sequence number of the first
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FEC protected packet.  The last protected packet's sequence number will
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be one less than the sequence number of the FEC packet.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(false) {}
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewDataPacket(char* buffer,
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   size_t length,
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool owns_buffer,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool includes_version) {
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, false);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static QuicPacket* NewFecPacket(char* buffer,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  size_t length,
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool owns_buffer,
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool includes_version) {
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, includes_version, true);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece FecProtectedData() const;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece AssociatedData() const;
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece BeforePlaintext() const;
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece Plaintext() const;
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_fec_packet() const { return is_fec_packet_; }
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool includes_version() const { return includes_version_; }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket(char* buffer,
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             size_t length,
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool owns_buffer,
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool includes_version,
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool is_fec_packet)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer_(buffer),
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        is_fec_packet_(is_fec_packet),
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        includes_version_(includes_version) {}
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool is_fec_packet_;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool includes_version_;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length) {}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member (in the base class QuicData) causes this object to have padding
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bytes, which causes the default gtest object printer to read
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninitialize memory. So we need to teach gtest how to print this object.
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicEncryptedPacket& s);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE RetransmittableFrames {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames();
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~RetransmittableFrames();
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use it.
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of |stream_frame|.
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of the frame inside |frame|.
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrames& frames() const { return frames_; }
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_encryption_level(EncryptionLevel level);
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level() const {
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return encryption_level_;
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames_;
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level_;
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data referenced by the StringPiece of a QuicStreamFrame.
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string*> stream_data_;
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE SerializedPacket {
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SerializedPacket(QuicPacketSequenceNumber sequence_number,
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacket* packet,
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacketEntropyHash entropy_hash,
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   RetransmittableFrames* retransmittable_frames)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : sequence_number(sequence_number),
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        packet(packet),
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entropy_hash(entropy_hash),
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        retransmittable_frames(retransmittable_frames) {}
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet;
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames* retransmittable_frames;
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A struct for functions which consume data payloads and fins.
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The first member of the pair indicates bytes consumed.
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The second member of the pair indicates if an incoming fin was consumed.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicConsumedData {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData(size_t bytes_consumed, bool fin_consumed)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : bytes_consumed(bytes_consumed),
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_consumed(fin_consumed) {}
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member causes this object to have padding bytes, which causes the
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default gtest object printer to read uninitialize memory. So we need
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to teach gtest how to print this object.
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicConsumedData& s);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t bytes_consumed;
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_consumed;
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
733