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 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 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 21 matching lines...) Expand all Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |