| 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 "net/quic/crypto/crypto_framer.h" | 9 #include "net/quic/crypto/crypto_framer.h" |
| 9 #include "net/quic/crypto/crypto_handshake_message.h" | 10 #include "net/quic/crypto/crypto_handshake_message.h" |
| 10 #include "net/quic/crypto/quic_decrypter.h" | 11 #include "net/quic/crypto/quic_decrypter.h" |
| 11 #include "net/quic/crypto/quic_encrypter.h" | 12 #include "net/quic/crypto/quic_encrypter.h" |
| 12 #include "net/quic/quic_data_reader.h" | 13 #include "net/quic/quic_data_reader.h" |
| 13 #include "net/quic/quic_data_writer.h" | 14 #include "net/quic/quic_data_writer.h" |
| 14 #include "net/quic/quic_socket_address_coder.h" | 15 #include "net/quic/quic_socket_address_coder.h" |
| 15 | 16 |
| 16 using base::StringPiece; | 17 using base::StringPiece; |
| 17 using std::make_pair; | 18 using std::make_pair; |
| (...skipping 1352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 } | 1371 } |
| 1371 for (size_t i = 0; i <= range_length; ++i) { | 1372 for (size_t i = 0; i <= range_length; ++i) { |
| 1372 received_info->missing_packets.insert(last_sequence_number - i); | 1373 received_info->missing_packets.insert(last_sequence_number - i); |
| 1373 } | 1374 } |
| 1374 // Subtract an extra 1 to ensure ranges are represented efficiently and | 1375 // Subtract an extra 1 to ensure ranges are represented efficiently and |
| 1375 // can't overlap by 1 sequence number. This allows a missing_delta of 0 | 1376 // can't overlap by 1 sequence number. This allows a missing_delta of 0 |
| 1376 // to represent an adjacent nack range. | 1377 // to represent an adjacent nack range. |
| 1377 last_sequence_number -= (range_length + 1); | 1378 last_sequence_number -= (range_length + 1); |
| 1378 } | 1379 } |
| 1379 | 1380 |
| 1381 if (quic_version_ > QUIC_VERSION_14) { |
| 1382 // Parse the revived packets list. |
| 1383 uint8 num_revived_packets; |
| 1384 if (!reader_->ReadBytes(&num_revived_packets, 1)) { |
| 1385 set_detailed_error("Unable to read num revived packets."); |
| 1386 return false; |
| 1387 } |
| 1388 |
| 1389 for (size_t i = 0; i < num_revived_packets; ++i) { |
| 1390 QuicPacketSequenceNumber revived_packet = 0; |
| 1391 if (!reader_->ReadBytes(&revived_packet, |
| 1392 largest_observed_sequence_number_length)) { |
| 1393 set_detailed_error("Unable to read revived packet."); |
| 1394 return false; |
| 1395 } |
| 1396 |
| 1397 received_info->revived_packets.insert(revived_packet); |
| 1398 } |
| 1399 } |
| 1400 |
| 1380 return true; | 1401 return true; |
| 1381 } | 1402 } |
| 1382 | 1403 |
| 1383 bool QuicFramer::ProcessSentInfo(const QuicPacketHeader& header, | 1404 bool QuicFramer::ProcessSentInfo(const QuicPacketHeader& header, |
| 1384 SentPacketInfo* sent_info) { | 1405 SentPacketInfo* sent_info) { |
| 1385 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { | 1406 if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) { |
| 1386 set_detailed_error("Unable to read entropy hash for sent packets."); | 1407 set_detailed_error("Unable to read entropy hash for sent packets."); |
| 1387 return false; | 1408 return false; |
| 1388 } | 1409 } |
| 1389 | 1410 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1407 set_detailed_error("Unable to read congestion feedback type."); | 1428 set_detailed_error("Unable to read congestion feedback type."); |
| 1408 return false; | 1429 return false; |
| 1409 } | 1430 } |
| 1410 frame->type = | 1431 frame->type = |
| 1411 static_cast<CongestionFeedbackType>(feedback_type); | 1432 static_cast<CongestionFeedbackType>(feedback_type); |
| 1412 | 1433 |
| 1413 switch (frame->type) { | 1434 switch (frame->type) { |
| 1414 case kInterArrival: { | 1435 case kInterArrival: { |
| 1415 CongestionFeedbackMessageInterArrival* inter_arrival = | 1436 CongestionFeedbackMessageInterArrival* inter_arrival = |
| 1416 &frame->inter_arrival; | 1437 &frame->inter_arrival; |
| 1417 uint16 unused_accumulated_number_of_lost_packets; | 1438 if (quic_version_ <= QUIC_VERSION_14) { |
| 1418 if (!reader_->ReadUInt16( | 1439 uint16 unused_accumulated_number_of_lost_packets; |
| 1419 &unused_accumulated_number_of_lost_packets)) { | 1440 if (!reader_->ReadUInt16( |
| 1420 set_detailed_error( | 1441 &unused_accumulated_number_of_lost_packets)) { |
| 1421 "Unable to read accumulated number of lost packets."); | 1442 set_detailed_error( |
| 1422 return false; | 1443 "Unable to read accumulated number of lost packets."); |
| 1444 return false; |
| 1445 } |
| 1423 } | 1446 } |
| 1424 uint8 num_received_packets; | 1447 uint8 num_received_packets; |
| 1425 if (!reader_->ReadBytes(&num_received_packets, 1)) { | 1448 if (!reader_->ReadBytes(&num_received_packets, 1)) { |
| 1426 set_detailed_error("Unable to read num received packets."); | 1449 set_detailed_error("Unable to read num received packets."); |
| 1427 return false; | 1450 return false; |
| 1428 } | 1451 } |
| 1429 | 1452 |
| 1430 if (num_received_packets > 0u) { | 1453 if (num_received_packets > 0u) { |
| 1431 uint64 smallest_received; | 1454 uint64 smallest_received; |
| 1432 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, | 1455 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 uint32 bitrate = 0; | 1495 uint32 bitrate = 0; |
| 1473 if (!reader_->ReadUInt32(&bitrate)) { | 1496 if (!reader_->ReadUInt32(&bitrate)) { |
| 1474 set_detailed_error("Unable to read bitrate."); | 1497 set_detailed_error("Unable to read bitrate."); |
| 1475 return false; | 1498 return false; |
| 1476 } | 1499 } |
| 1477 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); | 1500 frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate); |
| 1478 break; | 1501 break; |
| 1479 } | 1502 } |
| 1480 case kTCP: { | 1503 case kTCP: { |
| 1481 CongestionFeedbackMessageTCP* tcp = &frame->tcp; | 1504 CongestionFeedbackMessageTCP* tcp = &frame->tcp; |
| 1482 uint16 unused_accumulated_number_of_lost_packets; | 1505 if (quic_version_ <= QUIC_VERSION_14) { |
| 1483 if (!reader_->ReadUInt16(&unused_accumulated_number_of_lost_packets)) { | 1506 uint16 unused_accumulated_number_of_lost_packets; |
| 1484 set_detailed_error( | 1507 if (!reader_->ReadUInt16(&unused_accumulated_number_of_lost_packets)) { |
| 1485 "Unable to read accumulated number of lost packets."); | 1508 set_detailed_error( |
| 1486 return false; | 1509 "Unable to read accumulated number of lost packets."); |
| 1510 return false; |
| 1511 } |
| 1487 } | 1512 } |
| 1488 // TODO(ianswett): Remove receive window, since it's constant. | 1513 // TODO(ianswett): Remove receive window, since it's constant. |
| 1489 uint16 receive_window = 0; | 1514 uint16 receive_window = 0; |
| 1490 if (!reader_->ReadUInt16(&receive_window)) { | 1515 if (!reader_->ReadUInt16(&receive_window)) { |
| 1491 set_detailed_error("Unable to read receive window."); | 1516 set_detailed_error("Unable to read receive window."); |
| 1492 return false; | 1517 return false; |
| 1493 } | 1518 } |
| 1494 // Simple bit packing, don't send the 4 least significant bits. | 1519 // Simple bit packing, don't send the 4 least significant bits. |
| 1495 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; | 1520 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; |
| 1496 break; | 1521 break; |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 | 1787 |
| 1763 size_t QuicFramer::GetAckFrameSize( | 1788 size_t QuicFramer::GetAckFrameSize( |
| 1764 const QuicAckFrame& ack, | 1789 const QuicAckFrame& ack, |
| 1765 QuicSequenceNumberLength sequence_number_length) { | 1790 QuicSequenceNumberLength sequence_number_length) { |
| 1766 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1791 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1767 QuicSequenceNumberLength largest_observed_length = | 1792 QuicSequenceNumberLength largest_observed_length = |
| 1768 GetMinSequenceNumberLength(ack.received_info.largest_observed); | 1793 GetMinSequenceNumberLength(ack.received_info.largest_observed); |
| 1769 QuicSequenceNumberLength missing_sequence_number_length = | 1794 QuicSequenceNumberLength missing_sequence_number_length = |
| 1770 GetMinSequenceNumberLength(ack_info.max_delta); | 1795 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1771 | 1796 |
| 1772 return GetMinAckFrameSize(quic_version_, | 1797 size_t ack_size = GetMinAckFrameSize(quic_version_, |
| 1773 sequence_number_length, | 1798 sequence_number_length, |
| 1774 largest_observed_length) + | 1799 largest_observed_length); |
| 1775 (ack_info.nack_ranges.empty() ? 0 : kNumberOfMissingPacketsSize) + | 1800 if (!ack_info.nack_ranges.empty()) { |
| 1776 ack_info.nack_ranges.size() * | 1801 ack_size += kNumberOfMissingPacketsSize + |
| 1777 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1802 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); |
| 1803 ack_size += ack_info.nack_ranges.size() * |
| 1804 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1805 ack_size += |
| 1806 ack.received_info.revived_packets.size() * largest_observed_length; |
| 1807 } |
| 1808 return ack_size; |
| 1778 } | 1809 } |
| 1779 | 1810 |
| 1780 size_t QuicFramer::ComputeFrameLength( | 1811 size_t QuicFramer::ComputeFrameLength( |
| 1781 const QuicFrame& frame, | 1812 const QuicFrame& frame, |
| 1782 bool last_frame_in_packet, | 1813 bool last_frame_in_packet, |
| 1783 QuicSequenceNumberLength sequence_number_length) { | 1814 QuicSequenceNumberLength sequence_number_length) { |
| 1784 switch (frame.type) { | 1815 switch (frame.type) { |
| 1785 case STREAM_FRAME: | 1816 case STREAM_FRAME: |
| 1786 return GetMinStreamFrameSize(quic_version_, | 1817 return GetMinStreamFrameSize(quic_version_, |
| 1787 frame.stream_frame->stream_id, | 1818 frame.stream_frame->stream_id, |
| 1788 frame.stream_frame->offset, | 1819 frame.stream_frame->offset, |
| 1789 last_frame_in_packet) + | 1820 last_frame_in_packet) + |
| 1790 frame.stream_frame->data.TotalBufferSize(); | 1821 frame.stream_frame->data.TotalBufferSize(); |
| 1791 case ACK_FRAME: { | 1822 case ACK_FRAME: { |
| 1792 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); | 1823 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); |
| 1793 } | 1824 } |
| 1794 case CONGESTION_FEEDBACK_FRAME: { | 1825 case CONGESTION_FEEDBACK_FRAME: { |
| 1795 size_t len = kQuicFrameTypeSize; | 1826 size_t len = kQuicFrameTypeSize; |
| 1796 const QuicCongestionFeedbackFrame& congestion_feedback = | 1827 const QuicCongestionFeedbackFrame& congestion_feedback = |
| 1797 *frame.congestion_feedback_frame; | 1828 *frame.congestion_feedback_frame; |
| 1798 len += 1; // Congestion feedback type. | 1829 len += 1; // Congestion feedback type. |
| 1799 | 1830 |
| 1800 switch (congestion_feedback.type) { | 1831 switch (congestion_feedback.type) { |
| 1801 case kInterArrival: { | 1832 case kInterArrival: { |
| 1802 const CongestionFeedbackMessageInterArrival& inter_arrival = | 1833 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 1803 congestion_feedback.inter_arrival; | 1834 congestion_feedback.inter_arrival; |
| 1804 len += 2; | 1835 if (quic_version_ <= QUIC_VERSION_14) { |
| 1836 len += 2; // Accumulated number of lost packets. |
| 1837 } |
| 1805 len += 1; // Number received packets. | 1838 len += 1; // Number received packets. |
| 1806 if (inter_arrival.received_packet_times.size() > 0) { | 1839 if (inter_arrival.received_packet_times.size() > 0) { |
| 1807 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. | 1840 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. |
| 1808 len += 8; // Time. | 1841 len += 8; // Time. |
| 1809 // 2 bytes per sequence number delta plus 4 bytes per delta time. | 1842 // 2 bytes per sequence number delta plus 4 bytes per delta time. |
| 1810 len += PACKET_6BYTE_SEQUENCE_NUMBER * | 1843 len += PACKET_6BYTE_SEQUENCE_NUMBER * |
| 1811 (inter_arrival.received_packet_times.size() - 1); | 1844 (inter_arrival.received_packet_times.size() - 1); |
| 1812 } | 1845 } |
| 1813 break; | 1846 break; |
| 1814 } | 1847 } |
| 1815 case kFixRate: | 1848 case kFixRate: |
| 1816 len += 4; | 1849 len += 4; // Bitrate. |
| 1817 break; | 1850 break; |
| 1818 case kTCP: | 1851 case kTCP: |
| 1819 len += 4; | 1852 if (quic_version_ <= QUIC_VERSION_14) { |
| 1853 len += 2; // Accumulated number of lost packets. |
| 1854 } |
| 1855 len += 2; // Receive window. |
| 1820 break; | 1856 break; |
| 1821 default: | 1857 default: |
| 1822 set_detailed_error("Illegal feedback type."); | 1858 set_detailed_error("Illegal feedback type."); |
| 1823 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; | 1859 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; |
| 1824 break; | 1860 break; |
| 1825 } | 1861 } |
| 1826 return len; | 1862 return len; |
| 1827 } | 1863 } |
| 1828 case RST_STREAM_FRAME: | 1864 case RST_STREAM_FRAME: |
| 1829 return GetMinRstStreamFrameSize(quic_version_) + | 1865 return GetMinRstStreamFrameSize(quic_version_) + |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1963 QuicPacketSequenceNumber ack_largest_observed = | 1999 QuicPacketSequenceNumber ack_largest_observed = |
| 1964 frame.received_info.largest_observed; | 2000 frame.received_info.largest_observed; |
| 1965 QuicSequenceNumberLength largest_observed_length = | 2001 QuicSequenceNumberLength largest_observed_length = |
| 1966 GetMinSequenceNumberLength(ack_largest_observed); | 2002 GetMinSequenceNumberLength(ack_largest_observed); |
| 1967 QuicSequenceNumberLength missing_sequence_number_length = | 2003 QuicSequenceNumberLength missing_sequence_number_length = |
| 1968 GetMinSequenceNumberLength(ack_info.max_delta); | 2004 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1969 // Determine whether we need to truncate ranges. | 2005 // Determine whether we need to truncate ranges. |
| 1970 size_t available_range_bytes = writer->capacity() - writer->length() - | 2006 size_t available_range_bytes = writer->capacity() - writer->length() - |
| 1971 GetMinAckFrameSize(quic_version_, | 2007 GetMinAckFrameSize(quic_version_, |
| 1972 header.public_header.sequence_number_length, | 2008 header.public_header.sequence_number_length, |
| 1973 largest_observed_length); | 2009 largest_observed_length) - |
| 2010 (quic_version_ <= QUIC_VERSION_14 ? 0 : kNumberOfRevivedPacketsSize); |
| 1974 size_t max_num_ranges = available_range_bytes / | 2011 size_t max_num_ranges = available_range_bytes / |
| 1975 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 2012 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1976 max_num_ranges = | 2013 max_num_ranges = |
| 1977 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); | 2014 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); |
| 1978 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 2015 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
| 1979 DVLOG_IF(1, truncated) << "Truncating ack from " | 2016 DVLOG_IF(1, truncated) << "Truncating ack from " |
| 1980 << ack_info.nack_ranges.size() << " ranges to " | 2017 << ack_info.nack_ranges.size() << " ranges to " |
| 1981 << max_num_ranges; | 2018 << max_num_ranges; |
| 1982 | 2019 |
| 1983 // Write out the type byte by setting the low order bits and doing shifts | 2020 // Write out the type byte by setting the low order bits and doing shifts |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2078 return false; | 2115 return false; |
| 2079 } | 2116 } |
| 2080 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, | 2117 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, |
| 2081 ack_iter->second, writer)) { | 2118 ack_iter->second, writer)) { |
| 2082 return false; | 2119 return false; |
| 2083 } | 2120 } |
| 2084 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2121 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2085 last_sequence_written = ack_iter->first - 1; | 2122 last_sequence_written = ack_iter->first - 1; |
| 2086 ++num_ranges_written; | 2123 ++num_ranges_written; |
| 2087 } | 2124 } |
| 2125 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2088 | 2126 |
| 2089 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2127 if (quic_version_ > QUIC_VERSION_14) { |
| 2128 // Append revived packets. |
| 2129 // If not all the revived packets fit, only mention the ones that do. |
| 2130 uint8 num_revived_packets = |
| 2131 min(received_info.revived_packets.size(), |
| 2132 static_cast<size_t>(numeric_limits<uint8>::max())); |
| 2133 num_revived_packets = min( |
| 2134 static_cast<size_t>(num_revived_packets), |
| 2135 (writer->capacity() - writer->length()) / largest_observed_length); |
| 2136 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2137 return false; |
| 2138 } |
| 2139 |
| 2140 SequenceNumberSet::const_iterator iter = |
| 2141 received_info.revived_packets.begin(); |
| 2142 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
| 2143 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter)); |
| 2144 if (!AppendPacketSequenceNumber(largest_observed_length, |
| 2145 *iter, writer)) { |
| 2146 return false; |
| 2147 } |
| 2148 } |
| 2149 } |
| 2150 |
| 2090 return true; | 2151 return true; |
| 2091 } | 2152 } |
| 2092 | 2153 |
| 2093 bool QuicFramer::AppendQuicCongestionFeedbackFrame( | 2154 bool QuicFramer::AppendQuicCongestionFeedbackFrame( |
| 2094 const QuicCongestionFeedbackFrame& frame, | 2155 const QuicCongestionFeedbackFrame& frame, |
| 2095 QuicDataWriter* writer) { | 2156 QuicDataWriter* writer) { |
| 2096 if (!writer->WriteBytes(&frame.type, 1)) { | 2157 if (!writer->WriteBytes(&frame.type, 1)) { |
| 2097 return false; | 2158 return false; |
| 2098 } | 2159 } |
| 2099 | 2160 |
| 2100 switch (frame.type) { | 2161 switch (frame.type) { |
| 2101 case kInterArrival: { | 2162 case kInterArrival: { |
| 2102 const CongestionFeedbackMessageInterArrival& inter_arrival = | 2163 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 2103 frame.inter_arrival; | 2164 frame.inter_arrival; |
| 2104 // accumulated_number_of_lost_packets is removed. Always write 0. | 2165 if (quic_version_ <= QUIC_VERSION_14) { |
| 2105 if (!writer->WriteUInt16(0)) { | 2166 // accumulated_number_of_lost_packets is removed. Always write 0. |
| 2106 return false; | 2167 if (!writer->WriteUInt16(0)) { |
| 2168 return false; |
| 2169 } |
| 2107 } | 2170 } |
| 2108 DCHECK_GE(numeric_limits<uint8>::max(), | 2171 DCHECK_GE(numeric_limits<uint8>::max(), |
| 2109 inter_arrival.received_packet_times.size()); | 2172 inter_arrival.received_packet_times.size()); |
| 2110 if (inter_arrival.received_packet_times.size() > | 2173 if (inter_arrival.received_packet_times.size() > |
| 2111 numeric_limits<uint8>::max()) { | 2174 numeric_limits<uint8>::max()) { |
| 2112 return false; | 2175 return false; |
| 2113 } | 2176 } |
| 2114 // TODO(ianswett): Make num_received_packets a varint. | 2177 // TODO(ianswett): Make num_received_packets a varint. |
| 2115 uint8 num_received_packets = | 2178 uint8 num_received_packets = |
| 2116 inter_arrival.received_packet_times.size(); | 2179 inter_arrival.received_packet_times.size(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2158 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { | 2221 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { |
| 2159 return false; | 2222 return false; |
| 2160 } | 2223 } |
| 2161 break; | 2224 break; |
| 2162 } | 2225 } |
| 2163 case kTCP: { | 2226 case kTCP: { |
| 2164 const CongestionFeedbackMessageTCP& tcp = frame.tcp; | 2227 const CongestionFeedbackMessageTCP& tcp = frame.tcp; |
| 2165 DCHECK_LE(tcp.receive_window, 1u << 20); | 2228 DCHECK_LE(tcp.receive_window, 1u << 20); |
| 2166 // Simple bit packing, don't send the 4 least significant bits. | 2229 // Simple bit packing, don't send the 4 least significant bits. |
| 2167 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); | 2230 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); |
| 2168 // accumulated_number_of_lost_packets is removed. Always write 0. | 2231 if (quic_version_ <= QUIC_VERSION_14) { |
| 2169 if (!writer->WriteUInt16(0)) { | 2232 // accumulated_number_of_lost_packets is removed. Always write 0. |
| 2170 return false; | 2233 if (!writer->WriteUInt16(0)) { |
| 2234 return false; |
| 2235 } |
| 2171 } | 2236 } |
| 2172 if (!writer->WriteUInt16(receive_window)) { | 2237 if (!writer->WriteUInt16(receive_window)) { |
| 2173 return false; | 2238 return false; |
| 2174 } | 2239 } |
| 2175 break; | 2240 break; |
| 2176 } | 2241 } |
| 2177 default: | 2242 default: |
| 2178 return false; | 2243 return false; |
| 2179 } | 2244 } |
| 2180 | 2245 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2257 | 2322 |
| 2258 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2323 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2259 DVLOG(1) << "Error detail: " << detailed_error_; | 2324 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2260 set_error(error); | 2325 set_error(error); |
| 2261 visitor_->OnError(this); | 2326 visitor_->OnError(this); |
| 2262 reader_.reset(NULL); | 2327 reader_.reset(NULL); |
| 2263 return false; | 2328 return false; |
| 2264 } | 2329 } |
| 2265 | 2330 |
| 2266 } // namespace net | 2331 } // namespace net |
| OLD | NEW |