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)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t GetPacketHeaderSize(const QuicPacketHeader& header) {
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return GetPacketHeaderSize(header.public_header.connection_id_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)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length,
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           bool include_version,
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           QuicSequenceNumberLength sequence_number_length,
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           InFecGroup is_in_fec_group) {
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return kPublicFlagsSize + connection_id_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)
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetStartOfFecProtectedData(
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicConnectionIdLength connection_id_length,
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length) {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return GetPacketHeaderSize(connection_id_length,
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             include_version,
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             sequence_number_length,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             IN_FEC_GROUP);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)size_t GetStartOfEncryptedData(
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    QuicConnectionIdLength connection_id_length,
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    bool include_version,
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    QuicSequenceNumberLength sequence_number_length) {
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Don't include the fec size, since encryption starts before private flags.
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return GetPacketHeaderSize(connection_id_length,
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             include_version,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             sequence_number_length,
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             NOT_IN_FEC_GROUP) - kPrivateFlagsSize;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketPublicHeader::QuicPacketPublicHeader()
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : connection_id(0),
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_length(PACKET_8BYTE_CONNECTION_ID),
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      reset_flag(false),
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      version_flag(false),
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicPacketPublicHeader::QuicPacketPublicHeader(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const QuicPacketPublicHeader& other)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : connection_id(other.connection_id),
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_length(other.connection_id_length),
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reset_flag(other.reset_flag),
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      version_flag(other.version_flag),
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sequence_number_length(other.sequence_number_length),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      versions(other.versions) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketHeader::QuicPacketHeader()
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : fec_flag(false),
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_flag(false),
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_hash(0),
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      packet_sequence_number(0),
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_in_fec_group(NOT_IN_FEC_GROUP),
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_group(0) {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public_header(header),
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_flag(false),
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_flag(false),
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      entropy_hash(0),
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      packet_sequence_number(0),
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      is_in_fec_group(NOT_IN_FEC_GROUP),
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fec_group(0) {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicPublicResetPacket::QuicPublicResetPacket()
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : nonce_proof(0),
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rejected_sequence_number(0) {}
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicPublicResetPacket::QuicPublicResetPacket(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const QuicPacketPublicHeader& header)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public_header(header),
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      nonce_proof(0),
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rejected_sequence_number(0) {}
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicStreamFrame::QuicStreamFrame()
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : stream_id(0),
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fin(false),
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      offset(0),
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      notifier(NULL) {}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : stream_id(frame.stream_id),
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fin(frame.fin),
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      offset(frame.offset),
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      data(frame.data),
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      notifier(frame.notifier) {
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool fin,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicStreamOffset offset,
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 IOVector data)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : stream_id(stream_id),
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fin(fin),
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset(offset),
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data(data),
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      notifier(NULL) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)string* QuicStreamFrame::GetDataAsString() const {
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  string* data_string = new string();
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  data_string->reserve(data.TotalBufferSize());
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < data.Size(); ++i) {
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    data_string->append(static_cast<char*>(data.iovec()[i].iov_base),
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        data.iovec()[i].iov_len);
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK_EQ(data_string->size(), data.TotalBufferSize());
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return data_string;
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochuint32 MakeQuicTag(char a, char b, char c, char d) {
141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return static_cast<uint32>(a) |
142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(b) << 8 |
143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(c) << 16 |
144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch         static_cast<uint32>(d) << 24;
145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) {
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return std::find(tag_vector.begin(), tag_vector.end(),  tag)
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      != tag_vector.end();
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)QuicVersionVector QuicSupportedVersions() {
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  QuicVersionVector supported_versions;
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    supported_versions.push_back(kSupportedQuicVersions[i]);
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return supported_versions;
158c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch}
159c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
160558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochQuicTag QuicVersionToQuicTag(const QuicVersion version) {
161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (version) {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case QUIC_VERSION_15:
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '5');
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case QUIC_VERSION_16:
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '6');
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    case QUIC_VERSION_17:
167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      return MakeQuicTag('Q', '0', '1', '7');
1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case QUIC_VERSION_18:
1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return MakeQuicTag('Q', '0', '1', '8');
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case QUIC_VERSION_19:
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return MakeQuicTag('Q', '0', '1', '9');
1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    case QUIC_VERSION_20:
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return MakeQuicTag('Q', '0', '2', '0');
174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    default:
175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // This shold be an ERROR because we should never attempt to convert an
176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // invalid QuicVersion to be written to the wire.
177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      LOG(ERROR) << "Unsupported QuicVersion: " << version;
178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return 0;
179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
180558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
182558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochQuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) {
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return kSupportedQuicVersions[i];
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Reading from the client so this should not be considered an ERROR.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DVLOG(1) << "Unsupported QuicTag version: "
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           << QuicUtils::TagToString(version_tag);
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return QUIC_VERSION_UNSUPPORTED;
192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define RETURN_STRING_LITERAL(x) \
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochcase x: \
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochreturn #x
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstring QuicVersionToString(const QuicVersion version) {
199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  switch (version) {
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_15);
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_16);
202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    RETURN_STRING_LITERAL(QUIC_VERSION_17);
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    RETURN_STRING_LITERAL(QUIC_VERSION_18);
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_19);
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    RETURN_STRING_LITERAL(QUIC_VERSION_20);
206558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    default:
207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      return "QUIC_VERSION_UNSUPPORTED";
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
210558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)string QuicVersionVectorToString(const QuicVersionVector& versions) {
212558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  string result = "";
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (size_t i = 0; i < versions.size(); ++i) {
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (i != 0) {
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      result.append(",");
2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    result.append(QuicVersionToString(versions[i]));
218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
219558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return result;
220558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
221558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  os << "{ connection_id: " << header.public_header.connection_id
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     << ", connection_id_length:" << header.public_header.connection_id_length
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     << ", sequence_number_length:"
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)     << header.public_header.sequence_number_length
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", reset_flag: " << header.public_header.reset_flag
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", version_flag: " << header.public_header.version_flag;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (header.public_header.version_flag) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    os << " version: ";
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << header.public_header.versions[0] << " ";
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << ", fec_flag: " << header.fec_flag
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", entropy_flag: " << header.entropy_flag
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", entropy hash: " << static_cast<int>(header.entropy_hash)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", sequence_number: " << header.packet_sequence_number
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)     << ", is_in_fec_group:" << header.is_in_fec_group
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << ", fec_group: " << header.fec_group<< "}\n";
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ReceivedPacketInfo::ReceivedPacketInfo()
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : entropy_hash(0),
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      largest_observed(0),
2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      delta_time_largest_observed(QuicTime::Delta::Infinite()),
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_truncated(false) {}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReceivedPacketInfo::~ReceivedPacketInfo() {}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      QuicPacketSequenceNumber sequence_number) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return sequence_number > received_info.largest_observed ||
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContainsKey(received_info.missing_packets, sequence_number);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicPacketSequenceNumber lower,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicPacketSequenceNumber higher) {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_info->missing_packets.insert(i);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicStopWaitingFrame::QuicStopWaitingFrame()
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : entropy_hash(0),
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      least_unacked(0) {
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicAckFrame::QuicAckFrame() {}
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : receive_window(0) {
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() {
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CongestionFeedbackMessageInterArrival::
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ~CongestionFeedbackMessageInterArrival() {}
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {}
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2890529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochQuicRstStreamErrorCode AdjustErrorForVersion(
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    QuicRstStreamErrorCode error_code,
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    QuicVersion version) {
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  switch (error_code) {
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    case QUIC_RST_FLOW_CONTROL_ACCOUNTING:
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      if (version <= QUIC_VERSION_17) {
2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return QUIC_STREAM_NO_ERROR;
2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      }
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      break;
2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    default:
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return error_code;
3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return error_code;
3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicRstStreamFrame::QuicRstStreamFrame()
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : stream_id(0),
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_code(QUIC_STREAM_NO_ERROR) {
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id,
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       QuicRstStreamErrorCode error_code,
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       QuicStreamOffset bytes_written)
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : stream_id(stream_id),
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_code(error_code),
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      byte_offset(bytes_written) {
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_LE(error_code, numeric_limits<uint8>::max());
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicConnectionCloseFrame::QuicConnectionCloseFrame()
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : error_code(QUIC_NO_ERROR) {
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame() {}
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame)
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(PADDING_FRAME),
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      padding_frame(padding_frame) {
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(STREAM_FRAME),
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      stream_frame(stream_frame) {
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicAckFrame* frame)
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(ACK_FRAME),
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ack_frame(frame) {
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame)
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(CONGESTION_FEEDBACK_FRAME),
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      congestion_feedback_frame(frame) {
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : type(STOP_WAITING_FRAME),
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      stop_waiting_frame(frame) {
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3490529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochQuicFrame::QuicFrame(QuicPingFrame* frame)
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : type(PING_FRAME),
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ping_frame(frame) {
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(RST_STREAM_FRAME),
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      rst_stream_frame(frame) {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(CONNECTION_CLOSE_FRAME),
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      connection_close_frame(frame) {
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(GOAWAY_FRAME),
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      goaway_frame(frame) {
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(WINDOW_UPDATE_FRAME),
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      window_update_frame(frame) {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFrame::QuicFrame(QuicBlockedFrame* frame)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(BLOCKED_FRAME),
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      blocked_frame(frame) {
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicFecData::QuicFecData() : fec_group(0) {}
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " least_unacked: " << sent_info.least_unacked;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)     << " is_truncated: " << received_info.is_truncated
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " largest_observed: " << received_info.largest_observed
391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     << " delta_time_largest_observed: "
392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     << received_info.delta_time_largest_observed.ToMicroseconds()
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     << " missing_packets: [ ";
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (SequenceNumberSet::const_iterator it =
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           received_info.missing_packets.begin();
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != received_info.missing_packets.end(); ++it) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os << *it << " ";
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << " ] revived_packets: [ ";
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (SequenceNumberSet::const_iterator it =
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           received_info.revived_packets.begin();
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       it != received_info.revived_packets.end(); ++it) {
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    os << *it << " ";
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  os << " ]";
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return os;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicFrame& frame) {
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (frame.type) {
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  case PADDING_FRAME: {
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { PADDING_FRAME } ";
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case RST_STREAM_FRAME: {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame);
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case CONNECTION_CLOSE_FRAME: {
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { CONNECTION_CLOSE_FRAME } "
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << *(frame.connection_close_frame);
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case GOAWAY_FRAME: {
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case WINDOW_UPDATE_FRAME: {
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case BLOCKED_FRAME: {
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case STREAM_FRAME: {
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { STREAM_FRAME } " << *(frame.stream_frame);
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case ACK_FRAME: {
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { ACK_FRAME } " << *(frame.ack_frame);
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case CONGESTION_FEEDBACK_FRAME: {
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      os << "type { CONGESTION_FEEDBACK_FRAME } "
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         << *(frame.congestion_feedback_frame);
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case STOP_WAITING_FRAME: {
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame);
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default: {
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LOG(ERROR) << "Unknown frame type: " << frame.type;
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) {
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "stream_id { " << rst_frame.stream_id << " } "
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "error_code { " << rst_frame.error_code << " } "
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "error_details { " << rst_frame.error_details << " }\n";
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os,
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const QuicConnectionCloseFrame& connection_close_frame) {
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "error_code { " << connection_close_frame.error_code << " } "
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "error_details { " << connection_close_frame.error_details << " }\n";
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) {
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "error_code { " << goaway_frame.error_code << " } "
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } "
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "reason_phrase { " << goaway_frame.reason_phrase << " }\n";
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os,
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const QuicWindowUpdateFrame& window_update_frame) {
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "stream_id { " << window_update_frame.stream_id << " } "
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "byte_offset { " << window_update_frame.byte_offset << " }\n";
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) {
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "stream_id { " << blocked_frame.stream_id << " }\n";
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) {
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "stream_id { " << stream_frame.stream_id << " } "
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "fin { " << stream_frame.fin << " } "
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "offset { " << stream_frame.offset << " } "
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "data { "
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString()))
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << " }\n";
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os << "sent info { " << ack_frame.sent_info << " } "
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     << "received info { " << ack_frame.received_info << " }\n";
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return os;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const QuicCongestionFeedbackFrame& congestion_frame) {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << "type: " << congestion_frame.type;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (congestion_frame.type) {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kInterArrival: {
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const CongestionFeedbackMessageInterArrival& inter_arrival =
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          congestion_frame.inter_arrival;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " received packets: [ ";
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for (TimeMap::const_iterator it =
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               inter_arrival.received_packet_times.begin();
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           it != inter_arrival.received_packet_times.end(); ++it) {
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        os << it->first << "@" << it->second.ToDebuggingValue() << " ";
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << "]";
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kFixRate: {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " bitrate_in_bytes_per_second: "
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         << congestion_frame.fix_rate.bitrate.ToBytesPerSecond();
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case kTCP: {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      os << " receive_window: " << tcp.receive_window;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case kTCPBBR: {
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      LOG(DFATAL) << "TCPBBR is not yet supported.";
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
54168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return os;
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : bitrate(QuicBandwidth::Zero()) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicGoAwayFrame::QuicGoAwayFrame()
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : error_code(QUIC_NO_ERROR),
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      last_good_stream_id(0) {
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 QuicStreamId last_good_stream_id,
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const string& reason)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : error_code(error_code),
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_good_stream_id(last_good_stream_id),
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      reason_phrase(reason) {
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_LE(error_code, numeric_limits<uint8>::max());
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicData::QuicData(const char* buffer,
5635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   size_t length)
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : buffer_(buffer),
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      length_(length),
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      owns_buffer_(false) {
5675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicData::QuicData(char* buffer,
5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   size_t length,
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   bool owns_buffer)
5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : buffer_(buffer),
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      length_(length),
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      owns_buffer_(owns_buffer) {
5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicData::~QuicData() {
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (owns_buffer_) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete [] const_cast<char*>(buffer_);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id,
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             QuicStreamOffset byte_offset)
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : stream_id(stream_id),
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      byte_offset(byte_offset) {}
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id)
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : stream_id(stream_id) {}
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicPacket::QuicPacket(char* buffer,
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       size_t length,
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       bool owns_buffer,
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       QuicConnectionIdLength connection_id_length,
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       bool includes_version,
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       QuicSequenceNumberLength sequence_number_length,
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       bool is_fec_packet)
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : QuicData(buffer, length, owns_buffer),
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      buffer_(buffer),
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_fec_packet_(is_fec_packet),
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_length_(connection_id_length),
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      includes_version_(includes_version),
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sequence_number_length_(sequence_number_length) {
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         size_t length)
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : QuicData(buffer, length) {
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicEncryptedPacket::QuicEncryptedPacket(char* buffer,
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         size_t length,
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         bool owns_buffer)
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : QuicData(buffer, length, owns_buffer) {
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::FecProtectedData() const {
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const size_t start_of_fec = GetStartOfFecProtectedData(
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_length_, includes_version_, sequence_number_length_);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPiece(data() + start_of_fec, length() - start_of_fec);
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::AssociatedData() const {
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return StringPiece(
625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data() + kStartOfHashData,
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetStartOfEncryptedData(
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          connection_id_length_, includes_version_, sequence_number_length_) -
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      kStartOfHashData);
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::BeforePlaintext() const {
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_,
633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     includes_version_,
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                     sequence_number_length_));
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StringPiece QuicPacket::Plaintext() const {
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t start_of_encrypted_data =
639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GetStartOfEncryptedData(
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          connection_id_length_, includes_version_, sequence_number_length_);
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return StringPiece(data() + start_of_encrypted_data,
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     length() - start_of_encrypted_data);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RetransmittableFrames::RetransmittableFrames()
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : encryption_level_(NUM_ENCRYPTION_LEVELS) {
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RetransmittableFrames::~RetransmittableFrames() {
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (it->type) {
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PADDING_FRAME:
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->padding_frame;
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case STREAM_FRAME:
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->stream_frame;
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ACK_FRAME:
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->ack_frame;
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case CONGESTION_FEEDBACK_FRAME:
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->congestion_feedback_frame;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      case STOP_WAITING_FRAME:
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        delete it->stop_waiting_frame;
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        break;
6670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      case PING_FRAME:
6680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        delete it->ping_frame;
6690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        break;
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case RST_STREAM_FRAME:
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->rst_stream_frame;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case CONNECTION_CLOSE_FRAME:
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->connection_close_frame;
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case GOAWAY_FRAME:
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        delete it->goaway_frame;
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case WINDOW_UPDATE_FRAME:
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delete it->window_update_frame;
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case BLOCKED_FRAME:
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        delete it->blocked_frame;
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        break;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case NUM_FRAME_TYPES:
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK(false) << "Cannot delete type: " << it->type;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STLDeleteElements(&stream_data_);
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicFrame& RetransmittableFrames::AddStreamFrame(
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    QuicStreamFrame* stream_frame) {
694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Make an owned copy of the stream frame's data.
695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  stream_data_.push_back(stream_frame->GetDataAsString());
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Ensure the stream frame's IOVector points to the owned copy of the data.
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  stream_frame->data.Clear();
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            stream_data_.back()->size());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames_.push_back(QuicFrame(stream_frame));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frames_.back();
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const QuicFrame& frame) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_NE(frame.type, STREAM_FRAME);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  frames_.push_back(frame);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return frames_.back();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IsHandshake RetransmittableFrames::HasCryptoHandshake() const {
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < frames().size(); ++i) {
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (frames()[i].type == STREAM_FRAME &&
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        frames()[i].stream_frame->stream_id == kCryptoStreamId) {
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return IS_HANDSHAKE;
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return NOT_HANDSHAKE;
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  encryption_level_ = level;
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SerializedPacket::SerializedPacket(
72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicSequenceNumberLength sequence_number_length,
72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacket* packet,
72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QuicPacketEntropyHash entropy_hash,
73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    RetransmittableFrames* retransmittable_frames)
73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : sequence_number(sequence_number),
73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      sequence_number_length(sequence_number_length),
73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      packet(packet),
73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      entropy_hash(entropy_hash),
73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      retransmittable_frames(retransmittable_frames) {
73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SerializedPacket::~SerializedPacket() {}
73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)QuicEncryptedPacket* QuicEncryptedPacket::Clone() const {
741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  char* buffer = new char[this->length()];
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memcpy(buffer, this->data(), this->length());
743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return new QuicEncryptedPacket(buffer, this->length(), true);
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  os << s.length() << "-byte data";
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return os;
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TransmissionInfo::TransmissionInfo()
752010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : retransmittable_frames(NULL),
753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sent_time(QuicTime::Zero()),
755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bytes_sent(0),
756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      nack_count(0),
75746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      transmission_type(NOT_RETRANSMISSION),
758010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      all_transmissions(NULL),
759f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      in_flight(false) {}
760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TransmissionInfo::TransmissionInfo(
762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RetransmittableFrames* retransmittable_frames,
763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    QuicSequenceNumberLength sequence_number_length)
765010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : retransmittable_frames(retransmittable_frames),
766010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sequence_number_length(sequence_number_length),
767010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sent_time(QuicTime::Zero()),
768010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bytes_sent(0),
769010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      nack_count(0),
77046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      transmission_type(NOT_RETRANSMISSION),
771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      all_transmissions(new SequenceNumberSet),
772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      in_flight(false) {
773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  all_transmissions->insert(sequence_number);
774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
775010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
776010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TransmissionInfo::TransmissionInfo(
777010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    RetransmittableFrames* retransmittable_frames,
778010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    QuicSequenceNumberLength sequence_number_length,
78046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    TransmissionType transmission_type,
781010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    SequenceNumberSet* all_transmissions)
782010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : retransmittable_frames(retransmittable_frames),
783010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sequence_number_length(sequence_number_length),
784010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      sent_time(QuicTime::Zero()),
785010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bytes_sent(0),
786010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      nack_count(0),
78746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      transmission_type(transmission_type),
788010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      all_transmissions(all_transmissions),
789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      in_flight(false) {
790010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  all_transmissions->insert(sequence_number);
791010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
792010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
794