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 |