| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/quic/quic_protocol.h" | |
| 6 | |
| 7 #include "base/stl_util.h" | |
| 8 #include "base/strings/string_number_conversions.h" | |
| 9 #include "net/quic/quic_flags.h" | |
| 10 #include "net/quic/quic_utils.h" | |
| 11 | |
| 12 using base::StringPiece; | |
| 13 using std::map; | |
| 14 using std::numeric_limits; | |
| 15 using std::ostream; | |
| 16 using std::string; | |
| 17 | |
| 18 namespace net { | |
| 19 | |
| 20 const char* const kFinalOffsetHeaderKey = ":final-offset"; | |
| 21 | |
| 22 size_t GetPacketHeaderSize(QuicVersion version, | |
| 23 const QuicPacketHeader& header) { | |
| 24 return GetPacketHeaderSize(version, header.public_header.connection_id_length, | |
| 25 header.public_header.version_flag, | |
| 26 header.public_header.multipath_flag, | |
| 27 header.public_header.nonce != nullptr, | |
| 28 header.public_header.packet_number_length); | |
| 29 } | |
| 30 | |
| 31 size_t GetPacketHeaderSize(QuicVersion version, | |
| 32 QuicConnectionIdLength connection_id_length, | |
| 33 bool include_version, | |
| 34 bool include_path_id, | |
| 35 bool include_diversification_nonce, | |
| 36 QuicPacketNumberLength packet_number_length) { | |
| 37 return kPublicFlagsSize + connection_id_length + | |
| 38 (include_version ? kQuicVersionSize : 0) + | |
| 39 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length + | |
| 40 (include_diversification_nonce ? kDiversificationNonceSize : 0) + | |
| 41 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 42 } | |
| 43 | |
| 44 size_t GetStartOfEncryptedData(QuicVersion version, | |
| 45 const QuicPacketHeader& header) { | |
| 46 return GetPacketHeaderSize(version, header) - | |
| 47 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 48 } | |
| 49 | |
| 50 size_t GetStartOfEncryptedData(QuicVersion version, | |
| 51 QuicConnectionIdLength connection_id_length, | |
| 52 bool include_version, | |
| 53 bool include_path_id, | |
| 54 bool include_diversification_nonce, | |
| 55 QuicPacketNumberLength packet_number_length) { | |
| 56 // Encryption starts before private flags. | |
| 57 return GetPacketHeaderSize(version, connection_id_length, include_version, | |
| 58 include_path_id, include_diversification_nonce, | |
| 59 packet_number_length) - | |
| 60 (version <= QUIC_VERSION_33 ? kPrivateFlagsSize : 0); | |
| 61 } | |
| 62 | |
| 63 QuicPacketPublicHeader::QuicPacketPublicHeader() | |
| 64 : connection_id(0), | |
| 65 connection_id_length(PACKET_8BYTE_CONNECTION_ID), | |
| 66 multipath_flag(false), | |
| 67 reset_flag(false), | |
| 68 version_flag(false), | |
| 69 packet_number_length(PACKET_6BYTE_PACKET_NUMBER), | |
| 70 nonce(nullptr) {} | |
| 71 | |
| 72 QuicPacketPublicHeader::QuicPacketPublicHeader( | |
| 73 const QuicPacketPublicHeader& other) = default; | |
| 74 | |
| 75 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | |
| 76 | |
| 77 QuicPacketHeader::QuicPacketHeader() | |
| 78 : packet_number(0), | |
| 79 path_id(kDefaultPathId), | |
| 80 entropy_flag(false), | |
| 81 entropy_hash(0), | |
| 82 fec_flag(false) {} | |
| 83 | |
| 84 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | |
| 85 : public_header(header), | |
| 86 packet_number(0), | |
| 87 path_id(kDefaultPathId), | |
| 88 entropy_flag(false), | |
| 89 entropy_hash(0), | |
| 90 fec_flag(false) {} | |
| 91 | |
| 92 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default; | |
| 93 | |
| 94 QuicPublicResetPacket::QuicPublicResetPacket() | |
| 95 : nonce_proof(0), rejected_packet_number(0) {} | |
| 96 | |
| 97 QuicPublicResetPacket::QuicPublicResetPacket( | |
| 98 const QuicPacketPublicHeader& header) | |
| 99 : public_header(header), nonce_proof(0), rejected_packet_number(0) {} | |
| 100 | |
| 101 QuicBufferAllocator::~QuicBufferAllocator() = default; | |
| 102 | |
| 103 void StreamBufferDeleter::operator()(char* buffer) const { | |
| 104 if (allocator_ != nullptr && buffer != nullptr) { | |
| 105 allocator_->Delete(buffer); | |
| 106 } | |
| 107 } | |
| 108 | |
| 109 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator, | |
| 110 size_t size) { | |
| 111 return UniqueStreamBuffer(allocator->New(size), | |
| 112 StreamBufferDeleter(allocator)); | |
| 113 } | |
| 114 | |
| 115 QuicStreamFrame::QuicStreamFrame() | |
| 116 : QuicStreamFrame(0, false, 0, nullptr, 0, nullptr) {} | |
| 117 | |
| 118 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 119 bool fin, | |
| 120 QuicStreamOffset offset, | |
| 121 StringPiece data) | |
| 122 : QuicStreamFrame(stream_id, | |
| 123 fin, | |
| 124 offset, | |
| 125 data.data(), | |
| 126 data.length(), | |
| 127 nullptr) {} | |
| 128 | |
| 129 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 130 bool fin, | |
| 131 QuicStreamOffset offset, | |
| 132 QuicPacketLength data_length, | |
| 133 UniqueStreamBuffer buffer) | |
| 134 : QuicStreamFrame(stream_id, | |
| 135 fin, | |
| 136 offset, | |
| 137 nullptr, | |
| 138 data_length, | |
| 139 std::move(buffer)) { | |
| 140 DCHECK(this->buffer != nullptr); | |
| 141 DCHECK_EQ(data_buffer, this->buffer.get()); | |
| 142 } | |
| 143 | |
| 144 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
| 145 bool fin, | |
| 146 QuicStreamOffset offset, | |
| 147 const char* data_buffer, | |
| 148 QuicPacketLength data_length, | |
| 149 UniqueStreamBuffer buffer) | |
| 150 : stream_id(stream_id), | |
| 151 fin(fin), | |
| 152 data_length(data_length), | |
| 153 data_buffer(data_buffer), | |
| 154 offset(offset), | |
| 155 buffer(std::move(buffer)) { | |
| 156 if (this->buffer != nullptr) { | |
| 157 DCHECK(data_buffer == nullptr); | |
| 158 this->data_buffer = this->buffer.get(); | |
| 159 } | |
| 160 } | |
| 161 | |
| 162 QuicStreamFrame::~QuicStreamFrame() {} | |
| 163 | |
| 164 uint32_t MakeQuicTag(char a, char b, char c, char d) { | |
| 165 return static_cast<uint32_t>(a) | static_cast<uint32_t>(b) << 8 | | |
| 166 static_cast<uint32_t>(c) << 16 | static_cast<uint32_t>(d) << 24; | |
| 167 } | |
| 168 | |
| 169 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) { | |
| 170 return std::find(tag_vector.begin(), tag_vector.end(), tag) != | |
| 171 tag_vector.end(); | |
| 172 } | |
| 173 | |
| 174 QuicVersionVector QuicSupportedVersions() { | |
| 175 QuicVersionVector supported_versions; | |
| 176 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
| 177 supported_versions.push_back(kSupportedQuicVersions[i]); | |
| 178 } | |
| 179 return supported_versions; | |
| 180 } | |
| 181 | |
| 182 QuicVersionVector FilterSupportedVersions(QuicVersionVector versions) { | |
| 183 QuicVersionVector filtered_versions(versions.size()); | |
| 184 filtered_versions.clear(); // Guaranteed by spec not to change capacity. | |
| 185 for (QuicVersion version : versions) { | |
| 186 if (version == QUIC_VERSION_35) { | |
| 187 if (FLAGS_quic_enable_version_35) { | |
| 188 filtered_versions.push_back(version); | |
| 189 } | |
| 190 } else if (version == QUIC_VERSION_36) { | |
| 191 if (FLAGS_quic_enable_version_35 && FLAGS_quic_enable_version_36) { | |
| 192 filtered_versions.push_back(version); | |
| 193 } | |
| 194 } else { | |
| 195 filtered_versions.push_back(version); | |
| 196 } | |
| 197 } | |
| 198 return filtered_versions; | |
| 199 } | |
| 200 | |
| 201 QuicTag QuicVersionToQuicTag(const QuicVersion version) { | |
| 202 switch (version) { | |
| 203 case QUIC_VERSION_30: | |
| 204 return MakeQuicTag('Q', '0', '3', '0'); | |
| 205 case QUIC_VERSION_31: | |
| 206 return MakeQuicTag('Q', '0', '3', '1'); | |
| 207 case QUIC_VERSION_32: | |
| 208 return MakeQuicTag('Q', '0', '3', '2'); | |
| 209 case QUIC_VERSION_33: | |
| 210 return MakeQuicTag('Q', '0', '3', '3'); | |
| 211 case QUIC_VERSION_34: | |
| 212 return MakeQuicTag('Q', '0', '3', '4'); | |
| 213 case QUIC_VERSION_35: | |
| 214 return MakeQuicTag('Q', '0', '3', '5'); | |
| 215 case QUIC_VERSION_36: | |
| 216 return MakeQuicTag('Q', '0', '3', '6'); | |
| 217 default: | |
| 218 // This shold be an ERROR because we should never attempt to convert an | |
| 219 // invalid QuicVersion to be written to the wire. | |
| 220 LOG(ERROR) << "Unsupported QuicVersion: " << version; | |
| 221 return 0; | |
| 222 } | |
| 223 } | |
| 224 | |
| 225 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { | |
| 226 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
| 227 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { | |
| 228 return kSupportedQuicVersions[i]; | |
| 229 } | |
| 230 } | |
| 231 // Reading from the client so this should not be considered an ERROR. | |
| 232 DVLOG(1) << "Unsupported QuicTag version: " | |
| 233 << QuicUtils::TagToString(version_tag); | |
| 234 return QUIC_VERSION_UNSUPPORTED; | |
| 235 } | |
| 236 | |
| 237 #define RETURN_STRING_LITERAL(x) \ | |
| 238 case x: \ | |
| 239 return #x | |
| 240 | |
| 241 string QuicVersionToString(const QuicVersion version) { | |
| 242 switch (version) { | |
| 243 RETURN_STRING_LITERAL(QUIC_VERSION_30); | |
| 244 RETURN_STRING_LITERAL(QUIC_VERSION_31); | |
| 245 RETURN_STRING_LITERAL(QUIC_VERSION_32); | |
| 246 RETURN_STRING_LITERAL(QUIC_VERSION_33); | |
| 247 RETURN_STRING_LITERAL(QUIC_VERSION_34); | |
| 248 RETURN_STRING_LITERAL(QUIC_VERSION_35); | |
| 249 RETURN_STRING_LITERAL(QUIC_VERSION_36); | |
| 250 default: | |
| 251 return "QUIC_VERSION_UNSUPPORTED"; | |
| 252 } | |
| 253 } | |
| 254 | |
| 255 string QuicVersionVectorToString(const QuicVersionVector& versions) { | |
| 256 string result = ""; | |
| 257 for (size_t i = 0; i < versions.size(); ++i) { | |
| 258 if (i != 0) { | |
| 259 result.append(","); | |
| 260 } | |
| 261 result.append(QuicVersionToString(versions[i])); | |
| 262 } | |
| 263 return result; | |
| 264 } | |
| 265 | |
| 266 ostream& operator<<(ostream& os, const Perspective& s) { | |
| 267 if (s == Perspective::IS_SERVER) { | |
| 268 os << "IS_SERVER"; | |
| 269 } else { | |
| 270 os << "IS_CLIENT"; | |
| 271 } | |
| 272 return os; | |
| 273 } | |
| 274 | |
| 275 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { | |
| 276 os << "{ connection_id: " << header.public_header.connection_id | |
| 277 << ", connection_id_length: " << header.public_header.connection_id_length | |
| 278 << ", packet_number_length: " << header.public_header.packet_number_length | |
| 279 << ", multipath_flag: " << header.public_header.multipath_flag | |
| 280 << ", reset_flag: " << header.public_header.reset_flag | |
| 281 << ", version_flag: " << header.public_header.version_flag; | |
| 282 if (header.public_header.version_flag) { | |
| 283 os << ", version:"; | |
| 284 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | |
| 285 os << " "; | |
| 286 os << QuicVersionToString(header.public_header.versions[i]); | |
| 287 } | |
| 288 } | |
| 289 if (header.public_header.nonce != nullptr) { | |
| 290 os << ", diversification_nonce: " | |
| 291 << net::QuicUtils::HexDecode(*header.public_header.nonce); | |
| 292 } | |
| 293 os << ", fec_flag: " << header.fec_flag | |
| 294 << ", entropy_flag: " << header.entropy_flag | |
| 295 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | |
| 296 << ", path_id: " << static_cast<int>(header.path_id) | |
| 297 << ", packet_number: " << header.packet_number << " }\n"; | |
| 298 return os; | |
| 299 } | |
| 300 | |
| 301 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, | |
| 302 QuicPacketNumber packet_number, | |
| 303 QuicPacketNumber peer_least_packet_awaiting_ack) { | |
| 304 if (ack_frame.missing) { | |
| 305 return packet_number > ack_frame.largest_observed || | |
| 306 ack_frame.packets.Contains(packet_number); | |
| 307 } | |
| 308 return packet_number >= peer_least_packet_awaiting_ack && | |
| 309 !ack_frame.packets.Contains(packet_number); | |
| 310 } | |
| 311 | |
| 312 QuicStopWaitingFrame::QuicStopWaitingFrame() | |
| 313 : path_id(kDefaultPathId), entropy_hash(0), least_unacked(0) {} | |
| 314 | |
| 315 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | |
| 316 | |
| 317 QuicAckFrame::QuicAckFrame() | |
| 318 : largest_observed(0), | |
| 319 ack_delay_time(QuicTime::Delta::Infinite()), | |
| 320 path_id(kDefaultPathId), | |
| 321 entropy_hash(0), | |
| 322 is_truncated(false), | |
| 323 missing(true) {} | |
| 324 | |
| 325 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default; | |
| 326 | |
| 327 QuicAckFrame::~QuicAckFrame() {} | |
| 328 | |
| 329 QuicRstStreamErrorCode AdjustErrorForVersion(QuicRstStreamErrorCode error_code, | |
| 330 QuicVersion /*version*/) { | |
| 331 return error_code; | |
| 332 } | |
| 333 | |
| 334 QuicRstStreamFrame::QuicRstStreamFrame() | |
| 335 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {} | |
| 336 | |
| 337 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | |
| 338 QuicRstStreamErrorCode error_code, | |
| 339 QuicStreamOffset bytes_written) | |
| 340 : stream_id(stream_id), | |
| 341 error_code(error_code), | |
| 342 byte_offset(bytes_written) {} | |
| 343 | |
| 344 QuicConnectionCloseFrame::QuicConnectionCloseFrame() | |
| 345 : error_code(QUIC_NO_ERROR) {} | |
| 346 | |
| 347 QuicFrame::QuicFrame() {} | |
| 348 | |
| 349 QuicFrame::QuicFrame(QuicPaddingFrame padding_frame) | |
| 350 : type(PADDING_FRAME), padding_frame(padding_frame) {} | |
| 351 | |
| 352 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) | |
| 353 : type(STREAM_FRAME), stream_frame(stream_frame) {} | |
| 354 | |
| 355 QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) {} | |
| 356 | |
| 357 QuicFrame::QuicFrame(QuicMtuDiscoveryFrame frame) | |
| 358 : type(MTU_DISCOVERY_FRAME), mtu_discovery_frame(frame) {} | |
| 359 | |
| 360 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) | |
| 361 : type(STOP_WAITING_FRAME), stop_waiting_frame(frame) {} | |
| 362 | |
| 363 QuicFrame::QuicFrame(QuicPingFrame frame) | |
| 364 : type(PING_FRAME), ping_frame(frame) {} | |
| 365 | |
| 366 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) | |
| 367 : type(RST_STREAM_FRAME), rst_stream_frame(frame) {} | |
| 368 | |
| 369 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) | |
| 370 : type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) {} | |
| 371 | |
| 372 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) | |
| 373 : type(GOAWAY_FRAME), goaway_frame(frame) {} | |
| 374 | |
| 375 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | |
| 376 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {} | |
| 377 | |
| 378 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | |
| 379 : type(BLOCKED_FRAME), blocked_frame(frame) {} | |
| 380 | |
| 381 QuicFrame::QuicFrame(QuicPathCloseFrame* frame) | |
| 382 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {} | |
| 383 | |
| 384 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | |
| 385 os << "{ entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | |
| 386 << ", least_unacked: " << sent_info.least_unacked << " }\n"; | |
| 387 return os; | |
| 388 } | |
| 389 | |
| 390 PacketNumberQueue::const_iterator::const_iterator( | |
| 391 IntervalSet<QuicPacketNumber>::const_iterator interval_set_iter, | |
| 392 QuicPacketNumber first, | |
| 393 QuicPacketNumber last) | |
| 394 : interval_set_iter_(std::move(interval_set_iter)), | |
| 395 current_(first), | |
| 396 last_(last) {} | |
| 397 | |
| 398 PacketNumberQueue::const_iterator::const_iterator(const const_iterator& other) = | |
| 399 default; | |
| 400 // TODO(rtenneti): on windows RValue reference gives errors. | |
| 401 // PacketNumberQueue::const_iterator::const_iterator(const_iterator&& other) = | |
| 402 // default; | |
| 403 PacketNumberQueue::const_iterator::~const_iterator() {} | |
| 404 | |
| 405 PacketNumberQueue::const_iterator& PacketNumberQueue::const_iterator::operator=( | |
| 406 const const_iterator& other) = default; | |
| 407 // TODO(rtenneti): on windows RValue reference gives errors. | |
| 408 // PacketNumberQueue::const_iterator& | |
| 409 // PacketNumberQueue::const_iterator::operator=( | |
| 410 // const_iterator&& other) = default; | |
| 411 | |
| 412 bool PacketNumberQueue::const_iterator::operator!=( | |
| 413 const const_iterator& other) const { | |
| 414 return current_ != other.current_; | |
| 415 } | |
| 416 | |
| 417 bool PacketNumberQueue::const_iterator::operator==( | |
| 418 const const_iterator& other) const { | |
| 419 return current_ == other.current_; | |
| 420 } | |
| 421 | |
| 422 PacketNumberQueue::const_iterator::value_type | |
| 423 PacketNumberQueue::const_iterator::operator*() const { | |
| 424 return current_; | |
| 425 } | |
| 426 | |
| 427 PacketNumberQueue::const_iterator& PacketNumberQueue::const_iterator:: | |
| 428 operator++() { | |
| 429 ++current_; | |
| 430 if (current_ < last_) { | |
| 431 if (current_ >= interval_set_iter_->max()) { | |
| 432 ++interval_set_iter_; | |
| 433 current_ = interval_set_iter_->min(); | |
| 434 } | |
| 435 } else { | |
| 436 current_ = last_; | |
| 437 } | |
| 438 return *this; | |
| 439 } | |
| 440 | |
| 441 PacketNumberQueue::const_iterator PacketNumberQueue::const_iterator::operator++( | |
| 442 int /* postincrement */) { | |
| 443 PacketNumberQueue::const_iterator preincrement(*this); | |
| 444 operator++(); | |
| 445 return preincrement; | |
| 446 } | |
| 447 | |
| 448 PacketNumberQueue::PacketNumberQueue() = default; | |
| 449 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default; | |
| 450 // TODO(rtenneti): on windows RValue reference gives errors. | |
| 451 // PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default; | |
| 452 PacketNumberQueue::~PacketNumberQueue() {} | |
| 453 | |
| 454 PacketNumberQueue& PacketNumberQueue::operator=( | |
| 455 const PacketNumberQueue& other) = default; | |
| 456 // TODO(rtenneti): on windows RValue reference gives errors. | |
| 457 // PacketNumberQueue& PacketNumberQueue::operator=(PacketNumberQueue&& other) = | |
| 458 // default; | |
| 459 | |
| 460 void PacketNumberQueue::Add(QuicPacketNumber packet_number) { | |
| 461 packet_number_intervals_.Add(packet_number, packet_number + 1); | |
| 462 } | |
| 463 | |
| 464 void PacketNumberQueue::Add(QuicPacketNumber lower, QuicPacketNumber higher) { | |
| 465 packet_number_intervals_.Add(lower, higher); | |
| 466 } | |
| 467 | |
| 468 void PacketNumberQueue::Remove(QuicPacketNumber packet_number) { | |
| 469 packet_number_intervals_.Difference(packet_number, packet_number + 1); | |
| 470 } | |
| 471 | |
| 472 void PacketNumberQueue::Remove(QuicPacketNumber lower, | |
| 473 QuicPacketNumber higher) { | |
| 474 packet_number_intervals_.Difference(lower, higher); | |
| 475 } | |
| 476 | |
| 477 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) { | |
| 478 if (Empty()) { | |
| 479 return false; | |
| 480 } | |
| 481 const QuicPacketNumber old_min = Min(); | |
| 482 packet_number_intervals_.Difference(0, higher); | |
| 483 return Empty() || old_min != Min(); | |
| 484 } | |
| 485 | |
| 486 void PacketNumberQueue::Complement() { | |
| 487 if (Empty()) { | |
| 488 return; | |
| 489 } | |
| 490 packet_number_intervals_.Complement(Min(), Max() + 1); | |
| 491 } | |
| 492 | |
| 493 bool PacketNumberQueue::Contains(QuicPacketNumber packet_number) const { | |
| 494 return packet_number_intervals_.Contains(packet_number); | |
| 495 } | |
| 496 | |
| 497 bool PacketNumberQueue::Empty() const { | |
| 498 return packet_number_intervals_.Empty(); | |
| 499 } | |
| 500 | |
| 501 QuicPacketNumber PacketNumberQueue::Min() const { | |
| 502 DCHECK(!Empty()); | |
| 503 return packet_number_intervals_.begin()->min(); | |
| 504 } | |
| 505 | |
| 506 QuicPacketNumber PacketNumberQueue::Max() const { | |
| 507 DCHECK(!Empty()); | |
| 508 return packet_number_intervals_.rbegin()->max() - 1; | |
| 509 } | |
| 510 | |
| 511 size_t PacketNumberQueue::NumPacketsSlow() const { | |
| 512 size_t num_packets = 0; | |
| 513 for (const auto& interval : packet_number_intervals_) { | |
| 514 num_packets += interval.Length(); | |
| 515 } | |
| 516 return num_packets; | |
| 517 } | |
| 518 | |
| 519 size_t PacketNumberQueue::NumIntervals() const { | |
| 520 return packet_number_intervals_.Size(); | |
| 521 } | |
| 522 | |
| 523 QuicPacketNumber PacketNumberQueue::LastIntervalLength() const { | |
| 524 DCHECK(!Empty()); | |
| 525 return packet_number_intervals_.rbegin()->Length(); | |
| 526 } | |
| 527 | |
| 528 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const { | |
| 529 QuicPacketNumber first; | |
| 530 QuicPacketNumber last; | |
| 531 if (packet_number_intervals_.Empty()) { | |
| 532 first = 0; | |
| 533 last = 0; | |
| 534 } else { | |
| 535 first = packet_number_intervals_.begin()->min(); | |
| 536 last = packet_number_intervals_.rbegin()->max(); | |
| 537 } | |
| 538 return const_iterator(packet_number_intervals_.begin(), first, last); | |
| 539 } | |
| 540 | |
| 541 PacketNumberQueue::const_iterator PacketNumberQueue::end() const { | |
| 542 QuicPacketNumber last = packet_number_intervals_.Empty() | |
| 543 ? 0 | |
| 544 : packet_number_intervals_.rbegin()->max(); | |
| 545 return const_iterator(packet_number_intervals_.end(), last, last); | |
| 546 } | |
| 547 | |
| 548 PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound( | |
| 549 QuicPacketNumber packet_number) const { | |
| 550 QuicPacketNumber first; | |
| 551 QuicPacketNumber last; | |
| 552 if (packet_number_intervals_.Empty()) { | |
| 553 first = 0; | |
| 554 last = 0; | |
| 555 return const_iterator(packet_number_intervals_.begin(), first, last); | |
| 556 } | |
| 557 if (!packet_number_intervals_.Contains(packet_number)) { | |
| 558 return end(); | |
| 559 } | |
| 560 IntervalSet<QuicPacketNumber>::const_iterator it = | |
| 561 packet_number_intervals_.Find(packet_number); | |
| 562 first = packet_number; | |
| 563 last = packet_number_intervals_.rbegin()->max(); | |
| 564 return const_iterator(it, first, last); | |
| 565 } | |
| 566 | |
| 567 PacketNumberQueue::const_interval_iterator PacketNumberQueue::begin_intervals() | |
| 568 const { | |
| 569 return packet_number_intervals_.begin(); | |
| 570 } | |
| 571 | |
| 572 PacketNumberQueue::const_interval_iterator PacketNumberQueue::end_intervals() | |
| 573 const { | |
| 574 return packet_number_intervals_.end(); | |
| 575 } | |
| 576 | |
| 577 PacketNumberQueue::const_reverse_interval_iterator | |
| 578 PacketNumberQueue::rbegin_intervals() const { | |
| 579 return packet_number_intervals_.rbegin(); | |
| 580 } | |
| 581 | |
| 582 PacketNumberQueue::const_reverse_interval_iterator | |
| 583 PacketNumberQueue::rend_intervals() const { | |
| 584 return packet_number_intervals_.rend(); | |
| 585 } | |
| 586 | |
| 587 ostream& operator<<(ostream& os, const PacketNumberQueue& q) { | |
| 588 for (QuicPacketNumber packet_number : q) { | |
| 589 os << packet_number << " "; | |
| 590 } | |
| 591 return os; | |
| 592 } | |
| 593 | |
| 594 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | |
| 595 os << "{ entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) | |
| 596 << ", largest_observed: " << ack_frame.largest_observed | |
| 597 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds() | |
| 598 << ", packets: [ " << ack_frame.packets << " ]" | |
| 599 << ", is_truncated: " << ack_frame.is_truncated | |
| 600 << ", received_packets: [ "; | |
| 601 for (const std::pair<QuicPacketNumber, QuicTime>& p : | |
| 602 ack_frame.received_packet_times) { | |
| 603 os << p.first << " at " << p.second.ToDebuggingValue() << " "; | |
| 604 } | |
| 605 os << " ] }\n"; | |
| 606 return os; | |
| 607 } | |
| 608 | |
| 609 ostream& operator<<(ostream& os, const QuicFrame& frame) { | |
| 610 switch (frame.type) { | |
| 611 case PADDING_FRAME: { | |
| 612 os << "type { PADDING_FRAME } " << frame.padding_frame; | |
| 613 break; | |
| 614 } | |
| 615 case RST_STREAM_FRAME: { | |
| 616 os << "type { RST_STREAM_FRAME } " << *(frame.rst_stream_frame); | |
| 617 break; | |
| 618 } | |
| 619 case CONNECTION_CLOSE_FRAME: { | |
| 620 os << "type { CONNECTION_CLOSE_FRAME } " | |
| 621 << *(frame.connection_close_frame); | |
| 622 break; | |
| 623 } | |
| 624 case GOAWAY_FRAME: { | |
| 625 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); | |
| 626 break; | |
| 627 } | |
| 628 case WINDOW_UPDATE_FRAME: { | |
| 629 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); | |
| 630 break; | |
| 631 } | |
| 632 case BLOCKED_FRAME: { | |
| 633 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); | |
| 634 break; | |
| 635 } | |
| 636 case STREAM_FRAME: { | |
| 637 os << "type { STREAM_FRAME } " << *(frame.stream_frame); | |
| 638 break; | |
| 639 } | |
| 640 case ACK_FRAME: { | |
| 641 os << "type { ACK_FRAME } " << *(frame.ack_frame); | |
| 642 break; | |
| 643 } | |
| 644 case STOP_WAITING_FRAME: { | |
| 645 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); | |
| 646 break; | |
| 647 } | |
| 648 case PING_FRAME: { | |
| 649 os << "type { PING_FRAME } "; | |
| 650 break; | |
| 651 } | |
| 652 case MTU_DISCOVERY_FRAME: { | |
| 653 os << "type { MTU_DISCOVERY_FRAME } "; | |
| 654 break; | |
| 655 } | |
| 656 case PATH_CLOSE_FRAME: { | |
| 657 os << "type { PATH_CLOSE_FRAME } " << *(frame.path_close_frame); | |
| 658 break; | |
| 659 } | |
| 660 default: { | |
| 661 LOG(ERROR) << "Unknown frame type: " << frame.type; | |
| 662 break; | |
| 663 } | |
| 664 } | |
| 665 return os; | |
| 666 } | |
| 667 | |
| 668 ostream& operator<<(ostream& os, const QuicPaddingFrame& padding_frame) { | |
| 669 os << "{ num_padding_bytes: " << padding_frame.num_padding_bytes << " }\n"; | |
| 670 return os; | |
| 671 } | |
| 672 | |
| 673 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { | |
| 674 os << "{ stream_id: " << rst_frame.stream_id | |
| 675 << ", error_code: " << rst_frame.error_code << " }\n"; | |
| 676 return os; | |
| 677 } | |
| 678 | |
| 679 ostream& operator<<(ostream& os, | |
| 680 const QuicConnectionCloseFrame& connection_close_frame) { | |
| 681 os << "{ error_code: " << connection_close_frame.error_code | |
| 682 << ", error_details: '" << connection_close_frame.error_details << "' }\n"; | |
| 683 return os; | |
| 684 } | |
| 685 | |
| 686 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) { | |
| 687 os << "{ error_code: " << goaway_frame.error_code | |
| 688 << ", last_good_stream_id: " << goaway_frame.last_good_stream_id | |
| 689 << ", reason_phrase: '" << goaway_frame.reason_phrase << "' }\n"; | |
| 690 return os; | |
| 691 } | |
| 692 | |
| 693 ostream& operator<<(ostream& os, | |
| 694 const QuicWindowUpdateFrame& window_update_frame) { | |
| 695 os << "{ stream_id: " << window_update_frame.stream_id | |
| 696 << ", byte_offset: " << window_update_frame.byte_offset << " }\n"; | |
| 697 return os; | |
| 698 } | |
| 699 | |
| 700 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) { | |
| 701 os << "{ stream_id: " << blocked_frame.stream_id << " }\n"; | |
| 702 return os; | |
| 703 } | |
| 704 | |
| 705 ostream& operator<<(ostream& os, const QuicPathCloseFrame& path_close_frame) { | |
| 706 os << "{ path_id: " << static_cast<int>(path_close_frame.path_id) << " }\n"; | |
| 707 return os; | |
| 708 } | |
| 709 | |
| 710 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { | |
| 711 os << "{ stream_id: " << stream_frame.stream_id | |
| 712 << ", fin: " << stream_frame.fin << ", offset: " << stream_frame.offset | |
| 713 << ", length: " << stream_frame.data_length << " }\n"; | |
| 714 return os; | |
| 715 } | |
| 716 | |
| 717 QuicGoAwayFrame::QuicGoAwayFrame() | |
| 718 : error_code(QUIC_NO_ERROR), last_good_stream_id(0) {} | |
| 719 | |
| 720 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, | |
| 721 QuicStreamId last_good_stream_id, | |
| 722 const string& reason) | |
| 723 : error_code(error_code), | |
| 724 last_good_stream_id(last_good_stream_id), | |
| 725 reason_phrase(reason) {} | |
| 726 | |
| 727 QuicData::QuicData(const char* buffer, size_t length) | |
| 728 : buffer_(buffer), length_(length), owns_buffer_(false) {} | |
| 729 | |
| 730 QuicData::QuicData(char* buffer, size_t length, bool owns_buffer) | |
| 731 : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) {} | |
| 732 | |
| 733 QuicData::~QuicData() { | |
| 734 if (owns_buffer_) { | |
| 735 delete[] const_cast<char*>(buffer_); | |
| 736 } | |
| 737 } | |
| 738 | |
| 739 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, | |
| 740 QuicStreamOffset byte_offset) | |
| 741 : stream_id(stream_id), byte_offset(byte_offset) {} | |
| 742 | |
| 743 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) | |
| 744 : stream_id(stream_id) {} | |
| 745 | |
| 746 QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {} | |
| 747 | |
| 748 QuicPacket::QuicPacket(char* buffer, | |
| 749 size_t length, | |
| 750 bool owns_buffer, | |
| 751 QuicConnectionIdLength connection_id_length, | |
| 752 bool includes_version, | |
| 753 bool includes_path_id, | |
| 754 bool includes_diversification_nonce, | |
| 755 QuicPacketNumberLength packet_number_length) | |
| 756 : QuicData(buffer, length, owns_buffer), | |
| 757 buffer_(buffer), | |
| 758 connection_id_length_(connection_id_length), | |
| 759 includes_version_(includes_version), | |
| 760 includes_path_id_(includes_path_id), | |
| 761 includes_diversification_nonce_(includes_diversification_nonce), | |
| 762 packet_number_length_(packet_number_length) {} | |
| 763 | |
| 764 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length) | |
| 765 : QuicData(buffer, length) {} | |
| 766 | |
| 767 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, | |
| 768 size_t length, | |
| 769 bool owns_buffer) | |
| 770 : QuicData(buffer, length, owns_buffer) {} | |
| 771 | |
| 772 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { | |
| 773 char* buffer = new char[this->length()]; | |
| 774 memcpy(buffer, this->data(), this->length()); | |
| 775 return new QuicEncryptedPacket(buffer, this->length(), true); | |
| 776 } | |
| 777 | |
| 778 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { | |
| 779 os << s.length() << "-byte data"; | |
| 780 return os; | |
| 781 } | |
| 782 | |
| 783 QuicReceivedPacket::QuicReceivedPacket(const char* buffer, | |
| 784 size_t length, | |
| 785 QuicTime receipt_time) | |
| 786 : QuicEncryptedPacket(buffer, length), receipt_time_(receipt_time) {} | |
| 787 | |
| 788 QuicReceivedPacket::QuicReceivedPacket(char* buffer, | |
| 789 size_t length, | |
| 790 QuicTime receipt_time, | |
| 791 bool owns_buffer) | |
| 792 : QuicEncryptedPacket(buffer, length, owns_buffer), | |
| 793 receipt_time_(receipt_time) {} | |
| 794 | |
| 795 QuicReceivedPacket* QuicReceivedPacket::Clone() const { | |
| 796 char* buffer = new char[this->length()]; | |
| 797 memcpy(buffer, this->data(), this->length()); | |
| 798 return new QuicReceivedPacket(buffer, this->length(), receipt_time(), true); | |
| 799 } | |
| 800 | |
| 801 ostream& operator<<(ostream& os, const QuicReceivedPacket& s) { | |
| 802 os << s.length() << "-byte data"; | |
| 803 return os; | |
| 804 } | |
| 805 | |
| 806 StringPiece QuicPacket::AssociatedData(QuicVersion version) const { | |
| 807 return StringPiece( | |
| 808 data(), GetStartOfEncryptedData(version, connection_id_length_, | |
| 809 includes_version_, includes_path_id_, | |
| 810 includes_diversification_nonce_, | |
| 811 packet_number_length_)); | |
| 812 } | |
| 813 | |
| 814 StringPiece QuicPacket::Plaintext(QuicVersion version) const { | |
| 815 const size_t start_of_encrypted_data = GetStartOfEncryptedData( | |
| 816 version, connection_id_length_, includes_version_, includes_path_id_, | |
| 817 includes_diversification_nonce_, packet_number_length_); | |
| 818 return StringPiece(data() + start_of_encrypted_data, | |
| 819 length() - start_of_encrypted_data); | |
| 820 } | |
| 821 | |
| 822 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, | |
| 823 QuicPacketLength data_length) | |
| 824 : ack_listener(listener), length(data_length) { | |
| 825 DCHECK(listener != nullptr); | |
| 826 } | |
| 827 | |
| 828 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = | |
| 829 default; | |
| 830 | |
| 831 AckListenerWrapper::~AckListenerWrapper() {} | |
| 832 | |
| 833 SerializedPacket::SerializedPacket(QuicPathId path_id, | |
| 834 QuicPacketNumber packet_number, | |
| 835 QuicPacketNumberLength packet_number_length, | |
| 836 const char* encrypted_buffer, | |
| 837 QuicPacketLength encrypted_length, | |
| 838 QuicPacketEntropyHash entropy_hash, | |
| 839 bool has_ack, | |
| 840 bool has_stop_waiting) | |
| 841 : encrypted_buffer(encrypted_buffer), | |
| 842 encrypted_length(encrypted_length), | |
| 843 has_crypto_handshake(NOT_HANDSHAKE), | |
| 844 num_padding_bytes(0), | |
| 845 path_id(path_id), | |
| 846 packet_number(packet_number), | |
| 847 packet_number_length(packet_number_length), | |
| 848 encryption_level(ENCRYPTION_NONE), | |
| 849 entropy_hash(entropy_hash), | |
| 850 has_ack(has_ack), | |
| 851 has_stop_waiting(has_stop_waiting), | |
| 852 transmission_type(NOT_RETRANSMISSION), | |
| 853 original_path_id(kInvalidPathId), | |
| 854 original_packet_number(0) {} | |
| 855 | |
| 856 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; | |
| 857 | |
| 858 SerializedPacket::~SerializedPacket() {} | |
| 859 | |
| 860 TransmissionInfo::TransmissionInfo() | |
| 861 : encryption_level(ENCRYPTION_NONE), | |
| 862 packet_number_length(PACKET_1BYTE_PACKET_NUMBER), | |
| 863 bytes_sent(0), | |
| 864 sent_time(QuicTime::Zero()), | |
| 865 transmission_type(NOT_RETRANSMISSION), | |
| 866 in_flight(false), | |
| 867 is_unackable(false), | |
| 868 has_crypto_handshake(false), | |
| 869 num_padding_bytes(0), | |
| 870 retransmission(0) {} | |
| 871 | |
| 872 TransmissionInfo::TransmissionInfo(EncryptionLevel level, | |
| 873 QuicPacketNumberLength packet_number_length, | |
| 874 TransmissionType transmission_type, | |
| 875 QuicTime sent_time, | |
| 876 QuicPacketLength bytes_sent, | |
| 877 bool has_crypto_handshake, | |
| 878 int num_padding_bytes) | |
| 879 : encryption_level(level), | |
| 880 packet_number_length(packet_number_length), | |
| 881 bytes_sent(bytes_sent), | |
| 882 sent_time(sent_time), | |
| 883 transmission_type(transmission_type), | |
| 884 in_flight(false), | |
| 885 is_unackable(false), | |
| 886 has_crypto_handshake(has_crypto_handshake), | |
| 887 num_padding_bytes(num_padding_bytes), | |
| 888 retransmission(0) {} | |
| 889 | |
| 890 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; | |
| 891 | |
| 892 TransmissionInfo::~TransmissionInfo() {} | |
| 893 | |
| 894 } // namespace net | |
| OLD | NEW |