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

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

Issue 478153003: Change the wire format of the ack frame to include a compressed version (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase TOT and pass clock to QuicTestPacketMaker and use it in AckPacket Created 6 years, 3 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
« 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 "base/stl_util.h"
9 #include "net/quic/crypto/crypto_framer.h" 9 #include "net/quic/crypto/crypto_framer.h"
10 #include "net/quic/crypto/crypto_handshake_message.h" 10 #include "net/quic/crypto/crypto_handshake_message.h"
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 case PACKET_FLAGS_2BYTE_SEQUENCE: 125 case PACKET_FLAGS_2BYTE_SEQUENCE:
126 return PACKET_2BYTE_SEQUENCE_NUMBER; 126 return PACKET_2BYTE_SEQUENCE_NUMBER;
127 case PACKET_FLAGS_1BYTE_SEQUENCE: 127 case PACKET_FLAGS_1BYTE_SEQUENCE:
128 return PACKET_1BYTE_SEQUENCE_NUMBER; 128 return PACKET_1BYTE_SEQUENCE_NUMBER;
129 default: 129 default:
130 LOG(DFATAL) << "Unreachable case statement."; 130 LOG(DFATAL) << "Unreachable case statement.";
131 return PACKET_6BYTE_SEQUENCE_NUMBER; 131 return PACKET_6BYTE_SEQUENCE_NUMBER;
132 } 132 }
133 } 133 }
134 134
135 bool CanTruncate(const QuicFrame& frame, size_t free_bytes) {
136 if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) &&
137 free_bytes >=
138 QuicFramer::GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER,
139 PACKET_6BYTE_SEQUENCE_NUMBER)) {
140 return true;
141 }
142 return false;
143 }
144
145 } // namespace 135 } // namespace
146 136
147 bool QuicFramerVisitorInterface::OnWindowUpdateFrame( 137 bool QuicFramerVisitorInterface::OnWindowUpdateFrame(
148 const QuicWindowUpdateFrame& frame) { 138 const QuicWindowUpdateFrame& frame) {
149 return true; 139 return true;
150 } 140 }
151 141
152 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) { 142 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) {
153 return true; 143 return true;
154 } 144 }
155 145
156 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions, 146 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions,
157 QuicTime creation_time, 147 QuicTime creation_time,
158 bool is_server) 148 bool is_server)
159 : visitor_(NULL), 149 : visitor_(NULL),
160 fec_builder_(NULL), 150 fec_builder_(NULL),
161 entropy_calculator_(NULL), 151 entropy_calculator_(NULL),
162 error_(QUIC_NO_ERROR), 152 error_(QUIC_NO_ERROR),
163 last_sequence_number_(0), 153 last_sequence_number_(0),
164 last_serialized_connection_id_(0), 154 last_serialized_connection_id_(0),
165 supported_versions_(supported_versions), 155 supported_versions_(supported_versions),
166 decrypter_level_(ENCRYPTION_NONE), 156 decrypter_level_(ENCRYPTION_NONE),
167 alternative_decrypter_level_(ENCRYPTION_NONE), 157 alternative_decrypter_level_(ENCRYPTION_NONE),
168 alternative_decrypter_latch_(false), 158 alternative_decrypter_latch_(false),
169 is_server_(is_server), 159 is_server_(is_server),
170 validate_flags_(true), 160 validate_flags_(true),
171 creation_time_(creation_time) { 161 creation_time_(creation_time),
162 last_timestamp_(QuicTime::Delta::Zero()) {
172 DCHECK(!supported_versions.empty()); 163 DCHECK(!supported_versions.empty());
173 quic_version_ = supported_versions_[0]; 164 quic_version_ = supported_versions_[0];
174 decrypter_.reset(QuicDecrypter::Create(kNULL)); 165 decrypter_.reset(QuicDecrypter::Create(kNULL));
175 encrypter_[ENCRYPTION_NONE].reset( 166 encrypter_[ENCRYPTION_NONE].reset(
176 QuicEncrypter::Create(kNULL)); 167 QuicEncrypter::Create(kNULL));
177 } 168 }
178 169
179 QuicFramer::~QuicFramer() {} 170 QuicFramer::~QuicFramer() {}
180 171
181 // static 172 // static
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 sequence_number_length); 286 sequence_number_length);
296 if (frame_len <= free_bytes) { 287 if (frame_len <= free_bytes) {
297 // Frame fits within packet. Note that acks may be truncated. 288 // Frame fits within packet. Note that acks may be truncated.
298 return frame_len; 289 return frame_len;
299 } 290 }
300 // Only truncate the first frame in a packet, so if subsequent ones go 291 // Only truncate the first frame in a packet, so if subsequent ones go
301 // over, stop including more frames. 292 // over, stop including more frames.
302 if (!first_frame) { 293 if (!first_frame) {
303 return 0; 294 return 0;
304 } 295 }
305 if (CanTruncate(frame, free_bytes)) { 296 bool can_truncate = frame.type == ACK_FRAME &&
297 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER,
298 PACKET_6BYTE_SEQUENCE_NUMBER);
299 if (can_truncate) {
306 // Truncate the frame so the packet will not exceed kMaxPacketSize. 300 // Truncate the frame so the packet will not exceed kMaxPacketSize.
307 // Note that we may not use every byte of the writer in this case. 301 // Note that we may not use every byte of the writer in this case.
308 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; 302 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes;
309 return free_bytes; 303 return free_bytes;
310 } 304 }
311 if (!FLAGS_quic_allow_oversized_packets_for_test) { 305 if (!FLAGS_quic_allow_oversized_packets_for_test) {
312 return 0; 306 return 0;
313 } 307 }
314 LOG(DFATAL) << "Packet size too small to fit frame."; 308 LOG(DFATAL) << "Packet size too small to fit frame.";
315 return frame_len; 309 return frame_len;
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 uint8 first_fec_protected_packet_offset = 794 uint8 first_fec_protected_packet_offset =
801 header.packet_sequence_number - header.fec_group; 795 header.packet_sequence_number - header.fec_group;
802 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) { 796 if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
803 return false; 797 return false;
804 } 798 }
805 } 799 }
806 800
807 return true; 801 return true;
808 } 802 }
809 803
804 const QuicTime::Delta QuicFramer::CalculateTimestampFromWire(
805 uint32 time_delta_us) {
806 // The new time_delta might have wrapped to the next epoch, or it
807 // might have reverse wrapped to the previous epoch, or it might
808 // remain in the same epoch. Select the time closest to the previous
809 // time.
810 //
811 // epoch_delta is the delta between epochs. A delta is 4 bytes of
812 // microseconds.
813 const uint64 epoch_delta = GG_UINT64_C(1) << 32;
814 uint64 epoch = last_timestamp_.ToMicroseconds() & ~(epoch_delta - 1);
815 // Wrapping is safe here because a wrapped value will not be ClosestTo below.
816 uint64 prev_epoch = epoch - epoch_delta;
817 uint64 next_epoch = epoch + epoch_delta;
818
819 uint64 time = ClosestTo(last_timestamp_.ToMicroseconds(),
820 epoch + time_delta_us,
821 ClosestTo(last_timestamp_.ToMicroseconds(),
822 prev_epoch + time_delta_us,
823 next_epoch + time_delta_us));
824
825 return QuicTime::Delta::FromMicroseconds(time);
826 }
827
810 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire( 828 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
811 QuicSequenceNumberLength sequence_number_length, 829 QuicSequenceNumberLength sequence_number_length,
812 QuicPacketSequenceNumber packet_sequence_number) const { 830 QuicPacketSequenceNumber packet_sequence_number) const {
813 // The new sequence number might have wrapped to the next epoch, or 831 // The new sequence number might have wrapped to the next epoch, or
814 // it might have reverse wrapped to the previous epoch, or it might 832 // it might have reverse wrapped to the previous epoch, or it might
815 // remain in the same epoch. Select the sequence number closest to the 833 // remain in the same epoch. Select the sequence number closest to the
816 // next expected sequence number, the previous sequence number plus 1. 834 // next expected sequence number, the previous sequence number plus 1.
817 835
818 // epoch_delta is the delta between epochs the sequence number was serialized 836 // epoch_delta is the delta between epochs the sequence number was serialized
819 // with, so the correct value is likely the same epoch as the last sequence 837 // with, so the correct value is likely the same epoch as the last sequence
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1103 if (!visitor_->OnAckFrame(frame)) { 1121 if (!visitor_->OnAckFrame(frame)) {
1104 DVLOG(1) << "Visitor asked to stop further processing."; 1122 DVLOG(1) << "Visitor asked to stop further processing.";
1105 // Returning true since there was no parsing error. 1123 // Returning true since there was no parsing error.
1106 return true; 1124 return true;
1107 } 1125 }
1108 continue; 1126 continue;
1109 } 1127 }
1110 1128
1111 // Congestion Feedback Frame 1129 // Congestion Feedback Frame
1112 if (frame_type & kQuicFrameTypeCongestionFeedbackMask) { 1130 if (frame_type & kQuicFrameTypeCongestionFeedbackMask) {
1131 if (quic_version_ > QUIC_VERSION_22) {
1132 set_detailed_error("Congestion Feedback Frame has been deprecated.");
1133 DLOG(WARNING) << "Congestion Feedback Frame has been deprecated.";
1134 }
1113 QuicCongestionFeedbackFrame frame; 1135 QuicCongestionFeedbackFrame frame;
1114 if (!ProcessQuicCongestionFeedbackFrame(&frame)) { 1136 if (!ProcessCongestionFeedbackFrame(&frame)) {
1115 return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA); 1137 return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
1116 } 1138 }
1117 if (!visitor_->OnCongestionFeedbackFrame(frame)) { 1139 if (!visitor_->OnCongestionFeedbackFrame(frame)) {
1118 DVLOG(1) << "Visitor asked to stop further processing."; 1140 DVLOG(1) << "Visitor asked to stop further processing.";
1119 // Returning true since there was no parsing error. 1141 // Returning true since there was no parsing error.
1120 return true; 1142 return true;
1121 } 1143 }
1122 continue; 1144 continue;
1123 } 1145 }
1124 1146
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 return false; 1348 return false;
1327 } 1349 }
1328 1350
1329 if (delta_time_largest_observed_us == kUFloat16MaxValue) { 1351 if (delta_time_largest_observed_us == kUFloat16MaxValue) {
1330 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite(); 1352 ack_frame->delta_time_largest_observed = QuicTime::Delta::Infinite();
1331 } else { 1353 } else {
1332 ack_frame->delta_time_largest_observed = 1354 ack_frame->delta_time_largest_observed =
1333 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us); 1355 QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us);
1334 } 1356 }
1335 1357
1358 if (!ProcessTimestampsInAckFrame(ack_frame)) {
1359 return false;
1360 }
1361
1336 if (!has_nacks) { 1362 if (!has_nacks) {
1337 return true; 1363 return true;
1338 } 1364 }
1339 1365
1340 uint8 num_missing_ranges; 1366 uint8 num_missing_ranges;
1341 if (!reader_->ReadBytes(&num_missing_ranges, 1)) { 1367 if (!reader_->ReadBytes(&num_missing_ranges, 1)) {
1342 set_detailed_error("Unable to read num missing packet ranges."); 1368 set_detailed_error("Unable to read num missing packet ranges.");
1343 return false; 1369 return false;
1344 } 1370 }
1345 1371
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 set_detailed_error("Unable to read revived packet."); 1405 set_detailed_error("Unable to read revived packet.");
1380 return false; 1406 return false;
1381 } 1407 }
1382 1408
1383 ack_frame->revived_packets.insert(revived_packet); 1409 ack_frame->revived_packets.insert(revived_packet);
1384 } 1410 }
1385 1411
1386 return true; 1412 return true;
1387 } 1413 }
1388 1414
1415 bool QuicFramer::ProcessTimestampsInAckFrame(QuicAckFrame* ack_frame) {
1416 if (version() > QUIC_VERSION_22 && !ack_frame->is_truncated) {
1417 uint8 num_received_packets;
1418 if (!reader_->ReadBytes(&num_received_packets, 1)) {
1419 set_detailed_error("Unable to read num received packets.");
1420 return false;
1421 }
1422
1423 if (num_received_packets > 0) {
1424 uint8 delta_from_largest_observed;
1425 if (!reader_->ReadBytes(&delta_from_largest_observed,
1426 PACKET_1BYTE_SEQUENCE_NUMBER)) {
1427 set_detailed_error(
1428 "Unable to read sequence delta in received packets.");
1429 return false;
1430 }
1431 QuicPacketSequenceNumber seq_num = ack_frame->largest_observed -
1432 delta_from_largest_observed;
1433
1434 // Time delta from the framer creation.
1435 uint32 time_delta_us;
1436 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1437 set_detailed_error("Unable to read time delta in received packets.");
1438 return false;
1439 }
1440
1441 last_timestamp_ = CalculateTimestampFromWire(time_delta_us);
1442
1443 ack_frame->received_packet_times.push_back(
1444 make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1445
1446 for (uint8 i = 1; i < num_received_packets; ++i) {
1447 if (!reader_->ReadBytes(&delta_from_largest_observed,
1448 PACKET_1BYTE_SEQUENCE_NUMBER)) {
1449 set_detailed_error(
1450 "Unable to read sequence delta in received packets.");
1451 return false;
1452 }
1453 seq_num = ack_frame->largest_observed - delta_from_largest_observed;
1454
1455 // Time delta from the previous timestamp.
1456 uint64 incremental_time_delta_us;
1457 if (!reader_->ReadUFloat16(&incremental_time_delta_us)) {
1458 set_detailed_error(
1459 "Unable to read incremental time delta in received packets.");
1460 return false;
1461 }
1462
1463 last_timestamp_ = last_timestamp_.Add(
1464 QuicTime::Delta::FromMicroseconds(incremental_time_delta_us));
1465 ack_frame->received_packet_times.push_back(
1466 make_pair(seq_num, creation_time_.Add(last_timestamp_)));
1467 }
1468 }
1469 }
1470 return true;
1471 }
1472
1389 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header, 1473 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header,
1390 QuicStopWaitingFrame* stop_waiting) { 1474 QuicStopWaitingFrame* stop_waiting) {
1391 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) { 1475 if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) {
1392 set_detailed_error("Unable to read entropy hash for sent packets."); 1476 set_detailed_error("Unable to read entropy hash for sent packets.");
1393 return false; 1477 return false;
1394 } 1478 }
1395 1479
1396 QuicPacketSequenceNumber least_unacked_delta = 0; 1480 QuicPacketSequenceNumber least_unacked_delta = 0;
1397 if (!reader_->ReadBytes(&least_unacked_delta, 1481 if (!reader_->ReadBytes(&least_unacked_delta,
1398 header.public_header.sequence_number_length)) { 1482 header.public_header.sequence_number_length)) {
1399 set_detailed_error("Unable to read least unacked delta."); 1483 set_detailed_error("Unable to read least unacked delta.");
1400 return false; 1484 return false;
1401 } 1485 }
1402 DCHECK_GE(header.packet_sequence_number, least_unacked_delta); 1486 DCHECK_GE(header.packet_sequence_number, least_unacked_delta);
1403 stop_waiting->least_unacked = 1487 stop_waiting->least_unacked =
1404 header.packet_sequence_number - least_unacked_delta; 1488 header.packet_sequence_number - least_unacked_delta;
1405 1489
1406 return true; 1490 return true;
1407 } 1491 }
1408 1492
1409 bool QuicFramer::ProcessQuicCongestionFeedbackFrame( 1493 bool QuicFramer::ProcessCongestionFeedbackFrame(
1410 QuicCongestionFeedbackFrame* frame) { 1494 QuicCongestionFeedbackFrame* frame) {
1411 uint8 feedback_type; 1495 uint8 feedback_type;
1412 if (!reader_->ReadBytes(&feedback_type, 1)) { 1496 if (!reader_->ReadBytes(&feedback_type, 1)) {
1413 set_detailed_error("Unable to read congestion feedback type."); 1497 set_detailed_error("Unable to read congestion feedback type.");
1414 return false; 1498 return false;
1415 } 1499 }
1416 frame->type = 1500 frame->type =
1417 static_cast<CongestionFeedbackType>(feedback_type); 1501 static_cast<CongestionFeedbackType>(feedback_type);
1418 1502
1419 switch (frame->type) { 1503 switch (frame->type) {
1420 case kTimestamp: {
1421 set_detailed_error("Timestamp feedback not supported.");
1422 return false;
1423 }
1424 case kTCP: { 1504 case kTCP: {
1425 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1505 CongestionFeedbackMessageTCP* tcp = &frame->tcp;
1426 uint16 receive_window = 0; 1506 uint16 receive_window = 0;
1427 if (!reader_->ReadUInt16(&receive_window)) { 1507 if (!reader_->ReadUInt16(&receive_window)) {
1428 set_detailed_error("Unable to read receive window."); 1508 set_detailed_error("Unable to read receive window.");
1429 return false; 1509 return false;
1430 } 1510 }
1431 // Simple bit packing, don't send the 4 least significant bits. 1511 // Simple bit packing, don't send the 4 least significant bits.
1432 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1512 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
1433 break; 1513 break;
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 1789
1710 size_t ack_size = GetMinAckFrameSize(sequence_number_length, 1790 size_t ack_size = GetMinAckFrameSize(sequence_number_length,
1711 largest_observed_length); 1791 largest_observed_length);
1712 if (!ack_info.nack_ranges.empty()) { 1792 if (!ack_info.nack_ranges.empty()) {
1713 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; 1793 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize;
1714 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * 1794 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
1715 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); 1795 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
1716 ack_size += min(ack.revived_packets.size(), 1796 ack_size += min(ack.revived_packets.size(),
1717 kMaxRevivedPackets) * largest_observed_length; 1797 kMaxRevivedPackets) * largest_observed_length;
1718 } 1798 }
1799
1800 // In version 23, if the ack will be truncated due to too many nack ranges,
1801 // then do not include the number of timestamps (1 byte).
1802 if (version() > QUIC_VERSION_22 &&
1803 ack_info.nack_ranges.size() <= kMaxNackRanges) {
1804 // 1 byte for the number of timestamps.
1805 ack_size += 1;
1806 if (ack.received_packet_times.size() > 0) {
1807 // 1 byte for sequence number, 4 bytes for timestamp for the first
1808 // packet.
1809 ack_size += 5;
1810
1811 // 1 byte for sequence number, 2 bytes for timestamp for the other
1812 // packets.
1813 ack_size += 3 * (ack.received_packet_times.size() - 1);
1814 }
1815 }
1816
1719 return ack_size; 1817 return ack_size;
1720 } 1818 }
1721 1819
1722 size_t QuicFramer::ComputeFrameLength( 1820 size_t QuicFramer::ComputeFrameLength(
1723 const QuicFrame& frame, 1821 const QuicFrame& frame,
1724 bool last_frame_in_packet, 1822 bool last_frame_in_packet,
1725 InFecGroup is_in_fec_group, 1823 InFecGroup is_in_fec_group,
1726 QuicSequenceNumberLength sequence_number_length) { 1824 QuicSequenceNumberLength sequence_number_length) {
1727 switch (frame.type) { 1825 switch (frame.type) {
1728 case STREAM_FRAME: 1826 case STREAM_FRAME:
1729 return GetMinStreamFrameSize(frame.stream_frame->stream_id, 1827 return GetMinStreamFrameSize(frame.stream_frame->stream_id,
1730 frame.stream_frame->offset, 1828 frame.stream_frame->offset,
1731 last_frame_in_packet, 1829 last_frame_in_packet,
1732 is_in_fec_group) + 1830 is_in_fec_group) +
1733 frame.stream_frame->data.TotalBufferSize(); 1831 frame.stream_frame->data.TotalBufferSize();
1734 case ACK_FRAME: { 1832 case ACK_FRAME: {
1735 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1833 return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
1736 } 1834 }
1737 case CONGESTION_FEEDBACK_FRAME: { 1835 case CONGESTION_FEEDBACK_FRAME: {
1738 size_t len = kQuicFrameTypeSize; 1836 size_t len = kQuicFrameTypeSize;
1739 const QuicCongestionFeedbackFrame& congestion_feedback = 1837 const QuicCongestionFeedbackFrame& congestion_feedback =
1740 *frame.congestion_feedback_frame; 1838 *frame.congestion_feedback_frame;
1741 len += 1; // Congestion feedback type. 1839 len += 1; // Congestion feedback type.
1742 1840
1743 switch (congestion_feedback.type) { 1841 switch (congestion_feedback.type) {
1744 case kTimestamp: {
1745 set_detailed_error("Timestamp feedback not supported.");
1746 break;
1747 }
1748 case kTCP: 1842 case kTCP:
1749 len += 2; // Receive window. 1843 len += 2; // Receive window.
1750 break; 1844 break;
1751 default: 1845 default:
1752 set_detailed_error("Illegal feedback type."); 1846 set_detailed_error("Illegal feedback type.");
1753 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1847 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1754 break; 1848 break;
1755 } 1849 }
1756 return len; 1850 return len;
1757 } 1851 }
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1970 if (!frame.delta_time_largest_observed.IsInfinite()) { 2064 if (!frame.delta_time_largest_observed.IsInfinite()) {
1971 DCHECK_LE(0u, frame.delta_time_largest_observed.ToMicroseconds()); 2065 DCHECK_LE(0u, frame.delta_time_largest_observed.ToMicroseconds());
1972 delta_time_largest_observed_us = 2066 delta_time_largest_observed_us =
1973 frame.delta_time_largest_observed.ToMicroseconds(); 2067 frame.delta_time_largest_observed.ToMicroseconds();
1974 } 2068 }
1975 2069
1976 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) { 2070 if (!writer->WriteUFloat16(delta_time_largest_observed_us)) {
1977 return false; 2071 return false;
1978 } 2072 }
1979 2073
2074 // Timestamp goes at the end of the required fields.
2075 if (version() > QUIC_VERSION_22 && !truncated) {
2076 if (!AppendTimestampToAckFrame(frame, writer)) {
2077 return false;
2078 }
2079 }
2080
1980 if (ack_info.nack_ranges.empty()) { 2081 if (ack_info.nack_ranges.empty()) {
1981 return true; 2082 return true;
1982 } 2083 }
1983 2084
1984 const uint8 num_missing_ranges = 2085 const uint8 num_missing_ranges =
1985 min(ack_info.nack_ranges.size(), max_num_ranges); 2086 min(ack_info.nack_ranges.size(), max_num_ranges);
1986 if (!writer->WriteBytes(&num_missing_ranges, 1)) { 2087 if (!writer->WriteBytes(&num_missing_ranges, 1)) {
1987 return false; 2088 return false;
1988 } 2089 }
1989 2090
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 } 2132 }
2032 2133
2033 bool QuicFramer::AppendCongestionFeedbackFrame( 2134 bool QuicFramer::AppendCongestionFeedbackFrame(
2034 const QuicCongestionFeedbackFrame& frame, 2135 const QuicCongestionFeedbackFrame& frame,
2035 QuicDataWriter* writer) { 2136 QuicDataWriter* writer) {
2036 if (!writer->WriteBytes(&frame.type, 1)) { 2137 if (!writer->WriteBytes(&frame.type, 1)) {
2037 return false; 2138 return false;
2038 } 2139 }
2039 2140
2040 switch (frame.type) { 2141 switch (frame.type) {
2041 case kTimestamp: {
2042 // Timestamp feedback not supported.
2043 return false;
2044 }
2045 case kTCP: { 2142 case kTCP: {
2046 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2143 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2047 DCHECK_LE(tcp.receive_window, 1u << 20); 2144 DCHECK_LE(tcp.receive_window, 1u << 20);
2048 // Simple bit packing, don't send the 4 least significant bits. 2145 // Simple bit packing, don't send the 4 least significant bits.
2049 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2146 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2050 if (!writer->WriteUInt16(receive_window)) { 2147 if (!writer->WriteUInt16(receive_window)) {
2051 return false; 2148 return false;
2052 } 2149 }
2053 break; 2150 break;
2054 } 2151 }
2055 default: 2152 default:
2056 return false; 2153 return false;
2057 } 2154 }
2058 2155
2059 return true; 2156 return true;
2060 } 2157 }
2061 2158
2159 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
2160 QuicDataWriter* writer) {
2161 DCHECK_GE(version(), QUIC_VERSION_23);
2162 DCHECK_GE(numeric_limits<uint8>::max(), frame.received_packet_times.size());
2163 // num_received_packets is only 1 byte.
2164 if (frame.received_packet_times.size() > numeric_limits<uint8>::max()) {
2165 return false;
2166 }
2167
2168 uint8 num_received_packets = frame.received_packet_times.size();
2169
2170 if (!writer->WriteBytes(&num_received_packets, 1)) {
2171 return false;
2172 }
2173 if (num_received_packets == 0) {
2174 return true;
2175 }
2176
2177 PacketTimeList::const_iterator it = frame.received_packet_times.begin();
2178 QuicPacketSequenceNumber sequence_number = it->first;
2179 QuicPacketSequenceNumber delta_from_largest_observed =
2180 frame.largest_observed - sequence_number;
2181
2182 DCHECK_GE(numeric_limits<uint8>::max(), delta_from_largest_observed);
2183 if (delta_from_largest_observed > numeric_limits<uint8>::max()) {
2184 return false;
2185 }
2186
2187 if (!writer->WriteUInt8(
2188 delta_from_largest_observed & k1ByteSequenceNumberMask)) {
2189 return false;
2190 }
2191
2192 // Use the lowest 4 bytes of the time delta from the creation_time_.
2193 const uint64 time_epoch_delta_us = GG_UINT64_C(1) << 32;
2194 uint32 time_delta_us =
2195 static_cast<uint32>(it->second.Subtract(creation_time_).ToMicroseconds()
2196 & (time_epoch_delta_us - 1));
2197 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2198 return false;
2199 }
2200
2201 QuicTime prev_time = it->second;
2202
2203 for (++it; it != frame.received_packet_times.end(); ++it) {
2204 sequence_number = it->first;
2205 delta_from_largest_observed = frame.largest_observed - sequence_number;
2206
2207 if (delta_from_largest_observed > numeric_limits<uint8>::max()) {
2208 return false;
2209 }
2210
2211 if (!writer->WriteUInt8(
2212 delta_from_largest_observed & k1ByteSequenceNumberMask)) {
2213 return false;
2214 }
2215
2216 uint64 time_delta_us = it->second.Subtract(prev_time).ToMicroseconds();
2217 prev_time = it->second;
2218 if (!writer->WriteUFloat16(time_delta_us)) {
2219 return false;
2220 }
2221 }
2222 return true;
2223 }
2224
2062 bool QuicFramer::AppendStopWaitingFrame( 2225 bool QuicFramer::AppendStopWaitingFrame(
2063 const QuicPacketHeader& header, 2226 const QuicPacketHeader& header,
2064 const QuicStopWaitingFrame& frame, 2227 const QuicStopWaitingFrame& frame,
2065 QuicDataWriter* writer) { 2228 QuicDataWriter* writer) {
2066 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); 2229 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2067 const QuicPacketSequenceNumber least_unacked_delta = 2230 const QuicPacketSequenceNumber least_unacked_delta =
2068 header.packet_sequence_number - frame.least_unacked; 2231 header.packet_sequence_number - frame.least_unacked;
2069 const QuicPacketSequenceNumber length_shift = 2232 const QuicPacketSequenceNumber length_shift =
2070 header.public_header.sequence_number_length * 8; 2233 header.public_header.sequence_number_length * 8;
2071 if (!writer->WriteUInt8(frame.entropy_hash)) { 2234 if (!writer->WriteUInt8(frame.entropy_hash)) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2164 2327
2165 bool QuicFramer::RaiseError(QuicErrorCode error) { 2328 bool QuicFramer::RaiseError(QuicErrorCode error) {
2166 DVLOG(1) << "Error detail: " << detailed_error_; 2329 DVLOG(1) << "Error detail: " << detailed_error_;
2167 set_error(error); 2330 set_error(error);
2168 visitor_->OnError(this); 2331 visitor_->OnError(this);
2169 reader_.reset(NULL); 2332 reader_.reset(NULL);
2170 return false; 2333 return false;
2171 } 2334 }
2172 2335
2173 } // namespace net 2336 } // 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