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