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