| 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 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 const uint8_t kQuicStreamDataLengthShift = 1; | 84 const uint8_t kQuicStreamDataLengthShift = 1; |
| 85 const uint8_t kQuicStreamDataLengthMask = 0x01; | 85 const uint8_t kQuicStreamDataLengthMask = 0x01; |
| 86 | 86 |
| 87 // Fin bit may be set or not. | 87 // Fin bit may be set or not. |
| 88 const uint8_t kQuicStreamFinShift = 1; | 88 const uint8_t kQuicStreamFinShift = 1; |
| 89 const uint8_t kQuicStreamFinMask = 0x01; | 89 const uint8_t kQuicStreamFinMask = 0x01; |
| 90 | 90 |
| 91 // packet number size shift used in AckFrames. | 91 // packet number size shift used in AckFrames. |
| 92 const uint8_t kQuicSequenceNumberLengthShift = 2; | 92 const uint8_t kQuicSequenceNumberLengthShift = 2; |
| 93 | 93 |
| 94 // Acks may be truncated. | |
| 95 const uint8_t kQuicAckTruncatedShift = 1; | |
| 96 const uint8_t kQuicAckTruncatedMask = 0x01; | |
| 97 | |
| 98 // Acks may not have any nacks. | |
| 99 const uint8_t kQuicHasNacksMask = 0x01; | |
| 100 // Acks may have only one ack block. | 94 // Acks may have only one ack block. |
| 101 const uint8_t kQuicHasMultipleAckBlocksMask = 0x01; | 95 const uint8_t kQuicHasMultipleAckBlocksMask = 0x01; |
| 102 const uint8_t kQuicHasMultipleAckBlocksShift = 1; | 96 const uint8_t kQuicHasMultipleAckBlocksShift = 1; |
| 103 | 97 |
| 104 // Returns the absolute value of the difference between |a| and |b|. | 98 // Returns the absolute value of the difference between |a| and |b|. |
| 105 QuicPacketNumber Delta(QuicPacketNumber a, QuicPacketNumber b) { | 99 QuicPacketNumber Delta(QuicPacketNumber a, QuicPacketNumber b) { |
| 106 // Since these are unsigned numbers, we can't just return abs(a - b) | 100 // Since these are unsigned numbers, we can't just return abs(a - b) |
| 107 if (a < b) { | 101 if (a < b) { |
| 108 return b - a; | 102 return b - a; |
| 109 } | 103 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 131 return PACKET_6BYTE_PACKET_NUMBER; | 125 return PACKET_6BYTE_PACKET_NUMBER; |
| 132 } | 126 } |
| 133 } | 127 } |
| 134 | 128 |
| 135 } // namespace | 129 } // namespace |
| 136 | 130 |
| 137 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 131 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
| 138 QuicTime creation_time, | 132 QuicTime creation_time, |
| 139 Perspective perspective) | 133 Perspective perspective) |
| 140 : visitor_(nullptr), | 134 : visitor_(nullptr), |
| 141 entropy_calculator_(nullptr), | |
| 142 error_(QUIC_NO_ERROR), | 135 error_(QUIC_NO_ERROR), |
| 143 last_packet_number_(0), | 136 last_packet_number_(0), |
| 144 largest_packet_number_(0), | 137 largest_packet_number_(0), |
| 145 last_path_id_(kInvalidPathId), | 138 last_path_id_(kInvalidPathId), |
| 146 last_serialized_connection_id_(0), | 139 last_serialized_connection_id_(0), |
| 147 supported_versions_(supported_versions), | 140 supported_versions_(supported_versions), |
| 148 decrypter_level_(ENCRYPTION_NONE), | 141 decrypter_level_(ENCRYPTION_NONE), |
| 149 alternative_decrypter_level_(ENCRYPTION_NONE), | 142 alternative_decrypter_level_(ENCRYPTION_NONE), |
| 150 alternative_decrypter_latch_(false), | 143 alternative_decrypter_latch_(false), |
| 151 perspective_(perspective), | 144 perspective_(perspective), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 168 GetStreamOffsetSize(offset) + | 161 GetStreamOffsetSize(offset) + |
| 169 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); | 162 (last_frame_in_packet ? 0 : kQuicStreamPayloadLengthSize); |
| 170 } | 163 } |
| 171 | 164 |
| 172 // static | 165 // static |
| 173 size_t QuicFramer::GetMinAckFrameSize( | 166 size_t QuicFramer::GetMinAckFrameSize( |
| 174 QuicVersion version, | 167 QuicVersion version, |
| 175 QuicPacketNumberLength largest_observed_length) { | 168 QuicPacketNumberLength largest_observed_length) { |
| 176 size_t min_size = kQuicFrameTypeSize + largest_observed_length + | 169 size_t min_size = kQuicFrameTypeSize + largest_observed_length + |
| 177 kQuicDeltaTimeLargestObservedSize; | 170 kQuicDeltaTimeLargestObservedSize; |
| 178 if (version <= QUIC_VERSION_33) { | |
| 179 return min_size + kQuicEntropyHashSize; | |
| 180 } | |
| 181 return min_size + kQuicNumTimestampsSize; | 171 return min_size + kQuicNumTimestampsSize; |
| 182 } | 172 } |
| 183 | 173 |
| 184 // static | 174 // static |
| 185 size_t QuicFramer::GetStopWaitingFrameSize( | 175 size_t QuicFramer::GetStopWaitingFrameSize( |
| 186 QuicVersion version, | 176 QuicVersion version, |
| 187 QuicPacketNumberLength packet_number_length) { | 177 QuicPacketNumberLength packet_number_length) { |
| 188 size_t min_size = kQuicFrameTypeSize + packet_number_length; | 178 size_t min_size = kQuicFrameTypeSize + packet_number_length; |
| 189 if (version <= QUIC_VERSION_33) { | |
| 190 return min_size + kQuicEntropyHashSize; | |
| 191 } | |
| 192 return min_size; | 179 return min_size; |
| 193 } | 180 } |
| 194 | 181 |
| 195 // static | 182 // static |
| 196 size_t QuicFramer::GetRstStreamFrameSize() { | 183 size_t QuicFramer::GetRstStreamFrameSize() { |
| 197 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + | 184 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize + |
| 198 kQuicErrorCodeSize; | 185 kQuicErrorCodeSize; |
| 199 } | 186 } |
| 200 | 187 |
| 201 // static | 188 // static |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); | 304 GetMinAckFrameSize(quic_version_, PACKET_6BYTE_PACKET_NUMBER); |
| 318 if (can_truncate) { | 305 if (can_truncate) { |
| 319 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 306 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 320 // Note that we may not use every byte of the writer in this case. | 307 // Note that we may not use every byte of the writer in this case. |
| 321 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | 308 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; |
| 322 return free_bytes; | 309 return free_bytes; |
| 323 } | 310 } |
| 324 return 0; | 311 return 0; |
| 325 } | 312 } |
| 326 | 313 |
| 327 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} | |
| 328 | |
| 329 QuicFramer::AckFrameInfo::AckFrameInfo(const AckFrameInfo& other) = default; | |
| 330 | |
| 331 QuicFramer::AckFrameInfo::~AckFrameInfo() {} | |
| 332 | |
| 333 QuicFramer::AckBlock::AckBlock(uint8_t gap, QuicPacketNumber length) | |
| 334 : gap(gap), length(length) {} | |
| 335 | |
| 336 QuicFramer::AckBlock::AckBlock(const AckBlock& other) = default; | |
| 337 | |
| 338 QuicFramer::AckBlock::~AckBlock() {} | |
| 339 | |
| 340 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() | 314 QuicFramer::NewAckFrameInfo::NewAckFrameInfo() |
| 341 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} | 315 : max_block_length(0), first_block_length(0), num_ack_blocks(0) {} |
| 342 | 316 |
| 343 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = | 317 QuicFramer::NewAckFrameInfo::NewAckFrameInfo(const NewAckFrameInfo& other) = |
| 344 default; | 318 default; |
| 345 | 319 |
| 346 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} | 320 QuicFramer::NewAckFrameInfo::~NewAckFrameInfo() {} |
| 347 | 321 |
| 348 // static | |
| 349 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | |
| 350 const QuicPacketHeader& header) { | |
| 351 return header.entropy_flag << (header.packet_number % 8); | |
| 352 } | |
| 353 | |
| 354 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, | 322 size_t QuicFramer::BuildDataPacket(const QuicPacketHeader& header, |
| 355 const QuicFrames& frames, | 323 const QuicFrames& frames, |
| 356 char* buffer, | 324 char* buffer, |
| 357 size_t packet_length) { | 325 size_t packet_length) { |
| 358 QuicDataWriter writer(packet_length, buffer); | 326 QuicDataWriter writer(packet_length, buffer); |
| 359 if (!AppendPacketHeader(header, &writer)) { | 327 if (!AppendPacketHeader(header, &writer)) { |
| 360 QUIC_BUG << "AppendPacketHeader failed"; | 328 QUIC_BUG << "AppendPacketHeader failed"; |
| 361 return 0; | 329 return 0; |
| 362 } | 330 } |
| 363 | 331 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 375 writer.WritePadding(); | 343 writer.WritePadding(); |
| 376 break; | 344 break; |
| 377 case STREAM_FRAME: | 345 case STREAM_FRAME: |
| 378 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, | 346 if (!AppendStreamFrame(*frame.stream_frame, no_stream_frame_length, |
| 379 &writer)) { | 347 &writer)) { |
| 380 QUIC_BUG << "AppendStreamFrame failed"; | 348 QUIC_BUG << "AppendStreamFrame failed"; |
| 381 return 0; | 349 return 0; |
| 382 } | 350 } |
| 383 break; | 351 break; |
| 384 case ACK_FRAME: | 352 case ACK_FRAME: |
| 385 if (quic_version_ <= QUIC_VERSION_33) { | 353 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { |
| 386 if (!AppendAckFrameAndTypeByte(header, *frame.ack_frame, &writer)) { | 354 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; |
| 387 QUIC_BUG << "AppendAckFrameAndTypeByte failed" | 355 return 0; |
| 388 << " header: " << header | |
| 389 << " ack_fame: " << *frame.ack_frame; | |
| 390 return 0; | |
| 391 } | |
| 392 } else { | |
| 393 if (!AppendNewAckFrameAndTypeByte(*frame.ack_frame, &writer)) { | |
| 394 QUIC_BUG << "AppendNewAckFrameAndTypeByte failed"; | |
| 395 return 0; | |
| 396 } | |
| 397 } | 356 } |
| 398 break; | 357 break; |
| 399 case STOP_WAITING_FRAME: | 358 case STOP_WAITING_FRAME: |
| 400 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, | 359 if (!AppendStopWaitingFrame(header, *frame.stop_waiting_frame, |
| 401 &writer)) { | 360 &writer)) { |
| 402 QUIC_BUG << "AppendStopWaitingFrame failed"; | 361 QUIC_BUG << "AppendStopWaitingFrame failed"; |
| 403 return 0; | 362 return 0; |
| 404 } | 363 } |
| 405 break; | 364 break; |
| 406 case MTU_DISCOVERY_FRAME: | 365 case MTU_DISCOVERY_FRAME: |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 } | 573 } |
| 615 | 574 |
| 616 size_t decrypted_length = 0; | 575 size_t decrypted_length = 0; |
| 617 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, | 576 if (!DecryptPayload(encrypted_reader, header, packet, decrypted_buffer, |
| 618 buffer_length, &decrypted_length)) { | 577 buffer_length, &decrypted_length)) { |
| 619 set_detailed_error("Unable to decrypt payload."); | 578 set_detailed_error("Unable to decrypt payload."); |
| 620 return RaiseError(QUIC_DECRYPTION_FAILURE); | 579 return RaiseError(QUIC_DECRYPTION_FAILURE); |
| 621 } | 580 } |
| 622 | 581 |
| 623 QuicDataReader reader(decrypted_buffer, decrypted_length); | 582 QuicDataReader reader(decrypted_buffer, decrypted_length); |
| 624 if (quic_version_ <= QUIC_VERSION_33) { | |
| 625 if (!ProcessAuthenticatedHeader(&reader, &header)) { | |
| 626 DVLOG(1) << "Unable to process packet header. Stopping parsing."; | |
| 627 return false; | |
| 628 } | |
| 629 } | |
| 630 | 583 |
| 631 // Set the last packet number after we have decrypted the packet | 584 // Set the last packet number after we have decrypted the packet |
| 632 // so we are confident is not attacker controlled. | 585 // so we are confident is not attacker controlled. |
| 633 SetLastPacketNumber(header); | 586 SetLastPacketNumber(header); |
| 634 | 587 |
| 635 if (!visitor_->OnPacketHeader(header)) { | 588 if (!visitor_->OnPacketHeader(header)) { |
| 636 // The visitor suppresses further processing of the packet. | 589 // The visitor suppresses further processing of the packet. |
| 637 return true; | 590 return true; |
| 638 } | 591 } |
| 639 | 592 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 } | 666 } |
| 714 | 667 |
| 715 switch (header.public_header.connection_id_length) { | 668 switch (header.public_header.connection_id_length) { |
| 716 case PACKET_0BYTE_CONNECTION_ID: | 669 case PACKET_0BYTE_CONNECTION_ID: |
| 717 if (!writer->WriteUInt8(public_flags | | 670 if (!writer->WriteUInt8(public_flags | |
| 718 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { | 671 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) { |
| 719 return false; | 672 return false; |
| 720 } | 673 } |
| 721 break; | 674 break; |
| 722 case PACKET_8BYTE_CONNECTION_ID: | 675 case PACKET_8BYTE_CONNECTION_ID: |
| 723 if (quic_version_ > QUIC_VERSION_32) { | 676 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; |
| 724 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID; | 677 if (!FLAGS_quic_remove_v33_hacks2 && |
| 725 if (!FLAGS_quic_remove_v33_hacks2 && | 678 perspective_ == Perspective::IS_CLIENT) { |
| 726 perspective_ == Perspective::IS_CLIENT) { | |
| 727 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; | |
| 728 } | |
| 729 | |
| 730 } else { | |
| 731 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; | 679 public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD; |
| 732 } | 680 } |
| 733 if (!writer->WriteUInt8(public_flags) || | 681 if (!writer->WriteUInt8(public_flags) || |
| 734 !writer->WriteUInt64(header.public_header.connection_id)) { | 682 !writer->WriteUInt64(header.public_header.connection_id)) { |
| 735 return false; | 683 return false; |
| 736 } | 684 } |
| 737 break; | 685 break; |
| 738 } | 686 } |
| 739 last_serialized_connection_id_ = header.public_header.connection_id; | 687 last_serialized_connection_id_ = header.public_header.connection_id; |
| 740 | 688 |
| 741 if (header.public_header.version_flag) { | 689 if (header.public_header.version_flag) { |
| 742 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); | 690 DCHECK_EQ(Perspective::IS_CLIENT, perspective_); |
| 743 QuicTag tag = QuicVersionToQuicTag(quic_version_); | 691 QuicTag tag = QuicVersionToQuicTag(quic_version_); |
| 744 writer->WriteUInt32(tag); | 692 writer->WriteUInt32(tag); |
| 745 DVLOG(1) << "version = " << quic_version_ << ", tag = '" | 693 DVLOG(1) << "version = " << quic_version_ << ", tag = '" |
| 746 << QuicUtils::TagToString(tag) << "'"; | 694 << QuicTagToString(tag) << "'"; |
| 747 } | 695 } |
| 748 | 696 |
| 749 if (header.public_header.multipath_flag && | 697 if (header.public_header.multipath_flag && |
| 750 !writer->WriteUInt8(header.path_id)) { | 698 !writer->WriteUInt8(header.path_id)) { |
| 751 return false; | 699 return false; |
| 752 } | 700 } |
| 753 | 701 |
| 754 if (header.public_header.nonce != nullptr && | 702 if (header.public_header.nonce != nullptr && |
| 755 !writer->WriteBytes(header.public_header.nonce, | 703 !writer->WriteBytes(header.public_header.nonce, |
| 756 kDiversificationNonceSize)) { | 704 kDiversificationNonceSize)) { |
| 757 return false; | 705 return false; |
| 758 } | 706 } |
| 759 | 707 |
| 760 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, | 708 if (!AppendPacketSequenceNumber(header.public_header.packet_number_length, |
| 761 header.packet_number, writer)) { | 709 header.packet_number, writer)) { |
| 762 return false; | 710 return false; |
| 763 } | 711 } |
| 764 if (quic_version_ > QUIC_VERSION_33) { | |
| 765 return true; | |
| 766 } | |
| 767 | |
| 768 uint8_t private_flags = 0; | |
| 769 if (header.entropy_flag) { | |
| 770 private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY; | |
| 771 } | |
| 772 if (!writer->WriteUInt8(private_flags)) { | |
| 773 return false; | |
| 774 } | |
| 775 | 712 |
| 776 return true; | 713 return true; |
| 777 } | 714 } |
| 778 | 715 |
| 779 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( | 716 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire( |
| 780 uint32_t time_delta_us) { | 717 uint32_t time_delta_us) { |
| 781 // 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 |
| 782 // might have reverse wrapped to the previous epoch, or it might | 719 // might have reverse wrapped to the previous epoch, or it might |
| 783 // remain in the same epoch. Select the time closest to the previous | 720 // remain in the same epoch. Select the time closest to the previous |
| 784 // time. | 721 // time. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 last_version_tag_ = version_tag; | 856 last_version_tag_ = version_tag; |
| 920 QuicVersion version = QuicTagToQuicVersion(version_tag); | 857 QuicVersion version = QuicTagToQuicVersion(version_tag); |
| 921 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { | 858 if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) { |
| 922 set_detailed_error("Illegal public flags value."); | 859 set_detailed_error("Illegal public flags value."); |
| 923 return false; | 860 return false; |
| 924 } | 861 } |
| 925 public_header->versions.push_back(version); | 862 public_header->versions.push_back(version); |
| 926 } | 863 } |
| 927 | 864 |
| 928 // A nonce should only be present in packets from the server to the client, | 865 // A nonce should only be present in packets from the server to the client, |
| 929 // which are neither version negotiation nor public reset packets | 866 // which are neither version negotiation nor public reset packets. |
| 930 // and only for versions after QUIC_VERSION_32. Earlier versions will | 867 if (public_flags & PACKET_PUBLIC_FLAGS_NONCE && |
| 931 // set this bit when indicating an 8-byte connection ID, which should | |
| 932 // not be interpreted as indicating a nonce is present. | |
| 933 if (quic_version_ > QUIC_VERSION_32 && | |
| 934 public_flags & PACKET_PUBLIC_FLAGS_NONCE && | |
| 935 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && | 868 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && |
| 936 !(public_flags & PACKET_PUBLIC_FLAGS_RST) && | 869 !(public_flags & PACKET_PUBLIC_FLAGS_RST) && |
| 937 // The nonce flag from a client is ignored and is assumed to be an older | 870 // The nonce flag from a client is ignored and is assumed to be an older |
| 938 // client indicating an eight-byte connection ID. | 871 // client indicating an eight-byte connection ID. |
| 939 perspective_ == Perspective::IS_CLIENT) { | 872 perspective_ == Perspective::IS_CLIENT) { |
| 940 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()), | 873 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()), |
| 941 last_nonce_.size())) { | 874 last_nonce_.size())) { |
| 942 set_detailed_error("Unable to read nonce."); | 875 set_detailed_error("Unable to read nonce."); |
| 943 return false; | 876 return false; |
| 944 } | 877 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 return PACKET_FLAGS_4BYTE_PACKET; | 909 return PACKET_FLAGS_4BYTE_PACKET; |
| 977 case PACKET_6BYTE_PACKET_NUMBER: | 910 case PACKET_6BYTE_PACKET_NUMBER: |
| 978 return PACKET_FLAGS_6BYTE_PACKET; | 911 return PACKET_FLAGS_6BYTE_PACKET; |
| 979 default: | 912 default: |
| 980 QUIC_BUG << "Unreachable case statement."; | 913 QUIC_BUG << "Unreachable case statement."; |
| 981 return PACKET_FLAGS_6BYTE_PACKET; | 914 return PACKET_FLAGS_6BYTE_PACKET; |
| 982 } | 915 } |
| 983 } | 916 } |
| 984 | 917 |
| 985 // static | 918 // static |
| 986 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo( | |
| 987 const QuicAckFrame& frame) { | |
| 988 AckFrameInfo ack_info; | |
| 989 if (frame.packets.Empty()) { | |
| 990 return ack_info; | |
| 991 } | |
| 992 DCHECK_GE(frame.largest_observed, frame.packets.Max()); | |
| 993 QuicPacketNumber last_largest_missing = 0; | |
| 994 for (const Interval<QuicPacketNumber>& interval : frame.packets) { | |
| 995 for (QuicPacketNumber interval_start = interval.min(); | |
| 996 interval_start < interval.max(); | |
| 997 interval_start += (1ull + std::numeric_limits<uint8_t>::max())) { | |
| 998 uint8_t cur_range_length = | |
| 999 interval.max() - interval_start > std::numeric_limits<uint8_t>::max() | |
| 1000 ? std::numeric_limits<uint8_t>::max() | |
| 1001 : (interval.max() - interval_start) - 1; | |
| 1002 ack_info.nack_ranges[interval_start] = cur_range_length; | |
| 1003 } | |
| 1004 ack_info.max_delta = | |
| 1005 max(ack_info.max_delta, last_largest_missing == 0 | |
| 1006 ? QuicPacketNumber{0} | |
| 1007 : (interval.min() - last_largest_missing)); | |
| 1008 last_largest_missing = interval.max() - 1; | |
| 1009 } | |
| 1010 // Include the range to the largest observed. | |
| 1011 ack_info.max_delta = | |
| 1012 max(ack_info.max_delta, frame.largest_observed - last_largest_missing); | |
| 1013 return ack_info; | |
| 1014 } | |
| 1015 | |
| 1016 // static | |
| 1017 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( | 919 QuicFramer::NewAckFrameInfo QuicFramer::GetNewAckFrameInfo( |
| 1018 const QuicAckFrame& frame) { | 920 const QuicAckFrame& frame) { |
| 1019 NewAckFrameInfo new_ack_info; | 921 NewAckFrameInfo new_ack_info; |
| 1020 if (frame.packets.Empty()) { | 922 if (frame.packets.Empty()) { |
| 1021 return new_ack_info; | 923 return new_ack_info; |
| 1022 } | 924 } |
| 1023 // The first block is the last interval. It isn't encoded with the gap-length | 925 // The first block is the last interval. It isn't encoded with the gap-length |
| 1024 // encoding, so skip it. | 926 // encoding, so skip it. |
| 1025 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); | 927 new_ack_info.first_block_length = frame.packets.LastIntervalLength(); |
| 1026 auto itr = frame.packets.rbegin(); | 928 auto itr = frame.packets.rbegin(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 set_detailed_error("packet numbers cannot be 0."); | 973 set_detailed_error("packet numbers cannot be 0."); |
| 1072 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 974 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1073 } | 975 } |
| 1074 | 976 |
| 1075 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 977 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| 1076 return false; | 978 return false; |
| 1077 } | 979 } |
| 1078 return true; | 980 return true; |
| 1079 } | 981 } |
| 1080 | 982 |
| 1081 bool QuicFramer::ProcessAuthenticatedHeader(QuicDataReader* reader, | |
| 1082 QuicPacketHeader* header) { | |
| 1083 uint8_t private_flags; | |
| 1084 if (!reader->ReadBytes(&private_flags, 1)) { | |
| 1085 set_detailed_error("Unable to read private flags."); | |
| 1086 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1087 } | |
| 1088 | |
| 1089 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { | |
| 1090 set_detailed_error("Illegal private flags value."); | |
| 1091 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1092 } | |
| 1093 | |
| 1094 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; | |
| 1095 header->entropy_hash = GetPacketEntropyHash(*header); | |
| 1096 return true; | |
| 1097 } | |
| 1098 | |
| 1099 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { | 983 bool QuicFramer::ProcessPathId(QuicDataReader* reader, QuicPathId* path_id) { |
| 1100 if (!reader->ReadBytes(path_id, 1)) { | 984 if (!reader->ReadBytes(path_id, 1)) { |
| 1101 return false; | 985 return false; |
| 1102 } | 986 } |
| 1103 | 987 |
| 1104 return true; | 988 return true; |
| 1105 } | 989 } |
| 1106 | 990 |
| 1107 bool QuicFramer::ProcessPacketSequenceNumber( | 991 bool QuicFramer::ProcessPacketSequenceNumber( |
| 1108 QuicDataReader* reader, | 992 QuicDataReader* reader, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1145 DVLOG(1) << "Visitor asked to stop further processing."; | 1029 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1146 // Returning true since there was no parsing error. | 1030 // Returning true since there was no parsing error. |
| 1147 return true; | 1031 return true; |
| 1148 } | 1032 } |
| 1149 continue; | 1033 continue; |
| 1150 } | 1034 } |
| 1151 | 1035 |
| 1152 // Ack Frame | 1036 // Ack Frame |
| 1153 if (frame_type & kQuicFrameTypeAckMask) { | 1037 if (frame_type & kQuicFrameTypeAckMask) { |
| 1154 QuicAckFrame frame; | 1038 QuicAckFrame frame; |
| 1155 if (quic_version_ <= QUIC_VERSION_33) { | 1039 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { |
| 1156 if (!ProcessAckFrame(reader, frame_type, &frame)) { | 1040 return RaiseError(QUIC_INVALID_ACK_DATA); |
| 1157 return RaiseError(QUIC_INVALID_ACK_DATA); | |
| 1158 } | |
| 1159 } else { | |
| 1160 if (!ProcessNewAckFrame(reader, frame_type, &frame)) { | |
| 1161 return RaiseError(QUIC_INVALID_ACK_DATA); | |
| 1162 } | |
| 1163 } | 1041 } |
| 1164 if (!visitor_->OnAckFrame(frame)) { | 1042 if (!visitor_->OnAckFrame(frame)) { |
| 1165 DVLOG(1) << "Visitor asked to stop further processing."; | 1043 DVLOG(1) << "Visitor asked to stop further processing."; |
| 1166 // Returning true since there was no parsing error. | 1044 // Returning true since there was no parsing error. |
| 1167 return true; | 1045 return true; |
| 1168 } | 1046 } |
| 1169 continue; | 1047 continue; |
| 1170 } | 1048 } |
| 1171 | 1049 |
| 1172 // This was a special frame type that did not match any | 1050 // This was a special frame type that did not match any |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1345 set_detailed_error("Unable to read frame data."); | 1223 set_detailed_error("Unable to read frame data."); |
| 1346 return false; | 1224 return false; |
| 1347 } | 1225 } |
| 1348 } | 1226 } |
| 1349 frame->data_buffer = data.data(); | 1227 frame->data_buffer = data.data(); |
| 1350 frame->data_length = static_cast<uint16_t>(data.length()); | 1228 frame->data_length = static_cast<uint16_t>(data.length()); |
| 1351 | 1229 |
| 1352 return true; | 1230 return true; |
| 1353 } | 1231 } |
| 1354 | 1232 |
| 1355 bool QuicFramer::ProcessAckFrame(QuicDataReader* reader, | |
| 1356 uint8_t frame_type, | |
| 1357 QuicAckFrame* ack_frame) { | |
| 1358 // Determine the three lengths from the frame type: largest observed length, | |
| 1359 // missing packet number length, and missing range length. | |
| 1360 const QuicPacketNumberLength missing_packet_number_length = | |
| 1361 ReadSequenceNumberLength(frame_type); | |
| 1362 frame_type >>= kQuicSequenceNumberLengthShift; | |
| 1363 const QuicPacketNumberLength largest_observed_packet_number_length = | |
| 1364 ReadSequenceNumberLength(frame_type); | |
| 1365 frame_type >>= kQuicSequenceNumberLengthShift; | |
| 1366 ack_frame->is_truncated = frame_type & kQuicAckTruncatedMask; | |
| 1367 frame_type >>= kQuicAckTruncatedShift; | |
| 1368 bool has_nacks = frame_type & kQuicHasNacksMask; | |
| 1369 | |
| 1370 if (!reader->ReadBytes(&ack_frame->entropy_hash, 1)) { | |
| 1371 set_detailed_error("Unable to read entropy hash for received packets."); | |
| 1372 return false; | |
| 1373 } | |
| 1374 | |
| 1375 if (!reader->ReadBytes(&ack_frame->largest_observed, | |
| 1376 largest_observed_packet_number_length)) { | |
| 1377 set_detailed_error("Unable to read largest observed."); | |
| 1378 return false; | |
| 1379 } | |
| 1380 | |
| 1381 uint64_t ack_delay_time_us; | |
| 1382 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | |
| 1383 set_detailed_error("Unable to read ack delay time."); | |
| 1384 return false; | |
| 1385 } | |
| 1386 | |
| 1387 if (ack_delay_time_us == kUFloat16MaxValue) { | |
| 1388 ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); | |
| 1389 } else { | |
| 1390 ack_frame->ack_delay_time = | |
| 1391 QuicTime::Delta::FromMicroseconds(ack_delay_time_us); | |
| 1392 } | |
| 1393 | |
| 1394 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | |
| 1395 return false; | |
| 1396 } | |
| 1397 | |
| 1398 if (!has_nacks) { | |
| 1399 return true; | |
| 1400 } | |
| 1401 | |
| 1402 uint8_t num_missing_ranges; | |
| 1403 if (!reader->ReadBytes(&num_missing_ranges, 1)) { | |
| 1404 set_detailed_error("Unable to read num missing packet ranges."); | |
| 1405 return false; | |
| 1406 } | |
| 1407 | |
| 1408 QuicPacketNumber last_packet_number = ack_frame->largest_observed; | |
| 1409 for (size_t i = 0; i < num_missing_ranges; ++i) { | |
| 1410 QuicPacketNumber missing_delta = 0; | |
| 1411 if (!reader->ReadBytes(&missing_delta, missing_packet_number_length)) { | |
| 1412 set_detailed_error("Unable to read missing packet number delta."); | |
| 1413 return false; | |
| 1414 } | |
| 1415 last_packet_number -= missing_delta; | |
| 1416 QuicPacketNumber range_length = 0; | |
| 1417 if (!reader->ReadBytes(&range_length, PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1418 set_detailed_error("Unable to read missing packet number range."); | |
| 1419 return false; | |
| 1420 } | |
| 1421 ack_frame->packets.Add(last_packet_number - range_length, | |
| 1422 last_packet_number + 1); | |
| 1423 // Subtract an extra 1 to ensure ranges are represented efficiently and | |
| 1424 // can't overlap by 1 packet number. This allows a missing_delta of 0 | |
| 1425 // to represent an adjacent nack range. | |
| 1426 last_packet_number -= (range_length + 1); | |
| 1427 } | |
| 1428 | |
| 1429 return true; | |
| 1430 } | |
| 1431 | |
| 1432 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, | 1233 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, |
| 1433 uint8_t frame_type, | 1234 uint8_t frame_type, |
| 1434 QuicAckFrame* ack_frame) { | 1235 QuicAckFrame* ack_frame) { |
| 1435 // Determine the two lengths from the frame type: largest acked length, | 1236 // Determine the two lengths from the frame type: largest acked length, |
| 1436 // ack block length. | 1237 // ack block length. |
| 1437 const QuicPacketNumberLength ack_block_length = | 1238 const QuicPacketNumberLength ack_block_length = |
| 1438 ReadSequenceNumberLength(frame_type); | 1239 ReadSequenceNumberLength(frame_type); |
| 1439 frame_type >>= kQuicSequenceNumberLengthShift; | 1240 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1440 const QuicPacketNumberLength largest_acked_length = | 1241 const QuicPacketNumberLength largest_acked_length = |
| 1441 ReadSequenceNumberLength(frame_type); | 1242 ReadSequenceNumberLength(frame_type); |
| 1442 frame_type >>= kQuicSequenceNumberLengthShift; | 1243 frame_type >>= kQuicSequenceNumberLengthShift; |
| 1443 frame_type >>= kQuicHasMultipleAckBlocksShift; | 1244 frame_type >>= kQuicHasMultipleAckBlocksShift; |
| 1444 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; | 1245 bool has_ack_blocks = frame_type & kQuicHasMultipleAckBlocksMask; |
| 1445 ack_frame->missing = false; | |
| 1446 | 1246 |
| 1447 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { | 1247 if (!reader->ReadBytes(&ack_frame->largest_observed, largest_acked_length)) { |
| 1448 set_detailed_error("Unable to read largest acked."); | 1248 set_detailed_error("Unable to read largest acked."); |
| 1449 return false; | 1249 return false; |
| 1450 } | 1250 } |
| 1451 | 1251 |
| 1452 uint64_t ack_delay_time_us; | 1252 uint64_t ack_delay_time_us; |
| 1453 if (!reader->ReadUFloat16(&ack_delay_time_us)) { | 1253 if (!reader->ReadUFloat16(&ack_delay_time_us)) { |
| 1454 set_detailed_error("Unable to read ack delay time."); | 1254 set_detailed_error("Unable to read ack delay time."); |
| 1455 return false; | 1255 return false; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1501 | 1301 |
| 1502 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { | 1302 if (!ProcessTimestampsInAckFrame(reader, ack_frame)) { |
| 1503 return false; | 1303 return false; |
| 1504 } | 1304 } |
| 1505 | 1305 |
| 1506 return true; | 1306 return true; |
| 1507 } | 1307 } |
| 1508 | 1308 |
| 1509 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, | 1309 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, |
| 1510 QuicAckFrame* ack_frame) { | 1310 QuicAckFrame* ack_frame) { |
| 1511 if (ack_frame->is_truncated) { | |
| 1512 return true; | |
| 1513 } | |
| 1514 uint8_t num_received_packets; | 1311 uint8_t num_received_packets; |
| 1515 if (!reader->ReadBytes(&num_received_packets, 1)) { | 1312 if (!reader->ReadBytes(&num_received_packets, 1)) { |
| 1516 set_detailed_error("Unable to read num received packets."); | 1313 set_detailed_error("Unable to read num received packets."); |
| 1517 return false; | 1314 return false; |
| 1518 } | 1315 } |
| 1519 | 1316 |
| 1520 if (num_received_packets > 0) { | 1317 if (num_received_packets > 0) { |
| 1521 uint8_t delta_from_largest_observed; | 1318 uint8_t delta_from_largest_observed; |
| 1522 if (!reader->ReadBytes(&delta_from_largest_observed, | 1319 if (!reader->ReadBytes(&delta_from_largest_observed, |
| 1523 PACKET_1BYTE_PACKET_NUMBER)) { | 1320 PACKET_1BYTE_PACKET_NUMBER)) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1562 ack_frame->received_packet_times.push_back( | 1359 ack_frame->received_packet_times.push_back( |
| 1563 std::make_pair(seq_num, creation_time_ + last_timestamp_)); | 1360 std::make_pair(seq_num, creation_time_ + last_timestamp_)); |
| 1564 } | 1361 } |
| 1565 } | 1362 } |
| 1566 return true; | 1363 return true; |
| 1567 } | 1364 } |
| 1568 | 1365 |
| 1569 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, | 1366 bool QuicFramer::ProcessStopWaitingFrame(QuicDataReader* reader, |
| 1570 const QuicPacketHeader& header, | 1367 const QuicPacketHeader& header, |
| 1571 QuicStopWaitingFrame* stop_waiting) { | 1368 QuicStopWaitingFrame* stop_waiting) { |
| 1572 if (quic_version_ <= QUIC_VERSION_33) { | |
| 1573 if (!reader->ReadBytes(&stop_waiting->entropy_hash, 1)) { | |
| 1574 set_detailed_error("Unable to read entropy hash for sent packets."); | |
| 1575 return false; | |
| 1576 } | |
| 1577 } | |
| 1578 | |
| 1579 QuicPacketNumber least_unacked_delta = 0; | 1369 QuicPacketNumber least_unacked_delta = 0; |
| 1580 if (!reader->ReadBytes(&least_unacked_delta, | 1370 if (!reader->ReadBytes(&least_unacked_delta, |
| 1581 header.public_header.packet_number_length)) { | 1371 header.public_header.packet_number_length)) { |
| 1582 set_detailed_error("Unable to read least unacked delta."); | 1372 set_detailed_error("Unable to read least unacked delta."); |
| 1583 return false; | 1373 return false; |
| 1584 } | 1374 } |
| 1585 DCHECK_GE(header.packet_number, least_unacked_delta); | 1375 DCHECK_GE(header.packet_number, least_unacked_delta); |
| 1586 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; | 1376 stop_waiting->least_unacked = header.packet_number - least_unacked_delta; |
| 1587 | 1377 |
| 1588 return true; | 1378 return true; |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1836 if (success) { | 1626 if (success) { |
| 1837 visitor_->OnDecryptedPacket(decrypter_level_); | 1627 visitor_->OnDecryptedPacket(decrypter_level_); |
| 1838 } else if (alternative_decrypter_.get() != nullptr) { | 1628 } else if (alternative_decrypter_.get() != nullptr) { |
| 1839 if (header.public_header.nonce != nullptr) { | 1629 if (header.public_header.nonce != nullptr) { |
| 1840 DCHECK_EQ(perspective_, Perspective::IS_CLIENT); | 1630 DCHECK_EQ(perspective_, Perspective::IS_CLIENT); |
| 1841 alternative_decrypter_->SetDiversificationNonce( | 1631 alternative_decrypter_->SetDiversificationNonce( |
| 1842 *header.public_header.nonce); | 1632 *header.public_header.nonce); |
| 1843 } | 1633 } |
| 1844 bool try_alternative_decryption = true; | 1634 bool try_alternative_decryption = true; |
| 1845 if (alternative_decrypter_level_ == ENCRYPTION_INITIAL) { | 1635 if (alternative_decrypter_level_ == ENCRYPTION_INITIAL) { |
| 1846 if (perspective_ == Perspective::IS_CLIENT && | 1636 if (perspective_ == Perspective::IS_CLIENT) { |
| 1847 quic_version_ > QUIC_VERSION_32) { | |
| 1848 if (header.public_header.nonce == nullptr) { | 1637 if (header.public_header.nonce == nullptr) { |
| 1849 // Can not use INITIAL decryption without a diversification nonce. | 1638 // Can not use INITIAL decryption without a diversification nonce. |
| 1850 try_alternative_decryption = false; | 1639 try_alternative_decryption = false; |
| 1851 } | 1640 } |
| 1852 } else { | 1641 } else { |
| 1853 DCHECK(header.public_header.nonce == nullptr); | 1642 DCHECK(header.public_header.nonce == nullptr); |
| 1854 } | 1643 } |
| 1855 } | 1644 } |
| 1856 | 1645 |
| 1857 if (try_alternative_decryption) { | 1646 if (try_alternative_decryption) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1891 return 0; | 1680 return 0; |
| 1892 } | 1681 } |
| 1893 | 1682 |
| 1894 return 5 + 3 * (ack.received_packet_times.size() - 1); | 1683 return 5 + 3 * (ack.received_packet_times.size() - 1); |
| 1895 } | 1684 } |
| 1896 | 1685 |
| 1897 size_t QuicFramer::GetAckFrameSize( | 1686 size_t QuicFramer::GetAckFrameSize( |
| 1898 const QuicAckFrame& ack, | 1687 const QuicAckFrame& ack, |
| 1899 QuicPacketNumberLength packet_number_length) { | 1688 QuicPacketNumberLength packet_number_length) { |
| 1900 size_t ack_size = 0; | 1689 size_t ack_size = 0; |
| 1901 if (quic_version_ <= QUIC_VERSION_33) { | |
| 1902 AckFrameInfo ack_info = GetAckFrameInfo(ack); | |
| 1903 QuicPacketNumberLength largest_observed_length = | |
| 1904 GetMinSequenceNumberLength(ack.largest_observed); | |
| 1905 QuicPacketNumberLength missing_packet_number_length = | |
| 1906 GetMinSequenceNumberLength(ack_info.max_delta); | |
| 1907 | |
| 1908 ack_size = GetMinAckFrameSize(quic_version_, largest_observed_length); | |
| 1909 if (!ack_info.nack_ranges.empty()) { | |
| 1910 ack_size += kNumberOfNackRangesSize; | |
| 1911 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | |
| 1912 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | |
| 1913 } | |
| 1914 | |
| 1915 // In version 23, if the ack will be truncated due to too many nack ranges, | |
| 1916 // then do not include the number of timestamps (1 byte). | |
| 1917 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | |
| 1918 // 1 byte for the number of timestamps. | |
| 1919 ack_size += 1; | |
| 1920 ack_size += GetAckFrameTimeStampSize(ack); | |
| 1921 } | |
| 1922 | |
| 1923 return ack_size; | |
| 1924 } | |
| 1925 | 1690 |
| 1926 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); | 1691 NewAckFrameInfo ack_info = GetNewAckFrameInfo(ack); |
| 1927 QuicPacketNumberLength largest_acked_length = | 1692 QuicPacketNumberLength largest_acked_length = |
| 1928 GetMinSequenceNumberLength(ack.largest_observed); | 1693 GetMinSequenceNumberLength(ack.largest_observed); |
| 1929 QuicPacketNumberLength ack_block_length = | 1694 QuicPacketNumberLength ack_block_length = |
| 1930 GetMinSequenceNumberLength(ack_info.max_block_length); | 1695 GetMinSequenceNumberLength(ack_info.max_block_length); |
| 1931 | 1696 |
| 1932 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); | 1697 ack_size = GetMinAckFrameSize(quic_version_, largest_acked_length); |
| 1933 // First ack block length. | 1698 // First ack block length. |
| 1934 ack_size += ack_block_length; | 1699 ack_size += ack_block_length; |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2094 return false; | 1859 return false; |
| 2095 } | 1860 } |
| 2096 return true; | 1861 return true; |
| 2097 } | 1862 } |
| 2098 | 1863 |
| 2099 void QuicFramer::set_version(const QuicVersion version) { | 1864 void QuicFramer::set_version(const QuicVersion version) { |
| 2100 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); | 1865 DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version); |
| 2101 quic_version_ = version; | 1866 quic_version_ = version; |
| 2102 } | 1867 } |
| 2103 | 1868 |
| 2104 bool QuicFramer::AppendAckFrameAndTypeByte(const QuicPacketHeader& header, | |
| 2105 const QuicAckFrame& frame, | |
| 2106 QuicDataWriter* writer) { | |
| 2107 AckFrameInfo ack_info = GetAckFrameInfo(frame); | |
| 2108 QuicPacketNumber ack_largest_observed = frame.largest_observed; | |
| 2109 QuicPacketNumberLength largest_observed_length = | |
| 2110 GetMinSequenceNumberLength(ack_largest_observed); | |
| 2111 QuicPacketNumberLength missing_packet_number_length = | |
| 2112 GetMinSequenceNumberLength(ack_info.max_delta); | |
| 2113 // Determine whether we need to truncate ranges. | |
| 2114 size_t available_range_bytes = | |
| 2115 writer->capacity() - writer->length() - kNumberOfNackRangesSize - | |
| 2116 GetMinAckFrameSize(quic_version_, largest_observed_length); | |
| 2117 size_t max_num_ranges = | |
| 2118 available_range_bytes / | |
| 2119 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | |
| 2120 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | |
| 2121 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | |
| 2122 DVLOG_IF(1, truncated) << "Truncating ack from " | |
| 2123 << ack_info.nack_ranges.size() << " ranges to " | |
| 2124 << max_num_ranges; | |
| 2125 // Write out the type byte by setting the low order bits and doing shifts | |
| 2126 // to make room for the next bit flags to be set. | |
| 2127 // Whether there are any nacks. | |
| 2128 uint8_t type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; | |
| 2129 | |
| 2130 // truncating bit. | |
| 2131 type_byte <<= kQuicAckTruncatedShift; | |
| 2132 type_byte |= truncated ? kQuicAckTruncatedMask : 0; | |
| 2133 | |
| 2134 // Largest observed packet number length. | |
| 2135 type_byte <<= kQuicSequenceNumberLengthShift; | |
| 2136 type_byte |= GetSequenceNumberFlags(largest_observed_length); | |
| 2137 | |
| 2138 // Missing packet number length. | |
| 2139 type_byte <<= kQuicSequenceNumberLengthShift; | |
| 2140 type_byte |= GetSequenceNumberFlags(missing_packet_number_length); | |
| 2141 | |
| 2142 type_byte |= kQuicFrameTypeAckMask; | |
| 2143 | |
| 2144 if (!writer->WriteUInt8(type_byte)) { | |
| 2145 QUIC_BUG << "type byte failed"; | |
| 2146 return false; | |
| 2147 } | |
| 2148 | |
| 2149 QuicPacketEntropyHash ack_entropy_hash = frame.entropy_hash; | |
| 2150 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); | |
| 2151 if (truncated) { | |
| 2152 // Skip the nack ranges which the truncated ack won't include and set | |
| 2153 // a correct largest observed for the truncated ack. | |
| 2154 for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges); | |
| 2155 ++i) { | |
| 2156 ++ack_iter; | |
| 2157 } | |
| 2158 // If the last range is followed by acks, include them. | |
| 2159 // If the last range is followed by another range, specify the end of the | |
| 2160 // range as the largest_observed. | |
| 2161 ack_largest_observed = ack_iter->first - 1; | |
| 2162 // Also update the entropy so it matches the largest observed. | |
| 2163 ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed); | |
| 2164 ++ack_iter; | |
| 2165 } | |
| 2166 | |
| 2167 if (!writer->WriteUInt8(ack_entropy_hash)) { | |
| 2168 QUIC_BUG << "hash failed."; | |
| 2169 return false; | |
| 2170 } | |
| 2171 | |
| 2172 if (!AppendPacketSequenceNumber(largest_observed_length, ack_largest_observed, | |
| 2173 writer)) { | |
| 2174 QUIC_BUG << "AppendPacketSequenceNumber failed. " | |
| 2175 << "largest_observed_length: " << largest_observed_length | |
| 2176 << " ack_largest_observed: " << ack_largest_observed; | |
| 2177 return false; | |
| 2178 } | |
| 2179 | |
| 2180 uint64_t ack_delay_time_us = kUFloat16MaxValue; | |
| 2181 if (!frame.ack_delay_time.IsInfinite()) { | |
| 2182 DCHECK_LE(0u, frame.ack_delay_time.ToMicroseconds()); | |
| 2183 ack_delay_time_us = frame.ack_delay_time.ToMicroseconds(); | |
| 2184 } | |
| 2185 | |
| 2186 if (!writer->WriteUFloat16(ack_delay_time_us)) { | |
| 2187 QUIC_BUG << "ack delay time failed."; | |
| 2188 return false; | |
| 2189 } | |
| 2190 | |
| 2191 // Timestamp goes at the end of the required fields. | |
| 2192 if (!truncated) { | |
| 2193 if (!AppendTimestampToAckFrame(frame, writer)) { | |
| 2194 QUIC_BUG << "AppendTimestampToAckFrame failed"; | |
| 2195 return false; | |
| 2196 } | |
| 2197 } | |
| 2198 | |
| 2199 if (ack_info.nack_ranges.empty()) { | |
| 2200 return true; | |
| 2201 } | |
| 2202 | |
| 2203 const uint8_t num_missing_ranges = | |
| 2204 static_cast<uint8_t>(min(ack_info.nack_ranges.size(), max_num_ranges)); | |
| 2205 if (!writer->WriteBytes(&num_missing_ranges, 1)) { | |
| 2206 QUIC_BUG << "num_missing_ranges failed: " | |
| 2207 << static_cast<uint32_t>(num_missing_ranges); | |
| 2208 return false; | |
| 2209 } | |
| 2210 | |
| 2211 int num_ranges_written = 0; | |
| 2212 QuicPacketNumber last_sequence_written = ack_largest_observed; | |
| 2213 for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) { | |
| 2214 // Calculate the delta to the last number in the range. | |
| 2215 QuicPacketNumber missing_delta = | |
| 2216 last_sequence_written - (ack_iter->first + ack_iter->second); | |
| 2217 if (!AppendPacketSequenceNumber(missing_packet_number_length, missing_delta, | |
| 2218 writer)) { | |
| 2219 QUIC_BUG << "AppendPacketSequenceNumber failed: " | |
| 2220 << "missing_packet_number_length: " | |
| 2221 << missing_packet_number_length << " missing_delta " | |
| 2222 << missing_delta; | |
| 2223 return false; | |
| 2224 } | |
| 2225 if (!AppendPacketSequenceNumber(PACKET_1BYTE_PACKET_NUMBER, | |
| 2226 ack_iter->second, writer)) { | |
| 2227 QUIC_BUG << "AppendPacketSequenceNumber failed"; | |
| 2228 return false; | |
| 2229 } | |
| 2230 // Subtract 1 so a missing_delta of 0 means an adjacent range. | |
| 2231 last_sequence_written = ack_iter->first - 1; | |
| 2232 ++num_ranges_written; | |
| 2233 } | |
| 2234 DCHECK_EQ(num_missing_ranges, num_ranges_written); | |
| 2235 | |
| 2236 return true; | |
| 2237 } | |
| 2238 | |
| 2239 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 1869 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 2240 QuicDataWriter* writer) { | 1870 QuicDataWriter* writer) { |
| 2241 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 1871 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); |
| 2242 QuicPacketNumber largest_acked = frame.largest_observed; | 1872 QuicPacketNumber largest_acked = frame.largest_observed; |
| 2243 QuicPacketNumberLength largest_acked_length = | 1873 QuicPacketNumberLength largest_acked_length = |
| 2244 GetMinSequenceNumberLength(largest_acked); | 1874 GetMinSequenceNumberLength(largest_acked); |
| 2245 QuicPacketNumberLength ack_block_length = | 1875 QuicPacketNumberLength ack_block_length = |
| 2246 GetMinSequenceNumberLength(new_ack_info.max_block_length); | 1876 GetMinSequenceNumberLength(new_ack_info.max_block_length); |
| 2247 // Calculate available bytes for timestamps and ack blocks. | 1877 // Calculate available bytes for timestamps and ack blocks. |
| 2248 int32_t available_timestamp_and_ack_block_bytes = | 1878 int32_t available_timestamp_and_ack_block_bytes = |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 } | 2080 } |
| 2451 | 2081 |
| 2452 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, | 2082 bool QuicFramer::AppendStopWaitingFrame(const QuicPacketHeader& header, |
| 2453 const QuicStopWaitingFrame& frame, | 2083 const QuicStopWaitingFrame& frame, |
| 2454 QuicDataWriter* writer) { | 2084 QuicDataWriter* writer) { |
| 2455 DCHECK_GE(header.packet_number, frame.least_unacked); | 2085 DCHECK_GE(header.packet_number, frame.least_unacked); |
| 2456 const QuicPacketNumber least_unacked_delta = | 2086 const QuicPacketNumber least_unacked_delta = |
| 2457 header.packet_number - frame.least_unacked; | 2087 header.packet_number - frame.least_unacked; |
| 2458 const QuicPacketNumber length_shift = | 2088 const QuicPacketNumber length_shift = |
| 2459 header.public_header.packet_number_length * 8; | 2089 header.public_header.packet_number_length * 8; |
| 2460 if (quic_version_ <= QUIC_VERSION_33) { | |
| 2461 if (!writer->WriteUInt8(frame.entropy_hash)) { | |
| 2462 QUIC_BUG << " hash failed"; | |
| 2463 return false; | |
| 2464 } | |
| 2465 } | |
| 2466 | 2090 |
| 2467 if (least_unacked_delta >> length_shift > 0) { | 2091 if (least_unacked_delta >> length_shift > 0) { |
| 2468 QUIC_BUG << "packet_number_length " | 2092 QUIC_BUG << "packet_number_length " |
| 2469 << header.public_header.packet_number_length | 2093 << header.public_header.packet_number_length |
| 2470 << " is too small for least_unacked_delta: " << least_unacked_delta | 2094 << " is too small for least_unacked_delta: " << least_unacked_delta |
| 2471 << " packet_number:" << header.packet_number | 2095 << " packet_number:" << header.packet_number |
| 2472 << " least_unacked:" << frame.least_unacked | 2096 << " least_unacked:" << frame.least_unacked |
| 2473 << " version:" << quic_version_; | 2097 << " version:" << quic_version_; |
| 2474 return false; | 2098 return false; |
| 2475 } | 2099 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2553 bool QuicFramer::AppendPathCloseFrame(const QuicPathCloseFrame& frame, | 2177 bool QuicFramer::AppendPathCloseFrame(const QuicPathCloseFrame& frame, |
| 2554 QuicDataWriter* writer) { | 2178 QuicDataWriter* writer) { |
| 2555 uint8_t path_id = static_cast<uint8_t>(frame.path_id); | 2179 uint8_t path_id = static_cast<uint8_t>(frame.path_id); |
| 2556 if (!writer->WriteUInt8(path_id)) { | 2180 if (!writer->WriteUInt8(path_id)) { |
| 2557 return false; | 2181 return false; |
| 2558 } | 2182 } |
| 2559 return true; | 2183 return true; |
| 2560 } | 2184 } |
| 2561 | 2185 |
| 2562 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2186 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2563 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2187 DVLOG(1) << "Error: " << QuicErrorCodeToString(error) |
| 2564 << " detail: " << detailed_error_; | 2188 << " detail: " << detailed_error_; |
| 2565 set_error(error); | 2189 set_error(error); |
| 2566 visitor_->OnError(this); | 2190 visitor_->OnError(this); |
| 2567 return false; | 2191 return false; |
| 2568 } | 2192 } |
| 2569 | 2193 |
| 2570 } // namespace net | 2194 } // namespace net |
| OLD | NEW |