| 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 |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1095 } | 1095 } |
| 1096 | 1096 |
| 1097 bool QuicFramer::ProcessAuthenticatedHeader(QuicDataReader* reader, | 1097 bool QuicFramer::ProcessAuthenticatedHeader(QuicDataReader* reader, |
| 1098 QuicPacketHeader* header) { | 1098 QuicPacketHeader* header) { |
| 1099 uint8_t private_flags; | 1099 uint8_t private_flags; |
| 1100 if (!reader->ReadBytes(&private_flags, 1)) { | 1100 if (!reader->ReadBytes(&private_flags, 1)) { |
| 1101 set_detailed_error("Unable to read private flags."); | 1101 set_detailed_error("Unable to read private flags."); |
| 1102 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1102 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1103 } | 1103 } |
| 1104 | 1104 |
| 1105 if (quic_version_ > QUIC_VERSION_31) { | 1105 if (private_flags > PACKET_PRIVATE_FLAGS_MAX_VERSION_32) { |
| 1106 if (private_flags > PACKET_PRIVATE_FLAGS_MAX_VERSION_32) { | 1106 set_detailed_error("Illegal private flags value."); |
| 1107 set_detailed_error("Illegal private flags value."); | 1107 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| 1108 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1109 } | |
| 1110 } else { | |
| 1111 if (private_flags > PACKET_PRIVATE_FLAGS_MAX) { | |
| 1112 set_detailed_error("Illegal private flags value."); | |
| 1113 return RaiseError(QUIC_INVALID_PACKET_HEADER); | |
| 1114 } | |
| 1115 } | 1108 } |
| 1116 | 1109 |
| 1117 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; | 1110 header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0; |
| 1118 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; | 1111 header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0; |
| 1119 | 1112 |
| 1120 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { | 1113 if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) { |
| 1121 uint8_t first_fec_protected_packet_offset; | 1114 uint8_t first_fec_protected_packet_offset; |
| 1122 if (!reader->ReadBytes(&first_fec_protected_packet_offset, 1)) { | 1115 if (!reader->ReadBytes(&first_fec_protected_packet_offset, 1)) { |
| 1123 set_detailed_error("Unable to read first fec protected packet offset."); | 1116 set_detailed_error("Unable to read first fec protected packet offset."); |
| 1124 return RaiseError(QUIC_INVALID_PACKET_HEADER); | 1117 return RaiseError(QUIC_INVALID_PACKET_HEADER); |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1458 return false; | 1451 return false; |
| 1459 } | 1452 } |
| 1460 ack_frame->packets.Add(last_packet_number - range_length, | 1453 ack_frame->packets.Add(last_packet_number - range_length, |
| 1461 last_packet_number + 1); | 1454 last_packet_number + 1); |
| 1462 // Subtract an extra 1 to ensure ranges are represented efficiently and | 1455 // Subtract an extra 1 to ensure ranges are represented efficiently and |
| 1463 // can't overlap by 1 packet number. This allows a missing_delta of 0 | 1456 // can't overlap by 1 packet number. This allows a missing_delta of 0 |
| 1464 // to represent an adjacent nack range. | 1457 // to represent an adjacent nack range. |
| 1465 last_packet_number -= (range_length + 1); | 1458 last_packet_number -= (range_length + 1); |
| 1466 } | 1459 } |
| 1467 | 1460 |
| 1468 if (quic_version_ > QUIC_VERSION_31) { | |
| 1469 return true; | |
| 1470 } | |
| 1471 | |
| 1472 // Parse the revived packets list. | |
| 1473 // TODO(ianswett): Change the ack frame so it only expresses one revived. | |
| 1474 uint8_t num_revived_packets; | |
| 1475 if (!reader->ReadBytes(&num_revived_packets, 1)) { | |
| 1476 set_detailed_error("Unable to read num revived packets."); | |
| 1477 return false; | |
| 1478 } | |
| 1479 | |
| 1480 for (size_t i = 0; i < num_revived_packets; ++i) { | |
| 1481 QuicPacketNumber revived_packet = 0; | |
| 1482 if (!reader->ReadBytes(&revived_packet, | |
| 1483 largest_observed_packet_number_length)) { | |
| 1484 set_detailed_error("Unable to read revived packet."); | |
| 1485 return false; | |
| 1486 } | |
| 1487 } | |
| 1488 | |
| 1489 return true; | 1461 return true; |
| 1490 } | 1462 } |
| 1491 | 1463 |
| 1492 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, | 1464 bool QuicFramer::ProcessNewAckFrame(QuicDataReader* reader, |
| 1493 uint8_t frame_type, | 1465 uint8_t frame_type, |
| 1494 QuicAckFrame* ack_frame) { | 1466 QuicAckFrame* ack_frame) { |
| 1495 // Determine the two lengths from the frame type: largest acked length, | 1467 // Determine the two lengths from the frame type: largest acked length, |
| 1496 // ack block length. | 1468 // ack block length. |
| 1497 const QuicPacketNumberLength ack_block_length = | 1469 const QuicPacketNumberLength ack_block_length = |
| 1498 ReadSequenceNumberLength(frame_type); | 1470 ReadSequenceNumberLength(frame_type); |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1961 if (quic_version_ <= QUIC_VERSION_33) { | 1933 if (quic_version_ <= QUIC_VERSION_33) { |
| 1962 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1934 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1963 QuicPacketNumberLength largest_observed_length = | 1935 QuicPacketNumberLength largest_observed_length = |
| 1964 GetMinSequenceNumberLength(ack.largest_observed); | 1936 GetMinSequenceNumberLength(ack.largest_observed); |
| 1965 QuicPacketNumberLength missing_packet_number_length = | 1937 QuicPacketNumberLength missing_packet_number_length = |
| 1966 GetMinSequenceNumberLength(ack_info.max_delta); | 1938 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1967 | 1939 |
| 1968 ack_size = GetMinAckFrameSize(quic_version_, largest_observed_length); | 1940 ack_size = GetMinAckFrameSize(quic_version_, largest_observed_length); |
| 1969 if (!ack_info.nack_ranges.empty()) { | 1941 if (!ack_info.nack_ranges.empty()) { |
| 1970 ack_size += kNumberOfNackRangesSize; | 1942 ack_size += kNumberOfNackRangesSize; |
| 1971 if (quic_version_ <= QUIC_VERSION_31) { | |
| 1972 ack_size += kNumberOfRevivedPacketsSize; | |
| 1973 } | |
| 1974 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | 1943 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * |
| 1975 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | 1944 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); |
| 1976 } | 1945 } |
| 1977 | 1946 |
| 1978 // In version 23, if the ack will be truncated due to too many nack ranges, | 1947 // In version 23, if the ack will be truncated due to too many nack ranges, |
| 1979 // then do not include the number of timestamps (1 byte). | 1948 // then do not include the number of timestamps (1 byte). |
| 1980 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { | 1949 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { |
| 1981 // 1 byte for the number of timestamps. | 1950 // 1 byte for the number of timestamps. |
| 1982 ack_size += 1; | 1951 ack_size += 1; |
| 1983 ack_size += GetAckFrameTimeStampSize(ack); | 1952 ack_size += GetAckFrameTimeStampSize(ack); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2170 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 2139 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| 2171 QuicPacketNumber ack_largest_observed = frame.largest_observed; | 2140 QuicPacketNumber ack_largest_observed = frame.largest_observed; |
| 2172 QuicPacketNumberLength largest_observed_length = | 2141 QuicPacketNumberLength largest_observed_length = |
| 2173 GetMinSequenceNumberLength(ack_largest_observed); | 2142 GetMinSequenceNumberLength(ack_largest_observed); |
| 2174 QuicPacketNumberLength missing_packet_number_length = | 2143 QuicPacketNumberLength missing_packet_number_length = |
| 2175 GetMinSequenceNumberLength(ack_info.max_delta); | 2144 GetMinSequenceNumberLength(ack_info.max_delta); |
| 2176 // Determine whether we need to truncate ranges. | 2145 // Determine whether we need to truncate ranges. |
| 2177 size_t available_range_bytes = | 2146 size_t available_range_bytes = |
| 2178 writer->capacity() - writer->length() - kNumberOfNackRangesSize - | 2147 writer->capacity() - writer->length() - kNumberOfNackRangesSize - |
| 2179 GetMinAckFrameSize(quic_version_, largest_observed_length); | 2148 GetMinAckFrameSize(quic_version_, largest_observed_length); |
| 2180 if (quic_version_ <= QUIC_VERSION_31) { | |
| 2181 available_range_bytes -= kNumberOfRevivedPacketsSize; | |
| 2182 } | |
| 2183 size_t max_num_ranges = | 2149 size_t max_num_ranges = |
| 2184 available_range_bytes / | 2150 available_range_bytes / |
| 2185 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); | 2151 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); |
| 2186 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | 2152 max_num_ranges = min(kMaxNackRanges, max_num_ranges); |
| 2187 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 2153 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
| 2188 DVLOG_IF(1, truncated) << "Truncating ack from " | 2154 DVLOG_IF(1, truncated) << "Truncating ack from " |
| 2189 << ack_info.nack_ranges.size() << " ranges to " | 2155 << ack_info.nack_ranges.size() << " ranges to " |
| 2190 << max_num_ranges; | 2156 << max_num_ranges; |
| 2191 // Write out the type byte by setting the low order bits and doing shifts | 2157 // Write out the type byte by setting the low order bits and doing shifts |
| 2192 // to make room for the next bit flags to be set. | 2158 // to make room for the next bit flags to be set. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2292 ack_iter->second, writer)) { | 2258 ack_iter->second, writer)) { |
| 2293 QUIC_BUG << "AppendPacketSequenceNumber failed"; | 2259 QUIC_BUG << "AppendPacketSequenceNumber failed"; |
| 2294 return false; | 2260 return false; |
| 2295 } | 2261 } |
| 2296 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2262 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2297 last_sequence_written = ack_iter->first - 1; | 2263 last_sequence_written = ack_iter->first - 1; |
| 2298 ++num_ranges_written; | 2264 ++num_ranges_written; |
| 2299 } | 2265 } |
| 2300 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2266 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2301 | 2267 |
| 2302 if (quic_version_ > QUIC_VERSION_31) { | |
| 2303 return true; | |
| 2304 } | |
| 2305 | |
| 2306 // Append revived packets. | |
| 2307 // FEC is not supported. | |
| 2308 uint8_t num_revived_packets = 0; | |
| 2309 if (!writer->WriteBytes(&num_revived_packets, 1)) { | |
| 2310 QUIC_BUG << "num_revived_packets failed: " << num_revived_packets; | |
| 2311 return false; | |
| 2312 } | |
| 2313 | |
| 2314 return true; | 2268 return true; |
| 2315 } | 2269 } |
| 2316 | 2270 |
| 2317 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, | 2271 bool QuicFramer::AppendNewAckFrameAndTypeByte(const QuicAckFrame& frame, |
| 2318 QuicDataWriter* writer) { | 2272 QuicDataWriter* writer) { |
| 2319 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); | 2273 const NewAckFrameInfo new_ack_info = GetNewAckFrameInfo(frame); |
| 2320 QuicPacketNumber largest_acked = frame.largest_observed; | 2274 QuicPacketNumber largest_acked = frame.largest_observed; |
| 2321 QuicPacketNumberLength largest_acked_length = | 2275 QuicPacketNumberLength largest_acked_length = |
| 2322 GetMinSequenceNumberLength(largest_acked); | 2276 GetMinSequenceNumberLength(largest_acked); |
| 2323 QuicPacketNumberLength ack_block_length = | 2277 QuicPacketNumberLength ack_block_length = |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2636 | 2590 |
| 2637 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2591 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2638 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2592 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
| 2639 << " detail: " << detailed_error_; | 2593 << " detail: " << detailed_error_; |
| 2640 set_error(error); | 2594 set_error(error); |
| 2641 visitor_->OnError(this); | 2595 visitor_->OnError(this); |
| 2642 return false; | 2596 return false; |
| 2643 } | 2597 } |
| 2644 | 2598 |
| 2645 } // namespace net | 2599 } // namespace net |
| OLD | NEW |