Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: net/quic/core/quic_framer.cc

Issue 2334363002: Landing Recent QUIC changes until Sat Sep 10 00:32:41 (Closed)
Patch Set: Revase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 // and only for versions after QUIC_VERSION_32. Earlier versions will 949 // and only for versions after QUIC_VERSION_32. Earlier versions will
929 // set this bit when indicating an 8-byte connection ID, which should 950 // set this bit when indicating an 8-byte connection ID, which should
930 // not be interpreted as indicating a nonce is present. 951 // not be interpreted as indicating a nonce is present.
931 if (quic_version_ > QUIC_VERSION_32 && 952 if (quic_version_ > QUIC_VERSION_32 &&
932 public_flags & PACKET_PUBLIC_FLAGS_NONCE && 953 public_flags & PACKET_PUBLIC_FLAGS_NONCE &&
933 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) && 954 !(public_flags & PACKET_PUBLIC_FLAGS_VERSION) &&
934 !(public_flags & PACKET_PUBLIC_FLAGS_RST) && 955 !(public_flags & PACKET_PUBLIC_FLAGS_RST) &&
935 // The nonce flag from a client is ignored and is assumed to be an older 956 // The nonce flag from a client is ignored and is assumed to be an older
936 // client indicating an eight-byte connection ID. 957 // client indicating an eight-byte connection ID.
937 perspective_ == Perspective::IS_CLIENT) { 958 perspective_ == Perspective::IS_CLIENT) {
938 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_), 959 if (!reader->ReadBytes(reinterpret_cast<uint8_t*>(last_nonce_.data()),
939 sizeof(last_nonce_))) { 960 last_nonce_.size())) {
940 set_detailed_error("Unable to read nonce."); 961 set_detailed_error("Unable to read nonce.");
941 return false; 962 return false;
942 } 963 }
943 public_header->nonce = &last_nonce_; 964 public_header->nonce = &last_nonce_;
944 } else { 965 } else {
945 public_header->nonce = nullptr; 966 public_header->nonce = nullptr;
946 } 967 }
947 968
948 return true; 969 return true;
949 } 970 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 ? largest_packet_number_
1077 : last_packet_number_;
1055 if (header->public_header.multipath_flag && 1078 if (header->public_header.multipath_flag &&
1056 !IsValidPath(header->path_id, &last_packet_number)) { 1079 !IsValidPath(header->path_id, &base_packet_number)) {
1057 // Stop processing because path is closed. 1080 // Stop processing because path is closed.
1058 return false; 1081 return false;
1059 } 1082 }
1060 1083
1061 if (!ProcessPacketSequenceNumber( 1084 if (!ProcessPacketSequenceNumber(
1062 encrypted_reader, header->public_header.packet_number_length, 1085 encrypted_reader, header->public_header.packet_number_length,
1063 last_packet_number, &header->packet_number)) { 1086 base_packet_number, &header->packet_number)) {
1064 set_detailed_error("Unable to read packet number."); 1087 set_detailed_error("Unable to read packet number.");
1065 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1088 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1066 } 1089 }
1067 1090
1068 if (header->packet_number == 0u) { 1091 if (header->packet_number == 0u) {
1069 set_detailed_error("packet numbers cannot be 0."); 1092 set_detailed_error("packet numbers cannot be 0.");
1070 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1093 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1071 } 1094 }
1072 1095
1073 if (!visitor_->OnUnauthenticatedHeader(*header)) { 1096 if (!visitor_->OnUnauthenticatedHeader(*header)) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 if (!reader->ReadBytes(path_id, 1)) { 1144 if (!reader->ReadBytes(path_id, 1)) {
1122 return false; 1145 return false;
1123 } 1146 }
1124 1147
1125 return true; 1148 return true;
1126 } 1149 }
1127 1150
1128 bool QuicFramer::ProcessPacketSequenceNumber( 1151 bool QuicFramer::ProcessPacketSequenceNumber(
1129 QuicDataReader* reader, 1152 QuicDataReader* reader,
1130 QuicPacketNumberLength packet_number_length, 1153 QuicPacketNumberLength packet_number_length,
1131 QuicPacketNumber last_packet_number, 1154 QuicPacketNumber base_packet_number,
1132 QuicPacketNumber* packet_number) { 1155 QuicPacketNumber* packet_number) {
1133 QuicPacketNumber wire_packet_number = 0u; 1156 QuicPacketNumber wire_packet_number = 0u;
1134 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) { 1157 if (!reader->ReadBytes(&wire_packet_number, packet_number_length)) {
1135 return false; 1158 return false;
1136 } 1159 }
1137 1160
1138 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers 1161 // TODO(ianswett): Explore the usefulness of trying multiple packet numbers
1139 // in case the first guess is incorrect. 1162 // in case the first guess is incorrect.
1140 *packet_number = CalculatePacketNumberFromWire( 1163 *packet_number = CalculatePacketNumberFromWire(
1141 packet_number_length, last_packet_number, wire_packet_number); 1164 packet_number_length, base_packet_number, wire_packet_number);
1142 return true; 1165 return true;
1143 } 1166 }
1144 1167
1145 bool QuicFramer::ProcessFrameData(QuicDataReader* reader, 1168 bool QuicFramer::ProcessFrameData(QuicDataReader* reader,
1146 const QuicPacketHeader& header) { 1169 const QuicPacketHeader& header) {
1147 if (reader->IsDoneReading()) { 1170 if (reader->IsDoneReading()) {
1148 set_detailed_error("Packet has no frames."); 1171 set_detailed_error("Packet has no frames.");
1149 return RaiseError(QUIC_MISSING_PAYLOAD); 1172 return RaiseError(QUIC_MISSING_PAYLOAD);
1150 } 1173 }
1151 while (!reader->IsDoneReading()) { 1174 while (!reader->IsDoneReading()) {
(...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after
2618 2641
2619 bool QuicFramer::RaiseError(QuicErrorCode error) { 2642 bool QuicFramer::RaiseError(QuicErrorCode error) {
2620 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) 2643 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error)
2621 << " detail: " << detailed_error_; 2644 << " detail: " << detailed_error_;
2622 set_error(error); 2645 set_error(error);
2623 visitor_->OnError(this); 2646 visitor_->OnError(this);
2624 return false; 2647 return false;
2625 } 2648 }
2626 2649
2627 } // namespace net 2650 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_framer.h ('k') | net/quic/core/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698