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

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

Issue 446063005: Move Quic AppendTimestampFrame method out of AppendCongestionFrame. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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/quic_framer.h ('k') | net/quic/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/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include "base/containers/hash_tables.h" 7 #include "base/containers/hash_tables.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "net/quic/crypto/crypto_framer.h" 9 #include "net/quic/crypto/crypto_framer.h"
10 #include "net/quic/crypto/crypto_handshake_message.h" 10 #include "net/quic/crypto/crypto_handshake_message.h"
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 const QuicAckFrame& frame) { 965 const QuicAckFrame& frame) {
966 AckFrameInfo ack_info; 966 AckFrameInfo ack_info;
967 if (!frame.missing_packets.empty()) { 967 if (!frame.missing_packets.empty()) {
968 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); 968 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin());
969 size_t cur_range_length = 0; 969 size_t cur_range_length = 0;
970 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); 970 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin();
971 QuicPacketSequenceNumber last_missing = *iter; 971 QuicPacketSequenceNumber last_missing = *iter;
972 ++iter; 972 ++iter;
973 for (; iter != frame.missing_packets.end(); ++iter) { 973 for (; iter != frame.missing_packets.end(); ++iter) {
974 if (cur_range_length != numeric_limits<uint8>::max() && 974 if (cur_range_length != numeric_limits<uint8>::max() &&
975 *iter == (last_missing + 1)) { 975 *iter == (last_missing + 1)) {
976 ++cur_range_length; 976 ++cur_range_length;
977 } else { 977 } else {
978 ack_info.nack_ranges[last_missing - cur_range_length] 978 ack_info.nack_ranges[last_missing - cur_range_length]
979 = cur_range_length; 979 = cur_range_length;
980 cur_range_length = 0; 980 cur_range_length = 0;
981 } 981 }
982 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); 982 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing);
983 last_missing = *iter; 983 last_missing = *iter;
984 }
985 // Include the last nack range.
986 ack_info.nack_ranges[last_missing - cur_range_length] =
987 cur_range_length;
988 // Include the range to the largest observed.
989 ack_info.max_delta = max(ack_info.max_delta,
990 frame.largest_observed - last_missing);
991 }
992 return ack_info;
984 } 993 }
985 // Include the last nack range. 994
986 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length; 995 bool QuicFramer::ProcessPacketHeader(
987 // Include the range to the largest observed. 996 QuicPacketHeader* header,
988 ack_info.max_delta = max(ack_info.max_delta, 997 const QuicEncryptedPacket& packet) {
989 frame.largest_observed - last_missing); 998 if (!ProcessPacketSequenceNumber(
990 } 999 header->public_header.sequence_number_length,
991 return ack_info; 1000 &header->packet_sequence_number)) {
992 } 1001 set_detailed_error("Unable to read sequence number.");
993 1002 return RaiseError(QUIC_INVALID_PACKET_HEADER);
994 bool QuicFramer::ProcessPacketHeader( 1003 }
995 QuicPacketHeader* header, 1004
996 const QuicEncryptedPacket& packet) { 1005 if (header->packet_sequence_number == 0u) {
997 if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length, 1006 set_detailed_error("Packet sequence numbers cannot be 0.");
998 &header->packet_sequence_number)) { 1007 return RaiseError(QUIC_INVALID_PACKET_HEADER);
999 set_detailed_error("Unable to read sequence number."); 1008 }
1000 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1009
1001 } 1010 if (!visitor_->OnUnauthenticatedHeader(*header)) {
1002 1011 return false;
1003 if (header->packet_sequence_number == 0u) { 1012 }
1004 set_detailed_error("Packet sequence numbers cannot be 0."); 1013
1005 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1014 if (!DecryptPayload(*header, packet)) {
1006 } 1015 set_detailed_error("Unable to decrypt payload.");
1007 1016 return RaiseError(QUIC_DECRYPTION_FAILURE);
1008 if (!visitor_->OnUnauthenticatedHeader(*header)) { 1017 }
1009 return false; 1018
1010 } 1019 uint8 private_flags;
1011 1020 if (!reader_->ReadBytes(&private_flags, 1)) {
1012 if (!DecryptPayload(*header, packet)) { 1021 set_detailed_error("Unable to read private flags.");
1013 set_detailed_error("Unable to decrypt payload."); 1022 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1014 return RaiseError(QUIC_DECRYPTION_FAILURE); 1023 }
1015 } 1024
1016 1025 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) {
1017 uint8 private_flags; 1026 set_detailed_error("Illegal private flags value.");
1018 if (!reader_->ReadBytes(&private_flags, 1)) { 1027 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1019 set_detailed_error("Unable to read private flags."); 1028 }
1020 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1029
1021 } 1030 header->entropy_flag =
1022 1031 (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
1023 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { 1032 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
1024 set_detailed_error("Illegal private flags value."); 1033
1025 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1034 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) {
1026 } 1035 header->is_in_fec_group = IN_FEC_GROUP;
1027 1036 uint8 first_fec_protected_packet_offset;
1028 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; 1037 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
1029 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; 1038 set_detailed_error(
1030 1039 "Unable to read first fec protected packet offset.");
1031 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { 1040 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1032 header->is_in_fec_group = IN_FEC_GROUP; 1041 }
1033 uint8 first_fec_protected_packet_offset; 1042 if (first_fec_protected_packet_offset >=
1034 if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) { 1043 header->packet_sequence_number) {
1035 set_detailed_error("Unable to read first fec protected packet offset."); 1044 set_detailed_error("First fec protected packet offset must be less "
1036 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1045 "than the sequence number.");
1046 return RaiseError(QUIC_INVALID_PACKET_HEADER);
1047 }
1048 header->fec_group =
1049 header->packet_sequence_number - first_fec_protected_packet_offset;
1050 }
1051
1052 header->entropy_hash = GetPacketEntropyHash(*header);
1053 // Set the last sequence number after we have decrypted the packet
1054 // so we are confident is not attacker controlled.
1055 last_sequence_number_ = header->packet_sequence_number;
1056 return true;
1037 } 1057 }
1038 if (first_fec_protected_packet_offset >= header->packet_sequence_number) { 1058
1039 set_detailed_error("First fec protected packet offset must be less " 1059 bool QuicFramer::ProcessPacketSequenceNumber(
1040 "than the sequence number."); 1060 QuicSequenceNumberLength sequence_number_length,
1041 return RaiseError(QUIC_INVALID_PACKET_HEADER); 1061 QuicPacketSequenceNumber* sequence_number) {
1062 QuicPacketSequenceNumber wire_sequence_number = 0u;
1063 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) {
1064 return false;
1065 }
1066
1067 // TODO(ianswett): Explore the usefulness of trying multiple sequence
1068 // numbers in case the first guess is incorrect.
1069 *sequence_number =
1070 CalculatePacketSequenceNumberFromWire(sequence_number_length,
1071 wire_sequence_number);
1072 return true;
1042 } 1073 }
1043 header->fec_group = 1074
1044 header->packet_sequence_number - first_fec_protected_packet_offset; 1075 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) {
1045 } 1076 if (reader_->IsDoneReading()) {
1046 1077 set_detailed_error("Packet has no frames.");
1047 header->entropy_hash = GetPacketEntropyHash(*header); 1078 return RaiseError(QUIC_MISSING_PAYLOAD);
1048 // Set the last sequence number after we have decrypted the packet 1079 }
1049 // so we are confident is not attacker controlled. 1080 while (!reader_->IsDoneReading()) {
1050 last_sequence_number_ = header->packet_sequence_number; 1081 uint8 frame_type;
1051 return true; 1082 if (!reader_->ReadBytes(&frame_type, 1)) {
1052 } 1083 set_detailed_error("Unable to read frame type.");
1053 1084 return RaiseError(QUIC_INVALID_FRAME_DATA);
1054 bool QuicFramer::ProcessPacketSequenceNumber( 1085 }
1055 QuicSequenceNumberLength sequence_number_length, 1086
1056 QuicPacketSequenceNumber* sequence_number) { 1087 if (frame_type & kQuicFrameTypeSpecialMask) {
1057 QuicPacketSequenceNumber wire_sequence_number = 0u; 1088 // Stream Frame
1058 if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) { 1089 if (frame_type & kQuicFrameTypeStreamMask) {
1059 return false; 1090 QuicStreamFrame frame;
1060 } 1091 if (!ProcessStreamFrame(frame_type, &frame)) {
1061 1092 return RaiseError(QUIC_INVALID_STREAM_DATA);
1062 // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers 1093 }
1063 // in case the first guess is incorrect. 1094 if (!visitor_->OnStreamFrame(frame)) {
1064 *sequence_number = 1095 DVLOG(1) << "Visitor asked to stop further processing.";
1065 CalculatePacketSequenceNumberFromWire(sequence_number_length, 1096 // Returning true since there was no parsing error.
1066 wire_sequence_number); 1097 return true;
1067 return true; 1098 }
1068 } 1099 continue;
1069 1100 }
1070 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) { 1101
1071 if (reader_->IsDoneReading()) { 1102 // Ack Frame
1072 set_detailed_error("Packet has no frames."); 1103 if (frame_type & kQuicFrameTypeAckMask) {
1073 return RaiseError(QUIC_MISSING_PAYLOAD); 1104 QuicAckFrame frame;
1074 } 1105 if (!ProcessAckFrame(frame_type, &frame)) {
1075 while (!reader_->IsDoneReading()) { 1106 return RaiseError(QUIC_INVALID_ACK_DATA);
1076 uint8 frame_type; 1107 }
1077 if (!reader_->ReadBytes(&frame_type, 1)) { 1108 if (!visitor_->OnAckFrame(frame)) {
1078 set_detailed_error("Unable to read frame type."); 1109 DVLOG(1) << "Visitor asked to stop further processing.";
1079 return RaiseError(QUIC_INVALID_FRAME_DATA); 1110 // Returning true since there was no parsing error.
1080 } 1111 return true;
1081 1112 }
1082 if (frame_type & kQuicFrameTypeSpecialMask) { 1113 continue;
1083 // Stream Frame 1114 }
1084 if (frame_type & kQuicFrameTypeStreamMask) { 1115
1085 QuicStreamFrame frame; 1116 // Congestion Feedback Frame
1086 if (!ProcessStreamFrame(frame_type, &frame)) { 1117 if (frame_type & kQuicFrameTypeCongestionFeedbackMask) {
1087 return RaiseError(QUIC_INVALID_STREAM_DATA); 1118 QuicCongestionFeedbackFrame frame;
1088 } 1119 if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
1089 if (!visitor_->OnStreamFrame(frame)) { 1120 return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
1090 DVLOG(1) << "Visitor asked to stop further processing."; 1121 }
1091 // Returning true since there was no parsing error. 1122 if (!visitor_->OnCongestionFeedbackFrame(frame)) {
1092 return true; 1123 DVLOG(1) << "Visitor asked to stop further processing.";
1093 } 1124 // Returning true since there was no parsing error.
1125 return true;
1126 }
1127 continue;
1128 }
1129
1130 // This was a special frame type that did not match any
1131 // of the known ones. Error.
1132 set_detailed_error("Illegal frame type.");
1133 DLOG(WARNING) << "Illegal frame type: "
1134 << static_cast<int>(frame_type);
1135 return RaiseError(QUIC_INVALID_FRAME_DATA);
1136 }
1137
1138 switch (frame_type) {
1139 case PADDING_FRAME:
1140 // We're done with the packet.
1141 return true;
1142
1143 case RST_STREAM_FRAME: {
1144 QuicRstStreamFrame frame;
1145 if (!ProcessRstStreamFrame(&frame)) {
1146 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
1147 }
1148 if (!visitor_->OnRstStreamFrame(frame)) {
1149 DVLOG(1) << "Visitor asked to stop further processing.";
1150 // Returning true since there was no parsing error.
1151 return true;
1152 }
1153 continue;
1154 }
1155
1156 case CONNECTION_CLOSE_FRAME: {
1157 QuicConnectionCloseFrame frame;
1158 if (!ProcessConnectionCloseFrame(&frame)) {
1159 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
1160 }
1161
1162 if (!visitor_->OnConnectionCloseFrame(frame)) {
1163 DVLOG(1) << "Visitor asked to stop further processing.";
1164 // Returning true since there was no parsing error.
1165 return true;
1166 }
1167 continue;
1168 }
1169
1170 case GOAWAY_FRAME: {
1171 QuicGoAwayFrame goaway_frame;
1172 if (!ProcessGoAwayFrame(&goaway_frame)) {
1173 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
1174 }
1175 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
1176 DVLOG(1) << "Visitor asked to stop further processing.";
1177 // Returning true since there was no parsing error.
1178 return true;
1179 }
1180 continue;
1181 }
1182
1183 case WINDOW_UPDATE_FRAME: {
1184 QuicWindowUpdateFrame window_update_frame;
1185 if (!ProcessWindowUpdateFrame(&window_update_frame)) {
1186 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
1187 }
1188 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
1189 DVLOG(1) << "Visitor asked to stop further processing.";
1190 // Returning true since there was no parsing error.
1191 return true;
1192 }
1094 continue; 1193 continue;
1095 } 1194 }
1096 1195
1097 // Ack Frame
1098 if (frame_type & kQuicFrameTypeAckMask) {
1099 QuicAckFrame frame;
1100 if (!ProcessAckFrame(frame_type, &frame)) {
1101 return RaiseError(QUIC_INVALID_ACK_DATA);
1102 }
1103 if (!visitor_->OnAckFrame(frame)) {
1104 DVLOG(1) << "Visitor asked to stop further processing.";
1105 // Returning true since there was no parsing error.
1106 return true;
1107 }
1108 continue;
1109 }
1110
1111 // Congestion Feedback Frame
1112 if (frame_type & kQuicFrameTypeCongestionFeedbackMask) {
1113 QuicCongestionFeedbackFrame frame;
1114 if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
1115 return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
1116 }
1117 if (!visitor_->OnCongestionFeedbackFrame(frame)) {
1118 DVLOG(1) << "Visitor asked to stop further processing.";
1119 // Returning true since there was no parsing error.
1120 return true;
1121 }
1122 continue;
1123 }
1124
1125 // This was a special frame type that did not match any
1126 // of the known ones. Error.
1127 set_detailed_error("Illegal frame type.");
1128 DLOG(WARNING) << "Illegal frame type: "
1129 << static_cast<int>(frame_type);
1130 return RaiseError(QUIC_INVALID_FRAME_DATA);
1131 }
1132
1133 switch (frame_type) {
1134 case PADDING_FRAME:
1135 // We're done with the packet.
1136 return true;
1137
1138 case RST_STREAM_FRAME: {
1139 QuicRstStreamFrame frame;
1140 if (!ProcessRstStreamFrame(&frame)) {
1141 return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
1142 }
1143 if (!visitor_->OnRstStreamFrame(frame)) {
1144 DVLOG(1) << "Visitor asked to stop further processing.";
1145 // Returning true since there was no parsing error.
1146 return true;
1147 }
1148 continue;
1149 }
1150
1151 case CONNECTION_CLOSE_FRAME: {
1152 QuicConnectionCloseFrame frame;
1153 if (!ProcessConnectionCloseFrame(&frame)) {
1154 return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
1155 }
1156
1157 if (!visitor_->OnConnectionCloseFrame(frame)) {
1158 DVLOG(1) << "Visitor asked to stop further processing.";
1159 // Returning true since there was no parsing error.
1160 return true;
1161 }
1162 continue;
1163 }
1164
1165 case GOAWAY_FRAME: {
1166 QuicGoAwayFrame goaway_frame;
1167 if (!ProcessGoAwayFrame(&goaway_frame)) {
1168 return RaiseError(QUIC_INVALID_GOAWAY_DATA);
1169 }
1170 if (!visitor_->OnGoAwayFrame(goaway_frame)) {
1171 DVLOG(1) << "Visitor asked to stop further processing.";
1172 // Returning true since there was no parsing error.
1173 return true;
1174 }
1175 continue;
1176 }
1177
1178 case WINDOW_UPDATE_FRAME: {
1179 QuicWindowUpdateFrame window_update_frame;
1180 if (!ProcessWindowUpdateFrame(&window_update_frame)) {
1181 return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
1182 }
1183 if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
1184 DVLOG(1) << "Visitor asked to stop further processing.";
1185 // Returning true since there was no parsing error.
1186 return true;
1187 }
1188 continue;
1189 }
1190
1191 case BLOCKED_FRAME: { 1196 case BLOCKED_FRAME: {
1192 QuicBlockedFrame blocked_frame; 1197 QuicBlockedFrame blocked_frame;
1193 if (!ProcessBlockedFrame(&blocked_frame)) { 1198 if (!ProcessBlockedFrame(&blocked_frame)) {
1194 return RaiseError(QUIC_INVALID_BLOCKED_DATA); 1199 return RaiseError(QUIC_INVALID_BLOCKED_DATA);
1195 } 1200 }
1196 if (!visitor_->OnBlockedFrame(blocked_frame)) { 1201 if (!visitor_->OnBlockedFrame(blocked_frame)) {
1197 DVLOG(1) << "Visitor asked to stop further processing."; 1202 DVLOG(1) << "Visitor asked to stop further processing.";
1198 // Returning true since there was no parsing error. 1203 // Returning true since there was no parsing error.
1199 return true; 1204 return true;
1200 } 1205 }
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 QuicCongestionFeedbackFrame* frame) { 1415 QuicCongestionFeedbackFrame* frame) {
1411 uint8 feedback_type; 1416 uint8 feedback_type;
1412 if (!reader_->ReadBytes(&feedback_type, 1)) { 1417 if (!reader_->ReadBytes(&feedback_type, 1)) {
1413 set_detailed_error("Unable to read congestion feedback type."); 1418 set_detailed_error("Unable to read congestion feedback type.");
1414 return false; 1419 return false;
1415 } 1420 }
1416 frame->type = 1421 frame->type =
1417 static_cast<CongestionFeedbackType>(feedback_type); 1422 static_cast<CongestionFeedbackType>(feedback_type);
1418 1423
1419 switch (frame->type) { 1424 switch (frame->type) {
1420 case kInterArrival: { 1425 case kTimestamp: {
1421 CongestionFeedbackMessageInterArrival* inter_arrival = 1426 CongestionFeedbackMessageTimestamp* timestamp = &frame->timestamp;
1422 &frame->inter_arrival;
1423 uint8 num_received_packets; 1427 uint8 num_received_packets;
1424 if (!reader_->ReadBytes(&num_received_packets, 1)) { 1428 if (!reader_->ReadBytes(&num_received_packets, 1)) {
1425 set_detailed_error("Unable to read num received packets."); 1429 set_detailed_error("Unable to read num received packets.");
1426 return false; 1430 return false;
1427 } 1431 }
1428 1432
1429 if (num_received_packets > 0u) { 1433 if (num_received_packets > 0u) {
1430 uint64 smallest_received; 1434 uint64 smallest_received;
1431 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, 1435 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
1432 &smallest_received)) { 1436 &smallest_received)) {
1433 set_detailed_error("Unable to read smallest received."); 1437 set_detailed_error("Unable to read smallest received.");
1434 return false; 1438 return false;
1435 } 1439 }
1436 1440
1437 uint64 time_received_us; 1441 uint64 time_received_us;
1438 if (!reader_->ReadUInt64(&time_received_us)) { 1442 if (!reader_->ReadUInt64(&time_received_us)) {
1439 set_detailed_error("Unable to read time received."); 1443 set_detailed_error("Unable to read time received.");
1440 return false; 1444 return false;
1441 } 1445 }
1442 QuicTime time_received = creation_time_.Add( 1446 QuicTime time_received = creation_time_.Add(
1443 QuicTime::Delta::FromMicroseconds(time_received_us)); 1447 QuicTime::Delta::FromMicroseconds(time_received_us));
1444 1448
1445 inter_arrival->received_packet_times.insert( 1449 timestamp->received_packet_times.insert(
1446 make_pair(smallest_received, time_received)); 1450 make_pair(smallest_received, time_received));
1447 1451
1448 for (uint8 i = 0; i < num_received_packets - 1; ++i) { 1452 for (uint8 i = 0; i < num_received_packets - 1; ++i) {
1449 uint16 sequence_delta; 1453 uint16 sequence_delta;
1450 if (!reader_->ReadUInt16(&sequence_delta)) { 1454 if (!reader_->ReadUInt16(&sequence_delta)) {
1451 set_detailed_error( 1455 set_detailed_error(
1452 "Unable to read sequence delta in received packets."); 1456 "Unable to read sequence delta in received packets.");
1453 return false; 1457 return false;
1454 } 1458 }
1455 1459
1456 int32 time_delta_us; 1460 int32 time_delta_us;
1457 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1461 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1458 set_detailed_error( 1462 set_detailed_error(
1459 "Unable to read time delta in received packets."); 1463 "Unable to read time delta in received packets.");
1460 return false; 1464 return false;
1461 } 1465 }
1462 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; 1466 QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
1463 inter_arrival->received_packet_times.insert( 1467 timestamp->received_packet_times.insert(
1464 make_pair(packet, time_received.Add( 1468 make_pair(packet, time_received.Add(
1465 QuicTime::Delta::FromMicroseconds(time_delta_us)))); 1469 QuicTime::Delta::FromMicroseconds(time_delta_us))));
1466 } 1470 }
1467 } 1471 }
1468 break; 1472 break;
1469 } 1473 }
1470 case kTCP: { 1474 case kTCP: {
1471 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1475 CongestionFeedbackMessageTCP* tcp = &frame->tcp;
1472 // TODO(ianswett): Remove receive window, since it's constant.
1473 uint16 receive_window = 0; 1476 uint16 receive_window = 0;
1474 if (!reader_->ReadUInt16(&receive_window)) { 1477 if (!reader_->ReadUInt16(&receive_window)) {
1475 set_detailed_error("Unable to read receive window."); 1478 set_detailed_error("Unable to read receive window.");
1476 return false; 1479 return false;
1477 } 1480 }
1478 // Simple bit packing, don't send the 4 least significant bits. 1481 // Simple bit packing, don't send the 4 least significant bits.
1479 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1482 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
1480 break; 1483 break;
1481 } 1484 }
1482 default: 1485 default:
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1781 case ACK_FRAME: { 1784 case ACK_FRAME: {
1782 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1785 return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
1783 } 1786 }
1784 case CONGESTION_FEEDBACK_FRAME: { 1787 case CONGESTION_FEEDBACK_FRAME: {
1785 size_t len = kQuicFrameTypeSize; 1788 size_t len = kQuicFrameTypeSize;
1786 const QuicCongestionFeedbackFrame& congestion_feedback = 1789 const QuicCongestionFeedbackFrame& congestion_feedback =
1787 *frame.congestion_feedback_frame; 1790 *frame.congestion_feedback_frame;
1788 len += 1; // Congestion feedback type. 1791 len += 1; // Congestion feedback type.
1789 1792
1790 switch (congestion_feedback.type) { 1793 switch (congestion_feedback.type) {
1791 case kInterArrival: { 1794 case kTimestamp: {
1792 const CongestionFeedbackMessageInterArrival& inter_arrival = 1795 const CongestionFeedbackMessageTimestamp& timestamp =
1793 congestion_feedback.inter_arrival; 1796 congestion_feedback.timestamp;
1794 len += 1; // Number received packets. 1797 len += 1; // Number received packets.
1795 if (inter_arrival.received_packet_times.size() > 0) { 1798 if (!timestamp.received_packet_times.empty()) {
1796 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. 1799 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
1797 len += 8; // Time. 1800 len += 8; // Time.
1798 // 2 bytes per sequence number delta plus 4 bytes per delta time. 1801 // 2 bytes per sequence number delta plus 4 bytes per delta time.
1799 len += PACKET_6BYTE_SEQUENCE_NUMBER * 1802 len += PACKET_6BYTE_SEQUENCE_NUMBER *
1800 (inter_arrival.received_packet_times.size() - 1); 1803 (timestamp.received_packet_times.size() - 1);
1801 } 1804 }
1802 break; 1805 break;
1803 } 1806 }
1804 case kTCP: 1807 case kTCP:
1805 len += 2; // Receive window. 1808 len += 2; // Receive window.
1806 break; 1809 break;
1807 default: 1810 default:
1808 set_detailed_error("Illegal feedback type."); 1811 set_detailed_error("Illegal feedback type.");
1809 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1812 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1810 break; 1813 break;
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 } 2090 }
2088 2091
2089 bool QuicFramer::AppendCongestionFeedbackFrame( 2092 bool QuicFramer::AppendCongestionFeedbackFrame(
2090 const QuicCongestionFeedbackFrame& frame, 2093 const QuicCongestionFeedbackFrame& frame,
2091 QuicDataWriter* writer) { 2094 QuicDataWriter* writer) {
2092 if (!writer->WriteBytes(&frame.type, 1)) { 2095 if (!writer->WriteBytes(&frame.type, 1)) {
2093 return false; 2096 return false;
2094 } 2097 }
2095 2098
2096 switch (frame.type) { 2099 switch (frame.type) {
2097 case kInterArrival: { 2100 case kTimestamp: {
2098 const CongestionFeedbackMessageInterArrival& inter_arrival = 2101 return AppendTimestampFrame(frame, writer);
2099 frame.inter_arrival;
2100 DCHECK_GE(numeric_limits<uint8>::max(),
2101 inter_arrival.received_packet_times.size());
2102 if (inter_arrival.received_packet_times.size() >
2103 numeric_limits<uint8>::max()) {
2104 return false;
2105 }
2106 // TODO(ianswett): Make num_received_packets a varint.
2107 uint8 num_received_packets =
2108 inter_arrival.received_packet_times.size();
2109 if (!writer->WriteBytes(&num_received_packets, 1)) {
2110 return false;
2111 }
2112 if (num_received_packets > 0) {
2113 TimeMap::const_iterator it =
2114 inter_arrival.received_packet_times.begin();
2115
2116 QuicPacketSequenceNumber lowest_sequence = it->first;
2117 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
2118 lowest_sequence, writer)) {
2119 return false;
2120 }
2121
2122 QuicTime lowest_time = it->second;
2123 if (!writer->WriteUInt64(
2124 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
2125 return false;
2126 }
2127
2128 for (++it; it != inter_arrival.received_packet_times.end(); ++it) {
2129 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
2130 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
2131 if (sequence_delta > numeric_limits<uint16>::max()) {
2132 return false;
2133 }
2134 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
2135 return false;
2136 }
2137
2138 int32 time_delta_us =
2139 it->second.Subtract(lowest_time).ToMicroseconds();
2140 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2141 return false;
2142 }
2143 }
2144 }
2145 break;
2146 } 2102 }
2147 case kTCP: { 2103 case kTCP: {
2148 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2104 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2149 DCHECK_LE(tcp.receive_window, 1u << 20); 2105 DCHECK_LE(tcp.receive_window, 1u << 20);
2150 // Simple bit packing, don't send the 4 least significant bits. 2106 // Simple bit packing, don't send the 4 least significant bits.
2151 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2107 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2152 if (!writer->WriteUInt16(receive_window)) { 2108 if (!writer->WriteUInt16(receive_window)) {
2153 return false; 2109 return false;
2154 } 2110 }
2155 break; 2111 break;
2156 } 2112 }
2157 default: 2113 default:
2158 return false; 2114 return false;
2159 } 2115 }
2160 2116
2161 return true; 2117 return true;
2162 } 2118 }
2163 2119
2120 bool QuicFramer::AppendTimestampFrame(
2121 const QuicCongestionFeedbackFrame& frame,
2122 QuicDataWriter* writer) {
2123 const CongestionFeedbackMessageTimestamp& timestamp = frame.timestamp;
2124 DCHECK_GE(numeric_limits<uint8>::max(),
2125 timestamp.received_packet_times.size());
2126 if (timestamp.received_packet_times.size() > numeric_limits<uint8>::max()) {
2127 return false;
2128 }
2129 uint8 num_received_packets = timestamp.received_packet_times.size();
2130 if (!writer->WriteBytes(&num_received_packets, 1)) {
2131 return false;
2132 }
2133 if (num_received_packets > 0) {
2134 TimeMap::const_iterator it = timestamp.received_packet_times.begin();
2135
2136 QuicPacketSequenceNumber lowest_sequence = it->first;
2137 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
2138 lowest_sequence, writer)) {
2139 return false;
2140 }
2141
2142 QuicTime lowest_time = it->second;
2143 if (!writer->WriteUInt64(
2144 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
2145 return false;
2146 }
2147
2148 for (++it; it != timestamp.received_packet_times.end(); ++it) {
2149 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
2150 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
2151 if (sequence_delta > numeric_limits<uint16>::max()) {
2152 return false;
2153 }
2154 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
2155 return false;
2156 }
2157
2158 int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds();
2159 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2160 return false;
2161 }
2162 }
2163 }
2164 return true;
2165 }
2166
2164 bool QuicFramer::AppendStopWaitingFrame( 2167 bool QuicFramer::AppendStopWaitingFrame(
2165 const QuicPacketHeader& header, 2168 const QuicPacketHeader& header,
2166 const QuicStopWaitingFrame& frame, 2169 const QuicStopWaitingFrame& frame,
2167 QuicDataWriter* writer) { 2170 QuicDataWriter* writer) {
2168 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); 2171 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2169 const QuicPacketSequenceNumber least_unacked_delta = 2172 const QuicPacketSequenceNumber least_unacked_delta =
2170 header.packet_sequence_number - frame.least_unacked; 2173 header.packet_sequence_number - frame.least_unacked;
2171 const QuicPacketSequenceNumber length_shift = 2174 const QuicPacketSequenceNumber length_shift =
2172 header.public_header.sequence_number_length * 8; 2175 header.public_header.sequence_number_length * 8;
2173 if (!writer->WriteUInt8(frame.entropy_hash)) { 2176 if (!writer->WriteUInt8(frame.entropy_hash)) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2266 2269
2267 bool QuicFramer::RaiseError(QuicErrorCode error) { 2270 bool QuicFramer::RaiseError(QuicErrorCode error) {
2268 DVLOG(1) << "Error detail: " << detailed_error_; 2271 DVLOG(1) << "Error detail: " << detailed_error_;
2269 set_error(error); 2272 set_error(error);
2270 visitor_->OnError(this); 2273 visitor_->OnError(this);
2271 reader_.reset(NULL); 2274 reader_.reset(NULL);
2272 return false; 2275 return false;
2273 } 2276 }
2274 2277
2275 } // namespace net 2278 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698