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 1410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1421 } | 1421 } |
1422 for (size_t i = 0; i <= range_length; ++i) { | 1422 for (size_t i = 0; i <= range_length; ++i) { |
1423 received_info->missing_packets.insert(last_sequence_number - i); | 1423 received_info->missing_packets.insert(last_sequence_number - i); |
1424 } | 1424 } |
1425 // Subtract an extra 1 to ensure ranges are represented efficiently and | 1425 // Subtract an extra 1 to ensure ranges are represented efficiently and |
1426 // can't overlap by 1 sequence number. This allows a missing_delta of 0 | 1426 // can't overlap by 1 sequence number. This allows a missing_delta of 0 |
1427 // to represent an adjacent nack range. | 1427 // to represent an adjacent nack range. |
1428 last_sequence_number -= (range_length + 1); | 1428 last_sequence_number -= (range_length + 1); |
1429 } | 1429 } |
1430 | 1430 |
1431 if (quic_version_ > QUIC_VERSION_14) { | 1431 if (quic_version_ != QUIC_VERSION_13) { |
1432 // Parse the revived packets list. | 1432 // Parse the revived packets list. |
1433 uint8 num_revived_packets; | 1433 uint8 num_revived_packets; |
1434 if (!reader_->ReadBytes(&num_revived_packets, 1)) { | 1434 if (!reader_->ReadBytes(&num_revived_packets, 1)) { |
1435 set_detailed_error("Unable to read num revived packets."); | 1435 set_detailed_error("Unable to read num revived packets."); |
1436 return false; | 1436 return false; |
1437 } | 1437 } |
1438 | 1438 |
1439 for (size_t i = 0; i < num_revived_packets; ++i) { | 1439 for (size_t i = 0; i < num_revived_packets; ++i) { |
1440 QuicPacketSequenceNumber revived_packet = 0; | 1440 QuicPacketSequenceNumber revived_packet = 0; |
1441 if (!reader_->ReadBytes(&revived_packet, | 1441 if (!reader_->ReadBytes(&revived_packet, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 set_detailed_error("Unable to read congestion feedback type."); | 1478 set_detailed_error("Unable to read congestion feedback type."); |
1479 return false; | 1479 return false; |
1480 } | 1480 } |
1481 frame->type = | 1481 frame->type = |
1482 static_cast<CongestionFeedbackType>(feedback_type); | 1482 static_cast<CongestionFeedbackType>(feedback_type); |
1483 | 1483 |
1484 switch (frame->type) { | 1484 switch (frame->type) { |
1485 case kInterArrival: { | 1485 case kInterArrival: { |
1486 CongestionFeedbackMessageInterArrival* inter_arrival = | 1486 CongestionFeedbackMessageInterArrival* inter_arrival = |
1487 &frame->inter_arrival; | 1487 &frame->inter_arrival; |
1488 if (quic_version_ <= QUIC_VERSION_14) { | 1488 if (quic_version_ == QUIC_VERSION_13) { |
1489 uint16 unused_accumulated_number_of_lost_packets; | 1489 uint16 unused_accumulated_number_of_lost_packets; |
1490 if (!reader_->ReadUInt16( | 1490 if (!reader_->ReadUInt16( |
1491 &unused_accumulated_number_of_lost_packets)) { | 1491 &unused_accumulated_number_of_lost_packets)) { |
1492 set_detailed_error( | 1492 set_detailed_error( |
1493 "Unable to read accumulated number of lost packets."); | 1493 "Unable to read accumulated number of lost packets."); |
1494 return false; | 1494 return false; |
1495 } | 1495 } |
1496 } | 1496 } |
1497 uint8 num_received_packets; | 1497 uint8 num_received_packets; |
1498 if (!reader_->ReadBytes(&num_received_packets, 1)) { | 1498 if (!reader_->ReadBytes(&num_received_packets, 1)) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1545 uint32 bitrate = 0; | 1545 uint32 bitrate = 0; |
1546 if (!reader_->ReadUInt32(&bitrate)) { | 1546 if (!reader_->ReadUInt32(&bitrate)) { |
1547 set_detailed_error("Unable to read bitrate."); | 1547 set_detailed_error("Unable to read bitrate."); |
1548 return false; | 1548 return false; |
1549 } | 1549 } |
1550 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); | 1550 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); |
1551 break; | 1551 break; |
1552 } | 1552 } |
1553 case kTCP: { | 1553 case kTCP: { |
1554 CongestionFeedbackMessageTCP* tcp = &frame->tcp; | 1554 CongestionFeedbackMessageTCP* tcp = &frame->tcp; |
1555 if (quic_version_ <= QUIC_VERSION_14) { | 1555 if (quic_version_ == QUIC_VERSION_13) { |
1556 uint16 unused_accumulated_number_of_lost_packets; | 1556 uint16 unused_accumulated_number_of_lost_packets; |
1557 if (!reader_->ReadUInt16(&unused_accumulated_number_of_lost_packets)) { | 1557 if (!reader_->ReadUInt16(&unused_accumulated_number_of_lost_packets)) { |
1558 set_detailed_error( | 1558 set_detailed_error( |
1559 "Unable to read accumulated number of lost packets."); | 1559 "Unable to read accumulated number of lost packets."); |
1560 return false; | 1560 return false; |
1561 } | 1561 } |
1562 } | 1562 } |
1563 // TODO(ianswett): Remove receive window, since it's constant. | 1563 // TODO(ianswett): Remove receive window, since it's constant. |
1564 uint16 receive_window = 0; | 1564 uint16 receive_window = 0; |
1565 if (!reader_->ReadUInt16(&receive_window)) { | 1565 if (!reader_->ReadUInt16(&receive_window)) { |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 QuicSequenceNumberLength largest_observed_length = | 1842 QuicSequenceNumberLength largest_observed_length = |
1843 GetMinSequenceNumberLength(ack.received_info.largest_observed); | 1843 GetMinSequenceNumberLength(ack.received_info.largest_observed); |
1844 QuicSequenceNumberLength missing_sequence_number_length = | 1844 QuicSequenceNumberLength missing_sequence_number_length = |
1845 GetMinSequenceNumberLength(ack_info.max_delta); | 1845 GetMinSequenceNumberLength(ack_info.max_delta); |
1846 | 1846 |
1847 size_t ack_size = GetMinAckFrameSize(quic_version_, | 1847 size_t ack_size = GetMinAckFrameSize(quic_version_, |
1848 sequence_number_length, | 1848 sequence_number_length, |
1849 largest_observed_length); | 1849 largest_observed_length); |
1850 if (!ack_info.nack_ranges.empty()) { | 1850 if (!ack_info.nack_ranges.empty()) { |
1851 ack_size += kNumberOfMissingPacketsSize + | 1851 ack_size += kNumberOfMissingPacketsSize + |
1852 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); | 1852 (quic_version_ == QUIC_VERSION_13 ? 0 : kNumberOfRevivedPacketsSize); |
1853 ack_size += ack_info.nack_ranges.size() * | 1853 ack_size += ack_info.nack_ranges.size() * |
1854 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1854 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
1855 ack_size += | 1855 ack_size += |
1856 ack.received_info.revived_packets.size() * largest_observed_length; | 1856 ack.received_info.revived_packets.size() * largest_observed_length; |
1857 } | 1857 } |
1858 return ack_size; | 1858 return ack_size; |
1859 } | 1859 } |
1860 | 1860 |
1861 size_t QuicFramer::ComputeFrameLength( | 1861 size_t QuicFramer::ComputeFrameLength( |
1862 const QuicFrame& frame, | 1862 const QuicFrame& frame, |
(...skipping 12 matching lines...) Expand all Loading... |
1875 case CONGESTION_FEEDBACK_FRAME: { | 1875 case CONGESTION_FEEDBACK_FRAME: { |
1876 size_t len = kQuicFrameTypeSize; | 1876 size_t len = kQuicFrameTypeSize; |
1877 const QuicCongestionFeedbackFrame& congestion_feedback = | 1877 const QuicCongestionFeedbackFrame& congestion_feedback = |
1878 *frame.congestion_feedback_frame; | 1878 *frame.congestion_feedback_frame; |
1879 len += 1; // Congestion feedback type. | 1879 len += 1; // Congestion feedback type. |
1880 | 1880 |
1881 switch (congestion_feedback.type) { | 1881 switch (congestion_feedback.type) { |
1882 case kInterArrival: { | 1882 case kInterArrival: { |
1883 const CongestionFeedbackMessageInterArrival& inter_arrival = | 1883 const CongestionFeedbackMessageInterArrival& inter_arrival = |
1884 congestion_feedback.inter_arrival; | 1884 congestion_feedback.inter_arrival; |
1885 if (quic_version_ <= QUIC_VERSION_14) { | 1885 if (quic_version_ == QUIC_VERSION_13) { |
1886 len += 2; // Accumulated number of lost packets. | 1886 len += 2; // Accumulated number of lost packets. |
1887 } | 1887 } |
1888 len += 1; // Number received packets. | 1888 len += 1; // Number received packets. |
1889 if (inter_arrival.received_packet_times.size() > 0) { | 1889 if (inter_arrival.received_packet_times.size() > 0) { |
1890 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. | 1890 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. |
1891 len += 8; // Time. | 1891 len += 8; // Time. |
1892 // 2 bytes per sequence number delta plus 4 bytes per delta time. | 1892 // 2 bytes per sequence number delta plus 4 bytes per delta time. |
1893 len += PACKET_6BYTE_SEQUENCE_NUMBER * | 1893 len += PACKET_6BYTE_SEQUENCE_NUMBER * |
1894 (inter_arrival.received_packet_times.size() - 1); | 1894 (inter_arrival.received_packet_times.size() - 1); |
1895 } | 1895 } |
1896 break; | 1896 break; |
1897 } | 1897 } |
1898 case kFixRate: | 1898 case kFixRate: |
1899 len += 4; // Bitrate. | 1899 len += 4; // Bitrate. |
1900 break; | 1900 break; |
1901 case kTCP: | 1901 case kTCP: |
1902 if (quic_version_ <= QUIC_VERSION_14) { | 1902 if (quic_version_ == QUIC_VERSION_13) { |
1903 len += 2; // Accumulated number of lost packets. | 1903 len += 2; // Accumulated number of lost packets. |
1904 } | 1904 } |
1905 len += 2; // Receive window. | 1905 len += 2; // Receive window. |
1906 break; | 1906 break; |
1907 default: | 1907 default: |
1908 set_detailed_error("Illegal feedback type."); | 1908 set_detailed_error("Illegal feedback type."); |
1909 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; | 1909 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; |
1910 break; | 1910 break; |
1911 } | 1911 } |
1912 return len; | 1912 return len; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 frame.received_info.largest_observed; | 2052 frame.received_info.largest_observed; |
2053 QuicSequenceNumberLength largest_observed_length = | 2053 QuicSequenceNumberLength largest_observed_length = |
2054 GetMinSequenceNumberLength(ack_largest_observed); | 2054 GetMinSequenceNumberLength(ack_largest_observed); |
2055 QuicSequenceNumberLength missing_sequence_number_length = | 2055 QuicSequenceNumberLength missing_sequence_number_length = |
2056 GetMinSequenceNumberLength(ack_info.max_delta); | 2056 GetMinSequenceNumberLength(ack_info.max_delta); |
2057 // Determine whether we need to truncate ranges. | 2057 // Determine whether we need to truncate ranges. |
2058 size_t available_range_bytes = writer->capacity() - writer->length() - | 2058 size_t available_range_bytes = writer->capacity() - writer->length() - |
2059 GetMinAckFrameSize(quic_version_, | 2059 GetMinAckFrameSize(quic_version_, |
2060 header.public_header.sequence_number_length, | 2060 header.public_header.sequence_number_length, |
2061 largest_observed_length) - | 2061 largest_observed_length) - |
2062 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); | 2062 (quic_version_ == QUIC_VERSION_13 ? 0 : kNumberOfRevivedPacketsSize); |
2063 size_t max_num_ranges = available_range_bytes / | 2063 size_t max_num_ranges = available_range_bytes / |
2064 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 2064 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
2065 max_num_ranges = | 2065 max_num_ranges = |
2066 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); | 2066 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); |
2067 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 2067 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
2068 DVLOG_IF(1, truncated) << "Truncating ack from " | 2068 DVLOG_IF(1, truncated) << "Truncating ack from " |
2069 << ack_info.nack_ranges.size() << " ranges to " | 2069 << ack_info.nack_ranges.size() << " ranges to " |
2070 << max_num_ranges; | 2070 << max_num_ranges; |
2071 | 2071 |
2072 // Write out the type byte by setting the low order bits and doing shifts | 2072 // Write out the type byte by setting the low order bits and doing shifts |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2161 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, | 2161 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, |
2162 ack_iter->second, writer)) { | 2162 ack_iter->second, writer)) { |
2163 return false; | 2163 return false; |
2164 } | 2164 } |
2165 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2165 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
2166 last_sequence_written = ack_iter->first - 1; | 2166 last_sequence_written = ack_iter->first - 1; |
2167 ++num_ranges_written; | 2167 ++num_ranges_written; |
2168 } | 2168 } |
2169 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2169 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
2170 | 2170 |
2171 if (quic_version_ > QUIC_VERSION_14) { | 2171 if (quic_version_ != QUIC_VERSION_13) { |
2172 // Append revived packets. | 2172 // Append revived packets. |
2173 // If not all the revived packets fit, only mention the ones that do. | 2173 // If not all the revived packets fit, only mention the ones that do. |
2174 uint8 num_revived_packets = | 2174 uint8 num_revived_packets = |
2175 min(received_info.revived_packets.size(), | 2175 min(received_info.revived_packets.size(), |
2176 static_cast<size_t>(numeric_limits<uint8>::max())); | 2176 static_cast<size_t>(numeric_limits<uint8>::max())); |
2177 num_revived_packets = min( | 2177 num_revived_packets = min( |
2178 static_cast<size_t>(num_revived_packets), | 2178 static_cast<size_t>(num_revived_packets), |
2179 (writer->capacity() - writer->length()) / largest_observed_length); | 2179 (writer->capacity() - writer->length()) / largest_observed_length); |
2180 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2180 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
2181 return false; | 2181 return false; |
(...skipping 17 matching lines...) Expand all Loading... |
2199 const QuicCongestionFeedbackFrame& frame, | 2199 const QuicCongestionFeedbackFrame& frame, |
2200 QuicDataWriter* writer) { | 2200 QuicDataWriter* writer) { |
2201 if (!writer->WriteBytes(&frame.type, 1)) { | 2201 if (!writer->WriteBytes(&frame.type, 1)) { |
2202 return false; | 2202 return false; |
2203 } | 2203 } |
2204 | 2204 |
2205 switch (frame.type) { | 2205 switch (frame.type) { |
2206 case kInterArrival: { | 2206 case kInterArrival: { |
2207 const CongestionFeedbackMessageInterArrival& inter_arrival = | 2207 const CongestionFeedbackMessageInterArrival& inter_arrival = |
2208 frame.inter_arrival; | 2208 frame.inter_arrival; |
2209 if (quic_version_ <= QUIC_VERSION_14) { | 2209 if (quic_version_ == QUIC_VERSION_13) { |
2210 // accumulated_number_of_lost_packets is removed. Always write 0. | 2210 // accumulated_number_of_lost_packets is removed. Always write 0. |
2211 if (!writer->WriteUInt16(0)) { | 2211 if (!writer->WriteUInt16(0)) { |
2212 return false; | 2212 return false; |
2213 } | 2213 } |
2214 } | 2214 } |
2215 DCHECK_GE(numeric_limits<uint8>::max(), | 2215 DCHECK_GE(numeric_limits<uint8>::max(), |
2216 inter_arrival.received_packet_times.size()); | 2216 inter_arrival.received_packet_times.size()); |
2217 if (inter_arrival.received_packet_times.size() > | 2217 if (inter_arrival.received_packet_times.size() > |
2218 numeric_limits<uint8>::max()) { | 2218 numeric_limits<uint8>::max()) { |
2219 return false; | 2219 return false; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2265 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { | 2265 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { |
2266 return false; | 2266 return false; |
2267 } | 2267 } |
2268 break; | 2268 break; |
2269 } | 2269 } |
2270 case kTCP: { | 2270 case kTCP: { |
2271 const CongestionFeedbackMessageTCP& tcp = frame.tcp; | 2271 const CongestionFeedbackMessageTCP& tcp = frame.tcp; |
2272 DCHECK_LE(tcp.receive_window, 1u << 20); | 2272 DCHECK_LE(tcp.receive_window, 1u << 20); |
2273 // Simple bit packing, don't send the 4 least significant bits. | 2273 // Simple bit packing, don't send the 4 least significant bits. |
2274 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); | 2274 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); |
2275 if (quic_version_ <= QUIC_VERSION_14) { | 2275 if (quic_version_ == QUIC_VERSION_13) { |
2276 // accumulated_number_of_lost_packets is removed. Always write 0. | 2276 // accumulated_number_of_lost_packets is removed. Always write 0. |
2277 if (!writer->WriteUInt16(0)) { | 2277 if (!writer->WriteUInt16(0)) { |
2278 return false; | 2278 return false; |
2279 } | 2279 } |
2280 } | 2280 } |
2281 if (!writer->WriteUInt16(receive_window)) { | 2281 if (!writer->WriteUInt16(receive_window)) { |
2282 return false; | 2282 return false; |
2283 } | 2283 } |
2284 break; | 2284 break; |
2285 } | 2285 } |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2397 | 2397 |
2398 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2398 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2399 DVLOG(1) << "Error detail: " << detailed_error_; | 2399 DVLOG(1) << "Error detail: " << detailed_error_; |
2400 set_error(error); | 2400 set_error(error); |
2401 visitor_->OnError(this); | 2401 visitor_->OnError(this); |
2402 reader_.reset(NULL); | 2402 reader_.reset(NULL); |
2403 return false; | 2403 return false; |
2404 } | 2404 } |
2405 | 2405 |
2406 } // namespace net | 2406 } // namespace net |
OLD | NEW |