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 |