| 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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 | 129 |
| 130 } // namespace | 130 } // namespace |
| 131 | 131 |
| 132 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 132 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
| 133 QuicTime creation_time, | 133 QuicTime creation_time, |
| 134 Perspective perspective) | 134 Perspective perspective) |
| 135 : visitor_(nullptr), | 135 : visitor_(nullptr), |
| 136 error_(QUIC_NO_ERROR), | 136 error_(QUIC_NO_ERROR), |
| 137 last_packet_number_(0), | 137 last_packet_number_(0), |
| 138 largest_packet_number_(0), | 138 largest_packet_number_(0), |
| 139 last_path_id_(kInvalidPathId), | |
| 140 last_serialized_connection_id_(0), | 139 last_serialized_connection_id_(0), |
| 141 supported_versions_(supported_versions), | 140 supported_versions_(supported_versions), |
| 142 decrypter_level_(ENCRYPTION_NONE), | 141 decrypter_level_(ENCRYPTION_NONE), |
| 143 alternative_decrypter_level_(ENCRYPTION_NONE), | 142 alternative_decrypter_level_(ENCRYPTION_NONE), |
| 144 alternative_decrypter_latch_(false), | 143 alternative_decrypter_latch_(false), |
| 145 perspective_(perspective), | 144 perspective_(perspective), |
| 146 validate_flags_(true), | 145 validate_flags_(true), |
| 147 creation_time_(creation_time), | 146 creation_time_(creation_time), |
| 148 last_timestamp_(QuicTime::Delta::Zero()) { | 147 last_timestamp_(QuicTime::Delta::Zero()) { |
| 149 DCHECK(!supported_versions.empty()); | 148 DCHECK(!supported_versions.empty()); |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 uint64_t next_epoch = epoch + epoch_delta; | 735 uint64_t next_epoch = epoch + epoch_delta; |
| 737 | 736 |
| 738 uint64_t time = ClosestTo( | 737 uint64_t time = ClosestTo( |
| 739 last_timestamp_.ToMicroseconds(), epoch + time_delta_us, | 738 last_timestamp_.ToMicroseconds(), epoch + time_delta_us, |
| 740 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us, | 739 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us, |
| 741 next_epoch + time_delta_us)); | 740 next_epoch + time_delta_us)); |
| 742 | 741 |
| 743 return QuicTime::Delta::FromMicroseconds(time); | 742 return QuicTime::Delta::FromMicroseconds(time); |
| 744 } | 743 } |
| 745 | 744 |
| 746 bool QuicFramer::IsValidPath(QuicPathId path_id, | |
| 747 QuicPacketNumber* base_packet_number) { | |
| 748 if (QuicContainsKey(closed_paths_, path_id)) { | |
| 749 // Path is closed. | |
| 750 return false; | |
| 751 } | |
| 752 | |
| 753 if (path_id == last_path_id_) { | |
| 754 *base_packet_number = largest_packet_number_; | |
| 755 return true; | |
| 756 } | |
| 757 | |
| 758 if (QuicContainsKey(largest_packet_numbers_, path_id)) { | |
| 759 *base_packet_number = largest_packet_numbers_[path_id]; | |
| 760 } else { | |
| 761 *base_packet_number = 0; | |
| 762 } | |
| 763 | |
| 764 return true; | |
| 765 } | |
| 766 | |
| 767 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { | 745 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { |
| 768 if (header.public_header.multipath_flag && header.path_id != last_path_id_) { | |
| 769 if (last_path_id_ != kInvalidPathId) { | |
| 770 // Save current last packet number before changing path. | |
| 771 largest_packet_numbers_[last_path_id_] = largest_packet_number_; | |
| 772 } | |
| 773 // Change path. | |
| 774 last_path_id_ = header.path_id; | |
| 775 } | |
| 776 last_packet_number_ = header.packet_number; | 746 last_packet_number_ = header.packet_number; |
| 777 largest_packet_number_ = | 747 largest_packet_number_ = |
| 778 std::max(header.packet_number, largest_packet_number_); | 748 std::max(header.packet_number, largest_packet_number_); |
| 779 } | 749 } |
| 780 | 750 |
| 781 void QuicFramer::OnPathClosed(QuicPathId path_id) { | |
| 782 closed_paths_.insert(path_id); | |
| 783 largest_packet_numbers_.erase(path_id); | |
| 784 } | |
| 785 | |
| 786 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( | 751 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( |
| 787 QuicPacketNumberLength packet_number_length, | 752 QuicPacketNumberLength packet_number_length, |
| 788 QuicPacketNumber base_packet_number, | 753 QuicPacketNumber base_packet_number, |
| 789 QuicPacketNumber packet_number) const { | 754 QuicPacketNumber packet_number) const { |
| 790 // The new packet number might have wrapped to the next epoch, or | 755 // The new packet number might have wrapped to the next epoch, or |
| 791 // it might have reverse wrapped to the previous epoch, or it might | 756 // it might have reverse wrapped to the previous epoch, or it might |
| 792 // remain in the same epoch. Select the packet number closest to the | 757 // remain in the same epoch. Select the packet number closest to the |
| 793 // next expected packet number, the previous packet number plus 1. | 758 // next expected packet number, the previous packet number plus 1. |
| 794 | 759 |
| 795 // epoch_delta is the delta between epochs the packet number was serialized | 760 // epoch_delta is the delta between epochs the packet number was serialized |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 922 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
| 958 QuicPacketHeader* header) { | 923 QuicPacketHeader* header) { |
| 959 header->path_id = kDefaultPathId; | 924 header->path_id = kDefaultPathId; |
| 960 if (header->public_header.multipath_flag && | 925 if (header->public_header.multipath_flag && |
| 961 !ProcessPathId(encrypted_reader, &header->path_id)) { | 926 !ProcessPathId(encrypted_reader, &header->path_id)) { |
| 962 set_detailed_error("Unable to read path id."); | 927 set_detailed_error("Unable to read path id."); |
| 963 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 928 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 964 } | 929 } |
| 965 | 930 |
| 966 QuicPacketNumber base_packet_number = largest_packet_number_; | 931 QuicPacketNumber base_packet_number = largest_packet_number_; |
| 967 if (header->public_header.multipath_flag && | |
| 968 !IsValidPath(header->path_id, &base_packet_number)) { | |
| 969 // Stop processing because path is closed. | |
| 970 set_detailed_error("Path is closed."); | |
| 971 return false; | |
| 972 } | |
| 973 | 932 |
| 974 if (!ProcessPacketSequenceNumber( | 933 if (!ProcessPacketSequenceNumber( |
| 975 encrypted_reader, header->public_header.packet_number_length, | 934 encrypted_reader, header->public_header.packet_number_length, |
| 976 base_packet_number, &header->packet_number)) { | 935 base_packet_number, &header->packet_number)) { |
| 977 set_detailed_error("Unable to read packet number."); | 936 set_detailed_error("Unable to read packet number."); |
| 978 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 937 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 979 } | 938 } |
| 980 | 939 |
| 981 if (header->packet_number == 0u) { | 940 if (header->packet_number == 0u) { |
| 982 set_detailed_error("packet numbers cannot be 0."); | 941 set_detailed_error("packet numbers cannot be 0."); |
| (...skipping 1221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2204 | 2163 |
| 2205 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2164 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2206 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) | 2165 QUIC_DLOG(INFO) << ENDPOINT << "Error: " << QuicErrorCodeToString(error) |
| 2207 << " detail: " << detailed_error_; | 2166 << " detail: " << detailed_error_; |
| 2208 set_error(error); | 2167 set_error(error); |
| 2209 visitor_->OnError(this); | 2168 visitor_->OnError(this); |
| 2210 return false; | 2169 return false; |
| 2211 } | 2170 } |
| 2212 | 2171 |
| 2213 } // namespace net | 2172 } // namespace net |
| OLD | NEW |