quic_protocol.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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)#include "net/quic/quic_protocol.h"
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/quic/quic_utils.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::StringPiece;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::map;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::numeric_limits;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::ostream;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::string;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetPacketHeaderSize(QuicPacketHeader header) {
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetPacketHeaderSize(header.public_header.guid_length,
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                             header.public_header.version_flag,
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                             header.public_header.sequence_number_length,
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                             header.is_in_fec_group);
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetPacketHeaderSize(QuicGuidLength guid_length,
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           bool include_version,
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           QuicSequenceNumberLength sequence_number_length,
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           InFecGroup is_in_fec_group) {
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return kPublicFlagsSize + guid_length +
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      (include_version ? kQuicVersionSize : 0) + sequence_number_length +
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GetPublicResetPacketSize() {
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize +
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      PACKET_6BYTE_SEQUENCE_NUMBER;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetStartOfFecProtectedData(
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicGuidLength guid_length,
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length) {
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetPacketHeaderSize(
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      guid_length, include_version, sequence_number_length, IN_FEC_GROUP);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetStartOfEncryptedData(
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicGuidLength guid_length,
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length) {
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Don't include the fec size, since encryption starts before private flags.
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return GetPacketHeaderSize(
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      guid_length, include_version, sequence_number_length, NOT_IN_FEC_GROUP) -
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kPrivateFlagsSize;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketPublicHeader::QuicPacketPublicHeader()
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : guid(0),
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      guid_length(PACKET_8BYTE_GUID),
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reset_flag(false),
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      version_flag(false),
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicPacketPublicHeader::QuicPacketPublicHeader(
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const QuicPacketPublicHeader& other)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : guid(other.guid),
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      guid_length(other.guid_length),
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reset_flag(other.reset_flag),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      version_flag(other.version_flag),
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sequence_number_length(other.sequence_number_length),
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      versions(other.versions) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketHeader::QuicPacketHeader()
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : fec_flag(false),
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_flag(false),
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_hash(0),
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      packet_sequence_number(0),
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_in_fec_group(NOT_IN_FEC_GROUP),
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_group(0) {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public_header(header),
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_flag(false),
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_flag(false),
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_hash(0),
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      packet_sequence_number(0),
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_in_fec_group(NOT_IN_FEC_GROUP),
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_group(0) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicStreamFrame::QuicStreamFrame() {}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool fin,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicStreamOffset offset,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 StringPiece data)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : stream_id(stream_id),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fin(fin),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset(offset),
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data(data),
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      notifier(NULL) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochuint32 MakeQuicTag(char a, char b, char c, char d) {
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return static_cast<uint32>(a) |
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(b) << 8 |
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(c) << 16 |
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(d) << 24;
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)QuicVersionVector QuicSupportedVersions() {
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicVersionVector supported_versions;
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    supported_versions.push_back(kSupportedQuicVersions[i]);
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return supported_versions;
122c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
123c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
124558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochQuicTag QuicVersionToQuicTag(const QuicVersion version) {
125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (version) {
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case QUIC_VERSION_10:
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '0');
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case QUIC_VERSION_11:
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '1');
1300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case QUIC_VERSION_12:
1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '2');
132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    default:
133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // This shold be an ERROR because we should never attempt to convert an
134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // invalid QuicVersion to be written to the wire.
135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      LOG(ERROR) << "Unsupported QuicVersion: " << version;
136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return 0;
137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
140558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochQuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) {
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return kSupportedQuicVersions[i];
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Reading from the client so this should not be considered an ERROR.
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DLOG(INFO) << "Unsupported QuicTag version: "
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             << QuicUtils::TagToString(version_tag);
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return QUIC_VERSION_UNSUPPORTED;
150558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define RETURN_STRING_LITERAL(x) \
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochcase x: \
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochreturn #x
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
156558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstring QuicVersionToString(const QuicVersion version) {
157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (version) {
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_10);
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_11);
1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_12);
161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    default:
162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return "QUIC_VERSION_UNSUPPORTED";
163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
164558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
165558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)string QuicVersionVectorToString(const QuicVersionVector& versions) {
167558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  string result = "";
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < versions.size(); ++i) {
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (i != 0) {
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      result.append(",");
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    result.append(QuicVersionToString(versions[i]));
173558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return result;
175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "{ guid: " << header.public_header.guid
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     << ", guid_length:" << header.public_header.guid_length
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     << ", sequence_number_length:"
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     << header.public_header.sequence_number_length
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", reset_flag: " << header.public_header.reset_flag
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", version_flag: " << header.public_header.version_flag;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (header.public_header.version_flag) {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    os << " version: ";
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << header.public_header.versions[0] << " ";
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << ", fec_flag: " << header.fec_flag
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", entropy_flag: " << header.entropy_flag
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", entropy hash: " << static_cast<int>(header.entropy_hash)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", sequence_number: " << header.packet_sequence_number
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     << ", is_in_fec_group:" << header.is_in_fec_group
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", fec_group: " << header.fec_group<< "}\n";
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(ianswett): Initializing largest_observed to 0 should not be necessary.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ReceivedPacketInfo::ReceivedPacketInfo()
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : largest_observed(0),
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      delta_time_largest_observed(QuicTime::Delta::Infinite()),
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      is_truncated(false) {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReceivedPacketInfo::~ReceivedPacketInfo() {}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      QuicPacketSequenceNumber sequence_number) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return sequence_number > received_info.largest_observed ||
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContainsKey(received_info.missing_packets, sequence_number);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicPacketSequenceNumber lower,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicPacketSequenceNumber higher) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_info->missing_packets.insert(i);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SentPacketInfo::SentPacketInfo() {}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SentPacketInfo::~SentPacketInfo() {}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Testing convenience method.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicAckFrame::QuicAckFrame(QuicPacketSequenceNumber largest_observed,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           QuicTime largest_observed_receive_time,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           QuicPacketSequenceNumber least_unacked) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_info.largest_observed = largest_observed;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  received_info.entropy_hash = 0;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sent_info.least_unacked = least_unacked;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sent_info.entropy_hash = 0;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const SentPacketInfo& sent_info) {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " least_unacked: " << sent_info.least_unacked;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " largest_observed: " << received_info.largest_observed
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " missing_packets: [ ";
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (SequenceNumberSet::const_iterator it =
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           received_info.missing_packets.begin();
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != received_info.missing_packets.end(); ++it) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << *it << " ";
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << " ] ";
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return os;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const QuicCongestionFeedbackFrame& congestion_frame) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "type: " << congestion_frame.type;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (congestion_frame.type) {
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kInterArrival: {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const CongestionFeedbackMessageInterArrival& inter_arrival =
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          congestion_frame.inter_arrival;
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " accumulated_number_of_lost_packets: "
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         << inter_arrival.accumulated_number_of_lost_packets;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " received packets: [ ";
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (TimeMap::const_iterator it =
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               inter_arrival.received_packet_times.begin();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           it != inter_arrival.received_packet_times.end(); ++it) {
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        os << it->first << "@" << it->second.ToDebuggingValue() << " ";
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << "]";
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kFixRate: {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " bitrate_in_bytes_per_second: "
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         << congestion_frame.fix_rate.bitrate.ToBytesPerSecond();
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kTCP: {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " accumulated_number_of_lost_packets: "
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         << congestion_frame.tcp.accumulated_number_of_lost_packets;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " receive_window: " << tcp.receive_window;
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return os;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "sent info { " << ack_frame.sent_info << " } "
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << "received info { " << ack_frame.received_info << " }\n";
29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return os;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : bitrate(QuicBandwidth::Zero()) {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CongestionFeedbackMessageInterArrival::
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CongestionFeedbackMessageInterArrival() {}
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CongestionFeedbackMessageInterArrival::
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)~CongestionFeedbackMessageInterArrival() {}
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicStreamId last_good_stream_id,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const string& reason)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : error_code(error_code),
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_good_stream_id(last_good_stream_id),
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reason_phrase(reason) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LE(error_code, numeric_limits<uint8>::max());
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicFecData::QuicFecData() {}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicData::~QuicData() {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (owns_buffer_) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete [] const_cast<char*>(buffer_);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::FecProtectedData() const {
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const size_t start_of_fec = GetStartOfFecProtectedData(
330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      guid_length_, includes_version_, sequence_number_length_);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPiece(data() + start_of_fec, length() - start_of_fec);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::AssociatedData() const {
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return StringPiece(
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data() + kStartOfHashData,
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetStartOfEncryptedData(
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          guid_length_, includes_version_, sequence_number_length_) -
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kStartOfHashData);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::BeforePlaintext() const {
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return StringPiece(data(), GetStartOfEncryptedData(guid_length_,
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     includes_version_,
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     sequence_number_length_));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::Plaintext() const {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t start_of_encrypted_data =
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetStartOfEncryptedData(
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          guid_length_, includes_version_, sequence_number_length_);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPiece(data() + start_of_encrypted_data,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     length() - start_of_encrypted_data);
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RetransmittableFrames::RetransmittableFrames()
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : encryption_level_(NUM_ENCRYPTION_LEVELS) {
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RetransmittableFrames::~RetransmittableFrames() {
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (it->type) {
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PADDING_FRAME:
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->padding_frame;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case STREAM_FRAME:
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->stream_frame;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ACK_FRAME:
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->ack_frame;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case CONGESTION_FEEDBACK_FRAME:
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->congestion_feedback_frame;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case RST_STREAM_FRAME:
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->rst_stream_frame;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case CONNECTION_CLOSE_FRAME:
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->connection_close_frame;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case GOAWAY_FRAME:
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->goaway_frame;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case NUM_FRAME_TYPES:
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK(false) << "Cannot delete type: " << it->type;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STLDeleteElements(&stream_data_);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicFrame& RetransmittableFrames::AddStreamFrame(
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicStreamFrame* stream_frame) {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make an owned copy of the StringPiece.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string* stream_data = new string(stream_frame->data.data(),
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   stream_frame->data.size());
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ensure the frame's StringPiece points to the owned copy of the data.
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  stream_frame->data = StringPiece(*stream_data);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  stream_data_.push_back(stream_data);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames_.push_back(QuicFrame(stream_frame));
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frames_.back();
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const QuicFrame& frame) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_NE(frame.type, STREAM_FRAME);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames_.push_back(frame);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frames_.back();
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  encryption_level_ = level;
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SerializedPacket::SerializedPacket(
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicSequenceNumberLength sequence_number_length,
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacket* packet,
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacketEntropyHash entropy_hash,
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RetransmittableFrames* retransmittable_frames)
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : sequence_number(sequence_number),
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      sequence_number_length(sequence_number_length),
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      packet(packet),
42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      entropy_hash(entropy_hash),
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      retransmittable_frames(retransmittable_frames) {
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SerializedPacket::~SerializedPacket() {}
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << s.length() << "-byte data";
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicConsumedData& s) {
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "bytes_consumed: " << s.bytes_consumed
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " fin_consumed: " << s.fin_consumed;
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
441