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

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

Issue 471293002: Landing Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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
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 957 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin()); 968 DCHECK_GE(frame.largest_observed, *frame.missing_packets.rbegin());
969 size_t cur_range_length = 0; 969 size_t cur_range_length = 0;
970 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin(); 970 SequenceNumberSet::const_iterator iter = frame.missing_packets.begin();
971 QuicPacketSequenceNumber last_missing = *iter; 971 QuicPacketSequenceNumber last_missing = *iter;
972 ++iter; 972 ++iter;
973 for (; iter != frame.missing_packets.end(); ++iter) { 973 for (; iter != frame.missing_packets.end(); ++iter) {
974 if (cur_range_length != numeric_limits<uint8>::max() && 974 if (cur_range_length != numeric_limits<uint8>::max() &&
975 *iter == (last_missing + 1)) { 975 *iter == (last_missing + 1)) {
976 ++cur_range_length; 976 ++cur_range_length;
977 } else { 977 } else {
978 ack_info.nack_ranges[last_missing - cur_range_length] 978 ack_info.nack_ranges[last_missing - cur_range_length] =
979 = cur_range_length; 979 cur_range_length;
980 cur_range_length = 0; 980 cur_range_length = 0;
981 } 981 }
982 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing); 982 ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing);
983 last_missing = *iter; 983 last_missing = *iter;
984 } 984 }
985 // Include the last nack range. 985 // Include the last nack range.
986 ack_info.nack_ranges[last_missing - cur_range_length] = 986 ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length;
987 cur_range_length;
988 // Include the range to the largest observed. 987 // Include the range to the largest observed.
989 ack_info.max_delta = max(ack_info.max_delta, 988 ack_info.max_delta = max(ack_info.max_delta,
990 frame.largest_observed - last_missing); 989 frame.largest_observed - last_missing);
991 } 990 }
992 return ack_info; 991 return ack_info;
993 } 992 }
994 993
995 bool QuicFramer::ProcessPacketHeader( 994 bool QuicFramer::ProcessPacketHeader(
996 QuicPacketHeader* header, 995 QuicPacketHeader* header,
997 const QuicEncryptedPacket& packet) { 996 const QuicEncryptedPacket& packet) {
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 uint8 feedback_type; 1411 uint8 feedback_type;
1413 if (!reader_->ReadBytes(&feedback_type, 1)) { 1412 if (!reader_->ReadBytes(&feedback_type, 1)) {
1414 set_detailed_error("Unable to read congestion feedback type."); 1413 set_detailed_error("Unable to read congestion feedback type.");
1415 return false; 1414 return false;
1416 } 1415 }
1417 frame->type = 1416 frame->type =
1418 static_cast<CongestionFeedbackType>(feedback_type); 1417 static_cast<CongestionFeedbackType>(feedback_type);
1419 1418
1420 switch (frame->type) { 1419 switch (frame->type) {
1421 case kTimestamp: { 1420 case kTimestamp: {
1422 CongestionFeedbackMessageTimestamp* timestamp = &frame->timestamp; 1421 set_detailed_error("Timestamp feedback not supported.");
1423 uint8 num_received_packets; 1422 return false;
1424 if (!reader_->ReadBytes(&num_received_packets, 1)) {
1425 set_detailed_error("Unable to read num received packets.");
1426 return false;
1427 }
1428
1429 if (num_received_packets > 0u) {
1430 uint64 smallest_received;
1431 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
1432 &smallest_received)) {
1433 set_detailed_error("Unable to read smallest received.");
1434 return false;
1435 }
1436
1437 uint64 time_received_us;
1438 if (!reader_->ReadUInt64(&time_received_us)) {
1439 set_detailed_error("Unable to read time received.");
1440 return false;
1441 }
1442 QuicTime time_received = creation_time_.Add(
1443 QuicTime::Delta::FromMicroseconds(time_received_us));
1444
1445 timestamp->received_packet_times.insert(
1446 make_pair(smallest_received, time_received));
1447
1448 for (uint8 i = 0; i < num_received_packets - 1; ++i) {
1449 uint16 sequence_delta;
1450 if (!reader_->ReadUInt16(&sequence_delta)) {
1451 set_detailed_error(
1452 "Unable to read sequence delta in received packets.");
1453 return false;
1454 }
1455
1456 int32 time_delta_us;
1457 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1458 set_detailed_error(
1459 "Unable to read time delta in received packets.");
1460 return false;
1461 }
1462 QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
1463 timestamp->received_packet_times.insert(
1464 make_pair(packet, time_received.Add(
1465 QuicTime::Delta::FromMicroseconds(time_delta_us))));
1466 }
1467 }
1468 break;
1469 } 1423 }
1470 case kTCP: { 1424 case kTCP: {
1471 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1425 CongestionFeedbackMessageTCP* tcp = &frame->tcp;
1472 uint16 receive_window = 0; 1426 uint16 receive_window = 0;
1473 if (!reader_->ReadUInt16(&receive_window)) { 1427 if (!reader_->ReadUInt16(&receive_window)) {
1474 set_detailed_error("Unable to read receive window."); 1428 set_detailed_error("Unable to read receive window.");
1475 return false; 1429 return false;
1476 } 1430 }
1477 // Simple bit packing, don't send the 4 least significant bits. 1431 // Simple bit packing, don't send the 4 least significant bits.
1478 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1432 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1781 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1735 return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
1782 } 1736 }
1783 case CONGESTION_FEEDBACK_FRAME: { 1737 case CONGESTION_FEEDBACK_FRAME: {
1784 size_t len = kQuicFrameTypeSize; 1738 size_t len = kQuicFrameTypeSize;
1785 const QuicCongestionFeedbackFrame& congestion_feedback = 1739 const QuicCongestionFeedbackFrame& congestion_feedback =
1786 *frame.congestion_feedback_frame; 1740 *frame.congestion_feedback_frame;
1787 len += 1; // Congestion feedback type. 1741 len += 1; // Congestion feedback type.
1788 1742
1789 switch (congestion_feedback.type) { 1743 switch (congestion_feedback.type) {
1790 case kTimestamp: { 1744 case kTimestamp: {
1791 const CongestionFeedbackMessageTimestamp& timestamp = 1745 set_detailed_error("Timestamp feedback not supported.");
1792 congestion_feedback.timestamp;
1793 len += 1; // Number received packets.
1794 if (!timestamp.received_packet_times.empty()) {
1795 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
1796 len += 8; // Time.
1797 // 2 bytes per sequence number delta plus 4 bytes per delta time.
1798 len += PACKET_6BYTE_SEQUENCE_NUMBER *
1799 (timestamp.received_packet_times.size() - 1);
1800 }
1801 break; 1746 break;
1802 } 1747 }
1803 case kTCP: 1748 case kTCP:
1804 len += 2; // Receive window. 1749 len += 2; // Receive window.
1805 break; 1750 break;
1806 default: 1751 default:
1807 set_detailed_error("Illegal feedback type."); 1752 set_detailed_error("Illegal feedback type.");
1808 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1753 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1809 break; 1754 break;
1810 } 1755 }
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 2032
2088 bool QuicFramer::AppendCongestionFeedbackFrame( 2033 bool QuicFramer::AppendCongestionFeedbackFrame(
2089 const QuicCongestionFeedbackFrame& frame, 2034 const QuicCongestionFeedbackFrame& frame,
2090 QuicDataWriter* writer) { 2035 QuicDataWriter* writer) {
2091 if (!writer->WriteBytes(&frame.type, 1)) { 2036 if (!writer->WriteBytes(&frame.type, 1)) {
2092 return false; 2037 return false;
2093 } 2038 }
2094 2039
2095 switch (frame.type) { 2040 switch (frame.type) {
2096 case kTimestamp: { 2041 case kTimestamp: {
2097 return AppendTimestampFrame(frame, writer); 2042 // Timestamp feedback not supported.
2043 return false;
2098 } 2044 }
2099 case kTCP: { 2045 case kTCP: {
2100 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2046 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2101 DCHECK_LE(tcp.receive_window, 1u << 20); 2047 DCHECK_LE(tcp.receive_window, 1u << 20);
2102 // Simple bit packing, don't send the 4 least significant bits. 2048 // Simple bit packing, don't send the 4 least significant bits.
2103 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2049 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2104 if (!writer->WriteUInt16(receive_window)) { 2050 if (!writer->WriteUInt16(receive_window)) {
2105 return false; 2051 return false;
2106 } 2052 }
2107 break; 2053 break;
2108 } 2054 }
2109 default: 2055 default:
2110 return false; 2056 return false;
2111 } 2057 }
2112 2058
2113 return true; 2059 return true;
2114 } 2060 }
2115 2061
2116 bool QuicFramer::AppendTimestampFrame(
2117 const QuicCongestionFeedbackFrame& frame,
2118 QuicDataWriter* writer) {
2119 const CongestionFeedbackMessageTimestamp& timestamp = frame.timestamp;
2120 DCHECK_GE(numeric_limits<uint8>::max(),
2121 timestamp.received_packet_times.size());
2122 if (timestamp.received_packet_times.size() > numeric_limits<uint8>::max()) {
2123 return false;
2124 }
2125 uint8 num_received_packets = timestamp.received_packet_times.size();
2126 if (!writer->WriteBytes(&num_received_packets, 1)) {
2127 return false;
2128 }
2129 if (num_received_packets > 0) {
2130 TimeMap::const_iterator it = timestamp.received_packet_times.begin();
2131
2132 QuicPacketSequenceNumber lowest_sequence = it->first;
2133 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
2134 lowest_sequence, writer)) {
2135 return false;
2136 }
2137
2138 QuicTime lowest_time = it->second;
2139 if (!writer->WriteUInt64(
2140 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
2141 return false;
2142 }
2143
2144 for (++it; it != timestamp.received_packet_times.end(); ++it) {
2145 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
2146 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
2147 if (sequence_delta > numeric_limits<uint16>::max()) {
2148 return false;
2149 }
2150 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
2151 return false;
2152 }
2153
2154 int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds();
2155 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2156 return false;
2157 }
2158 }
2159 }
2160 return true;
2161 }
2162
2163 bool QuicFramer::AppendStopWaitingFrame( 2062 bool QuicFramer::AppendStopWaitingFrame(
2164 const QuicPacketHeader& header, 2063 const QuicPacketHeader& header,
2165 const QuicStopWaitingFrame& frame, 2064 const QuicStopWaitingFrame& frame,
2166 QuicDataWriter* writer) { 2065 QuicDataWriter* writer) {
2167 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); 2066 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2168 const QuicPacketSequenceNumber least_unacked_delta = 2067 const QuicPacketSequenceNumber least_unacked_delta =
2169 header.packet_sequence_number - frame.least_unacked; 2068 header.packet_sequence_number - frame.least_unacked;
2170 const QuicPacketSequenceNumber length_shift = 2069 const QuicPacketSequenceNumber length_shift =
2171 header.public_header.sequence_number_length * 8; 2070 header.public_header.sequence_number_length * 8;
2172 if (!writer->WriteUInt8(frame.entropy_hash)) { 2071 if (!writer->WriteUInt8(frame.entropy_hash)) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2265 2164
2266 bool QuicFramer::RaiseError(QuicErrorCode error) { 2165 bool QuicFramer::RaiseError(QuicErrorCode error) {
2267 DVLOG(1) << "Error detail: " << detailed_error_; 2166 DVLOG(1) << "Error detail: " << detailed_error_;
2268 set_error(error); 2167 set_error(error);
2269 visitor_->OnError(this); 2168 visitor_->OnError(this);
2270 reader_.reset(NULL); 2169 reader_.reset(NULL);
2271 return false; 2170 return false;
2272 } 2171 }
2273 2172
2274 } // namespace net 2173 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.h ('k') | net/quic/quic_framer_test.cc » ('j') | net/quic/quic_protocol.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698