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

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

Issue 1421853006: Landing Recent QUIC changes until: Fri Oct 30 22:23:58 2015 +0000 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix comments Created 5 years, 1 month 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 <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 } 297 }
298 bool can_truncate = 298 bool can_truncate =
299 frame.type == ACK_FRAME && 299 frame.type == ACK_FRAME &&
300 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_PACKET_NUMBER); 300 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_PACKET_NUMBER);
301 if (can_truncate) { 301 if (can_truncate) {
302 // Truncate the frame so the packet will not exceed kMaxPacketSize. 302 // Truncate the frame so the packet will not exceed kMaxPacketSize.
303 // Note that we may not use every byte of the writer in this case. 303 // Note that we may not use every byte of the writer in this case.
304 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; 304 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes;
305 return free_bytes; 305 return free_bytes;
306 } 306 }
307 if (!FLAGS_quic_allow_oversized_packets_for_test) { 307 return 0;
308 return 0;
309 }
310 LOG(DFATAL) << "Packet size too small to fit frame.";
311 return frame_len;
312 } 308 }
313 309
314 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {} 310 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {}
315 311
316 QuicFramer::AckFrameInfo::~AckFrameInfo() {} 312 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
317 313
318 // static 314 // static
319 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( 315 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
320 const QuicPacketHeader& header) { 316 const QuicPacketHeader& header) {
321 return header.entropy_flag << (header.packet_number % 8); 317 return header.entropy_flag << (header.packet_number % 8);
(...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 } 1352 }
1357 ack_frame->missing_packets.Add(last_packet_number - range_length, 1353 ack_frame->missing_packets.Add(last_packet_number - range_length,
1358 last_packet_number + 1); 1354 last_packet_number + 1);
1359 // Subtract an extra 1 to ensure ranges are represented efficiently and 1355 // Subtract an extra 1 to ensure ranges are represented efficiently and
1360 // can't overlap by 1 packet number. This allows a missing_delta of 0 1356 // can't overlap by 1 packet number. This allows a missing_delta of 0
1361 // to represent an adjacent nack range. 1357 // to represent an adjacent nack range.
1362 last_packet_number -= (range_length + 1); 1358 last_packet_number -= (range_length + 1);
1363 } 1359 }
1364 1360
1365 // Parse the revived packets list. 1361 // Parse the revived packets list.
1362 // TODO(ianswett): Change the ack frame so it only expresses one revived.
1366 uint8 num_revived_packets; 1363 uint8 num_revived_packets;
1367 if (!reader->ReadBytes(&num_revived_packets, 1)) { 1364 if (!reader->ReadBytes(&num_revived_packets, 1)) {
1368 set_detailed_error("Unable to read num revived packets."); 1365 set_detailed_error("Unable to read num revived packets.");
1369 return false; 1366 return false;
1370 } 1367 }
1371 1368
1372 for (size_t i = 0; i < num_revived_packets; ++i) { 1369 for (size_t i = 0; i < num_revived_packets; ++i) {
1373 QuicPacketNumber revived_packet = 0; 1370 QuicPacketNumber revived_packet = 0;
1374 if (!reader->ReadBytes(&revived_packet, 1371 if (!reader->ReadBytes(&revived_packet,
1375 largest_observed_packet_number_length)) { 1372 largest_observed_packet_number_length)) {
1376 set_detailed_error("Unable to read revived packet."); 1373 set_detailed_error("Unable to read revived packet.");
1377 return false; 1374 return false;
1378 } 1375 }
1379 1376 ack_frame->latest_revived_packet = revived_packet;
1380 ack_frame->revived_packets.insert(revived_packet);
1381 } 1377 }
1382 1378
1383 return true; 1379 return true;
1384 } 1380 }
1385 1381
1386 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader, 1382 bool QuicFramer::ProcessTimestampsInAckFrame(QuicDataReader* reader,
1387 QuicAckFrame* ack_frame) { 1383 QuicAckFrame* ack_frame) {
1388 if (ack_frame->is_truncated) { 1384 if (ack_frame->is_truncated) {
1389 return true; 1385 return true;
1390 } 1386 }
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 return alternative_decrypter_.get(); 1603 return alternative_decrypter_.get();
1608 } 1604 }
1609 1605
1610 void QuicFramer::SetEncrypter(EncryptionLevel level, 1606 void QuicFramer::SetEncrypter(EncryptionLevel level,
1611 QuicEncrypter* encrypter) { 1607 QuicEncrypter* encrypter) {
1612 DCHECK_GE(level, 0); 1608 DCHECK_GE(level, 0);
1613 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS); 1609 DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1614 encrypter_[level].reset(encrypter); 1610 encrypter_[level].reset(encrypter);
1615 } 1611 }
1616 1612
1617 QuicEncryptedPacket* QuicFramer::EncryptPayload(EncryptionLevel level, 1613 size_t QuicFramer::EncryptPayload(EncryptionLevel level,
1618 QuicPacketNumber packet_number, 1614 QuicPacketNumber packet_number,
1619 const QuicPacket& packet, 1615 const QuicPacket& packet,
1620 char* buffer, 1616 char* buffer,
1621 size_t buffer_len) { 1617 size_t buffer_len) {
1622 DCHECK(encrypter_[level].get() != nullptr); 1618 DCHECK(encrypter_[level].get() != nullptr);
1623 1619
1624 const size_t encrypted_len =
1625 encrypter_[level]->GetCiphertextSize(packet.Plaintext().length());
1626 StringPiece header_data = packet.BeforePlaintext(); 1620 StringPiece header_data = packet.BeforePlaintext();
1627 const size_t total_len = header_data.length() + encrypted_len;
1628
1629 char* encryption_buffer = buffer;
1630 // Allocate a large enough buffer for the header and the encrypted data.
1631 const bool is_new_buffer = total_len > buffer_len;
1632 if (is_new_buffer) {
1633 if (!FLAGS_quic_allow_oversized_packets_for_test) {
1634 LOG(DFATAL) << "Buffer of length:" << buffer_len
1635 << " is not large enough to encrypt length " << total_len;
1636 return nullptr;
1637 }
1638 encryption_buffer = new char[total_len];
1639 }
1640 // Copy in the header, because the encrypter only populates the encrypted 1621 // Copy in the header, because the encrypter only populates the encrypted
1641 // plaintext content. 1622 // plaintext content.
1642 memcpy(encryption_buffer, header_data.data(), header_data.length()); 1623 const size_t header_len = header_data.length();
1624 memcpy(buffer, header_data.data(), header_len);
1643 // Encrypt the plaintext into the buffer. 1625 // Encrypt the plaintext into the buffer.
1644 size_t output_length = 0; 1626 size_t output_length = 0;
1645 if (!encrypter_[level]->EncryptPacket( 1627 if (!encrypter_[level]->EncryptPacket(
1646 packet_number, packet.AssociatedData(), packet.Plaintext(), 1628 packet_number, packet.AssociatedData(), packet.Plaintext(),
1647 encryption_buffer + header_data.length(), &output_length, 1629 buffer + header_len, &output_length, buffer_len - header_len)) {
1648 encrypted_len)) {
1649 RaiseError(QUIC_ENCRYPTION_FAILURE); 1630 RaiseError(QUIC_ENCRYPTION_FAILURE);
1650 return nullptr; 1631 return 0;
1651 } 1632 }
1652 1633
1653 return new QuicEncryptedPacket( 1634 return header_len + output_length;
1654 encryption_buffer, header_data.length() + output_length, is_new_buffer);
1655 } 1635 }
1656 1636
1657 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) { 1637 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
1658 // In order to keep the code simple, we don't have the current encryption 1638 // In order to keep the code simple, we don't have the current encryption
1659 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12. 1639 // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
1660 size_t min_plaintext_size = ciphertext_size; 1640 size_t min_plaintext_size = ciphertext_size;
1661 1641
1662 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) { 1642 for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) {
1663 if (encrypter_[i].get() != nullptr) { 1643 if (encrypter_[i].get() != nullptr) {
1664 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size); 1644 size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1726 QuicPacketNumberLength largest_observed_length = 1706 QuicPacketNumberLength largest_observed_length =
1727 GetMinSequenceNumberLength(ack.largest_observed); 1707 GetMinSequenceNumberLength(ack.largest_observed);
1728 QuicPacketNumberLength missing_packet_number_length = 1708 QuicPacketNumberLength missing_packet_number_length =
1729 GetMinSequenceNumberLength(ack_info.max_delta); 1709 GetMinSequenceNumberLength(ack_info.max_delta);
1730 1710
1731 size_t ack_size = GetMinAckFrameSize(largest_observed_length); 1711 size_t ack_size = GetMinAckFrameSize(largest_observed_length);
1732 if (!ack_info.nack_ranges.empty()) { 1712 if (!ack_info.nack_ranges.empty()) {
1733 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; 1713 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize;
1734 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * 1714 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
1735 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER); 1715 (missing_packet_number_length + PACKET_1BYTE_PACKET_NUMBER);
1736 ack_size += min(ack.revived_packets.size(), 1716 if (ack.latest_revived_packet != 0) {
1737 kMaxRevivedPackets) * largest_observed_length; 1717 ack_size += largest_observed_length;
1718 }
1738 } 1719 }
1739 1720
1740 // In version 23, if the ack will be truncated due to too many nack ranges, 1721 // In version 23, if the ack will be truncated due to too many nack ranges,
1741 // then do not include the number of timestamps (1 byte). 1722 // then do not include the number of timestamps (1 byte).
1742 if (ack_info.nack_ranges.size() <= kMaxNackRanges) { 1723 if (ack_info.nack_ranges.size() <= kMaxNackRanges) {
1743 // 1 byte for the number of timestamps. 1724 // 1 byte for the number of timestamps.
1744 ack_size += 1; 1725 ack_size += 1;
1745 if (ack.received_packet_times.size() > 0) { 1726 if (ack.received_packet_times.size() > 0) {
1746 // 1 byte for packet number, 4 bytes for timestamp for the first 1727 // 1 byte for packet number, 4 bytes for timestamp for the first
1747 // packet. 1728 // packet.
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 return false; 2000 return false;
2020 } 2001 }
2021 // Subtract 1 so a missing_delta of 0 means an adjacent range. 2002 // Subtract 1 so a missing_delta of 0 means an adjacent range.
2022 last_sequence_written = ack_iter->first - 1; 2003 last_sequence_written = ack_iter->first - 1;
2023 ++num_ranges_written; 2004 ++num_ranges_written;
2024 } 2005 }
2025 DCHECK_EQ(num_missing_ranges, num_ranges_written); 2006 DCHECK_EQ(num_missing_ranges, num_ranges_written);
2026 2007
2027 // Append revived packets. 2008 // Append revived packets.
2028 // If not all the revived packets fit, only mention the ones that do. 2009 // If not all the revived packets fit, only mention the ones that do.
2029 uint8 num_revived_packets = 2010 uint8 num_revived_packets = frame.latest_revived_packet == 0 ? 0 : 1;
2030 static_cast<uint8>(min(frame.revived_packets.size(), kMaxRevivedPackets)); 2011 if (((writer->capacity() - writer->length()) / largest_observed_length) ==
2031 num_revived_packets = static_cast<uint8>(min( 2012 0) {
2032 static_cast<size_t>(num_revived_packets), 2013 num_revived_packets = 0;
2033 (writer->capacity() - writer->length()) / largest_observed_length)); 2014 }
2034 if (!writer->WriteBytes(&num_revived_packets, 1)) { 2015 if (!writer->WriteBytes(&num_revived_packets, 1)) {
2035 return false; 2016 return false;
2036 } 2017 }
2037 2018
2038 PacketNumberSet::const_iterator iter = frame.revived_packets.begin(); 2019 if (num_revived_packets > 0) {
2039 for (int i = 0; i < num_revived_packets; ++i, ++iter) { 2020 LOG_IF(DFATAL,
2040 LOG_IF(DFATAL, !frame.missing_packets.Contains(*iter)); 2021 !frame.missing_packets.Contains(frame.latest_revived_packet));
2041 if (!AppendPacketSequenceNumber(largest_observed_length, 2022 if (!AppendPacketSequenceNumber(largest_observed_length,
2042 *iter, writer)) { 2023 frame.latest_revived_packet, writer)) {
2043 return false; 2024 return false;
2044 } 2025 }
2045 } 2026 }
2046 2027
2047 return true; 2028 return true;
2048 } 2029 }
2049 2030
2050 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame, 2031 bool QuicFramer::AppendTimestampToAckFrame(const QuicAckFrame& frame,
2051 QuicDataWriter* writer) { 2032 QuicDataWriter* writer) {
2052 DCHECK_GE(numeric_limits<uint8>::max(), frame.received_packet_times.size()); 2033 DCHECK_GE(numeric_limits<uint8>::max(), frame.received_packet_times.size());
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2212 2193
2213 bool QuicFramer::RaiseError(QuicErrorCode error) { 2194 bool QuicFramer::RaiseError(QuicErrorCode error) {
2214 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) 2195 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error)
2215 << " detail: " << detailed_error_; 2196 << " detail: " << detailed_error_;
2216 set_error(error); 2197 set_error(error);
2217 visitor_->OnError(this); 2198 visitor_->OnError(this);
2218 return false; 2199 return false;
2219 } 2200 }
2220 2201
2221 } // namespace net 2202 } // 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