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

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

Issue 157803007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win_x64 compiler error fix Created 6 years, 10 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_framer.h ('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 "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 623 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 } 642 }
642 643
643 visitor_->OnPacketComplete(); 644 visitor_->OnPacketComplete();
644 return true; 645 return true;
645 } 646 }
646 647
647 bool QuicFramer::ProcessPublicResetPacket( 648 bool QuicFramer::ProcessPublicResetPacket(
648 const QuicPacketPublicHeader& public_header) { 649 const QuicPacketPublicHeader& public_header) {
649 QuicPublicResetPacket packet(public_header); 650 QuicPublicResetPacket packet(public_header);
650 651
651 if (reader_->BytesRemaining() <= 652 if (public_header.sequence_number_length == PACKET_6BYTE_SEQUENCE_NUMBER) {
652 kPublicResetNonceSize + PACKET_6BYTE_SEQUENCE_NUMBER) { 653 // An old-style public reset packet has the
653 // An old-style public reset packet. 654 // PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE bits set in the public flags.
654 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. 655 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13.
655 if (!reader_->ReadUInt64(&packet.nonce_proof)) { 656 if (!reader_->ReadUInt64(&packet.nonce_proof)) {
656 set_detailed_error("Unable to read nonce proof."); 657 set_detailed_error("Unable to read nonce proof.");
657 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 658 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
658 } 659 }
659 660
660 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) { 661 if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) {
661 set_detailed_error("Unable to read rejected sequence number."); 662 set_detailed_error("Unable to read rejected sequence number.");
662 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET); 663 return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
663 } 664 }
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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 21 matching lines...) Expand all
2005 2042
2006 // TODO(satyamshekhar): Decide how often we really should send this 2043 // TODO(satyamshekhar): Decide how often we really should send this
2007 // entropy_hash update. 2044 // entropy_hash update.
2008 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) { 2045 if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) {
2009 return false; 2046 return false;
2010 } 2047 }
2011 2048
2012 DCHECK_GE(header.packet_sequence_number, frame.sent_info.least_unacked); 2049 DCHECK_GE(header.packet_sequence_number, frame.sent_info.least_unacked);
2013 const QuicPacketSequenceNumber least_unacked_delta = 2050 const QuicPacketSequenceNumber least_unacked_delta =
2014 header.packet_sequence_number - frame.sent_info.least_unacked; 2051 header.packet_sequence_number - frame.sent_info.least_unacked;
2052 const QuicPacketSequenceNumber length_shift =
2053 header.public_header.sequence_number_length * 8;
2054 if (least_unacked_delta >> length_shift > 0) {
2055 LOG(DFATAL) << "sequence_number_length "
2056 << header.public_header.sequence_number_length
2057 << " is too small for least_unacked_delta: "
2058 << least_unacked_delta;
2059 return false;
2060 }
2015 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length, 2061 if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
2016 least_unacked_delta, writer)) { 2062 least_unacked_delta, writer)) {
2017 return false; 2063 return false;
2018 } 2064 }
2019 2065
2020 const ReceivedPacketInfo& received_info = frame.received_info; 2066 const ReceivedPacketInfo& received_info = frame.received_info;
2021 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash; 2067 QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash;
2022 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin(); 2068 NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin();
2023 if (truncated) { 2069 if (truncated) {
2024 // Skip the nack ranges which the truncated ack won't include and set 2070 // Skip the nack ranges which the truncated ack won't include and set
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 return false; 2124 return false;
2079 } 2125 }
2080 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER, 2126 if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER,
2081 ack_iter->second, writer)) { 2127 ack_iter->second, writer)) {
2082 return false; 2128 return false;
2083 } 2129 }
2084 // Subtract 1 so a missing_delta of 0 means an adjacent range. 2130 // Subtract 1 so a missing_delta of 0 means an adjacent range.
2085 last_sequence_written = ack_iter->first - 1; 2131 last_sequence_written = ack_iter->first - 1;
2086 ++num_ranges_written; 2132 ++num_ranges_written;
2087 } 2133 }
2134 DCHECK_EQ(num_missing_ranges, num_ranges_written);
2088 2135
2089 DCHECK_EQ(num_missing_ranges, num_ranges_written); 2136 if (quic_version_ > QUIC_VERSION_14) {
2137 // Append revived packets.
2138 // If not all the revived packets fit, only mention the ones that do.
2139 uint8 num_revived_packets =
2140 min(received_info.revived_packets.size(),
2141 static_cast<size_t>(numeric_limits<uint8>::max()));
2142 num_revived_packets = min(
2143 static_cast<size_t>(num_revived_packets),
2144 (writer->capacity() - writer->length()) / largest_observed_length);
2145 if (!writer->WriteBytes(&num_revived_packets, 1)) {
2146 return false;
2147 }
2148
2149 SequenceNumberSet::const_iterator iter =
2150 received_info.revived_packets.begin();
2151 for (int i = 0; i < num_revived_packets; ++i, ++iter) {
2152 LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter));
2153 if (!AppendPacketSequenceNumber(largest_observed_length,
2154 *iter, writer)) {
2155 return false;
2156 }
2157 }
2158 }
2159
2090 return true; 2160 return true;
2091 } 2161 }
2092 2162
2093 bool QuicFramer::AppendQuicCongestionFeedbackFrame( 2163 bool QuicFramer::AppendQuicCongestionFeedbackFrame(
2094 const QuicCongestionFeedbackFrame& frame, 2164 const QuicCongestionFeedbackFrame& frame,
2095 QuicDataWriter* writer) { 2165 QuicDataWriter* writer) {
2096 if (!writer->WriteBytes(&frame.type, 1)) { 2166 if (!writer->WriteBytes(&frame.type, 1)) {
2097 return false; 2167 return false;
2098 } 2168 }
2099 2169
2100 switch (frame.type) { 2170 switch (frame.type) {
2101 case kInterArrival: { 2171 case kInterArrival: {
2102 const CongestionFeedbackMessageInterArrival& inter_arrival = 2172 const CongestionFeedbackMessageInterArrival& inter_arrival =
2103 frame.inter_arrival; 2173 frame.inter_arrival;
2104 // accumulated_number_of_lost_packets is removed. Always write 0. 2174 if (quic_version_ <= QUIC_VERSION_14) {
2105 if (!writer->WriteUInt16(0)) { 2175 // accumulated_number_of_lost_packets is removed. Always write 0.
2106 return false; 2176 if (!writer->WriteUInt16(0)) {
2177 return false;
2178 }
2107 } 2179 }
2108 DCHECK_GE(numeric_limits<uint8>::max(), 2180 DCHECK_GE(numeric_limits<uint8>::max(),
2109 inter_arrival.received_packet_times.size()); 2181 inter_arrival.received_packet_times.size());
2110 if (inter_arrival.received_packet_times.size() > 2182 if (inter_arrival.received_packet_times.size() >
2111 numeric_limits<uint8>::max()) { 2183 numeric_limits<uint8>::max()) {
2112 return false; 2184 return false;
2113 } 2185 }
2114 // TODO(ianswett): Make num_received_packets a varint. 2186 // TODO(ianswett): Make num_received_packets a varint.
2115 uint8 num_received_packets = 2187 uint8 num_received_packets =
2116 inter_arrival.received_packet_times.size(); 2188 inter_arrival.received_packet_times.size();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) { 2230 if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) {
2159 return false; 2231 return false;
2160 } 2232 }
2161 break; 2233 break;
2162 } 2234 }
2163 case kTCP: { 2235 case kTCP: {
2164 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2236 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2165 DCHECK_LE(tcp.receive_window, 1u << 20); 2237 DCHECK_LE(tcp.receive_window, 1u << 20);
2166 // Simple bit packing, don't send the 4 least significant bits. 2238 // Simple bit packing, don't send the 4 least significant bits.
2167 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2239 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2168 // accumulated_number_of_lost_packets is removed. Always write 0. 2240 if (quic_version_ <= QUIC_VERSION_14) {
2169 if (!writer->WriteUInt16(0)) { 2241 // accumulated_number_of_lost_packets is removed. Always write 0.
2170 return false; 2242 if (!writer->WriteUInt16(0)) {
2243 return false;
2244 }
2171 } 2245 }
2172 if (!writer->WriteUInt16(receive_window)) { 2246 if (!writer->WriteUInt16(receive_window)) {
2173 return false; 2247 return false;
2174 } 2248 }
2175 break; 2249 break;
2176 } 2250 }
2177 default: 2251 default:
2178 return false; 2252 return false;
2179 } 2253 }
2180 2254
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2257 2331
2258 bool QuicFramer::RaiseError(QuicErrorCode error) { 2332 bool QuicFramer::RaiseError(QuicErrorCode error) {
2259 DVLOG(1) << "Error detail: " << detailed_error_; 2333 DVLOG(1) << "Error detail: " << detailed_error_;
2260 set_error(error); 2334 set_error(error);
2261 visitor_->OnError(this); 2335 visitor_->OnError(this);
2262 reader_.reset(NULL); 2336 reader_.reset(NULL);
2263 return false; 2337 return false;
2264 } 2338 }
2265 2339
2266 } // namespace net 2340 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698