| 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_, HOST_BYTE_ORDER); |
| 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 429 return nullptr; | 423 return nullptr; |
| 430 } | 424 } |
| 431 reset.SetStringPiece(kCADR, serialized_address); | 425 reset.SetStringPiece(kCADR, serialized_address); |
| 432 } | 426 } |
| 433 const QuicData& reset_serialized = | 427 const QuicData& reset_serialized = |
| 434 reset.GetSerialized(Perspective::IS_SERVER); | 428 reset.GetSerialized(Perspective::IS_SERVER); |
| 435 | 429 |
| 436 size_t len = | 430 size_t len = |
| 437 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); | 431 kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length(); |
| 438 std::unique_ptr<char[]> buffer(new char[len]); | 432 std::unique_ptr<char[]> buffer(new char[len]); |
| 439 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 433 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 434 HOST_BYTE_ORDER); |
| 440 | 435 |
| 441 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | | 436 uint8_t flags = static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_RST | |
| 442 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); | 437 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID); |
| 443 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { | 438 if (FLAGS_quic_reloadable_flag_quic_use_old_public_reset_packets) { |
| 444 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 439 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
| 445 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 440 flags |= static_cast<uint8_t>(PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
| 446 } | 441 } |
| 447 if (!writer.WriteUInt8(flags)) { | 442 if (!writer.WriteUInt8(flags)) { |
| 448 return nullptr; | 443 return nullptr; |
| 449 } | 444 } |
| 450 | 445 |
| 451 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { | 446 if (!writer.WriteConnectionId(packet.public_header.connection_id)) { |
| 452 return nullptr; | 447 return nullptr; |
| 453 } | 448 } |
| 454 | 449 |
| 455 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { | 450 if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) { |
| 456 return nullptr; | 451 return nullptr; |
| 457 } | 452 } |
| 458 | 453 |
| 459 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 454 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
| 460 } | 455 } |
| 461 | 456 |
| 462 // static | 457 // static |
| 463 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( | 458 std::unique_ptr<QuicEncryptedPacket> QuicFramer::BuildVersionNegotiationPacket( |
| 464 QuicConnectionId connection_id, | 459 QuicConnectionId connection_id, |
| 465 const QuicVersionVector& versions) { | 460 const QuicVersionVector& versions) { |
| 466 DCHECK(!versions.empty()); | 461 DCHECK(!versions.empty()); |
| 467 size_t len = GetVersionNegotiationPacketSize(versions.size()); | 462 size_t len = GetVersionNegotiationPacketSize(versions.size()); |
| 468 std::unique_ptr<char[]> buffer(new char[len]); | 463 std::unique_ptr<char[]> buffer(new char[len]); |
| 469 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER); | 464 QuicDataWriter writer(len, buffer.get(), Perspective::IS_SERVER, |
| 465 HOST_BYTE_ORDER); |
| 470 | 466 |
| 471 uint8_t flags = static_cast<uint8_t>( | 467 uint8_t flags = static_cast<uint8_t>( |
| 472 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | | 468 PACKET_PUBLIC_FLAGS_VERSION | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID | |
| 473 // TODO(rch): Remove this QUIC_VERSION_32 is retired. | 469 // TODO(rch): Remove this QUIC_VERSION_32 is retired. |
| 474 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); | 470 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD); |
| 475 if (!writer.WriteUInt8(flags)) { | 471 if (!writer.WriteUInt8(flags)) { |
| 476 return nullptr; | 472 return nullptr; |
| 477 } | 473 } |
| 478 | 474 |
| 479 if (!writer.WriteConnectionId(connection_id)) { | 475 if (!writer.WriteConnectionId(connection_id)) { |
| 480 return nullptr; | 476 return nullptr; |
| 481 } | 477 } |
| 482 | 478 |
| 483 for (QuicVersion version : versions) { | 479 for (QuicVersion version : versions) { |
| 484 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { | 480 if (!writer.WriteTag(QuicVersionToQuicTag(version))) { |
| 485 return nullptr; | 481 return nullptr; |
| 486 } | 482 } |
| 487 } | 483 } |
| 488 | 484 |
| 489 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); | 485 return QuicMakeUnique<QuicEncryptedPacket>(buffer.release(), len, true); |
| 490 } | 486 } |
| 491 | 487 |
| 492 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { | 488 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) { |
| 493 QuicDataReader reader(packet.data(), packet.length(), perspective_); | 489 QuicDataReader reader(packet.data(), packet.length(), perspective_, |
| 490 HOST_BYTE_ORDER); |
| 494 | 491 |
| 495 visitor_->OnPacket(); | 492 visitor_->OnPacket(); |
| 496 | 493 |
| 497 // First parse the public header. | 494 // First parse the public header. |
| 498 QuicPacketPublicHeader public_header; | 495 QuicPacketPublicHeader public_header; |
| 499 if (!ProcessPublicHeader(&reader, &public_header)) { | 496 if (!ProcessPublicHeader(&reader, &public_header)) { |
| 500 DCHECK_NE("", detailed_error_); | 497 DCHECK_NE("", detailed_error_); |
| 501 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " | 498 QUIC_DVLOG(1) << ENDPOINT << "Unable to process public header. Error: " |
| 502 << detailed_error_; | 499 << detailed_error_; |
| 503 DCHECK_NE("", detailed_error_); | 500 DCHECK_NE("", detailed_error_); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 return false; | 568 return false; |
| 572 } | 569 } |
| 573 | 570 |
| 574 size_t decrypted_length = 0; | 571 size_t decrypted_length = 0; |
| 575 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 572 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
| 576 buffer_length, &decrypted_length)) { | 573 buffer_length, &decrypted_length)) { |
| 577 set_detailed_error("Unable to decrypt payload."); | 574 set_detailed_error("Unable to decrypt payload."); |
| 578 return RaiseError(QUIC_DECRYPTION_FAILURE); | 575 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 579 } | 576 } |
| 580 | 577 |
| 581 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_); | 578 QuicDataReader reader(decrypted_buffer, decrypted_length, perspective_, |
| 579 HOST_BYTE_ORDER); |
| 582 | 580 |
| 583 // Set the last packet number after we have decrypted the packet | 581 // Set the last packet number after we have decrypted the packet |
| 584 // so we are confident is not attacker controlled. | 582 // so we are confident is not attacker controlled. |
| 585 SetLastPacketNumber(header); | 583 SetLastPacketNumber(header); |
| 586 | 584 |
| 587 if (!visitor_->OnPacketHeader(header)) { | 585 if (!visitor_->OnPacketHeader(header)) { |
| 588 // The visitor suppresses further processing of the packet. | 586 // The visitor suppresses further processing of the packet. |
| 589 return true; | 587 return true; |
| 590 } | 588 } |
| 591 | 589 |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 public_flags |= PACKET_PUBLIC_FLAGS_RST; | 649 public_flags |= PACKET_PUBLIC_FLAGS_RST; |
| 652 } | 650 } |
| 653 if (header.public_header.version_flag) { | 651 if (header.public_header.version_flag) { |
| 654 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; | 652 public_flags |= PACKET_PUBLIC_FLAGS_VERSION; |
| 655 } | 653 } |
| 656 if (header.public_header.multipath_flag) { | 654 if (header.public_header.multipath_flag) { |
| 657 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; | 655 public_flags |= PACKET_PUBLIC_FLAGS_MULTIPATH; |
| 658 } | 656 } |
| 659 | 657 |
| 660 public_flags |= | 658 public_flags |= |
| 661 GetSequenceNumberFlags(header.public_header.packet_number_length) | 659 GetPacketNumberFlags(header.public_header.packet_number_length) |
| 662 << kPublicHeaderSequenceNumberShift; | 660 << kPublicHeaderSequenceNumberShift; |
| 663 | 661 |
| 664 if (header.public_header.nonce != nullptr) { | 662 if (header.public_header.nonce != nullptr) { |
| 665 DCHECK_EQ(Perspective::IS_SERVER, perspective_); | 663 DCHECK_EQ(Perspective::IS_SERVER, perspective_); |
| 666 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; | 664 public_flags |= PACKET_PUBLIC_FLAGS_NONCE; |
| 667 } | 665 } |
| 668 | 666 |
| 669 switch (header.public_header.connection_id_length) { | 667 switch (header.public_header.connection_id_length) { |
| 670 case PACKET_0BYTE_CONNECTION_ID: | 668 case PACKET_0BYTE_CONNECTION_ID: |
| 671 if (!writer->WriteUInt8(public_flags | | 669 if (!writer->WriteUInt8(public_flags | |
| (...skipping 24 matching lines...) Expand all Loading... |
| 696 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" | 694 QUIC_DVLOG(1) << ENDPOINT << "version = " << quic_version_ << ", tag = '" |
| 697 << QuicTagToString(tag) << "'"; | 695 << QuicTagToString(tag) << "'"; |
| 698 } | 696 } |
| 699 | 697 |
| 700 if (header.public_header.nonce != nullptr && | 698 if (header.public_header.nonce != nullptr && |
| 701 !writer->WriteBytes(header.public_header.nonce, | 699 !writer->WriteBytes(header.public_header.nonce, |
| 702 kDiversificationNonceSize)) { | 700 kDiversificationNonceSize)) { |
| 703 return false; | 701 return false; |
| 704 } | 702 } |
| 705 | 703 |
| 706 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 704 if (!AppendPacketNumber(header.public_header.packet_number_length, |
| 707 header.packet_number, writer)) { | 705 header.packet_number, writer)) { |
| 708 return false; | 706 return false; |
| 709 } | 707 } |
| 710 | 708 |
| 711 return true; | 709 return true; |
| 712 } | 710 } |
| 713 | 711 |
| 714 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 712 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
| 715 uint32_t time_delta_us) { | 713 uint32_t time_delta_us) { |
| 716 // The new time_delta might have wrapped to the next epoch, or it | 714 // 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 | 715 // 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 } | 851 } |
| 854 public_header->nonce = &last_nonce_; | 852 public_header->nonce = &last_nonce_; |
| 855 } else { | 853 } else { |
| 856 public_header->nonce = nullptr; | 854 public_header->nonce = nullptr; |
| 857 } | 855 } |
| 858 | 856 |
| 859 return true; | 857 return true; |
| 860 } | 858 } |
| 861 | 859 |
| 862 // static | 860 // static |
| 863 QuicPacketNumberLength QuicFramer::GetMinSequenceNumberLength( | 861 QuicPacketNumberLength QuicFramer::GetMinPacketNumberLength( |
| 864 QuicPacketNumber packet_number) { | 862 QuicPacketNumber packet_number) { |
| 865 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { | 863 if (packet_number < 1 << (PACKET_1BYTE_PACKET_NUMBER * 8)) { |
| 866 return PACKET_1BYTE_PACKET_NUMBER; | 864 return PACKET_1BYTE_PACKET_NUMBER; |
| 867 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { | 865 } else if (packet_number < 1 << (PACKET_2BYTE_PACKET_NUMBER * 8)) { |
| 868 return PACKET_2BYTE_PACKET_NUMBER; | 866 return PACKET_2BYTE_PACKET_NUMBER; |
| 869 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { | 867 } else if (packet_number < UINT64_C(1) << (PACKET_4BYTE_PACKET_NUMBER * 8)) { |
| 870 return PACKET_4BYTE_PACKET_NUMBER; | 868 return PACKET_4BYTE_PACKET_NUMBER; |
| 871 } else { | 869 } else { |
| 872 return PACKET_6BYTE_PACKET_NUMBER; | 870 return PACKET_6BYTE_PACKET_NUMBER; |
| 873 } | 871 } |
| 874 } | 872 } |
| 875 | 873 |
| 876 // static | 874 // static |
| 877 uint8_t QuicFramer::GetSequenceNumberFlags( | 875 uint8_t QuicFramer::GetPacketNumberFlags( |
| 878 QuicPacketNumberLength packet_number_length) { | 876 QuicPacketNumberLength packet_number_length) { |
| 879 switch (packet_number_length) { | 877 switch (packet_number_length) { |
| 880 case PACKET_1BYTE_PACKET_NUMBER: | 878 case PACKET_1BYTE_PACKET_NUMBER: |
| 881 return PACKET_FLAGS_1BYTE_PACKET; | 879 return PACKET_FLAGS_1BYTE_PACKET; |
| 882 case PACKET_2BYTE_PACKET_NUMBER: | 880 case PACKET_2BYTE_PACKET_NUMBER: |
| 883 return PACKET_FLAGS_2BYTE_PACKET; | 881 return PACKET_FLAGS_2BYTE_PACKET; |
| 884 case PACKET_4BYTE_PACKET_NUMBER: | 882 case PACKET_4BYTE_PACKET_NUMBER: |
| 885 return PACKET_FLAGS_4BYTE_PACKET; | 883 return PACKET_FLAGS_4BYTE_PACKET; |
| 886 case PACKET_6BYTE_PACKET_NUMBER: | 884 case PACKET_6BYTE_PACKET_NUMBER: |
| 887 return PACKET_FLAGS_6BYTE_PACKET; | 885 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 = | 917 new_ack_info.max_block_length = |
| 920 std::max(new_ack_info.max_block_length, interval.Length()); | 918 std::max(new_ack_info.max_block_length, interval.Length()); |
| 921 } | 919 } |
| 922 return new_ack_info; | 920 return new_ack_info; |
| 923 } | 921 } |
| 924 | 922 |
| 925 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 923 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
| 926 QuicPacketHeader* header) { | 924 QuicPacketHeader* header) { |
| 927 QuicPacketNumber base_packet_number = largest_packet_number_; | 925 QuicPacketNumber base_packet_number = largest_packet_number_; |
| 928 | 926 |
| 929 if (!ProcessPacketSequenceNumber( | 927 if (!ProcessAndCalculatePacketNumber( |
| 930 encrypted_reader, header->public_header.packet_number_length, | 928 encrypted_reader, header->public_header.packet_number_length, |
| 931 base_packet_number, &header->packet_number)) { | 929 base_packet_number, &header->packet_number)) { |
| 932 set_detailed_error("Unable to read packet number."); | 930 set_detailed_error("Unable to read packet number."); |
| 933 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 931 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 934 } | 932 } |
| 935 | 933 |
| 936 if (header->packet_number == 0u) { | 934 if (header->packet_number == 0u) { |
| 937 set_detailed_error("packet numbers cannot be 0."); | 935 set_detailed_error("packet numbers cannot be 0."); |
| 938 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 936 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 939 } | 937 } |
| 940 | 938 |
| 941 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 939 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 942 set_detailed_error( | 940 set_detailed_error( |
| 943 "Visitor asked to stop processing of unauthenticated header."); | 941 "Visitor asked to stop processing of unauthenticated header."); |
| 944 return false; | 942 return false; |
| 945 } | 943 } |
| 946 return true; | 944 return true; |
| 947 } | 945 } |
| 948 | 946 |
| 949 bool QuicFramer::ProcessPacketSequenceNumber( | 947 bool QuicFramer::ProcessAndCalculatePacketNumber( |
| 950 QuicDataReader* reader, | 948 QuicDataReader* reader, |
| 951 QuicPacketNumberLength packet_number_length, | 949 QuicPacketNumberLength packet_number_length, |
| 952 QuicPacketNumber base_packet_number, | 950 QuicPacketNumber base_packet_number, |
| 953 QuicPacketNumber* packet_number) { | 951 QuicPacketNumber* packet_number) { |
| 954 QuicPacketNumber wire_packet_number = 0u; | 952 QuicPacketNumber wire_packet_number = 0u; |
| 955 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { | 953 if (!reader->ReadBytesToUInt64(packet_number_length, &wire_packet_number)) { |
| 956 return false; | 954 return false; |
| 957 } | 955 } |
| 958 | 956 |
| 959 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers | 957 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
| 960 // in case the first guess is incorrect. | 958 // in case the first guess is incorrect. |
| 961 *packet_number = CalculatePacketNumberFromWire( | 959 *packet_number = CalculatePacketNumberFromWire( |
| 962 packet_number_length, base_packet_number, wire_packet_number); | 960 packet_number_length, base_packet_number, wire_packet_number); |
| 963 return true; | 961 return true; |
| 964 } | 962 } |
| 965 | 963 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 offset_length += 1; | 1148 offset_length += 1; |
| 1151 } | 1149 } |
| 1152 stream_flags >>= kQuicStreamOffsetShift; | 1150 stream_flags >>= kQuicStreamOffsetShift; |
| 1153 | 1151 |
| 1154 bool has_data_length = | 1152 bool has_data_length = |
| 1155 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; | 1153 (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask; |
| 1156 stream_flags >>= kQuicStreamDataLengthShift; | 1154 stream_flags >>= kQuicStreamDataLengthShift; |
| 1157 | 1155 |
| 1158 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; | 1156 frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift; |
| 1159 | 1157 |
| 1160 frame->stream_id = 0; | 1158 uint64_t stream_id = 0; |
| 1161 if (!reader->ReadBytes(&frame->stream_id, stream_id_length)) { | 1159 if (!reader->ReadBytesToUInt64(stream_id_length, &stream_id)) { |
| 1162 set_detailed_error("Unable to read stream_id."); | 1160 set_detailed_error("Unable to read stream_id."); |
| 1163 return false; | 1161 return false; |
| 1164 } | 1162 } |
| 1163 frame->stream_id = static_cast<QuicStreamId>(stream_id); |
| 1165 | 1164 |
| 1166 frame->offset = 0; | 1165 frame->offset = 0; |
| 1167 if (!reader->ReadBytes(&frame->offset, offset_length)) { | 1166 if (!reader->ReadBytesToUInt64(offset_length, &frame->offset)) { |
| 1168 set_detailed_error("Unable to read offset."); | 1167 set_detailed_error("Unable to read offset."); |
| 1169 return false; | 1168 return false; |
| 1170 } | 1169 } |
| 1171 | 1170 |
| 1172 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. | 1171 // TODO(ianswett): Don't use QuicStringPiece as an intermediary. |
| 1173 QuicStringPiece data; | 1172 QuicStringPiece data; |
| 1174 if (has_data_length) { | 1173 if (has_data_length) { |
| 1175 if (!reader->ReadStringPiece16(&data)) { | 1174 if (!reader->ReadStringPiece16(&data)) { |
| 1176 set_detailed_error("Unable to read frame data."); | 1175 set_detailed_error("Unable to read frame data."); |
| 1177 return false; | 1176 return false; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1195 // ack block length. | 1194 // ack block length. |
| 1196 const QuicPacketNumberLength ack_block_length = | 1195 const QuicPacketNumberLength ack_block_length = |
| 1197 ReadSequenceNumberLength(frame_type); | 1196 ReadSequenceNumberLength(frame_type); |
| 1198 frame_type >>= kQuicSequenceNumberLengthShift; | 1197 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1199 const QuicPacketNumberLength largest_acked_length = | 1198 const QuicPacketNumberLength largest_acked_length = |
| 1200 ReadSequenceNumberLength(frame_type); | 1199 ReadSequenceNumberLength(frame_type); |
| 1201 frame_type >>= kQuicSequenceNumberLengthShift; | 1200 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1202 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1201 frame_type >>= kQuicHasMultipleAckBlocksShift; |
| 1203 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1202 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
| 1204 | 1203 |
| 1205 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1204 if (!reader->ReadBytesToUInt64(largest_acked_length, |
| 1205 &ack_frame->largest_observed)) { |
| 1206 set_detailed_error("Unable to read largest acked."); | 1206 set_detailed_error("Unable to read largest acked."); |
| 1207 return false; | 1207 return false; |
| 1208 } | 1208 } |
| 1209 | 1209 |
| 1210 uint64_t ack_delay_time_us; | 1210 uint64_t ack_delay_time_us; |
| 1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1211 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
| 1212 set_detailed_error("Unable to read ack delay time."); | 1212 set_detailed_error("Unable to read ack delay time."); |
| 1213 return false; | 1213 return false; |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 if (ack_delay_time_us == kUFloat16MaxValue) { | 1216 if (ack_delay_time_us == kUFloat16MaxValue) { |
| 1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | 1217 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); |
| 1218 } else { | 1218 } else { |
| 1219 ack_frame->ack_delay_time = | 1219 ack_frame->ack_delay_time = |
| 1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | 1220 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); |
| 1221 } | 1221 } |
| 1222 | 1222 |
| 1223 uint8_t num_ack_blocks = 0; | 1223 uint8_t num_ack_blocks = 0; |
| 1224 if (has_ack_blocks) { | 1224 if (has_ack_blocks) { |
| 1225 if (!reader->ReadBytes(&num_ack_blocks, 1)) { | 1225 if (!reader->ReadUInt8(&num_ack_blocks)) { |
| 1226 set_detailed_error("Unable to read num of ack blocks."); | 1226 set_detailed_error("Unable to read num of ack blocks."); |
| 1227 return false; | 1227 return false; |
| 1228 } | 1228 } |
| 1229 } | 1229 } |
| 1230 | 1230 |
| 1231 size_t first_block_length = 0; | 1231 uint64_t first_block_length = 0; |
| 1232 if (!reader->ReadBytes(&first_block_length, ack_block_length)) { | 1232 if (!reader->ReadBytesToUInt64(ack_block_length, &first_block_length)) { |
| 1233 set_detailed_error("Unable to read first ack block length."); | 1233 set_detailed_error("Unable to read first ack block length."); |
| 1234 return false; | 1234 return false; |
| 1235 } | 1235 } |
| 1236 QuicPacketNumber first_received = | 1236 QuicPacketNumber first_received = |
| 1237 ack_frame->largest_observed + 1 - first_block_length; | 1237 ack_frame->largest_observed + 1 - first_block_length; |
| 1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); | 1238 ack_frame->packets.Add(first_received, ack_frame->largest_observed + 1); |
| 1239 | 1239 |
| 1240 if (num_ack_blocks > 0) { | 1240 if (num_ack_blocks > 0) { |
| 1241 for (size_t i = 0; i < num_ack_blocks; ++i) { | 1241 for (size_t i = 0; i < num_ack_blocks; ++i) { |
| 1242 size_t gap = 0; | 1242 uint8_t gap = 0; |
| 1243 if (!reader->ReadBytes(&gap, PACKET_1BYTE_PACKET_NUMBER)) { | 1243 if (!reader->ReadUInt8(&gap)) { |
| 1244 set_detailed_error("Unable to read gap to next ack block."); | 1244 set_detailed_error("Unable to read gap to next ack block."); |
| 1245 return false; | 1245 return false; |
| 1246 } | 1246 } |
| 1247 size_t current_block_length = 0; | 1247 uint64_t current_block_length = 0; |
| 1248 if (!reader->ReadBytes(¤t_block_length, ack_block_length)) { | 1248 if (!reader->ReadBytesToUInt64(ack_block_length, ¤t_block_length)) { |
| 1249 set_detailed_error("Unable to ack block length."); | 1249 set_detailed_error("Unable to ack block length."); |
| 1250 return false; | 1250 return false; |
| 1251 } | 1251 } |
| 1252 first_received -= (gap + current_block_length); | 1252 first_received -= (gap + current_block_length); |
| 1253 if (current_block_length > 0) { | 1253 if (current_block_length > 0) { |
| 1254 ack_frame->packets.Add(first_received, | 1254 ack_frame->packets.Add(first_received, |
| 1255 first_received + current_block_length); | 1255 first_received + current_block_length); |
| 1256 } | 1256 } |
| 1257 } | 1257 } |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1260 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
| 1261 return false; | 1261 return false; |
| 1262 } | 1262 } |
| 1263 | 1263 |
| 1264 return true; | 1264 return true; |
| 1265 } | 1265 } |
| 1266 | 1266 |
| 1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1267 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
| 1268 QuicAckFrame* ack_frame) { | 1268 QuicAckFrame* ack_frame) { |
| 1269 uint8_t num_received_packets; | 1269 uint8_t num_received_packets; |
| 1270 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1270 if (!reader->ReadUInt8(&num_received_packets)) { |
| 1271 set_detailed_error("Unable to read num received packets."); | 1271 set_detailed_error("Unable to read num received packets."); |
| 1272 return false; | 1272 return false; |
| 1273 } | 1273 } |
| 1274 | 1274 |
| 1275 if (num_received_packets > 0) { | 1275 if (num_received_packets > 0) { |
| 1276 uint8_t delta_from_largest_observed; | 1276 uint8_t delta_from_largest_observed; |
| 1277 if (!reader->ReadBytes(&delta_from_largest_observed, | 1277 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
| 1278 PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1279 set_detailed_error("Unable to read sequence delta in received packets."); | 1278 set_detailed_error("Unable to read sequence delta in received packets."); |
| 1280 return false; | 1279 return false; |
| 1281 } | 1280 } |
| 1282 QuicPacketNumber seq_num = | 1281 QuicPacketNumber seq_num = |
| 1283 ack_frame->largest_observed - delta_from_largest_observed; | 1282 ack_frame->largest_observed - delta_from_largest_observed; |
| 1284 | 1283 |
| 1285 // Time delta from the framer creation. | 1284 // Time delta from the framer creation. |
| 1286 uint32_t time_delta_us; | 1285 uint32_t time_delta_us; |
| 1287 if (!reader->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | 1286 if (!reader->ReadUInt32(&time_delta_us)) { |
| 1288 set_detailed_error("Unable to read time delta in received packets."); | 1287 set_detailed_error("Unable to read time delta in received packets."); |
| 1289 return false; | 1288 return false; |
| 1290 } | 1289 } |
| 1291 | 1290 |
| 1292 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); | 1291 last_timestamp_ = CalculateTimestampFromWire(time_delta_us); |
| 1293 | 1292 |
| 1294 ack_frame->received_packet_times.reserve(num_received_packets); | 1293 ack_frame->received_packet_times.reserve(num_received_packets); |
| 1295 ack_frame->received_packet_times.push_back( | 1294 ack_frame->received_packet_times.push_back( |
| 1296 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1295 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
| 1297 | 1296 |
| 1298 for (uint8_t i = 1; i < num_received_packets; ++i) { | 1297 for (uint8_t i = 1; i < num_received_packets; ++i) { |
| 1299 if (!reader->ReadBytes(&delta_from_largest_observed, | 1298 if (!reader->ReadUInt8(&delta_from_largest_observed)) { |
| 1300 PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1301 set_detailed_error( | 1299 set_detailed_error( |
| 1302 "Unable to read sequence delta in received packets."); | 1300 "Unable to read sequence delta in received packets."); |
| 1303 return false; | 1301 return false; |
| 1304 } | 1302 } |
| 1305 seq_num = ack_frame->largest_observed - delta_from_largest_observed; | 1303 seq_num = ack_frame->largest_observed - delta_from_largest_observed; |
| 1306 | 1304 |
| 1307 // Time delta from the previous timestamp. | 1305 // Time delta from the previous timestamp. |
| 1308 uint64_t incremental_time_delta_us; | 1306 uint64_t incremental_time_delta_us; |
| 1309 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { | 1307 if (!reader->ReadUFloat16(&incremental_time_delta_us)) { |
| 1310 set_detailed_error( | 1308 set_detailed_error( |
| 1311 "Unable to read incremental time delta in received packets."); | 1309 "Unable to read incremental time delta in received packets."); |
| 1312 return false; | 1310 return false; |
| 1313 } | 1311 } |
| 1314 | 1312 |
| 1315 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( | 1313 last_timestamp_ = last_timestamp_ + QuicTime::Delta::FromMicroseconds( |
| 1316 incremental_time_delta_us); | 1314 incremental_time_delta_us); |
| 1317 ack_frame->received_packet_times.push_back( | 1315 ack_frame->received_packet_times.push_back( |
| 1318 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1316 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
| 1319 } | 1317 } |
| 1320 } | 1318 } |
| 1321 return true; | 1319 return true; |
| 1322 } | 1320 } |
| 1323 | 1321 |
| 1324 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1322 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
| 1325 const QuicPacketHeader& header, | 1323 const QuicPacketHeader& header, |
| 1326 QuicStopWaitingFrame* stop_waiting) { | 1324 QuicStopWaitingFrame* stop_waiting) { |
| 1327 QuicPacketNumber least_unacked_delta = 0; | 1325 QuicPacketNumber least_unacked_delta = 0; |
| 1328 if (!reader->ReadBytes(&least_unacked_delta, | 1326 if (!reader->ReadBytesToUInt64(header.public_header.packet_number_length, |
| 1329 header.public_header.packet_number_length)) { | 1327 &least_unacked_delta)) { |
| 1330 set_detailed_error("Unable to read least unacked delta."); | 1328 set_detailed_error("Unable to read least unacked delta."); |
| 1331 return false; | 1329 return false; |
| 1332 } | 1330 } |
| 1333 DCHECK_GE(header.packet_number, least_unacked_delta); | 1331 DCHECK_GE(header.packet_number, least_unacked_delta); |
| 1334 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1332 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
| 1335 | 1333 |
| 1336 return true; | 1334 return true; |
| 1337 } | 1335 } |
| 1338 | 1336 |
| 1339 bool QuicFramer::ProcessRstStreamFrame(QuicDataReader* reader, | 1337 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); | 1642 return 5 + 3 * (ack.received_packet_times.size() - 1); |
| 1645 } | 1643 } |
| 1646 | 1644 |
| 1647 size_t QuicFramer::GetAckFrameSize( | 1645 size_t QuicFramer::GetAckFrameSize( |
| 1648 const QuicAckFrame& ack, | 1646 const QuicAckFrame& ack, |
| 1649 QuicPacketNumberLength packet_number_length) { | 1647 QuicPacketNumberLength packet_number_length) { |
| 1650 size_t ack_size = 0; | 1648 size_t ack_size = 0; |
| 1651 | 1649 |
| 1652 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1650 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1653 QuicPacketNumberLength largest_acked_length = | 1651 QuicPacketNumberLength largest_acked_length = |
| 1654 GetMinSequenceNumberLength(ack.largest_observed); | 1652 GetMinPacketNumberLength(ack.largest_observed); |
| 1655 QuicPacketNumberLength ack_block_length = | 1653 QuicPacketNumberLength ack_block_length = |
| 1656 GetMinSequenceNumberLength(ack_info.max_block_length); | 1654 GetMinPacketNumberLength(ack_info.max_block_length); |
| 1657 | 1655 |
| 1658 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1656 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
| 1659 // First ack block length. | 1657 // First ack block length. |
| 1660 ack_size += ack_block_length; | 1658 ack_size += ack_block_length; |
| 1661 if (ack_info.num_ack_blocks != 0) { | 1659 if (ack_info.num_ack_blocks != 0) { |
| 1662 ack_size += kNumberOfAckBlocksSize; | 1660 ack_size += kNumberOfAckBlocksSize; |
| 1663 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * | 1661 ack_size += std::min(ack_info.num_ack_blocks, kMaxAckBlocks) * |
| 1664 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); | 1662 (ack_block_length + PACKET_1BYTE_PACKET_NUMBER); |
| 1665 } | 1663 } |
| 1666 | 1664 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1750 break; | 1748 break; |
| 1751 default: | 1749 default: |
| 1752 type_byte = static_cast<uint8_t>(frame.type); | 1750 type_byte = static_cast<uint8_t>(frame.type); |
| 1753 break; | 1751 break; |
| 1754 } | 1752 } |
| 1755 | 1753 |
| 1756 return writer->WriteUInt8(type_byte); | 1754 return writer->WriteUInt8(type_byte); |
| 1757 } | 1755 } |
| 1758 | 1756 |
| 1759 // static | 1757 // static |
| 1760 bool QuicFramer::AppendPacketSequenceNumber( | 1758 bool QuicFramer::AppendPacketNumber(QuicPacketNumberLength packet_number_length, |
| 1761 QuicPacketNumberLength packet_number_length, | 1759 QuicPacketNumber packet_number, |
| 1762 QuicPacketNumber packet_number, | 1760 QuicDataWriter* writer) { |
| 1763 QuicDataWriter* writer) { | 1761 size_t length = packet_number_length; |
| 1764 // Ensure the entire packet number can be written. | 1762 if (length != 1 && length != 2 && length != 4 && length != 6) { |
| 1765 if (writer->capacity() - writer->length() < | 1763 QUIC_BUG << "Invalid packet_number_length: " << length; |
| 1766 static_cast<size_t>(packet_number_length)) { | |
| 1767 return false; | 1764 return false; |
| 1768 } | 1765 } |
| 1769 switch (packet_number_length) { | 1766 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 } | 1767 } |
| 1787 | 1768 |
| 1788 // static | 1769 // static |
| 1770 bool QuicFramer::AppendStreamId(size_t stream_id_length, |
| 1771 QuicStreamId stream_id, |
| 1772 QuicDataWriter* writer) { |
| 1773 if (stream_id_length == 0 || stream_id_length > 4) { |
| 1774 QUIC_BUG << "Invalid stream_id_length: " << stream_id_length; |
| 1775 return false; |
| 1776 } |
| 1777 return writer->WriteBytesToUInt64(stream_id_length, stream_id); |
| 1778 } |
| 1779 |
| 1780 // static |
| 1781 bool QuicFramer::AppendStreamOffset(size_t offset_length, |
| 1782 QuicStreamOffset offset, |
| 1783 QuicDataWriter* writer) { |
| 1784 if (offset_length == 1 || offset_length > 8) { |
| 1785 QUIC_BUG << "Invalid stream_offset_length: " << offset_length; |
| 1786 return false; |
| 1787 } |
| 1788 |
| 1789 return writer->WriteBytesToUInt64(offset_length, offset); |
| 1790 } |
| 1791 |
| 1792 // static |
| 1789 bool QuicFramer::AppendAckBlock(uint8_t gap, | 1793 bool QuicFramer::AppendAckBlock(uint8_t gap, |
| 1790 QuicPacketNumberLength length_length, | 1794 QuicPacketNumberLength length_length, |
| 1791 QuicPacketNumber length, | 1795 QuicPacketNumber length, |
| 1792 QuicDataWriter* writer) { | 1796 QuicDataWriter* writer) { |
| 1793 return AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, gap, writer) && | 1797 return writer->WriteUInt8(gap) && |
| 1794 AppendPacketSequenceNumber(length_length, length, writer); | 1798 AppendPacketNumber(length_length, length, writer); |
| 1795 } | 1799 } |
| 1796 | 1800 |
| 1797 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, | 1801 bool QuicFramer::AppendStreamFrame(const QuicStreamFrame& frame, |
| 1798 bool no_stream_frame_length, | 1802 bool no_stream_frame_length, |
| 1799 QuicDataWriter* writer) { | 1803 QuicDataWriter* writer) { |
| 1800 if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) { | 1804 if (!AppendStreamId(GetStreamIdSize(frame.stream_id), frame.stream_id, |
| 1805 writer)) { |
| 1801 QUIC_BUG << "Writing stream id size failed."; | 1806 QUIC_BUG << "Writing stream id size failed."; |
| 1802 return false; | 1807 return false; |
| 1803 } | 1808 } |
| 1804 if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) { | 1809 if (!AppendStreamOffset(GetStreamOffsetSize(frame.offset), frame.offset, |
| 1810 writer)) { |
| 1805 QUIC_BUG << "Writing offset size failed."; | 1811 QUIC_BUG << "Writing offset size failed."; |
| 1806 return false; | 1812 return false; |
| 1807 } | 1813 } |
| 1808 if (!no_stream_frame_length) { | 1814 if (!no_stream_frame_length) { |
| 1809 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || | 1815 if ((frame.data_length > std::numeric_limits<uint16_t>::max()) || |
| 1810 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { | 1816 !writer->WriteUInt16(static_cast<uint16_t>(frame.data_length))) { |
| 1811 QUIC_BUG << "Writing stream frame length failed"; | 1817 QUIC_BUG << "Writing stream frame length failed"; |
| 1812 return false; | 1818 return false; |
| 1813 } | 1819 } |
| 1814 } | 1820 } |
| 1815 | 1821 |
| 1816 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { | 1822 if (!writer->WriteBytes(frame.data_buffer, frame.data_length)) { |
| 1817 QUIC_BUG << "Writing frame data failed."; | 1823 QUIC_BUG << "Writing frame data failed."; |
| 1818 return false; | 1824 return false; |
| 1819 } | 1825 } |
| 1820 return true; | 1826 return true; |
| 1821 } | 1827 } |
| 1822 | 1828 |
| 1823 void QuicFramer::set_version(const QuicVersion version) { | 1829 void QuicFramer::set_version(const QuicVersion version) { |
| 1824 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1830 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 1825 quic_version_ = version; | 1831 quic_version_ = version; |
| 1826 } | 1832 } |
| 1827 | 1833 |
| 1828 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, | 1834 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 1829 QuicDataWriter* writer) { | 1835 QuicDataWriter* writer) { |
| 1830 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); | 1836 const AckFrameInfo new_ack_info = GetAckFrameInfo(frame); |
| 1831 QuicPacketNumber largest_acked = frame.largest_observed; | 1837 QuicPacketNumber largest_acked = frame.largest_observed; |
| 1832 QuicPacketNumberLength largest_acked_length = | 1838 QuicPacketNumberLength largest_acked_length = |
| 1833 GetMinSequenceNumberLength(largest_acked); | 1839 GetMinPacketNumberLength(largest_acked); |
| 1834 QuicPacketNumberLength ack_block_length = | 1840 QuicPacketNumberLength ack_block_length = |
| 1835 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1841 GetMinPacketNumberLength(new_ack_info.max_block_length); |
| 1836 // Calculate available bytes for timestamps and ack blocks. | 1842 // Calculate available bytes for timestamps and ack blocks. |
| 1837 int32_t available_timestamp_and_ack_block_bytes = | 1843 int32_t available_timestamp_and_ack_block_bytes = |
| 1838 writer->capacity() - writer->length() - ack_block_length - | 1844 writer->capacity() - writer->length() - ack_block_length - |
| 1839 GetMinAckFrameSize(quic_version_, largest_acked_length) - | 1845 GetMinAckFrameSize(quic_version_, largest_acked_length) - |
| 1840 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); | 1846 (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); |
| 1841 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); | 1847 DCHECK_LE(0, available_timestamp_and_ack_block_bytes); |
| 1842 | 1848 |
| 1843 // Write out the type byte by setting the low order bits and doing shifts | 1849 // 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. | 1850 // to make room for the next bit flags to be set. |
| 1845 // Whether there are multiple ack blocks. | 1851 // Whether there are multiple ack blocks. |
| 1846 uint8_t type_byte = | 1852 uint8_t type_byte = |
| 1847 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; | 1853 new_ack_info.num_ack_blocks == 0 ? 0 : kQuicHasMultipleAckBlocksMask; |
| 1848 type_byte <<= kQuicHasMultipleAckBlocksShift; | 1854 type_byte <<= kQuicHasMultipleAckBlocksShift; |
| 1849 | 1855 |
| 1850 // Largest acked length. | 1856 // Largest acked length. |
| 1851 type_byte <<= kQuicSequenceNumberLengthShift; | 1857 type_byte <<= kQuicSequenceNumberLengthShift; |
| 1852 type_byte |= GetSequenceNumberFlags(largest_acked_length); | 1858 type_byte |= GetPacketNumberFlags(largest_acked_length); |
| 1853 | 1859 |
| 1854 // Ack block length. | 1860 // Ack block length. |
| 1855 type_byte <<= kQuicSequenceNumberLengthShift; | 1861 type_byte <<= kQuicSequenceNumberLengthShift; |
| 1856 type_byte |= GetSequenceNumberFlags(ack_block_length); | 1862 type_byte |= GetPacketNumberFlags(ack_block_length); |
| 1857 | 1863 |
| 1858 type_byte |= kQuicFrameTypeAckMask; | 1864 type_byte |= kQuicFrameTypeAckMask; |
| 1859 | 1865 |
| 1860 if (!writer->WriteUInt8(type_byte)) { | 1866 if (!writer->WriteUInt8(type_byte)) { |
| 1861 return false; | 1867 return false; |
| 1862 } | 1868 } |
| 1863 | 1869 |
| 1864 // Largest acked. | 1870 // Largest acked. |
| 1865 if (!AppendPacketSequenceNumber(largest_acked_length, largest_acked, | 1871 if (!AppendPacketNumber(largest_acked_length, largest_acked, writer)) { |
| 1866 writer)) { | |
| 1867 return false; | 1872 return false; |
| 1868 } | 1873 } |
| 1869 | 1874 |
| 1870 // Largest acked delta time. | 1875 // Largest acked delta time. |
| 1871 uint64_t ack_delay_time_us = kUFloat16MaxValue; | 1876 uint64_t ack_delay_time_us = kUFloat16MaxValue; |
| 1872 if (!frame.ack_delay_time.IsInfinite()) { | 1877 if (!frame.ack_delay_time.IsInfinite()) { |
| 1873 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | 1878 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); |
| 1874 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | 1879 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); |
| 1875 } | 1880 } |
| 1876 if (!writer->WriteUFloat16(ack_delay_time_us)) { | 1881 if (!writer->WriteUFloat16(ack_delay_time_us)) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1887 num_ack_blocks = std::numeric_limits<uint8_t>::max(); | 1892 num_ack_blocks = std::numeric_limits<uint8_t>::max(); |
| 1888 } | 1893 } |
| 1889 | 1894 |
| 1890 if (num_ack_blocks > 0) { | 1895 if (num_ack_blocks > 0) { |
| 1891 if (!writer->WriteBytes(&num_ack_blocks, 1)) { | 1896 if (!writer->WriteBytes(&num_ack_blocks, 1)) { |
| 1892 return false; | 1897 return false; |
| 1893 } | 1898 } |
| 1894 } | 1899 } |
| 1895 | 1900 |
| 1896 // First ack block length. | 1901 // First ack block length. |
| 1897 if (!AppendPacketSequenceNumber(ack_block_length, | 1902 if (!AppendPacketNumber(ack_block_length, new_ack_info.first_block_length, |
| 1898 new_ack_info.first_block_length, writer)) { | 1903 writer)) { |
| 1899 return false; | 1904 return false; |
| 1900 } | 1905 } |
| 1901 | 1906 |
| 1902 // Ack blocks. | 1907 // Ack blocks. |
| 1903 if (num_ack_blocks > 0) { | 1908 if (num_ack_blocks > 0) { |
| 1904 size_t num_ack_blocks_written = 0; | 1909 size_t num_ack_blocks_written = 0; |
| 1905 // Append, in descending order from the largest ACKed packet, a series of | 1910 // Append, in descending order from the largest ACKed packet, a series of |
| 1906 // ACK blocks that represents the successfully acknoweldged packets. Each | 1911 // ACK blocks that represents the successfully acknoweldged packets. Each |
| 1907 // appended gap/block length represents a descending delta from the previous | 1912 // appended gap/block length represents a descending delta from the previous |
| 1908 // block. i.e.: | 1913 // 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(); | 1999 PacketTimeVector::const_iterator it = frame.received_packet_times.begin(); |
| 1995 QuicPacketNumber packet_number = it->first; | 2000 QuicPacketNumber packet_number = it->first; |
| 1996 QuicPacketNumber delta_from_largest_observed = | 2001 QuicPacketNumber delta_from_largest_observed = |
| 1997 frame.largest_observed - packet_number; | 2002 frame.largest_observed - packet_number; |
| 1998 | 2003 |
| 1999 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); | 2004 DCHECK_GE(std::numeric_limits<uint8_t>::max(), delta_from_largest_observed); |
| 2000 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2005 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
| 2001 return false; | 2006 return false; |
| 2002 } | 2007 } |
| 2003 | 2008 |
| 2004 if (!writer->WriteUInt8(delta_from_largest_observed & | 2009 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
| 2005 k1ByteSequenceNumberMask)) { | |
| 2006 return false; | 2010 return false; |
| 2007 } | 2011 } |
| 2008 | 2012 |
| 2009 // Use the lowest 4 bytes of the time delta from the creation_time_. | 2013 // 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; | 2014 const uint64_t time_epoch_delta_us = UINT64_C(1) << 32; |
| 2011 uint32_t time_delta_us = | 2015 uint32_t time_delta_us = |
| 2012 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & | 2016 static_cast<uint32_t>((it->second - creation_time_).ToMicroseconds() & |
| 2013 (time_epoch_delta_us - 1)); | 2017 (time_epoch_delta_us - 1)); |
| 2014 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { | 2018 if (!writer->WriteUInt32(time_delta_us)) { |
| 2015 return false; | 2019 return false; |
| 2016 } | 2020 } |
| 2017 | 2021 |
| 2018 QuicTime prev_time = it->second; | 2022 QuicTime prev_time = it->second; |
| 2019 | 2023 |
| 2020 for (++it; it != frame.received_packet_times.end(); ++it) { | 2024 for (++it; it != frame.received_packet_times.end(); ++it) { |
| 2021 packet_number = it->first; | 2025 packet_number = it->first; |
| 2022 delta_from_largest_observed = frame.largest_observed - packet_number; | 2026 delta_from_largest_observed = frame.largest_observed - packet_number; |
| 2023 | 2027 |
| 2024 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { | 2028 if (delta_from_largest_observed > std::numeric_limits<uint8_t>::max()) { |
| 2025 return false; | 2029 return false; |
| 2026 } | 2030 } |
| 2027 | 2031 |
| 2028 if (!writer->WriteUInt8(delta_from_largest_observed & | 2032 if (!writer->WriteUInt8(delta_from_largest_observed)) { |
| 2029 k1ByteSequenceNumberMask)) { | |
| 2030 return false; | 2033 return false; |
| 2031 } | 2034 } |
| 2032 | 2035 |
| 2033 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); | 2036 uint64_t frame_time_delta_us = (it->second - prev_time).ToMicroseconds(); |
| 2034 prev_time = it->second; | 2037 prev_time = it->second; |
| 2035 if (!writer->WriteUFloat16(frame_time_delta_us)) { | 2038 if (!writer->WriteUFloat16(frame_time_delta_us)) { |
| 2036 return false; | 2039 return false; |
| 2037 } | 2040 } |
| 2038 } | 2041 } |
| 2039 return true; | 2042 return true; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2050 | 2053 |
| 2051 if (least_unacked_delta >> length_shift > 0) { | 2054 if (least_unacked_delta >> length_shift > 0) { |
| 2052 QUIC_BUG << "packet_number_length " | 2055 QUIC_BUG << "packet_number_length " |
| 2053 << header.public_header.packet_number_length | 2056 << header.public_header.packet_number_length |
| 2054 << " is too small for least_unacked_delta: " << least_unacked_delta | 2057 << " is too small for least_unacked_delta: " << least_unacked_delta |
| 2055 << " packet_number:" << header.packet_number | 2058 << " packet_number:" << header.packet_number |
| 2056 << " least_unacked:" << frame.least_unacked | 2059 << " least_unacked:" << frame.least_unacked |
| 2057 << " version:" << quic_version_; | 2060 << " version:" << quic_version_; |
| 2058 return false; | 2061 return false; |
| 2059 } | 2062 } |
| 2060 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 2063 if (!AppendPacketNumber(header.public_header.packet_number_length, |
| 2061 least_unacked_delta, writer)) { | 2064 least_unacked_delta, writer)) { |
| 2062 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; | 2065 QUIC_BUG << " seq failed: " << header.public_header.packet_number_length; |
| 2063 return false; | 2066 return false; |
| 2064 } | 2067 } |
| 2065 | 2068 |
| 2066 return true; | 2069 return true; |
| 2067 } | 2070 } |
| 2068 | 2071 |
| 2069 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, | 2072 bool QuicFramer::AppendRstStreamFrame(const QuicRstStreamFrame& frame, |
| 2070 QuicDataWriter* writer) { | 2073 QuicDataWriter* writer) { |
| 2071 if (!writer->WriteUInt32(frame.stream_id)) { | 2074 if (!writer->WriteUInt32(frame.stream_id)) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2155 | 2158 |
| 2156 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2159 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2157 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2160 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2158 << " detail: " << detailed_error_; | 2161 << " detail: " << detailed_error_; |
| 2159 set_error(error); | 2162 set_error(error); |
| 2160 visitor_->OnError(this); | 2163 visitor_->OnError(this); |
| 2161 return false; | 2164 return false; |
| 2162 } | 2165 } |
| 2163 | 2166 |
| 2164 } // namespace net | 2167 } // namespace net |
| OLD | NEW |