quic_protocol.h revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/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;
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct QuicPacketHeader;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicGuid;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 QuicStreamId;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicStreamOffset;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicPacketSequenceNumber;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketSequenceNumber QuicFecGroupNumber;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint64 QuicPublicResetNonceProof;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint8 QuicPacketEntropyHash;
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef uint32 QuicHeaderId;
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// QuicTag is the type of a tag in the wire protocol.
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef uint32 QuicTag;
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)typedef std::vector<QuicTag> QuicTagVector;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): Consider Quic specific names for these constants.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Maximum size in bytes of a QUIC packet.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicByteCount kMaxPacketSize = 1200;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum number of open streams per connection.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kDefaultMaxStreamsPerConnection = 100;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for public flags in the packet header.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicFlagsSize = 1;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for version number in the packet header.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kQuicVersionSize = 4;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for private flags in the packet header.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPrivateFlagsSize = 1;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for FEC group in the packet header.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kFecGroupSize = 1;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Number of bytes reserved for the nonce proof in public reset packet.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kPublicResetNonceSize = 8;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Signifies that the QuicPacket will contain version of the protocol.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const bool kIncludeVersion = true;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Index of the first byte in a QUIC packet which is used in hash calculation.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kStartOfHashData = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limit on the delta between stream IDs.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kMaxStreamIdDelta = 100;
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Limit on the delta between header IDs.
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const QuicHeaderId kMaxHeaderIdDelta = 100;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reserved ID for the crypto stream.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): ensure that this is not usable by any other streams.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kCryptoStreamId = 1;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This is the default network timeout a for connection till the crypto
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// handshake succeeds and the negotiated timeout from the handshake is received.
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int64 kDefaultInitialTimeoutSecs = 120;  // 2 mins.
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const int64 kDefaultTimeoutSecs = 60 * 10;  // 10 minutes.
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const int64 kDefaultMaxTimeForCryptoHandshakeSecs = 5;  // 5 secs.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum Retransmission {
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NOT_RETRANSMISSION,
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  IS_RETRANSMISSION,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum HasRetransmittableData {
90b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  NO_RETRANSMITTABLE_DATA,
91b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  HAS_RETRANSMITTABLE_DATA,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PADDING_FRAME = 0,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STREAM_FRAME,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CONGESTION_FEEDBACK_FRAME,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GOAWAY_FRAME,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum QuicGuidLength {
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_0BYTE_GUID = 0,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_1BYTE_GUID = 1,
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_4BYTE_GUID = 4,
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_8BYTE_GUID = 8
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum InFecGroup {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NOT_IN_FEC_GROUP,
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  IN_FEC_GROUP,
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum QuicSequenceNumberLength {
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_1BYTE_SEQUENCE_NUMBER = 1,
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_2BYTE_SEQUENCE_NUMBER = 2,
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_4BYTE_SEQUENCE_NUMBER = 4,
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_6BYTE_SEQUENCE_NUMBER = 6
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The public flags are specified in one byte.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPublicFlags {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_NONE = 0,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bit 0: Does the packet header contains version info?
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PUBLIC_FLAGS_VERSION = 1 << 0,
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bit 1: Is this packet a public reset packet?
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PUBLIC_FLAGS_RST = 1 << 1,
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bits 2 and 3 specify the length of the GUID as follows:
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ----00--: 0 bytes
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ----01--: 1 byte
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ----10--: 4 bytes
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // ----11--: 8 bytes
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_0BYTE_GUID = 0,
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_1BYTE_GUID = 1 << 2,
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_4BYTE_GUID = 1 << 3,
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PACKET_PUBLIC_FLAGS_8BYTE_GUID = 1 << 3 | 1 << 2,
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bits 4 and 5 describe the packet sequence number length as follows:
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // --00----: 1 byte
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // --01----: 2 bytes
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // --10----: 4 bytes
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // --11----: 6 bytes
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE = 0,
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE = 1 << 4,
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE = 1 << 5,
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE = 1 << 5 | 1 << 4,
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // All bits set (bits 6 and 7 are not currently used): 00111111
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PUBLIC_FLAGS_MAX = (1 << 6) - 1
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The private flags are specified in one byte.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicPacketPrivateFlags {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PACKET_PRIVATE_FLAGS_NONE = 0,
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bit 0: Does this packet contain an entropy bit?
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PACKET_PRIVATE_FLAGS_ENTROPY = 1 << 0,
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bit 1: Payload is part of an FEC group?
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PRIVATE_FLAGS_FEC_GROUP = 1 << 1,
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Bit 2: Payload is FEC as opposed to frames?
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PRIVATE_FLAGS_FEC = 1 << 2,
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // All bits set (bits 3-7 are not currently used): 00000111
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PACKET_PRIVATE_FLAGS_MAX = (1 << 3) - 1
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// The available versions of QUIC. Guaranteed that the integer value of the enum
176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// will match the version number.
177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// When adding a new version to this enum you should add it to
178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// kSupportedVersions (if appropriate), and also add a new case to the helper
179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// methods QuicVersionToQuicTag, and QuicTagToQuicVersion.
180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochenum QuicVersion {
181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Special case to indicate unknown/unsupported QUIC version.
182558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QUIC_VERSION_UNSUPPORTED = 0,
183558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
184558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QUIC_VERSION_6 = 6,  // Current version.
185558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// This vector contains QUIC versions which we currently support.
188558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// This should be ordered such that the highest supported version is the first
189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// element, with subsequent elements in descending order (versions can be
190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// skipped as necessary).
191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstatic const QuicVersion kSupportedQuicVersions[] = {QUIC_VERSION_6};
192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochtypedef std::vector<QuicVersion> QuicVersionVector;
194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
195558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Upper limit on versions we support.
196558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE QuicVersion QuicVersionMax();
197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// QuicTag is written to and read from the wire, but we prefer to use
199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// the more readable QuicVersion at other levels.
200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Helper function which translates from a QuicVersion to a QuicTag. Returns 0
201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// if QuicVersion is unsupported.
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE QuicTag QuicVersionToQuicTag(const QuicVersion version);
203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns appropriate QuicVersion from a QuicTag.
205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns QUIC_VERSION_UNSUPPORTED if version_tag cannot be understood.
206558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE QuicVersion QuicTagToQuicVersion(const QuicTag version_tag);
207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Helper function which translates from a QuicVersion to a string.
209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns strings corresponding to enum names (e.g. QUIC_VERSION_6).
210558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE std::string QuicVersionToString(const QuicVersion version);
211558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
212558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Returns comma separated list of string representations of QuicVersion enum
213558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// values in the supplied QuicVersionArray.
214558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE std::string QuicVersionArrayToString(
215558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const QuicVersion versions[], int num_versions);
216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
217558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Version and Crypto tags are written to the wire with a big-endian
218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// representation of the name of the tag.  For example
219558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// the client hello tag (CHLO) will be written as the
220558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// following 4 bytes: 'C' 'H' 'L' 'O'.  Since it is
221558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// stored in memory as a little endian uint32, we need
222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// to reverse the order of the bytes.
223558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
224558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// MakeQuicTag returns a value given the four bytes. For example:
225558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch//   MakeQuicTag('C', 'H', 'L', 'O');
226558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochNET_EXPORT_PRIVATE QuicTag MakeQuicTag(char a, char b, char c, char d);
227558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Size in bytes of the data or fec packet header.
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(QuicPacketHeader header);
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicGuidLength guid_length,
233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length,
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    InFecGroup is_in_fec_group);
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Size in bytes of the public reset packet.
238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NET_EXPORT_PRIVATE size_t GetPublicResetPacketSize();
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Index of the first byte in a QUIC packet of FEC protected data.
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData(
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicGuidLength guid_length,
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length);
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Index of the first byte in a QUIC packet of encrypted data.
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData(
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicGuidLength guid_length,
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length);
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicRstStreamErrorCode {
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_NO_ERROR = 0,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stream closed due to connection error. No reset frame is sent when this
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // happens.
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_CONNECTION_ERROR,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GoAway frame sent. No more stream can be created.
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_PEER_GOING_AWAY,
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_LAST_ERROR,
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum QuicErrorCode {
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_NO_ERROR = 0,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Connection has reached an invalid state.
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_INTERNAL_ERROR,
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There were data frames after the a fin or reset.
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GoAway data is malformed.
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_GOAWAY_DATA,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Version negotiation packet is malformed.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Public RST packet is malformed.
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_INVALID_PUBLIC_RST_PACKET,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The peer is going away.  May be a client or server.
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PEER_GOING_AWAY,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Received public reset for this connection.
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_PUBLIC_RESET,
311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Invalid protocol version.
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_VERSION,
313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Stream reset before headers decompressed.
314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_STREAM_RST_BEFORE_HEADERS_DECOMPRESSED,
315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The Header ID for a stream was too far from the previous.
316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_INVALID_HEADER_ID,
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Negotiable parameter received during handshake had invalid value.
31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_INVALID_NEGOTIATED_VALUE,
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error decompressing data.
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_DECOMPRESSION_FAILURE,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error encountered migrating addresses
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_ERROR_MIGRATING_ADDRESS,
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // There was an error while writing the packet.
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_PACKET_WRITE_ERROR,
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Hanshake failed.
33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  QUIC_HANDSHAKE_FAILED,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handshake message contained too many entries.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal message tag.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with an illegal parameter.
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a mandatory parameter missing.
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received with a parameter that has no overlap
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with the local parameter.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP,
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A crypto message was received that contained a parameter with too few
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND,
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // An internal error occured in crypto processing.
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_INTERNAL_ERROR,
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto handshake message specified an unsupported version.
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_VERSION_NOT_SUPPORTED,
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // There was no intersection between the crypto primitives supported by the
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // peer and ourselves.
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_NO_SUPPORT,
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The server rejected our client hello messages too many times.
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_REJECTS,
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The client rejected the server's certificate chain or signature.
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_PROOF_INVALID,
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A crypto message was received with a duplicate tag.
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_CRYPTO_DUPLICATE_TAG,
366b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // A crypto message was received with the wrong encryption level (i.e. it
367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // should have been encrypted but was not.)
368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT,
369b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The server config for a server has expired.
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QUIC_CRYPTO_SERVER_CONFIG_EXPIRED,
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // No error. Used as bound while iterating.
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QUIC_LAST_ERROR,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketPublicHeader {
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicPacketPublicHeader();
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader& operator=(const QuicPacketPublicHeader& other);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Universal header. All QuicPacket headers will have a guid and public flags.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  QuicGuidLength guid_length;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_flag;
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool version_flag;
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  QuicSequenceNumberLength sequence_number_length;
389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  QuicVersionVector versions;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Header for Data or FEC packets.
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketHeader {
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicPacketHeader();
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit QuicPacketHeader(const QuicPacketPublicHeader& header);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicPacketHeader& s);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fec_flag;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool entropy_flag;
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InFecGroup is_in_fec_group;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPublicResetPacket {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetPacket() {}
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : public_header(header) {}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketPublicHeader public_header;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber rejected_sequence_number;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPublicResetNonceProof nonce_proof;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum QuicVersionNegotiationState {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  START_NEGOTIATION = 0,
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SENT_NEGOTIATION_PACKET,
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NEGOTIATED_VERSION
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef QuicPacketPublicHeader QuicVersionNegotiationPacket;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A padding frame contains no payload.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPaddingFrame {
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamOffset offset,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamOffset offset;  // Location of this data in the stream.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Re-evaluate the trade-offs of hash_set vs set when framing
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is finalized.
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::set<QuicPacketSequenceNumber> SequenceNumberSet;
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pwestin): Add a way to enforce the max size of this map.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::map<QuicPacketSequenceNumber, QuicTime> TimeMap;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const ReceivedPacketInfo& s);
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to largest observed not including missing
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packets.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The highest packet sequence number we've observed from the peer.
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In general, this should be the largest packet number we've received.  In
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the case of truncated acks, we may have to advertise a lower "upper bound"
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // than largest received, to avoid implicitly acking missing packets that
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't fit in the missing packet list due to size limitations.  In this
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, largest_observed may be a packet which is also in the missing packets
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // list.
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber largest_observed;
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Time elapsed since largest_observed was received until this Ack frame was
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sent.
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicTime::Delta delta_time_largest_observed;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(satyamshekhar): Can be optimized using an interval set like data
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // structure.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SequenceNumberSet missing_packets;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// True if the sequence number is greater than largest_observed or is listed
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as missing.
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Always returns false for sequence numbers less than least_unacked.
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NET_EXPORT_PRIVATE IsAwaitingPacket(
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReceivedPacketInfo& received_info,
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inserts missing packets between [lower, higher).
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NET_EXPORT_PRIVATE InsertMissingPacketsBetween(
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReceivedPacketInfo* received_info,
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber lower,
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPacketSequenceNumber higher);
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const SentPacketInfo& s);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entropy hash of all packets up to, but not including, the least unacked
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // packet.
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame() {}
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Testing convenience method to construct a QuicAckFrame with all packets
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from least_unacked to largest_observed acked.
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_observed,
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicTime largest_observed_receive_time,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               QuicPacketSequenceNumber least_unacked);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicAckFrame& s);
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SentPacketInfo sent_info;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ReceivedPacketInfo received_info;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// kTCP MUST be supported by all QUIC implementations to guarantee 100%
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicByteCount receive_window;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival();
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~CongestionFeedbackMessageInterArrival();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The set of received packets since the last feedback was sent, along with
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their arrival times.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TimeMap received_packet_times;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate();
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicBandwidth bitrate;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicCongestionFeedbackFrame {
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicCongestionFeedbackFrame();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~QuicCongestionFeedbackFrame();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicCongestionFeedbackFrame& c);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackType type;
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should really be a union, but since the inter arrival struct
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is non-trivial, C++ prohibits it.
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageTCP tcp;
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageInterArrival inter_arrival;
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CongestionFeedbackMessageFixRate fix_rate;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, QuicRstStreamErrorCode error_code)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : stream_id(stream_id), error_code(error_code) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  QuicRstStreamErrorCode error_code;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicAckFrame ack_frame;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE QuicGoAwayFrame {
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame() {}
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGoAwayFrame(QuicErrorCode error_code,
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  QuicStreamId last_good_stream_id,
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  const std::string& reason);
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicErrorCode error_code;
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicStreamId last_good_stream_id;
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string reason_phrase;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EncryptionLevel enumerates the stages of encryption that a QUIC connection
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// progresses through. When retransmitting a packet, the encryption level needs
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to be specified so that it is retransmitted at a level which the peer can
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// understand.
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum EncryptionLevel {
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_NONE = 0,
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_INITIAL = 1,
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ENCRYPTION_FORWARD_SECURE = 2,
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NUM_ENCRYPTION_LEVELS,
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicPaddingFrame* padding_frame)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(PADDING_FRAME),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        padding_frame(padding_frame) {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(STREAM_FRAME),
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        stream_frame(stream_frame) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(ACK_FRAME),
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ack_frame(frame) {
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicCongestionFeedbackFrame* frame)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(CONGESTION_FEEDBACK_FRAME),
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        congestion_feedback_frame(frame) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit QuicFrame(QuicGoAwayFrame* frame)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : type(GOAWAY_FRAME),
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        goaway_frame(frame) {
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicPaddingFrame* padding_frame;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicCongestionFeedbackFrame* congestion_feedback_frame;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicGoAwayFrame* goaway_frame;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The FEC group number is also the sequence number of the first
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FEC protected packet.  The last protected packet's sequence number will
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be one less than the sequence number of the FEC packet.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(false) {}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        owns_buffer_(owns_buffer) {}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
694868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static QuicPacket* NewDataPacket(
695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      char* buffer,
696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      size_t length,
697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool owns_buffer,
698868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicGuidLength guid_length,
699868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool includes_version,
700868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicSequenceNumberLength sequence_number_length) {
701868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, guid_length,
702868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          includes_version, sequence_number_length, false);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static QuicPacket* NewFecPacket(
706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      char* buffer,
707868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      size_t length,
708868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool owns_buffer,
709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicGuidLength guid_length,
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool includes_version,
711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      QuicSequenceNumberLength sequence_number_length) {
712868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return new QuicPacket(buffer, length, owns_buffer, guid_length,
713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          includes_version, sequence_number_length, true);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece FecProtectedData() const;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece AssociatedData() const;
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece BeforePlaintext() const;
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::StringPiece Plaintext() const;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_fec_packet() const { return is_fec_packet_; }
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool includes_version() const { return includes_version_; }
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket(char* buffer,
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             size_t length,
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool owns_buffer,
731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             QuicGuidLength guid_length,
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool includes_version,
733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             QuicSequenceNumberLength sequence_number_length,
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             bool is_fec_packet)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer_(buffer),
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        is_fec_packet_(is_fec_packet),
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        guid_length_(guid_length),
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        includes_version_(includes_version),
740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        sequence_number_length_(sequence_number_length) {}
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool is_fec_packet_;
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicGuidLength guid_length_;
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const bool includes_version_;
746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const QuicSequenceNumberLength sequence_number_length_;
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length) {}
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {}
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member (in the base class QuicData) causes this object to have padding
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bytes, which causes the default gtest object printer to read
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // uninitialize memory. So we need to teach gtest how to print this object.
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicEncryptedPacket& s);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE RetransmittableFrames {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames();
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~RetransmittableFrames();
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates a local copy of the referenced StringPiece has QuicStreamFrame
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use it.
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of |stream_frame|.
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddStreamFrame(QuicStreamFrame* stream_frame);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Takes ownership of the frame inside |frame|.
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrame& AddNonStreamFrame(const QuicFrame& frame);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const QuicFrames& frames() const { return frames_; }
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_encryption_level(EncryptionLevel level);
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level() const {
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return encryption_level_;
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicFrames frames_;
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EncryptionLevel encryption_level_;
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data referenced by the StringPiece of a QuicStreamFrame.
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<std::string*> stream_data_;
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RetransmittableFrames);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT_PRIVATE SerializedPacket {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SerializedPacket(QuicPacketSequenceNumber sequence_number,
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacket* packet,
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   QuicPacketEntropyHash entropy_hash,
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   RetransmittableFrames* retransmittable_frames)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : sequence_number(sequence_number),
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        packet(packet),
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        entropy_hash(entropy_hash),
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        retransmittable_frames(retransmittable_frames) {}
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketSequenceNumber sequence_number;
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacket* packet;
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicPacketEntropyHash entropy_hash;
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RetransmittableFrames* retransmittable_frames;
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A struct for functions which consume data payloads and fins.
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The first member of the pair indicates bytes consumed.
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The second member of the pair indicates if an incoming fin was consumed.
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct QuicConsumedData {
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicConsumedData(size_t bytes_consumed, bool fin_consumed)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : bytes_consumed(bytes_consumed),
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fin_consumed(fin_consumed) {}
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, gtest prints the raw bytes of an object. The bool data
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // member causes this object to have padding bytes, which causes the
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default gtest object printer to read uninitialize memory. So we need
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to teach gtest how to print this object.
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::ostream& os, const QuicConsumedData& s);
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t bytes_consumed;
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool fin_consumed;
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
835