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 |