| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/quic_protocol.h" | 5 #include "net/quic/core/quic_protocol.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "net/quic/core/quic_flags.h" | 9 #include "net/quic/core/quic_flags.h" |
| 10 #include "net/quic/core/quic_utils.h" | 10 #include "net/quic/core/quic_utils.h" |
| 11 #include "net/quic/core/quic_versions.h" |
| 11 | 12 |
| 12 using base::StringPiece; | 13 using base::StringPiece; |
| 13 using std::map; | 14 using std::map; |
| 14 using std::numeric_limits; | 15 using std::numeric_limits; |
| 15 using std::ostream; | 16 using std::ostream; |
| 16 using std::string; | 17 using std::string; |
| 17 | 18 |
| 18 namespace net { | 19 namespace net { |
| 19 | 20 |
| 20 const char* const kFinalOffsetHeaderKey = ":final-offset"; | |
| 21 | |
| 22 size_t GetPacketHeaderSize(QuicVersion version, | 21 size_t GetPacketHeaderSize(QuicVersion version, |
| 23 const QuicPacketHeader& header) { | 22 const QuicPacketHeader& header) { |
| 24 return GetPacketHeaderSize(version, header.public_header.connection_id_length, | 23 return GetPacketHeaderSize(version, header.public_header.connection_id_length, |
| 25 header.public_header.version_flag, | 24 header.public_header.version_flag, |
| 26 header.public_header.multipath_flag, | 25 header.public_header.multipath_flag, |
| 27 header.public_header.nonce != nullptr, | 26 header.public_header.nonce != nullptr, |
| 28 header.public_header.packet_number_length); | 27 header.public_header.packet_number_length); |
| 29 } | 28 } |
| 30 | 29 |
| 31 size_t GetPacketHeaderSize(QuicVersion version, | 30 size_t GetPacketHeaderSize(QuicVersion version, |
| 32 QuicConnectionIdLength connection_id_length, | 31 QuicConnectionIdLength connection_id_length, |
| 33 bool include_version, | 32 bool include_version, |
| 34 bool include_path_id, | 33 bool include_path_id, |
| 35 bool include_diversification_nonce, | 34 bool include_diversification_nonce, |
| 36 QuicPacketNumberLength packet_number_length) { | 35 QuicPacketNumberLength packet_number_length) { |
| 37 return kPublicFlagsSize + connection_id_length + | 36 return kPublicFlagsSize + connection_id_length + |
| 38 (include_version ? kQuicVersionSize : 0) + | 37 (include_version ? kQuicVersionSize : 0) + |
| 39 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + | 38 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + |
| 40 (include_diversification_nonce ? kDiversificationNonceSize : 0) + | 39 (include_diversification_nonce ? kDiversificationNonceSize : 0); |
| 41 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 42 } | 40 } |
| 43 | 41 |
| 44 size_t GetStartOfEncryptedData(QuicVersion version, | 42 size_t GetStartOfEncryptedData(QuicVersion version, |
| 45 const QuicPacketHeader& header) { | 43 const QuicPacketHeader& header) { |
| 46 return GetPacketHeaderSize(version, header) - | 44 return GetPacketHeaderSize(version, header); |
| 47 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 48 } | 45 } |
| 49 | 46 |
| 50 size_t GetStartOfEncryptedData(QuicVersion version, | 47 size_t GetStartOfEncryptedData(QuicVersion version, |
| 51 QuicConnectionIdLength connection_id_length, | 48 QuicConnectionIdLength connection_id_length, |
| 52 bool include_version, | 49 bool include_version, |
| 53 bool include_path_id, | 50 bool include_path_id, |
| 54 bool include_diversification_nonce, | 51 bool include_diversification_nonce, |
| 55 QuicPacketNumberLength packet_number_length) { | 52 QuicPacketNumberLength packet_number_length) { |
| 56 // Encryption starts before private flags. | 53 // Encryption starts before private flags. |
| 57 return GetPacketHeaderSize(version, connection_id_length, include_version, | 54 return GetPacketHeaderSize(version, connection_id_length, include_version, |
| 58 include_path_id, include_diversification_nonce, | 55 include_path_id, include_diversification_nonce, |
| 59 packet_number_length) - | 56 packet_number_length); |
| 60 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 61 } | 57 } |
| 62 | 58 |
| 63 QuicPacketPublicHeader::QuicPacketPublicHeader() | 59 QuicPacketPublicHeader::QuicPacketPublicHeader() |
| 64 : connection_id(0), | 60 : connection_id(0), |
| 65 connection_id_length(PACKET_8BYTE_CONNECTION_ID), | 61 connection_id_length(PACKET_8BYTE_CONNECTION_ID), |
| 66 multipath_flag(false), | 62 multipath_flag(false), |
| 67 reset_flag(false), | 63 reset_flag(false), |
| 68 version_flag(false), | 64 version_flag(false), |
| 69 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), | 65 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), |
| 70 nonce(nullptr) {} | 66 nonce(nullptr) {} |
| 71 | 67 |
| 72 QuicPacketPublicHeader::QuicPacketPublicHeader( | 68 QuicPacketPublicHeader::QuicPacketPublicHeader( |
| 73 const QuicPacketPublicHeader& other) = default; | 69 const QuicPacketPublicHeader& other) = default; |
| 74 | 70 |
| 75 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | 71 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
| 76 | 72 |
| 77 QuicPacketHeader::QuicPacketHeader() | 73 QuicPacketHeader::QuicPacketHeader() |
| 78 : packet_number(0), | 74 : packet_number(0), path_id(kDefaultPathId) {} |
| 79 path_id(kDefaultPathId), | |
| 80 entropy_flag(false), | |
| 81 entropy_hash(0) {} | |
| 82 | 75 |
| 83 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | 76 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
| 84 : public_header(header), | 77 : public_header(header), packet_number(0), path_id(kDefaultPathId) {} |
| 85 packet_number(0), | |
| 86 path_id(kDefaultPathId), | |
| 87 entropy_flag(false), | |
| 88 entropy_hash(0) {} | |
| 89 | 78 |
| 90 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; | 79 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; |
| 91 | 80 |
| 92 QuicPublicResetPacket::QuicPublicResetPacket() | 81 QuicPublicResetPacket::QuicPublicResetPacket() |
| 93 : nonce_proof(0), rejected_packet_number(0) {} | 82 : nonce_proof(0), rejected_packet_number(0) {} |
| 94 | 83 |
| 95 QuicPublicResetPacket::QuicPublicResetPacket( | 84 QuicPublicResetPacket::QuicPublicResetPacket( |
| 96 const QuicPacketPublicHeader& header) | 85 const QuicPacketPublicHeader& header) |
| 97 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} | 86 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} |
| 98 | 87 |
| 99 QuicBufferAllocator::~QuicBufferAllocator() = default; | |
| 100 | |
| 101 void StreamBufferDeleter::operator()(char* buffer) const { | 88 void StreamBufferDeleter::operator()(char* buffer) const { |
| 102 if (allocator_ != nullptr && buffer != nullptr) { | 89 if (allocator_ != nullptr && buffer != nullptr) { |
| 103 allocator_->Delete(buffer); | 90 allocator_->Delete(buffer); |
| 104 } | 91 } |
| 105 } | 92 } |
| 106 | 93 |
| 107 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, | 94 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, |
| 108 size_t size) { | 95 size_t size) { |
| 109 return UniqueStreamBuffer(allocator->New(size), | 96 return UniqueStreamBuffer(allocator->New(size), |
| 110 StreamBufferDeleter(allocator)); | 97 StreamBufferDeleter(allocator)); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 offset(offset), | 139 offset(offset), |
| 153 buffer(std::move(buffer)) { | 140 buffer(std::move(buffer)) { |
| 154 if (this->buffer != nullptr) { | 141 if (this->buffer != nullptr) { |
| 155 DCHECK(data_buffer == nullptr); | 142 DCHECK(data_buffer == nullptr); |
| 156 this->data_buffer = this->buffer.get(); | 143 this->data_buffer = this->buffer.get(); |
| 157 } | 144 } |
| 158 } | 145 } |
| 159 | 146 |
| 160 QuicStreamFrame::~QuicStreamFrame() {} | 147 QuicStreamFrame::~QuicStreamFrame() {} |
| 161 | 148 |
| 162 uint32_t MakeQuicTag(char a, char b, char c, char d) { | |
| 163 return static_cast<uint32_t>(a) | static_cast<uint32_t>(b) << 8 | | |
| 164 static_cast<uint32_t>(c) << 16 | static_cast<uint32_t>(d) << 24; | |
| 165 } | |
| 166 | |
| 167 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) { | |
| 168 return std::find(tag_vector.begin(), tag_vector.end(), tag) != | |
| 169 tag_vector.end(); | |
| 170 } | |
| 171 | |
| 172 QuicVersionVector AllSupportedVersions() { | |
| 173 QuicVersionVector supported_versions; | |
| 174 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
| 175 supported_versions.push_back(kSupportedQuicVersions[i]); | |
| 176 } | |
| 177 return supported_versions; | |
| 178 } | |
| 179 | |
| 180 QuicVersionVector CurrentSupportedVersions() { | |
| 181 return FilterSupportedVersions(AllSupportedVersions()); | |
| 182 } | |
| 183 | |
| 184 QuicVersionVector FilterSupportedVersions(QuicVersionVector versions) { | |
| 185 QuicVersionVector filtered_versions(versions.size()); | |
| 186 filtered_versions.clear(); // Guaranteed by spec not to change capacity. | |
| 187 for (QuicVersion version : versions) { | |
| 188 if (version < QUIC_VERSION_34) { | |
| 189 if (!FLAGS_quic_disable_pre_34) { | |
| 190 filtered_versions.push_back(version); | |
| 191 } | |
| 192 } else if (version == QUIC_VERSION_35) { | |
| 193 if (FLAGS_quic_enable_version_35) { | |
| 194 filtered_versions.push_back(version); | |
| 195 } | |
| 196 } else if (version == QUIC_VERSION_36) { | |
| 197 if (FLAGS_quic_enable_version_35 && FLAGS_quic_enable_version_36_v2) { | |
| 198 filtered_versions.push_back(version); | |
| 199 } | |
| 200 } else { | |
| 201 filtered_versions.push_back(version); | |
| 202 } | |
| 203 } | |
| 204 return filtered_versions; | |
| 205 } | |
| 206 | |
| 207 QuicVersionVector VersionOfIndex(const QuicVersionVector& versions, int index) { | |
| 208 QuicVersionVector version; | |
| 209 int version_count = versions.size(); | |
| 210 if (index >= 0 && index < version_count) { | |
| 211 version.push_back(versions[index]); | |
| 212 } else { | |
| 213 version.push_back(QUIC_VERSION_UNSUPPORTED); | |
| 214 } | |
| 215 return version; | |
| 216 } | |
| 217 | |
| 218 QuicTag QuicVersionToQuicTag(const QuicVersion version) { | |
| 219 switch (version) { | |
| 220 case QUIC_VERSION_32: | |
| 221 return MakeQuicTag('Q', '0', '3', '2'); | |
| 222 case QUIC_VERSION_33: | |
| 223 return MakeQuicTag('Q', '0', '3', '3'); | |
| 224 case QUIC_VERSION_34: | |
| 225 return MakeQuicTag('Q', '0', '3', '4'); | |
| 226 case QUIC_VERSION_35: | |
| 227 return MakeQuicTag('Q', '0', '3', '5'); | |
| 228 case QUIC_VERSION_36: | |
| 229 return MakeQuicTag('Q', '0', '3', '6'); | |
| 230 default: | |
| 231 // This shold be an ERROR because we should never attempt to convert an | |
| 232 // invalid QuicVersion to be written to the wire. | |
| 233 LOG(ERROR) << "Unsupported QuicVersion: " << version; | |
| 234 return 0; | |
| 235 } | |
| 236 } | |
| 237 | |
| 238 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { | |
| 239 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
| 240 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { | |
| 241 return kSupportedQuicVersions[i]; | |
| 242 } | |
| 243 } | |
| 244 // Reading from the client so this should not be considered an ERROR. | |
| 245 DVLOG(1) << "Unsupported QuicTag version: " | |
| 246 << QuicUtils::TagToString(version_tag); | |
| 247 return QUIC_VERSION_UNSUPPORTED; | |
| 248 } | |
| 249 | |
| 250 #define RETURN_STRING_LITERAL(x) \ | |
| 251 case x: \ | |
| 252 return #x | |
| 253 | |
| 254 string QuicVersionToString(const QuicVersion version) { | |
| 255 switch (version) { | |
| 256 RETURN_STRING_LITERAL(QUIC_VERSION_32); | |
| 257 RETURN_STRING_LITERAL(QUIC_VERSION_33); | |
| 258 RETURN_STRING_LITERAL(QUIC_VERSION_34); | |
| 259 RETURN_STRING_LITERAL(QUIC_VERSION_35); | |
| 260 RETURN_STRING_LITERAL(QUIC_VERSION_36); | |
| 261 default: | |
| 262 return "QUIC_VERSION_UNSUPPORTED"; | |
| 263 } | |
| 264 } | |
| 265 | |
| 266 string QuicVersionVectorToString(const QuicVersionVector& versions) { | |
| 267 string result = ""; | |
| 268 for (size_t i = 0; i < versions.size(); ++i) { | |
| 269 if (i != 0) { | |
| 270 result.append(","); | |
| 271 } | |
| 272 result.append(QuicVersionToString(versions[i])); | |
| 273 } | |
| 274 return result; | |
| 275 } | |
| 276 | |
| 277 ostream& operator<<(ostream& os, const Perspective& s) { | |
| 278 if (s == Perspective::IS_SERVER) { | |
| 279 os << "IS_SERVER"; | |
| 280 } else { | |
| 281 os << "IS_CLIENT"; | |
| 282 } | |
| 283 return os; | |
| 284 } | |
| 285 | |
| 286 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { | 149 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { |
| 287 os << "{ connection_id: " << header.public_header.connection_id | 150 os << "{ connection_id: " << header.public_header.connection_id |
| 288 << ", connection_id_length: " << header.public_header.connection_id_length | 151 << ", connection_id_length: " << header.public_header.connection_id_length |
| 289 << ", packet_number_length: " << header.public_header.packet_number_length | 152 << ", packet_number_length: " << header.public_header.packet_number_length |
| 290 << ", multipath_flag: " << header.public_header.multipath_flag | 153 << ", multipath_flag: " << header.public_header.multipath_flag |
| 291 << ", reset_flag: " << header.public_header.reset_flag | 154 << ", reset_flag: " << header.public_header.reset_flag |
| 292 << ", version_flag: " << header.public_header.version_flag; | 155 << ", version_flag: " << header.public_header.version_flag; |
| 293 if (header.public_header.version_flag) { | 156 if (header.public_header.version_flag) { |
| 294 os << ", version:"; | 157 os << ", version:"; |
| 295 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | 158 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
| 296 os << " "; | 159 os << " "; |
| 297 os << QuicVersionToString(header.public_header.versions[i]); | 160 os << QuicVersionToString(header.public_header.versions[i]); |
| 298 } | 161 } |
| 299 } | 162 } |
| 300 if (header.public_header.nonce != nullptr) { | 163 if (header.public_header.nonce != nullptr) { |
| 301 os << ", diversification_nonce: " | 164 os << ", diversification_nonce: " |
| 302 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(), | 165 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(), |
| 303 header.public_header.nonce->size())); | 166 header.public_header.nonce->size())); |
| 304 } | 167 } |
| 305 os << ", entropy_flag: " << header.entropy_flag | 168 os << ", path_id: " << static_cast<int>(header.path_id) |
| 306 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | |
| 307 << ", path_id: " << static_cast<int>(header.path_id) | |
| 308 << ", packet_number: " << header.packet_number << " }\n"; | 169 << ", packet_number: " << header.packet_number << " }\n"; |
| 309 return os; | 170 return os; |
| 310 } | 171 } |
| 311 | 172 |
| 312 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, | 173 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
| 313 QuicPacketNumber packet_number, | 174 QuicPacketNumber packet_number, |
| 314 QuicPacketNumber peer_least_packet_awaiting_ack) { | 175 QuicPacketNumber peer_least_packet_awaiting_ack) { |
| 315 if (ack_frame.missing) { | |
| 316 return packet_number > ack_frame.largest_observed || | |
| 317 ack_frame.packets.Contains(packet_number); | |
| 318 } | |
| 319 return packet_number >= peer_least_packet_awaiting_ack && | 176 return packet_number >= peer_least_packet_awaiting_ack && |
| 320 !ack_frame.packets.Contains(packet_number); | 177 !ack_frame.packets.Contains(packet_number); |
| 321 } | 178 } |
| 322 | 179 |
| 323 QuicStopWaitingFrame::QuicStopWaitingFrame() | 180 QuicStopWaitingFrame::QuicStopWaitingFrame() |
| 324 : path_id(kDefaultPathId), entropy_hash(0), least_unacked(0) {} | 181 : path_id(kDefaultPathId), least_unacked(0) {} |
| 325 | 182 |
| 326 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | 183 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} |
| 327 | 184 |
| 328 QuicAckFrame::QuicAckFrame() | 185 QuicAckFrame::QuicAckFrame() |
| 329 : largest_observed(0), | 186 : largest_observed(0), |
| 330 ack_delay_time(QuicTime::Delta::Infinite()), | 187 ack_delay_time(QuicTime::Delta::Infinite()), |
| 331 path_id(kDefaultPathId), | 188 path_id(kDefaultPathId) {} |
| 332 entropy_hash(0), | |
| 333 is_truncated(false), | |
| 334 missing(true) {} | |
| 335 | 189 |
| 336 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; | 190 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; |
| 337 | 191 |
| 338 QuicAckFrame::~QuicAckFrame() {} | 192 QuicAckFrame::~QuicAckFrame() {} |
| 339 | 193 |
| 340 QuicRstStreamFrame::QuicRstStreamFrame() | 194 QuicRstStreamFrame::QuicRstStreamFrame() |
| 341 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} | 195 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} |
| 342 | 196 |
| 343 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | 197 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, |
| 344 QuicRstStreamErrorCode error_code, | 198 QuicRstStreamErrorCode error_code, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | 235 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) |
| 382 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} | 236 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} |
| 383 | 237 |
| 384 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | 238 QuicFrame::QuicFrame(QuicBlockedFrame* frame) |
| 385 : type(BLOCKED_FRAME), blocked_frame(frame) {} | 239 : type(BLOCKED_FRAME), blocked_frame(frame) {} |
| 386 | 240 |
| 387 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) | 241 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) |
| 388 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} | 242 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} |
| 389 | 243 |
| 390 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | 244 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { |
| 391 os << "{ entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | 245 os << "{ least_unacked: " << sent_info.least_unacked << " }\n"; |
| 392 << ", least_unacked: " << sent_info.least_unacked << " }\n"; | |
| 393 return os; | 246 return os; |
| 394 } | 247 } |
| 395 | 248 |
| 396 PacketNumberQueue::PacketNumberQueue() = default; | 249 PacketNumberQueue::PacketNumberQueue() = default; |
| 397 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; | 250 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; |
| 398 // TODO(rtenneti): on windows RValue reference gives errors. | 251 // TODO(rtenneti): on windows RValue reference gives errors. |
| 399 // PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; | 252 // PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; |
| 400 PacketNumberQueue::~PacketNumberQueue() {} | 253 PacketNumberQueue::~PacketNumberQueue() {} |
| 401 | 254 |
| 402 PacketNumberQueue& PacketNumberQueue::operator=( | 255 PacketNumberQueue& PacketNumberQueue::operator=( |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 for (const Interval<QuicPacketNumber>& interval : q) { | 363 for (const Interval<QuicPacketNumber>& interval : q) { |
| 511 for (QuicPacketNumber packet_number = interval.min(); | 364 for (QuicPacketNumber packet_number = interval.min(); |
| 512 packet_number < interval.max(); ++packet_number) { | 365 packet_number < interval.max(); ++packet_number) { |
| 513 os << packet_number << " "; | 366 os << packet_number << " "; |
| 514 } | 367 } |
| 515 } | 368 } |
| 516 return os; | 369 return os; |
| 517 } | 370 } |
| 518 | 371 |
| 519 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | 372 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { |
| 520 os << "{ entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) | 373 os << "{ largest_observed: " << ack_frame.largest_observed |
| 521 << ", largest_observed: " << ack_frame.largest_observed | |
| 522 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() | 374 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() |
| 523 << ", packets: [ " << ack_frame.packets << " ]" | 375 << ", packets: [ " << ack_frame.packets << " ]" |
| 524 << ", is_truncated: " << ack_frame.is_truncated | |
| 525 << ", received_packets: [ "; | 376 << ", received_packets: [ "; |
| 526 for (const std::pair<QuicPacketNumber, QuicTime>& p : | 377 for (const std::pair<QuicPacketNumber, QuicTime>& p : |
| 527 ack_frame.received_packet_times) { | 378 ack_frame.received_packet_times) { |
| 528 os << p.first << " at " << p.second.ToDebuggingValue() << " "; | 379 os << p.first << " at " << p.second.ToDebuggingValue() << " "; |
| 529 } | 380 } |
| 530 os << " ] }\n"; | 381 os << " ] }\n"; |
| 531 return os; | 382 return os; |
| 532 } | 383 } |
| 533 | 384 |
| 534 ostream& operator<<(ostream& os, const QuicFrame& frame) { | 385 ostream& operator<<(ostream& os, const QuicFrame& frame) { |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 | 603 |
| 753 StringPiece QuicPacket::Plaintext(QuicVersion version) const { | 604 StringPiece QuicPacket::Plaintext(QuicVersion version) const { |
| 754 const size_t start_of_encrypted_data = GetStartOfEncryptedData( | 605 const size_t start_of_encrypted_data = GetStartOfEncryptedData( |
| 755 version, connection_id_length_, includes_version_, includes_path_id_, | 606 version, connection_id_length_, includes_version_, includes_path_id_, |
| 756 includes_diversification_nonce_, packet_number_length_); | 607 includes_diversification_nonce_, packet_number_length_); |
| 757 return StringPiece(data() + start_of_encrypted_data, | 608 return StringPiece(data() + start_of_encrypted_data, |
| 758 length() - start_of_encrypted_data); | 609 length() - start_of_encrypted_data); |
| 759 } | 610 } |
| 760 | 611 |
| 761 QuicVersionManager::QuicVersionManager(QuicVersionVector supported_versions) | 612 QuicVersionManager::QuicVersionManager(QuicVersionVector supported_versions) |
| 762 : disable_pre_34_(FLAGS_quic_disable_pre_34), | 613 : enable_version_36_(FLAGS_quic_enable_version_36_v3), |
| 763 enable_version_35_(FLAGS_quic_enable_version_35), | |
| 764 enable_version_36_(FLAGS_quic_enable_version_36_v2), | |
| 765 allowed_supported_versions_(supported_versions), | 614 allowed_supported_versions_(supported_versions), |
| 766 filtered_supported_versions_( | 615 filtered_supported_versions_( |
| 767 FilterSupportedVersions(supported_versions)) {} | 616 FilterSupportedVersions(supported_versions)) {} |
| 768 | 617 |
| 769 QuicVersionManager::~QuicVersionManager() {} | 618 QuicVersionManager::~QuicVersionManager() {} |
| 770 | 619 |
| 771 const QuicVersionVector& QuicVersionManager::GetSupportedVersions() { | 620 const QuicVersionVector& QuicVersionManager::GetSupportedVersions() { |
| 772 if (disable_pre_34_ != FLAGS_quic_disable_pre_34 || | 621 MaybeRefilterSupportedVersions(); |
| 773 enable_version_35_ != FLAGS_quic_enable_version_35 || | 622 return filtered_supported_versions_; |
| 774 enable_version_36_ != FLAGS_quic_enable_version_36_v2) { | 623 } |
| 775 disable_pre_34_ = FLAGS_quic_disable_pre_34; | 624 |
| 776 enable_version_35_ = FLAGS_quic_enable_version_35; | 625 void QuicVersionManager::MaybeRefilterSupportedVersions() { |
| 777 enable_version_36_ = FLAGS_quic_enable_version_36_v2; | 626 if (enable_version_36_ != FLAGS_quic_enable_version_36_v3) { |
| 778 filtered_supported_versions_ = | 627 enable_version_36_ = FLAGS_quic_enable_version_36_v3; |
| 779 FilterSupportedVersions(allowed_supported_versions_); | 628 RefilterSupportedVersions(); |
| 780 } | 629 } |
| 781 return filtered_supported_versions_; | 630 } |
| 631 |
| 632 void QuicVersionManager::RefilterSupportedVersions() { |
| 633 filtered_supported_versions_ = |
| 634 FilterSupportedVersions(allowed_supported_versions_); |
| 782 } | 635 } |
| 783 | 636 |
| 784 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, | 637 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, |
| 785 QuicPacketLength data_length) | 638 QuicPacketLength data_length) |
| 786 : ack_listener(listener), length(data_length) { | 639 : ack_listener(listener), length(data_length) { |
| 787 DCHECK(listener != nullptr); | 640 DCHECK(listener != nullptr); |
| 788 } | 641 } |
| 789 | 642 |
| 790 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = | 643 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = |
| 791 default; | 644 default; |
| 792 | 645 |
| 793 AckListenerWrapper::~AckListenerWrapper() {} | 646 AckListenerWrapper::~AckListenerWrapper() {} |
| 794 | 647 |
| 795 SerializedPacket::SerializedPacket(QuicPathId path_id, | 648 SerializedPacket::SerializedPacket(QuicPathId path_id, |
| 796 QuicPacketNumber packet_number, | 649 QuicPacketNumber packet_number, |
| 797 QuicPacketNumberLength packet_number_length, | 650 QuicPacketNumberLength packet_number_length, |
| 798 const char* encrypted_buffer, | 651 const char* encrypted_buffer, |
| 799 QuicPacketLength encrypted_length, | 652 QuicPacketLength encrypted_length, |
| 800 QuicPacketEntropyHash entropy_hash, | |
| 801 bool has_ack, | 653 bool has_ack, |
| 802 bool has_stop_waiting) | 654 bool has_stop_waiting) |
| 803 : encrypted_buffer(encrypted_buffer), | 655 : encrypted_buffer(encrypted_buffer), |
| 804 encrypted_length(encrypted_length), | 656 encrypted_length(encrypted_length), |
| 805 has_crypto_handshake(NOT_HANDSHAKE), | 657 has_crypto_handshake(NOT_HANDSHAKE), |
| 806 num_padding_bytes(0), | 658 num_padding_bytes(0), |
| 807 path_id(path_id), | 659 path_id(path_id), |
| 808 packet_number(packet_number), | 660 packet_number(packet_number), |
| 809 packet_number_length(packet_number_length), | 661 packet_number_length(packet_number_length), |
| 810 encryption_level(ENCRYPTION_NONE), | 662 encryption_level(ENCRYPTION_NONE), |
| 811 entropy_hash(entropy_hash), | |
| 812 has_ack(has_ack), | 663 has_ack(has_ack), |
| 813 has_stop_waiting(has_stop_waiting), | 664 has_stop_waiting(has_stop_waiting), |
| 814 transmission_type(NOT_RETRANSMISSION), | 665 transmission_type(NOT_RETRANSMISSION), |
| 815 original_path_id(kInvalidPathId), | 666 original_path_id(kInvalidPathId), |
| 816 original_packet_number(0) {} | 667 original_packet_number(0) {} |
| 817 | 668 |
| 818 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; | 669 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; |
| 819 | 670 |
| 820 SerializedPacket::~SerializedPacket() {} | 671 SerializedPacket::~SerializedPacket() {} |
| 821 | 672 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 847 is_unackable(false), | 698 is_unackable(false), |
| 848 has_crypto_handshake(has_crypto_handshake), | 699 has_crypto_handshake(has_crypto_handshake), |
| 849 num_padding_bytes(num_padding_bytes), | 700 num_padding_bytes(num_padding_bytes), |
| 850 retransmission(0) {} | 701 retransmission(0) {} |
| 851 | 702 |
| 852 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; | 703 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; |
| 853 | 704 |
| 854 TransmissionInfo::~TransmissionInfo() {} | 705 TransmissionInfo::~TransmissionInfo() {} |
| 855 | 706 |
| 856 } // namespace net | 707 } // namespace net |
| OLD | NEW |