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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |