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/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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |