| 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_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 using std::string; | 30 using std::string; |
| 31 | 31 |
| 32 namespace net { | 32 namespace net { |
| 33 | 33 |
| 34 namespace { | 34 namespace { |
| 35 | 35 |
| 36 #define ENDPOINT \ | 36 #define ENDPOINT \ |
| 37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") | 37 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") |
| 38 | 38 |
| 39 // Mask to select the lowest 48 bits of a packet number. | |
| 40 const QuicPacketNumber k6ByteSequenceNumberMask = UINT64_C(0x0000FFFFFFFFFFFF); | |
| 41 const QuicPacketNumber k4ByteSequenceNumberMask = UINT64_C(0x00000000FFFFFFFF); | |
| 42 const QuicPacketNumber k2ByteSequenceNumberMask = UINT64_C(0x000000000000FFFF); | |
| 43 const QuicPacketNumber k1ByteSequenceNumberMask = UINT64_C(0x00000000000000FF); | |
| 44 | |
| 45 // Number of bits the packet number length bits are shifted from the right | 39 // Number of bits the packet number length bits are shifted from the right |
| 46 // edge of the public header. | 40 // edge of the public header. |
| 47 const uint8_t kPublicHeaderSequenceNumberShift = 4; | 41 const uint8_t kPublicHeaderSequenceNumberShift = 4; |
| 48 | 42 |
| 49 // New Frame Types, QUIC v. >= 10: | 43 // New Frame Types, QUIC v. >= 10: |
| 50 // There are two interpretations for the Frame Type byte in the QUIC protocol, | 44 // There are two interpretations for the Frame Type byte in the QUIC protocol, |
| 51 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. | 45 // resulting in two Frame Types: Special Frame Types and Regular Frame Types. |
| 52 // | 46 // |
| 53 // Regular Frame Types use the Frame Type byte simply. Currently defined | 47 // Regular Frame Types use the Frame Type byte simply. Currently defined |
| 54 // Regular Frame Types are: | 48 // Regular Frame Types are: |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 306 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
| 313 | 307 |
| 314 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; | 308 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; |
| 315 | 309 |
| 316 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | 310 QuicFramer::AckFrameInfo::~AckFrameInfo() {} |
| 317 | 311 |
| 318 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 312 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 319 const QuicFrames& frames, | 313 const QuicFrames& frames, |
| 320 char* buffer, | 314 char* buffer, |
| 321 size_t packet_length) { | 315 size_t packet_length) { |
| 322 QuicDataWriter writer(packet_length, buffer, perspective_); | 316 QuicDataWriter writer(packet_length, buffer, perspective_, endianness()); |
| 323 if (!AppendPacketHeader(header, &writer)) { | 317 if (!AppendPacketHeader(header, &writer)) { |
| 324 QUIC_BUG << "AppendPacketHeader failed"; | 318 QUIC_BUG << "AppendPacketHeader failed"; |
| 325 return 0; | 319 return 0; |
| 326 } | 320 } |
| 327 | 321 |
| 328 size_t i = 0; | 322 size_t i = 0; |
| 329 for (const QuicFrame& frame : frames) { | 323 for (const QuicFrame& frame : frames) { |
| 330 // Determine if we should write stream frame length in header. | 324 // Determine if we should write stream frame length in header. |
| 331 const bool no_stream_frame_length = i == frames.size() - 1; | 325 const bool no_stream_frame_length = i == frames.size() - 1; |
| 332 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { | 326 if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 } | 404 } |
| 411 | 405 |
| 412 // static | 406 // static |
| 413 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( | 407 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildPublicResetPacket( |
| 414 const QuicPublicResetPacket& packet) { | 408 const QuicPublicResetPacket& packet) { |
| 415 DCHECK(packet.public_header.reset_flag); | 409 DCHECK(packet.public_header.reset_flag); |
| 416 | 410 |
| 417 CryptoHandshakeMessage reset; | 411 CryptoHandshakeMessage reset; |
| 418 reset.set_tag(kPRST); | 412 reset.set_tag(kPRST); |
| 419 reset.SetValue(kRNON, packet.nonce_proof); | 413 reset.SetValue(kRNON, packet.nonce_proof); |
| 420 if (!FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) { | |
| 421 reset.SetValue(kRSEQ, packet.rejected_packet_number); | |
| 422 } | |
| 423 if (packet.client_address.host().address_family() != | 414 if (packet.client_address.host().address_family() != |
| 424 IpAddressFamily::IP_UNSPEC) { | 415 IpAddressFamily::IP_UNSPEC) { |
| 425 // packet.client_address is non-empty. | 416 // packet.client_address is non-empty. |
| 426 QuicSocketAddressCoder address_coder(packet.client_address); | 417 QuicSocketAddressCoder address_coder(packet.client_address); |
| 427 string serialized_address = address_coder.Encode(); | 418 string serialized_address = address_coder.Encode(); |
| 428 if (serialized_address.empty()) { | 419 if (serialized_address.empty()) { |
| 429 return nullptr; | 420 return nullptr; |
| 430 } | 421 } |
| 431 reset.SetStringPiece(kCADR, serialized_address); | 422 reset.SetStringPiece(kCADR, serialized_address); |
| 432 } | 423 } |
| 433 const QuicData& reset_serialized = | 424 const QuicData& reset_serialized = |
| 434 reset.GetSerialized(Perspective::IS_SERVER); | 425 reset.GetSerialized(Perspective::IS_SERVER); |
| 435 | 426 |
| 436 size_t len = | 427 size_t len = |
| 437 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 428 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
| 438 std::unique_ptr<char[]> buffer(new char[len]); | 429 std::unique_ptr<char[]> buffer(new char[len]); |
| 439 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 430 // Endianness is not a concern here, as writer is not going to write integers |
| 431 // or floating numbers. |
| 432 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 433 NETWORK_BYTE_ORDER); |
| 440 | 434 |
| 441 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | | 435 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | |
| 442 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 436 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 443 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { | 437 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { |
| 444 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 438 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
| 445 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 439 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
| 446 } | 440 } |
| 447 if (!writer.WriteUInt8(flags)) { | 441 if (!writer.WriteUInt8(flags)) { |
| 448 return nullptr; | 442 return nullptr; |
| 449 } | 443 } |
| 450 | 444 |
| 451 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { | 445 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { |
| 452 return nullptr; | 446 return nullptr; |
| 453 } | 447 } |
| 454 | 448 |
| 455 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 449 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
| 456 return nullptr; | 450 return nullptr; |
| 457 } | 451 } |
| 458 | 452 |
| 459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 453 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
| 460 } | 454 } |
| 461 | 455 |
| 462 // static | 456 // static |
| 463 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( | 457 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
| 464 QuicConnectionId connection_id, | 458 QuicConnectionId connection_id, |
| 465 const QuicVersionVector& versions) { | 459 const QuicVersionVector& versions) { |
| 466 DCHECK(!versions.empty()); | 460 DCHECK(!versions.empty()); |
| 467 size_t len = GetVersionNegotiationPacketSize(versions.size()); | 461 size_t len = GetVersionNegotiationPacketSize(versions.size()); |
| 468 std::unique_ptr<char[]> buffer(new char[len]); | 462 std::unique_ptr<char[]> buffer(new char[len]); |
| 469 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 463 // Endianness is not a concern here, version negotiation packet does not have |
| 464 // integers or floating numbers. |
| 465 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 466 NETWORK_BYTE_ORDER); |
| 470 | 467 |
| 471 uint8_t flags = static_cast<uint8_t>( | 468 uint8_t flags = static_cast<uint8_t>( |
| 472 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | | 469 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | |
| 473 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 470 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
| 474 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 471 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
| 475 if (!writer.WriteUInt8(flags)) { | 472 if (!writer.WriteUInt8(flags)) { |
| 476 return nullptr; | 473 return nullptr; |
| 477 } | 474 } |
| 478 | 475 |
| 479 if (!writer.WriteConnectionId(connection_id)) { | 476 if (!writer.WriteConnectionId(connection_id)) { |
| 480 return nullptr; | 477 return nullptr; |
| 481 } | 478 } |
| 482 | 479 |
| 483 for (QuicVersion version : versions) { | 480 for (QuicVersion version : versions) { |
| 484 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { | 481 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { |
| 485 return nullptr; | 482 return nullptr; |
| 486 } | 483 } |
| 487 } | 484 } |
| 488 | 485 |
| 489 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 486 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
| 490 } | 487 } |
| 491 | 488 |
| 492 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 489 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 493 QuicDataReader reader(packet.data(), packet.length(), perspective_); | 490 QuicDataReader reader(packet.data(), packet.length(), perspective_, |
| 491 endianness()); |
| 494 | 492 |
| 495 visitor_->OnPacket(); | 493 visitor_->OnPacket(); |
| 496 | 494 |
| 497 // First parse the public header. | 495 // First parse the public header. |
| 498 QuicPacketPublicHeader public_header; | 496 QuicPacketPublicHeader public_header; |
| 499 if (!ProcessPublicHeader(&reader, &public_header)) { | 497 if (!ProcessPublicHeader(&reader, &public_header)) { |
| 500 DCHECK_NE("", detailed_error_); | 498 DCHECK_NE("", detailed_error_); |
| 501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " | 499 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " |
| 502 << detailed_error_; | 500 << detailed_error_; |
| 503 DCHECK_NE("", detailed_error_); | 501 DCHECK_NE("", detailed_error_); |
| 504 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 502 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 505 } | 503 } |
| 506 | 504 |
| 507 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { | 505 if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) { |
| 508 // The visitor suppresses further processing of the packet. | 506 // The visitor suppresses further processing of the packet. |
| 509 return true; | 507 return true; |
| 510 } | 508 } |
| 511 | 509 |
| 512 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && | 510 if (perspective_ == Perspective::IS_SERVER && public_header.version_flag && |
| 513 public_header.versions[0] != quic_version_) { | 511 public_header.versions[0] != quic_version_) { |
| 514 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { | 512 if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) { |
| 515 return true; | 513 return true; |
| 516 } | 514 } |
| 517 } | 515 } |
| 518 | 516 |
| 517 // framer's version may change, reset reader's endianness. |
| 518 reader.set_endianness(endianness()); |
| 519 |
| 519 bool rv; | 520 bool rv; |
| 520 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { | 521 if (perspective_ == Perspective::IS_CLIENT && public_header.version_flag) { |
| 521 rv = ProcessVersionNegotiationPacket(&reader, &public_header); | 522 rv = ProcessVersionNegotiationPacket(&reader, &public_header); |
| 522 } else if (public_header.reset_flag) { | 523 } else if (public_header.reset_flag) { |
| 523 rv = ProcessPublicResetPacket(&reader, public_header); | 524 rv = ProcessPublicResetPacket(&reader, public_header); |
| 524 } else if (packet.length() <= kMaxPacketSize) { | 525 } else if (packet.length() <= kMaxPacketSize) { |
| 525 // The optimized decryption algorithm implementations run faster when | 526 // The optimized decryption algorithm implementations run faster when |
| 526 // operating on aligned memory. | 527 // operating on aligned memory. |
| 527 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize]; | 528 QUIC_CACHELINE_ALIGNED char buffer[kMaxPacketSize]; |
| 528 rv = ProcessDataPacket(&reader, public_header, packet, buffer, | 529 rv = ProcessDataPacket(&reader, public_header, packet, buffer, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 return false; | 572 return false; |
| 572 } | 573 } |
| 573 | 574 |
| 574 size_t decrypted_length = 0; | 575 size_t decrypted_length = 0; |
| 575 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 576 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
| 576 buffer_length, &decrypted_length)) { | 577 buffer_length, &decrypted_length)) { |
| 577 set_detailed_error("Unable to decrypt payload."); | 578 set_detailed_error("Unable to decrypt payload."); |
| 578 return RaiseError(QUIC_DECRYPTION_FAILURE); | 579 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 579 } | 580 } |
| 580 | 581 |
| 581 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_); | 582 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_, |
| 583 endianness()); |
| 582 | 584 |
| 583 // Set the last packet number after we have decrypted the packet | 585 // Set the last packet number after we have decrypted the packet |
| 584 // so we are confident is not attacker controlled. | 586 // so we are confident is not attacker controlled. |
| 585 SetLastPacketNumber(header); | 587 SetLastPacketNumber(header); |
| 586 | 588 |
| 587 if (!visitor_->OnPacketHeader(header)) { | 589 if (!visitor_->OnPacketHeader(header)) { |
| 588 // The visitor suppresses further processing of the packet. | 590 // The visitor suppresses further processing of the packet. |
| 589 return true; | 591 return true; |
| 590 } | 592 } |
| 591 | 593 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 653 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 652 } | 654 } |
| 653 if (header.public_header.version_flag) { | 655 if (header.public_header.version_flag) { |
| 654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 656 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 655 } | 657 } |
| 656 if (header.public_header.multipath_flag) { | 658 if (header.public_header.multipath_flag) { |
| 657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; | 659 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; |
| 658 } | 660 } |
| 659 | 661 |
| 660 public_flags |= | 662 public_flags |= |
| 661 GetSequenceNumberFlags(header.public_header.packet_number_length) | 663 GetPacketNumberFlags(header.public_header.packet_number_length) |
| 662 << kPublicHeaderSequenceNumberShift; | 664 << kPublicHeaderSequenceNumberShift; |
| 663 | 665 |
| 664 if (header.public_header.nonce != nullptr) { | 666 if (header.public_header.nonce != nullptr) { |
| 665 DCHECK_EQ(Perspective::IS_SERVER, perspective_); | 667 DCHECK_EQ(Perspective::IS_SERVER, perspective_); |
| 666 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; | 668 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; |
| 667 } | 669 } |
| 668 | 670 |
| 669 switch (header.public_header.connection_id_length) { | 671 switch (header.public_header.connection_id_length) { |
| 670 case PACKET_0BYTE_CONNECTION_ID: | 672 case PACKET_0BYTE_CONNECTION_ID: |
| 671 if (!writer->WriteUInt8(public_flags | | 673 if (!writer->WriteUInt8(public_flags | |
| (...skipping 24 matching lines...) Expand all Loading... |
| 696 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" | 698 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" |
| 697 << QuicTagToString(tag) << "'"; | 699 << QuicTagToString(tag) << "'"; |
| 698 } | 700 } |
| 699 | 701 |
| 700 if (header.public_header.nonce != nullptr && | 702 if (header.public_header.nonce != nullptr && |
| 701 !writer->WriteBytes(header.public_header.nonce, | 703 !writer->WriteBytes(header.public_header.nonce, |
| 702 kDiversificationNonceSize)) { | 704 kDiversificationNonceSize)) { |
| 703 return false; | 705 return false; |
| 704 } | 706 } |
| 705 | 707 |
| 706 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 708 if (!AppendPacketNumber(header.public_header.packet_number_length, |
| 707 header.packet_number, writer)) { | 709 header.packet_number, writer)) { |
| 708 return false; | 710 return false; |
| 709 } | 711 } |
| 710 | 712 |
| 711 return true; | 713 return true; |
| 712 } | 714 } |
| 713 | 715 |
| 714 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 716 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
| 715 uint32_t time_delta_us) { | 717 uint32_t time_delta_us) { |
| 716 // The new time_delta might have wrapped to the next epoch, or it | 718 // The new time_delta might have wrapped to the next epoch, or it |
| 717 // might have reverse wrapped to the previous epoch, or it might | 719 // might have reverse wrapped to the previous epoch, or it might |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 } | 855 } |
| 854 public_header->nonce = &last_nonce_; | 856 public_header->nonce = &last_nonce_; |
| 855 } else { | 857 } else { |
| 856 public_header->nonce = nullptr; | 858 public_header->nonce = nullptr; |
| 857 } | 859 } |
| 858 | 860 |
| 859 return true; | 861 return true; |
| 860 } | 862 } |
| 861 | 863 |
| 862 // static | 864 // static |
| 863 QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength( | 865 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength( |
| 864 QuicPacketNumber packet_number) { | 866 QuicPacketNumber packet_number) { |
| 865 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { | 867 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { |
| 866 return PACKET_1BYTE_PACKET_NUMBER; | 868 return PACKET_1BYTE_PACKET_NUMBER; |
| 867 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { | 869 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { |
| 868 return PACKET_2BYTE_PACKET_NUMBER; | 870 return PACKET_2BYTE_PACKET_NUMBER; |
| 869 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { | 871 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { |
| 870 return PACKET_4BYTE_PACKET_NUMBER; | 872 return PACKET_4BYTE_PACKET_NUMBER; |
| 871 } else { | 873 } else { |
| 872 return PACKET_6BYTE_PACKET_NUMBER; | 874 return PACKET_6BYTE_PACKET_NUMBER; |
| 873 } | 875 } |
| 874 } | 876 } |
| 875 | 877 |
| 876 // static | 878 // static |
| 877 uint8_t QuicFramer::GetSequenceNumberFlags( | 879 uint8_t QuicFramer::GetPacketNumberFlags( |
| 878 QuicPacketNumberLength packet_number_length) { | 880 QuicPacketNumberLength packet_number_length) { |
| 879 switch (packet_number_length) { | 881 switch (packet_number_length) { |
| 880 case PACKET_1BYTE_PACKET_NUMBER: | 882 case PACKET_1BYTE_PACKET_NUMBER: |
| 881 return PACKET_FLAGS_1BYTE_PACKET; | 883 return PACKET_FLAGS_1BYTE_PACKET; |
| 882 case PACKET_2BYTE_PACKET_NUMBER: | 884 case PACKET_2BYTE_PACKET_NUMBER: |
| 883 return PACKET_FLAGS_2BYTE_PACKET; | 885 return PACKET_FLAGS_2BYTE_PACKET; |
| 884 case PACKET_4BYTE_PACKET_NUMBER: | 886 case PACKET_4BYTE_PACKET_NUMBER: |
| 885 return PACKET_FLAGS_4BYTE_PACKET; | 887 return PACKET_FLAGS_4BYTE_PACKET; |
| 886 case PACKET_6BYTE_PACKET_NUMBER: | 888 case PACKET_6BYTE_PACKET_NUMBER: |
| 887 return PACKET_FLAGS_6BYTE_PACKET; | 889 return PACKET_FLAGS_6BYTE_PACKET; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 new_ack_info.max_block_length = | 921 new_ack_info.max_block_length = |
| 920 std::max(new_ack_info.max_block_length, interval.Length()); | 922 std::max(new_ack_info.max_block_length, interval.Length()); |
| 921 } | 923 } |
| 922 return new_ack_info; | 924 return new_ack_info; |
| 923 } | 925 } |
| 924 | 926 |
| 925 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 927 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
| 926 QuicPacketHeader* header) { | 928 QuicPacketHeader* header) { |
| 927 QuicPacketNumber base_packet_number = largest_packet_number_; | 929 QuicPacketNumber base_packet_number = largest_packet_number_; |
| 928 | 930 |
| 929 if (!ProcessPacketSequenceNumber( | 931 if (!ProcessAndCalculatePacketNumber( |
| 930 encrypted_reader, header->public_header.packet_number_length, | 932 encrypted_reader, header->public_header.packet_number_length, |
| 931 base_packet_number, &header->packet_number)) { | 933 base_packet_number, &header->packet_number)) { |
| 932 set_detailed_error("Unable to read packet number."); | 934 set_detailed_error("Unable to read packet number."); |
| 933 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 935 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 934 } | 936 } |
| 935 | 937 |
| 936 if (header->packet_number == 0u) { | 938 if (header->packet_number == 0u) { |
| 937 set_detailed_error("packet numbers cannot be 0."); | 939 set_detailed_error("packet numbers cannot be 0."); |
| 938 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 940 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 939 } | 941 } |
| 940 | 942 |
| 941 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 943 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 942 set_detailed_error( | 944 set_detailed_error( |
| 943 "Visitor asked to stop processing of unauthenticated header."); | 945 "Visitor asked to stop processing of unauthenticated header."); |
| 944 return false; | 946 return false; |
| 945 } | 947 } |
| 946 return true; | 948 return true; |
| 947 } | 949 } |
| 948 | 950 |
| 949 bool QuicFramer::ProcessPacketSequenceNumber( | 951 bool QuicFramer::ProcessAndCalculatePacketNumber( |
| 950 QuicDataReader* reader, | 952 QuicDataReader* reader, |
| 951 QuicPacketNumberLength packet_number_length, | 953 QuicPacketNumberLength packet_number_length, |
| 952 QuicPacketNumber base_packet_number, | 954 QuicPacketNumber base_packet_number, |
| 953 QuicPacketNumber* packet_number) { | 955 QuicPacketNumber* packet_number) { |
| 954 QuicPacketNumber wire_packet_number = 0u; | 956 QuicPacketNumber wire_packet_number = 0u; |
| 955 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { | 957 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) { |
| 956 return false; | 958 return false; |
| 957 } | 959 } |
| 958 | 960 |
| 959 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers | 961 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
| 960 // in case the first guess is incorrect. | 962 // in case the first guess is incorrect. |
| 961 *packet_number = CalculatePacketNumberFromWire( | 963 *packet_number = CalculatePacketNumberFromWire( |
| 962 packet_number_length, base_packet_number, wire_packet_number); | 964 packet_number_length, base_packet_number, wire_packet_number); |
| 963 return true; | 965 return true; |
| 964 } | 966 } |
| 965 | 967 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 offset_length += 1; | 1152 offset_length += 1; |
| 1151 } | 1153 } |
| 1152 stream_flags >>= kQuicStreamOffsetShift; | 1154 stream_flags >>= kQuicStreamOffsetShift; |
| 1153 | 1155 |
| 1154 bool has_data_length = | 1156 bool has_data_length = |
| 1155 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; | 1157 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; |
| 1156 stream_flags >>= kQuicStreamDataLengthShift; | 1158 stream_flags >>= kQuicStreamDataLengthShift; |
| 1157 | 1159 |
| 1158 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; | 1160 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; |
| 1159 | 1161 |
| 1160 frame->stream_id = 0; | 1162 uint64_t stream_id = 0; |
| 1161 if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) { | 1163 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) { |
| 1162 set_detailed_error("Unable to read stream_id."); | 1164 set_detailed_error("Unable to read stream_id."); |
| 1163 return false; | 1165 return false; |
| 1164 } | 1166 } |
| 1167 frame->stream_id = static_cast<QuicStreamId>(stream_id); |
| 1165 | 1168 |
| 1166 frame->offset = 0; | 1169 frame->offset = 0; |
| 1167 if (!reader->ReadBytes(&frame->offset, offset_length)) { | 1170 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) { |
| 1168 set_detailed_error("Unable to read offset."); | 1171 set_detailed_error("Unable to read offset."); |
| 1169 return false; | 1172 return false; |
| 1170 } | 1173 } |
| 1171 | 1174 |
| 1172 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. | 1175 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. |
| 1173 QuicStringPiece data; | 1176 QuicStringPiece data; |
| 1174 if (has_data_length) { | 1177 if (has_data_length) { |
| 1175 if (!reader->ReadStringPiece16(&data)) { | 1178 if (!reader->ReadStringPiece16(&data)) { |
| 1176 set_detailed_error("Unable to read frame data."); | 1179 set_detailed_error("Unable to read frame data."); |
| 1177 return false; | 1180 return false; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1195 // ack block length. | 1198 // ack block length. |
| 1196 const QuicPacketNumberLength ack_block_length = | 1199 const QuicPacketNumberLength ack_block_length = |
| 1197 ReadSequenceNumberLength(frame_type); | 1200 ReadSequenceNumberLength(frame_type); |
| 1198 frame_type >>= kQuicSequenceNumberLengthShift; | 1201 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1199 const QuicPacketNumberLength largest_acked_length = | 1202 const QuicPacketNumberLength largest_acked_length = |
| 1200 ReadSequenceNumberLength(frame_type); | 1203 ReadSequenceNumberLength(frame_type); |
| 1201 frame_type >>= kQuicSequenceNumberLengthShift; | 1204 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1202 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1205 frame_type >>= kQuicHasMultipleAckBlocksShift; |
| 1203 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1206 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
| 1204 | 1207 |
| 1205 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1208 if (!reader->ReadBytesToUInt64(largest_acked_length, |
| 1209 &ack_frame->largest_observed)) { |
| 1206 set_detailed_error("Unable to read largest acked."); | 1210 set_detailed_error("Unable to read largest acked."); |
| 1207 return false; | 1211 return false; |
| 1208 } | 1212 } |
| 1209 | 1213 |
| 1210 uint64_t ack_delay_time_us; | 1214 uint64_t ack_delay_time_us; |
| 1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1215 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
| 1212 set_detailed_error("Unable to read ack delay time."); | 1216 set_detailed_error("Unable to read ack delay time."); |
| 1213 return false; | 1217 return false; |
| 1214 } | 1218 } |
| 1215 | 1219 |
| 1216 if (ack_delay_time_us == kUFloat16MaxValue) { | 1220 if (ack_delay_time_us == kUFloat16MaxValue) { |
| 1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | 1221 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); |
| 1218 } else { | 1222 } else { |
| 1219 ack_frame->ack_delay_time = | 1223 ack_frame->ack_delay_time = |
| 1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | 1224 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); |
| 1221 } | 1225 } |
| 1222 | 1226 |
| 1223 uint8_t num_ack_blocks = 0; | 1227 uint8_t num_ack_blocks = 0; |
| 1224 if (has_ack_blocks) { | 1228 if (has_ack_blocks) { |
| 1225 if (!reader->ReadBytes(&num_ack_blocks, 1)) { | 1229 if (!reader->ReadUInt8(&num_ack_blocks)) { |
| 1226 set_detailed_error("Unable to read num of ack blocks."); | 1230 set_detailed_error("Unable to read num of ack blocks."); |
| 1227 return false; | 1231 return false; |
| 1228 } | 1232 } |
| 1229 } | 1233 } |
| 1230 | 1234 |
| 1231 size_t first_block_length = 0; | 1235 uint64_t first_block_length = 0; |
| 1232 if (!reader->ReadBytes(&first_block_length, ack_block_length)) { | 1236 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) { |
| 1233 set_detailed_error("Unable to read first ack block length."); | 1237 set_detailed_error("Unable to read first ack block length."); |
| 1234 return false; | 1238 return false; |
| 1235 } | 1239 } |
| 1236 QuicPacketNumber first_received = | 1240 QuicPacketNumber first_received = |
| 1237 ack_frame->largest_observed + 1 - first_block_length; | 1241 ack_frame->largest_observed + 1 - first_block_length; |
| 1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); | 1242 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); |
| 1239 | 1243 |
| 1240 if (num_ack_blocks > 0) { | 1244 if (num_ack_blocks > 0) { |
| 1241 for (size_t i = 0; i < num_ack_blocks; ++i) { | 1245 for (size_t i = 0; i < num_ack_blocks; ++i) { |
| 1242 size_t gap = 0; | 1246 uint8_t gap = 0; |
| 1243 if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) { | 1247 if (!reader->ReadUInt8(&gap)) { |
| 1244 set_detailed_error("Unable to read gap to next ack block."); | 1248 set_detailed_error("Unable to read gap to next ack block."); |
| 1245 return false; | 1249 return false; |
| 1246 } | 1250 } |
| 1247 size_t current_block_length = 0; | 1251 uint64_t current_block_length = 0; |
| 1248 if (!reader->ReadBytes(¤t_block_length, ack_block_length)) { | 1252 if (!reader->ReadBytesToUInt64(ack_block_length, ¤t_block_length)) { |
| 1249 set_detailed_error("Unable to ack block length."); | 1253 set_detailed_error("Unable to ack block length."); |
| 1250 return false; | 1254 return false; |
| 1251 } | 1255 } |
| 1252 first_received -= (gap + current_block_length); | 1256 first_received -= (gap + current_block_length); |
| 1253 if (current_block_length > 0) { | 1257 if (current_block_length > 0) { |
| 1254 ack_frame->packets.Add(first_received, | 1258 ack_frame->packets.Add(first_received, |
| 1255 first_received + current_block_length); | 1259 first_received + current_block_length); |
| 1256 } | 1260 } |
| 1257 } | 1261 } |
| 1258 } | 1262 } |
| 1259 | 1263 |
| 1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1264 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
| 1261 return false; | 1265 return false; |
| 1262 } | 1266 } |
| 1263 | 1267 |
| 1264 return true; | 1268 return true; |
| 1265 } | 1269 } |
| 1266 | 1270 |
| 1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1271 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
| 1268 QuicAckFrame* ack_frame) { | 1272 QuicAckFrame* ack_frame) { |
| 1269 uint8_t num_received_packets; | 1273 uint8_t num_received_packets; |
| 1270 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1274 if (!reader->ReadUInt8(&num_received_packets)) { |
| 1271 set_detailed_error("Unable to read num received packets."); | 1275 set_detailed_error("Unable to read num received packets."); |
| 1272 return false; | 1276 return false; |
| 1273 } | 1277 } |
| 1274 | 1278 |
| 1275 if (num_received_packets > 0) { | 1279 if (num_received_packets > 0) { |
| 1276 uint8_t delta_from_largest_observed; | 1280 uint8_t delta_from_largest_observed; |
| 1277 if (!reader->ReadBytes(&delta_from_largest_observed, | 1281 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
| 1278 PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1279 set_detailed_error("Unable to read sequence delta in received packets."); | 1282 set_detailed_error("Unable to read sequence delta in received packets."); |
| 1280 return false; | 1283 return false; |
| 1281 } | 1284 } |
| 1282 QuicPacketNumber seq_num = | 1285 QuicPacketNumber seq_num = |
| 1283 ack_frame->largest_observed - delta_from_largest_observed; | 1286 ack_frame->largest_observed - delta_from_largest_observed; |
| 1284 | 1287 |
| 1285 // Time delta from the framer creation. | 1288 // Time delta from the framer creation. |
| 1286 uint32_t time_delta_us; | 1289 uint32_t time_delta_us; |
| 1287 if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1290 if (!reader->ReadUInt32(&time_delta_us)) { |
| 1288 set_detailed_error("Unable to read time delta in received packets."); | 1291 set_detailed_error("Unable to read time delta in received packets."); |
| 1289 return false; | 1292 return false; |
| 1290 } | 1293 } |
| 1291 | 1294 |
| 1292 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | 1295 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); |
| 1293 | 1296 |
| 1294 ack_frame->received_packet_times.reserve(num_received_packets); | 1297 ack_frame->received_packet_times.reserve(num_received_packets); |
| 1295 ack_frame->received_packet_times.push_back( | 1298 ack_frame->received_packet_times.push_back( |
| 1296 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1299 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
| 1297 | 1300 |
| 1298 for (uint8_t i = 1; i < num_received_packets; ++i) { | 1301 for (uint8_t i = 1; i < num_received_packets; ++i) { |
| 1299 if (!reader->ReadBytes(&delta_from_largest_observed, | 1302 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
| 1300 PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1301 set_detailed_error( | 1303 set_detailed_error( |
| 1302 "Unable to read sequence delta in received packets."); | 1304 "Unable to read sequence delta in received packets."); |
| 1303 return false; | 1305 return false; |
| 1304 } | 1306 } |
| 1305 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | 1307 seq_num = ack_frame->largest_observed - delta_from_largest_observed; |
| 1306 | 1308 |
| 1307 // Time delta from the previous timestamp. | 1309 // Time delta from the previous timestamp. |
| 1308 uint64_t incremental_time_delta_us; | 1310 uint64_t incremental_time_delta_us; |
| 1309 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { | 1311 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { |
| 1310 set_detailed_error( | 1312 set_detailed_error( |
| 1311 "Unable to read incremental time delta in received packets."); | 1313 "Unable to read incremental time delta in received packets."); |
| 1312 return false; | 1314 return false; |
| 1313 } | 1315 } |
| 1314 | 1316 |
| 1315 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( | 1317 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( |
| 1316 incremental_time_delta_us); | 1318 incremental_time_delta_us); |
| 1317 ack_frame->received_packet_times.push_back( | 1319 ack_frame->received_packet_times.push_back( |
| 1318 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1320 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
| 1319 } | 1321 } |
| 1320 } | 1322 } |
| 1321 return true; | 1323 return true; |
| 1322 } | 1324 } |
| 1323 | 1325 |
| 1324 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1326 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
| 1325 const QuicPacketHeader& header, | 1327 const QuicPacketHeader& header, |
| 1326 QuicStopWaitingFrame* stop_waiting) { | 1328 QuicStopWaitingFrame* stop_waiting) { |
| 1327 QuicPacketNumber least_unacked_delta = 0; | 1329 QuicPacketNumber least_unacked_delta = 0; |
| 1328 if (!reader->ReadBytes(&least_unacked_delta, | 1330 if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length, |
| 1329 header.public_header.packet_number_length)) { | 1331 &least_unacked_delta)) { |
| 1330 set_detailed_error("Unable to read least unacked delta."); | 1332 set_detailed_error("Unable to read least unacked delta."); |
| 1331 return false; | 1333 return false; |
| 1332 } | 1334 } |
| 1333 DCHECK_GE(header.packet_number, least_unacked_delta); | 1335 DCHECK_GE(header.packet_number, least_unacked_delta); |
| 1334 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1336 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
| 1335 | 1337 |
| 1336 return true; | 1338 return true; |
| 1337 } | 1339 } |
| 1338 | 1340 |
| 1339 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, | 1341 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1644 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1646 return 5 + 3 * (ack.received_packet_times.size() - 1); |
| 1645 } | 1647 } |
| 1646 | 1648 |
| 1647 size_t QuicFramer::GetAckFrameSize( | 1649 size_t QuicFramer::GetAckFrameSize( |
| 1648 const QuicAckFrame& ack, | 1650 const QuicAckFrame& ack, |
| 1649 QuicPacketNumberLength packet_number_length) { | 1651 QuicPacketNumberLength packet_number_length) { |
| 1650 size_t ack_size = 0; | 1652 size_t ack_size = 0; |
| 1651 | 1653 |
| 1652 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1654 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1653 QuicPacketNumberLength largest_acked_length = | 1655 QuicPacketNumberLength largest_acked_length = |
| 1654 GetMinSequenceNumberLength(ack.largest_observed); | 1656 GetMinPacketNumberLength(ack.largest_observed); |
| 1655 QuicPacketNumberLength ack_block_length = | 1657 QuicPacketNumberLength ack_block_length = |
| 1656 GetMinSequenceNumberLength(ack_info.max_block_length); | 1658 GetMinPacketNumberLength(ack_info.max_block_length); |
| 1657 | 1659 |
| 1658 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1660 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
| 1659 // First ack block length. | 1661 // First ack block length. |
| 1660 ack_size += ack_block_length; | 1662 ack_size += ack_block_length; |
| 1661 if (ack_info.num_ack_blocks != 0) { | 1663 if (ack_info.num_ack_blocks != 0) { |
| 1662 ack_size += kNumberOfAckBlocksSize; | 1664 ack_size += kNumberOfAckBlocksSize; |
| 1663 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * | 1665 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * |
| 1664 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 1666 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
| 1665 } | 1667 } |
| 1666 | 1668 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1750 break; | 1752 break; |
| 1751 default: | 1753 default: |
| 1752 type_byte = static_cast<uint8_t>(frame.type); | 1754 type_byte = static_cast<uint8_t>(frame.type); |
| 1753 break; | 1755 break; |
| 1754 } | 1756 } |
| 1755 | 1757 |
| 1756 return writer->WriteUInt8(type_byte); | 1758 return writer->WriteUInt8(type_byte); |
| 1757 } | 1759 } |
| 1758 | 1760 |
| 1759 // static | 1761 // static |
| 1760 bool QuicFramer::AppendPacketSequenceNumber( | 1762 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length, |
| 1761 QuicPacketNumberLength packet_number_length, | 1763 QuicPacketNumber packet_number, |
| 1762 QuicPacketNumber packet_number, | 1764 QuicDataWriter* writer) { |
| 1763 QuicDataWriter* writer) { | 1765 size_t length = packet_number_length; |
| 1764 // Ensure the entire packet number can be written. | 1766 if (length != 1 && length != 2 && length != 4 && length != 6) { |
| 1765 if (writer->capacity() - writer->length() < | 1767 QUIC_BUG << "Invalid packet_number_length: " << length; |
| 1766 static_cast<size_t>(packet_number_length)) { | |
| 1767 return false; | 1768 return false; |
| 1768 } | 1769 } |
| 1769 switch (packet_number_length) { | 1770 return writer->WriteBytesToUInt64(packet_number_length, packet_number); |
| 1770 case PACKET_1BYTE_PACKET_NUMBER: | |
| 1771 return writer->WriteUInt8(packet_number & k1ByteSequenceNumberMask); | |
| 1772 break; | |
| 1773 case PACKET_2BYTE_PACKET_NUMBER: | |
| 1774 return writer->WriteUInt16(packet_number & k2ByteSequenceNumberMask); | |
| 1775 break; | |
| 1776 case PACKET_4BYTE_PACKET_NUMBER: | |
| 1777 return writer->WriteUInt32(packet_number & k4ByteSequenceNumberMask); | |
| 1778 break; | |
| 1779 case PACKET_6BYTE_PACKET_NUMBER: | |
| 1780 return writer->WriteUInt48(packet_number & k6ByteSequenceNumberMask); | |
| 1781 break; | |
| 1782 default: | |
| 1783 DCHECK(false) << "packet_number_length: " << packet_number_length; | |
| 1784 return false; | |
| 1785 } | |
| 1786 } | 1771 } |
| 1787 | 1772 |
| 1788 // static | 1773 // static |
| 1774 bool QuicFramer::AppendStreamId(size_t stream_id_length, |
| 1775 QuicStreamId stream_id, |
| 1776 QuicDataWriter* writer) { |
| 1777 if (stream_id_length == 0 || stream_id_length > 4) { |
| 1778 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length; |
| 1779 return false; |
| 1780 } |
| 1781 return writer->WriteBytesToUInt64(stream_id_length, stream_id); |
| 1782 } |
| 1783 |
| 1784 // static |
| 1785 bool QuicFramer::AppendStreamOffset(size_t offset_length, |
| 1786 QuicStreamOffset offset, |
| 1787 QuicDataWriter* writer) { |
| 1788 if (offset_length == 1 || offset_length > 8) { |
| 1789 QUIC_BUG << "Invalid stream_offset_length: " << offset_length; |
| 1790 return false; |
| 1791 } |
| 1792 |
| 1793 return writer->WriteBytesToUInt64(offset_length, offset); |
| 1794 } |
| 1795 |
| 1796 // static |
| 1789 bool QuicFramer::AppendAckBlock(uint8_t gap, | 1797 bool QuicFramer::AppendAckBlock(uint8_t gap, |
| 1790 QuicPacketNumberLength length_length, | 1798 QuicPacketNumberLength length_length, |
| 1791 QuicPacketNumber length, | 1799 QuicPacketNumber length, |
| 1792 QuicDataWriter* writer) { | 1800 QuicDataWriter* writer) { |
| 1793 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && | 1801 return writer->WriteUInt8(gap) && |
| 1794 AppendPacketSequenceNumber(length_length, length, writer); | 1802 AppendPacketNumber(length_length, length, writer); |
| 1795 } | 1803 } |
| 1796 | 1804 |
| 1797 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1805 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
| 1798 bool no_stream_frame_length, | 1806 bool no_stream_frame_length, |
| 1799 QuicDataWriter* writer) { | 1807 QuicDataWriter* writer) { |
| 1800 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1808 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, |
| 1809 writer)) { |
| 1801 QUIC_BUG << "Writing stream id size failed."; | 1810 QUIC_BUG << "Writing stream id size failed."; |
| 1802 return false; | 1811 return false; |
| 1803 } | 1812 } |
| 1804 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1813 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, |
| 1814 writer)) { |
| 1805 QUIC_BUG << "Writing offset size failed."; | 1815 QUIC_BUG << "Writing offset size failed."; |
| 1806 return false; | 1816 return false; |
| 1807 } | 1817 } |
| 1808 if (!no_stream_frame_length) { | 1818 if (!no_stream_frame_length) { |
| 1809 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || | 1819 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || |
| 1810 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { | 1820 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { |
| 1811 QUIC_BUG << "Writing stream frame length failed"; | 1821 QUIC_BUG << "Writing stream frame length failed"; |
| 1812 return false; | 1822 return false; |
| 1813 } | 1823 } |
| 1814 } | 1824 } |
| 1815 | 1825 |
| 1816 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { | 1826 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { |
| 1817 QUIC_BUG << "Writing frame data failed."; | 1827 QUIC_BUG << "Writing frame data failed."; |
| 1818 return false; | 1828 return false; |
| 1819 } | 1829 } |
| 1820 return true; | 1830 return true; |
| 1821 } | 1831 } |
| 1822 | 1832 |
| 1823 void QuicFramer::set_version(const QuicVersion version) { | 1833 void QuicFramer::set_version(const QuicVersion version) { |
| 1824 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1834 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 1825 quic_version_ = version; | 1835 quic_version_ = version; |
| 1826 } | 1836 } |
| 1827 | 1837 |
| 1828 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, | 1838 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 1829 QuicDataWriter* writer) { | 1839 QuicDataWriter* writer) { |
| 1830 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); | 1840 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
| 1831 QuicPacketNumber largest_acked = frame.largest_observed; | 1841 QuicPacketNumber largest_acked = frame.largest_observed; |
| 1832 QuicPacketNumberLength largest_acked_length = | 1842 QuicPacketNumberLength largest_acked_length = |
| 1833 GetMinSequenceNumberLength(largest_acked); | 1843 GetMinPacketNumberLength(largest_acked); |
| 1834 QuicPacketNumberLength ack_block_length = | 1844 QuicPacketNumberLength ack_block_length = |
| 1835 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1845 GetMinPacketNumberLength(new_ack_info.max_block_length); |
| 1836 // Calculate available bytes for timestamps and ack blocks. | 1846 // Calculate available bytes for timestamps and ack blocks. |
| 1837 int32_t available_timestamp_and_ack_block_bytes = | 1847 int32_t available_timestamp_and_ack_block_bytes = |
| 1838 writer->capacity() - writer->length() - ack_block_length - | 1848 writer->capacity() - writer->length() - ack_block_length - |
| 1839 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1849 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
| 1840 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1850 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
| 1841 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); | 1851 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); |
| 1842 | 1852 |
| 1843 // Write out the type byte by setting the low order bits and doing shifts | 1853 // Write out the type byte by setting the low order bits and doing shifts |
| 1844 // to make room for the next bit flags to be set. | 1854 // to make room for the next bit flags to be set. |
| 1845 // Whether there are multiple ack blocks. | 1855 // Whether there are multiple ack blocks. |
| 1846 uint8_t type_byte = | 1856 uint8_t type_byte = |
| 1847 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; | 1857 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; |
| 1848 type_byte <<= kQuicHasMultipleAckBlocksShift; | 1858 type_byte <<= kQuicHasMultipleAckBlocksShift; |
| 1849 | 1859 |
| 1850 // Largest acked length. | 1860 // Largest acked length. |
| 1851 type_byte <<= kQuicSequenceNumberLengthShift; | 1861 type_byte <<= kQuicSequenceNumberLengthShift; |
| 1852 type_byte |= GetSequenceNumberFlags(largest_acked_length); | 1862 type_byte |= GetPacketNumberFlags(largest_acked_length); |
| 1853 | 1863 |
| 1854 // Ack block length. | 1864 // Ack block length. |
| 1855 type_byte <<= kQuicSequenceNumberLengthShift; | 1865 type_byte <<= kQuicSequenceNumberLengthShift; |
| 1856 type_byte |= GetSequenceNumberFlags(ack_block_length); | 1866 type_byte |= GetPacketNumberFlags(ack_block_length); |
| 1857 | 1867 |
| 1858 type_byte |= kQuicFrameTypeAckMask; | 1868 type_byte |= kQuicFrameTypeAckMask; |
| 1859 | 1869 |
| 1860 if (!writer->WriteUInt8(type_byte)) { | 1870 if (!writer->WriteUInt8(type_byte)) { |
| 1861 return false; | 1871 return false; |
| 1862 } | 1872 } |
| 1863 | 1873 |
| 1864 // Largest acked. | 1874 // Largest acked. |
| 1865 if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked, | 1875 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) { |
| 1866 writer)) { | |
| 1867 return false; | 1876 return false; |
| 1868 } | 1877 } |
| 1869 | 1878 |
| 1870 // Largest acked delta time. | 1879 // Largest acked delta time. |
| 1871 uint64_t ack_delay_time_us = kUFloat16MaxValue; | 1880 uint64_t ack_delay_time_us = kUFloat16MaxValue; |
| 1872 if (!frame.ack_delay_time.IsInfinite()) { | 1881 if (!frame.ack_delay_time.IsInfinite()) { |
| 1873 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | 1882 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); |
| 1874 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 1883 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
| 1875 } | 1884 } |
| 1876 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 1885 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1887 num_ack_blocks = std::numeric_limits<uint8_t>::max(); | 1896 num_ack_blocks = std::numeric_limits<uint8_t>::max(); |
| 1888 } | 1897 } |
| 1889 | 1898 |
| 1890 if (num_ack_blocks > 0) { | 1899 if (num_ack_blocks > 0) { |
| 1891 if (!writer->WriteBytes(&num_ack_blocks, 1)) { | 1900 if (!writer->WriteBytes(&num_ack_blocks, 1)) { |
| 1892 return false; | 1901 return false; |
| 1893 } | 1902 } |
| 1894 } | 1903 } |
| 1895 | 1904 |
| 1896 // First ack block length. | 1905 // First ack block length. |
| 1897 if (!AppendPacketSequenceNumber(ack_block_length, | 1906 if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length, |
| 1898 new_ack_info.first_block_length, writer)) { | 1907 writer)) { |
| 1899 return false; | 1908 return false; |
| 1900 } | 1909 } |
| 1901 | 1910 |
| 1902 // Ack blocks. | 1911 // Ack blocks. |
| 1903 if (num_ack_blocks > 0) { | 1912 if (num_ack_blocks > 0) { |
| 1904 size_t num_ack_blocks_written = 0; | 1913 size_t num_ack_blocks_written = 0; |
| 1905 // Append, in descending order from the largest ACKed packet, a series of | 1914 // Append, in descending order from the largest ACKed packet, a series of |
| 1906 // ACK blocks that represents the successfully acknoweldged packets. Each | 1915 // ACK blocks that represents the successfully acknoweldged packets. Each |
| 1907 // appended gap/block length represents a descending delta from the previous | 1916 // appended gap/block length represents a descending delta from the previous |
| 1908 // block. i.e.: | 1917 // block. i.e.: |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); | 2003 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); |
| 1995 QuicPacketNumber packet_number = it->first; | 2004 QuicPacketNumber packet_number = it->first; |
| 1996 QuicPacketNumber delta_from_largest_observed = | 2005 QuicPacketNumber delta_from_largest_observed = |
| 1997 frame.largest_observed - packet_number; | 2006 frame.largest_observed - packet_number; |
| 1998 | 2007 |
| 1999 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); | 2008 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); |
| 2000 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2009 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
| 2001 return false; | 2010 return false; |
| 2002 } | 2011 } |
| 2003 | 2012 |
| 2004 if (!writer->WriteUInt8(delta_from_largest_observed & | 2013 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
| 2005 k1ByteSequenceNumberMask)) { | |
| 2006 return false; | 2014 return false; |
| 2007 } | 2015 } |
| 2008 | 2016 |
| 2009 // Use the lowest 4 bytes of the time delta from the creation_time_. | 2017 // Use the lowest 4 bytes of the time delta from the creation_time_. |
| 2010 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; | 2018 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; |
| 2011 uint32_t time_delta_us = | 2019 uint32_t time_delta_us = |
| 2012 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & | 2020 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & |
| 2013 (time_epoch_delta_us - 1)); | 2021 (time_epoch_delta_us - 1)); |
| 2014 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2022 if (!writer->WriteUInt32(time_delta_us)) { |
| 2015 return false; | 2023 return false; |
| 2016 } | 2024 } |
| 2017 | 2025 |
| 2018 QuicTime prev_time = it->second; | 2026 QuicTime prev_time = it->second; |
| 2019 | 2027 |
| 2020 for (++it; it != frame.received_packet_times.end(); ++it) { | 2028 for (++it; it != frame.received_packet_times.end(); ++it) { |
| 2021 packet_number = it->first; | 2029 packet_number = it->first; |
| 2022 delta_from_largest_observed = frame.largest_observed - packet_number; | 2030 delta_from_largest_observed = frame.largest_observed - packet_number; |
| 2023 | 2031 |
| 2024 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2032 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
| 2025 return false; | 2033 return false; |
| 2026 } | 2034 } |
| 2027 | 2035 |
| 2028 if (!writer->WriteUInt8(delta_from_largest_observed & | 2036 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
| 2029 k1ByteSequenceNumberMask)) { | |
| 2030 return false; | 2037 return false; |
| 2031 } | 2038 } |
| 2032 | 2039 |
| 2033 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); | 2040 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); |
| 2034 prev_time = it->second; | 2041 prev_time = it->second; |
| 2035 if (!writer->WriteUFloat16(frame_time_delta_us)) { | 2042 if (!writer->WriteUFloat16(frame_time_delta_us)) { |
| 2036 return false; | 2043 return false; |
| 2037 } | 2044 } |
| 2038 } | 2045 } |
| 2039 return true; | 2046 return true; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2050 | 2057 |
| 2051 if (least_unacked_delta >> length_shift > 0) { | 2058 if (least_unacked_delta >> length_shift > 0) { |
| 2052 QUIC_BUG << "packet_number_length " | 2059 QUIC_BUG << "packet_number_length " |
| 2053 << header.public_header.packet_number_length | 2060 << header.public_header.packet_number_length |
| 2054 << " is too small for least_unacked_delta: " << least_unacked_delta | 2061 << " is too small for least_unacked_delta: " << least_unacked_delta |
| 2055 << " packet_number:" << header.packet_number | 2062 << " packet_number:" << header.packet_number |
| 2056 << " least_unacked:" << frame.least_unacked | 2063 << " least_unacked:" << frame.least_unacked |
| 2057 << " version:" << quic_version_; | 2064 << " version:" << quic_version_; |
| 2058 return false; | 2065 return false; |
| 2059 } | 2066 } |
| 2060 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 2067 if (!AppendPacketNumber(header.public_header.packet_number_length, |
| 2061 least_unacked_delta, writer)) { | 2068 least_unacked_delta, writer)) { |
| 2062 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; | 2069 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; |
| 2063 return false; | 2070 return false; |
| 2064 } | 2071 } |
| 2065 | 2072 |
| 2066 return true; | 2073 return true; |
| 2067 } | 2074 } |
| 2068 | 2075 |
| 2069 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, | 2076 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
| 2070 QuicDataWriter* writer) { | 2077 QuicDataWriter* writer) { |
| 2071 if (!writer->WriteUInt32(frame.stream_id)) { | 2078 if (!writer->WriteUInt32(frame.stream_id)) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2154 } | 2161 } |
| 2155 | 2162 |
| 2156 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2163 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2157 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2164 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2158 << " detail: " << detailed_error_; | 2165 << " detail: " << detailed_error_; |
| 2159 set_error(error); | 2166 set_error(error); |
| 2160 visitor_->OnError(this); | 2167 visitor_->OnError(this); |
| 2161 return false; | 2168 return false; |
| 2162 } | 2169 } |
| 2163 | 2170 |
| 2171 Endianness QuicFramer::endianness() const { |
| 2172 return quic_version_ > QUIC_VERSION_38 ? NETWORK_BYTE_ORDER : HOST_BYTE_ORDER; |
| 2173 } |
| 2174 |
| 2164 } // namespace net | 2175 } // namespace net |
| OLD | NEW |