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 |