| 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 |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "net/quic/core/crypto/crypto_framer.h" | 14 #include "net/quic/core/crypto/crypto_framer.h" |
| 15 #include "net/quic/core/crypto/crypto_handshake_message.h" | 15 #include "net/quic/core/crypto/crypto_handshake_message.h" |
| 16 #include "net/quic/core/crypto/crypto_protocol.h" | 16 #include "net/quic/core/crypto/crypto_protocol.h" |
| 17 #include "net/quic/core/crypto/quic_decrypter.h" | 17 #include "net/quic/core/crypto/quic_decrypter.h" |
| 18 #include "net/quic/core/crypto/quic_encrypter.h" | 18 #include "net/quic/core/crypto/quic_encrypter.h" |
| 19 #include "net/quic/core/quic_bug_tracker.h" | 19 #include "net/quic/core/quic_bug_tracker.h" |
| 20 #include "net/quic/core/quic_data_reader.h" | 20 #include "net/quic/core/quic_data_reader.h" |
| 21 #include "net/quic/core/quic_data_writer.h" | 21 #include "net/quic/core/quic_data_writer.h" |
| 22 #include "net/quic/core/quic_flags.h" | 22 #include "net/quic/core/quic_flags.h" |
| 23 #include "net/quic/core/quic_socket_address_coder.h" | 23 #include "net/quic/core/quic_socket_address_coder.h" |
| 24 #include "net/quic/core/quic_utils.h" | 24 #include "net/quic/core/quic_utils.h" |
| 25 | 25 |
| 26 using base::ContainsKey; |
| 26 using base::StringPiece; | 27 using base::StringPiece; |
| 27 using std::map; | 28 using std::map; |
| 28 using std::max; | 29 using std::max; |
| 29 using std::min; | 30 using std::min; |
| 30 using std::numeric_limits; | 31 using std::numeric_limits; |
| 31 using std::string; | 32 using std::string; |
| 32 using std::vector; | 33 using std::vector; |
| 33 #define PREDICT_FALSE(x) (x) | 34 #define PREDICT_FALSE(x) (x) |
| 34 | 35 |
| 35 namespace net { | 36 namespace net { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 | 136 |
| 136 } // namespace | 137 } // namespace |
| 137 | 138 |
| 138 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, | 139 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, |
| 139 QuicTime creation_time, | 140 QuicTime creation_time, |
| 140 Perspective perspective) | 141 Perspective perspective) |
| 141 : visitor_(nullptr), | 142 : visitor_(nullptr), |
| 142 entropy_calculator_(nullptr), | 143 entropy_calculator_(nullptr), |
| 143 error_(QUIC_NO_ERROR), | 144 error_(QUIC_NO_ERROR), |
| 144 last_packet_number_(0), | 145 last_packet_number_(0), |
| 146 largest_packet_number_(0), |
| 145 last_path_id_(kInvalidPathId), | 147 last_path_id_(kInvalidPathId), |
| 146 last_serialized_connection_id_(0), | 148 last_serialized_connection_id_(0), |
| 147 supported_versions_(supported_versions), | 149 supported_versions_(supported_versions), |
| 148 decrypter_level_(ENCRYPTION_NONE), | 150 decrypter_level_(ENCRYPTION_NONE), |
| 149 alternative_decrypter_level_(ENCRYPTION_NONE), | 151 alternative_decrypter_level_(ENCRYPTION_NONE), |
| 150 alternative_decrypter_latch_(false), | 152 alternative_decrypter_latch_(false), |
| 151 perspective_(perspective), | 153 perspective_(perspective), |
| 152 validate_flags_(true), | 154 validate_flags_(true), |
| 153 creation_time_(creation_time), | 155 creation_time_(creation_time), |
| 154 last_timestamp_(QuicTime::Delta::Zero()) { | 156 last_timestamp_(QuicTime::Delta::Zero()) { |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 | 794 |
| 793 uint64_t time = ClosestTo( | 795 uint64_t time = ClosestTo( |
| 794 last_timestamp_.ToMicroseconds(), epoch + time_delta_us, | 796 last_timestamp_.ToMicroseconds(), epoch + time_delta_us, |
| 795 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us, | 797 ClosestTo(last_timestamp_.ToMicroseconds(), prev_epoch + time_delta_us, |
| 796 next_epoch + time_delta_us)); | 798 next_epoch + time_delta_us)); |
| 797 | 799 |
| 798 return QuicTime::Delta::FromMicroseconds(time); | 800 return QuicTime::Delta::FromMicroseconds(time); |
| 799 } | 801 } |
| 800 | 802 |
| 801 bool QuicFramer::IsValidPath(QuicPathId path_id, | 803 bool QuicFramer::IsValidPath(QuicPathId path_id, |
| 802 QuicPacketNumber* last_packet_number) { | 804 QuicPacketNumber* base_packet_number) { |
| 803 if (base::ContainsKey(closed_paths_, path_id)) { | 805 if (ContainsKey(closed_paths_, path_id)) { |
| 804 // Path is closed. | 806 // Path is closed. |
| 805 return false; | 807 return false; |
| 806 } | 808 } |
| 807 | 809 |
| 808 if (path_id == last_path_id_) { | 810 if (FLAGS_quic_packet_numbers_largest_received) { |
| 809 *last_packet_number = last_packet_number_; | 811 if (path_id == last_path_id_) { |
| 810 return true; | 812 *base_packet_number = largest_packet_number_; |
| 811 } | 813 return true; |
| 814 } |
| 812 | 815 |
| 813 if (base::ContainsKey(last_packet_numbers_, path_id)) { | 816 if (ContainsKey(largest_packet_numbers_, path_id)) { |
| 814 *last_packet_number = last_packet_numbers_[path_id]; | 817 *base_packet_number = largest_packet_numbers_[path_id]; |
| 818 } else { |
| 819 *base_packet_number = 0; |
| 820 } |
| 815 } else { | 821 } else { |
| 816 *last_packet_number = 0; | 822 if (path_id == last_path_id_) { |
| 823 *base_packet_number = last_packet_number_; |
| 824 return true; |
| 825 } |
| 826 |
| 827 if (ContainsKey(last_packet_numbers_, path_id)) { |
| 828 *base_packet_number = last_packet_numbers_[path_id]; |
| 829 } else { |
| 830 *base_packet_number = 0; |
| 831 } |
| 817 } | 832 } |
| 818 | 833 |
| 819 return true; | 834 return true; |
| 820 } | 835 } |
| 821 | 836 |
| 822 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { | 837 void QuicFramer::SetLastPacketNumber(const QuicPacketHeader& header) { |
| 823 if (header.public_header.multipath_flag && header.path_id != last_path_id_) { | 838 if (header.public_header.multipath_flag && header.path_id != last_path_id_) { |
| 824 if (last_path_id_ != kInvalidPathId) { | 839 if (last_path_id_ != kInvalidPathId) { |
| 825 // Save current last packet number before changing path. | 840 // Save current last packet number before changing path. |
| 826 last_packet_numbers_[last_path_id_] = last_packet_number_; | 841 last_packet_numbers_[last_path_id_] = last_packet_number_; |
| 842 if (FLAGS_quic_packet_numbers_largest_received) { |
| 843 largest_packet_numbers_[last_path_id_] = largest_packet_number_; |
| 844 } |
| 827 } | 845 } |
| 828 // Change path. | 846 // Change path. |
| 829 last_path_id_ = header.path_id; | 847 last_path_id_ = header.path_id; |
| 830 } | 848 } |
| 831 last_packet_number_ = header.packet_number; | 849 last_packet_number_ = header.packet_number; |
| 850 if (FLAGS_quic_packet_numbers_largest_received) { |
| 851 largest_packet_number_ = max(header.packet_number, largest_packet_number_); |
| 852 } |
| 832 } | 853 } |
| 833 | 854 |
| 834 void QuicFramer::OnPathClosed(QuicPathId path_id) { | 855 void QuicFramer::OnPathClosed(QuicPathId path_id) { |
| 835 closed_paths_.insert(path_id); | 856 closed_paths_.insert(path_id); |
| 836 last_packet_numbers_.erase(path_id); | 857 last_packet_numbers_.erase(path_id); |
| 837 } | 858 } |
| 838 | 859 |
| 839 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( | 860 QuicPacketNumber QuicFramer::CalculatePacketNumberFromWire( |
| 840 QuicPacketNumberLength packet_number_length, | 861 QuicPacketNumberLength packet_number_length, |
| 841 QuicPacketNumber last_packet_number, | 862 QuicPacketNumber base_packet_number, |
| 842 QuicPacketNumber packet_number) const { | 863 QuicPacketNumber packet_number) const { |
| 843 // The new packet number might have wrapped to the next epoch, or | 864 // The new packet number might have wrapped to the next epoch, or |
| 844 // it might have reverse wrapped to the previous epoch, or it might | 865 // it might have reverse wrapped to the previous epoch, or it might |
| 845 // remain in the same epoch. Select the packet number closest to the | 866 // remain in the same epoch. Select the packet number closest to the |
| 846 // next expected packet number, the previous packet number plus 1. | 867 // next expected packet number, the previous packet number plus 1. |
| 847 | 868 |
| 848 // epoch_delta is the delta between epochs the packet number was serialized | 869 // epoch_delta is the delta between epochs the packet number was serialized |
| 849 // with, so the correct value is likely the same epoch as the last sequence | 870 // with, so the correct value is likely the same epoch as the last sequence |
| 850 // number or an adjacent epoch. | 871 // number or an adjacent epoch. |
| 851 const QuicPacketNumber epoch_delta = UINT64_C(1) | 872 const QuicPacketNumber epoch_delta = UINT64_C(1) |
| 852 << (8 * packet_number_length); | 873 << (8 * packet_number_length); |
| 853 QuicPacketNumber next_packet_number = last_packet_number + 1; | 874 QuicPacketNumber next_packet_number = base_packet_number + 1; |
| 854 QuicPacketNumber epoch = last_packet_number & ~(epoch_delta - 1); | 875 QuicPacketNumber epoch = base_packet_number & ~(epoch_delta - 1); |
| 855 QuicPacketNumber prev_epoch = epoch - epoch_delta; | 876 QuicPacketNumber prev_epoch = epoch - epoch_delta; |
| 856 QuicPacketNumber next_epoch = epoch + epoch_delta; | 877 QuicPacketNumber next_epoch = epoch + epoch_delta; |
| 857 | 878 |
| 858 return ClosestTo(next_packet_number, epoch + packet_number, | 879 return ClosestTo(next_packet_number, epoch + packet_number, |
| 859 ClosestTo(next_packet_number, prev_epoch + packet_number, | 880 ClosestTo(next_packet_number, prev_epoch + packet_number, |
| 860 next_epoch + packet_number)); | 881 next_epoch + packet_number)); |
| 861 } | 882 } |
| 862 | 883 |
| 863 bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader, | 884 bool QuicFramer::ProcessPublicHeader(QuicDataReader* reader, |
| 864 QuicPacketPublicHeader* public_header) { | 885 QuicPacketPublicHeader* public_header) { |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 | 1065 |
| 1045 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, | 1066 bool QuicFramer::ProcessUnauthenticatedHeader(QuicDataReader* encrypted_reader, |
| 1046 QuicPacketHeader* header) { | 1067 QuicPacketHeader* header) { |
| 1047 header->path_id = kDefaultPathId; | 1068 header->path_id = kDefaultPathId; |
| 1048 if (header->public_header.multipath_flag && | 1069 if (header->public_header.multipath_flag && |
| 1049 !ProcessPathId(encrypted_reader, &header->path_id)) { | 1070 !ProcessPathId(encrypted_reader, &header->path_id)) { |
| 1050 set_detailed_error("Unable to read path id."); | 1071 set_detailed_error("Unable to read path id."); |
| 1051 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1072 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1052 } | 1073 } |
| 1053 | 1074 |
| 1054 QuicPacketNumber last_packet_number = last_packet_number_; | 1075 QuicPacketNumber base_packet_number = |
| 1076 FLAGS_quic_packet_numbers_largest_received |
| 1077 ? largest_packet_number_ |
| 1078 : last_packet_number_; |
| 1055 if (header->public_header.multipath_flag && | 1079 if (header->public_header.multipath_flag && |
| 1056 !IsValidPath(header->path_id, &last_packet_number)) { | 1080 !IsValidPath(header->path_id, &base_packet_number)) { |
| 1057 // Stop processing because path is closed. | 1081 // Stop processing because path is closed. |
| 1058 return false; | 1082 return false; |
| 1059 } | 1083 } |
| 1060 | 1084 |
| 1061 if (!ProcessPacketSequenceNumber( | 1085 if (!ProcessPacketSequenceNumber( |
| 1062 encrypted_reader, header->public_header.packet_number_length, | 1086 encrypted_reader, header->public_header.packet_number_length, |
| 1063 last_packet_number, &header->packet_number)) { | 1087 base_packet_number, &header->packet_number)) { |
| 1064 set_detailed_error("Unable to read packet number."); | 1088 set_detailed_error("Unable to read packet number."); |
| 1065 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1089 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1066 } | 1090 } |
| 1067 | 1091 |
| 1068 if (header->packet_number == 0u) { | 1092 if (header->packet_number == 0u) { |
| 1069 set_detailed_error("packet numbers cannot be 0."); | 1093 set_detailed_error("packet numbers cannot be 0."); |
| 1070 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1094 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1071 } | 1095 } |
| 1072 | 1096 |
| 1073 if (!visitor_->OnUnauthenticatedHeader(*header)) { | 1097 if (!visitor_->OnUnauthenticatedHeader(*header)) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 if (!reader->ReadBytes(path_id, 1)) { | 1145 if (!reader->ReadBytes(path_id, 1)) { |
| 1122 return false; | 1146 return false; |
| 1123 } | 1147 } |
| 1124 | 1148 |
| 1125 return true; | 1149 return true; |
| 1126 } | 1150 } |
| 1127 | 1151 |
| 1128 bool QuicFramer::ProcessPacketSequenceNumber( | 1152 bool QuicFramer::ProcessPacketSequenceNumber( |
| 1129 QuicDataReader* reader, | 1153 QuicDataReader* reader, |
| 1130 QuicPacketNumberLength packet_number_length, | 1154 QuicPacketNumberLength packet_number_length, |
| 1131 QuicPacketNumber last_packet_number, | 1155 QuicPacketNumber base_packet_number, |
| 1132 QuicPacketNumber* packet_number) { | 1156 QuicPacketNumber* packet_number) { |
| 1133 QuicPacketNumber wire_packet_number = 0u; | 1157 QuicPacketNumber wire_packet_number = 0u; |
| 1134 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { | 1158 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { |
| 1135 return false; | 1159 return false; |
| 1136 } | 1160 } |
| 1137 | 1161 |
| 1138 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers | 1162 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers |
| 1139 // in case the first guess is incorrect. | 1163 // in case the first guess is incorrect. |
| 1140 *packet_number = CalculatePacketNumberFromWire( | 1164 *packet_number = CalculatePacketNumberFromWire( |
| 1141 packet_number_length, last_packet_number, wire_packet_number); | 1165 packet_number_length, base_packet_number, wire_packet_number); |
| 1142 return true; | 1166 return true; |
| 1143 } | 1167 } |
| 1144 | 1168 |
| 1145 bool QuicFramer::ProcessFrameData(QuicDataReader* reader, | 1169 bool QuicFramer::ProcessFrameData(QuicDataReader* reader, |
| 1146 const QuicPacketHeader& header) { | 1170 const QuicPacketHeader& header) { |
| 1147 if (reader->IsDoneReading()) { | 1171 if (reader->IsDoneReading()) { |
| 1148 set_detailed_error("Packet has no frames."); | 1172 set_detailed_error("Packet has no frames."); |
| 1149 return RaiseError(QUIC_MISSING_PAYLOAD); | 1173 return RaiseError(QUIC_MISSING_PAYLOAD); |
| 1150 } | 1174 } |
| 1151 while (!reader->IsDoneReading()) { | 1175 while (!reader->IsDoneReading()) { |
| (...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2618 | 2642 |
| 2619 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2643 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2620 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2644 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
| 2621 << " detail: " << detailed_error_; | 2645 << " detail: " << detailed_error_; |
| 2622 set_error(error); | 2646 set_error(error); |
| 2623 visitor_->OnError(this); | 2647 visitor_->OnError(this); |
| 2624 return false; | 2648 return false; |
| 2625 } | 2649 } |
| 2626 | 2650 |
| 2627 } // namespace net | 2651 } // namespace net |
| OLD | NEW |