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

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

Issue 198353003: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection_test.cc ('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 1410 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_connection_test.cc ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698