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

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

Issue 447093004: Land Recent QUIC Changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed indenation in QuicFramer.cc 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
« 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 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
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] = cur_range_length; 986 ack_info.nack_ranges[last_missing - cur_range_length] =
987 cur_range_length;
987 // Include the range to the largest observed. 988 // Include the range to the largest observed.
988 ack_info.max_delta = max(ack_info.max_delta, 989 ack_info.max_delta = max(ack_info.max_delta,
989 frame.largest_observed - last_missing); 990 frame.largest_observed - last_missing);
990 } 991 }
991 return ack_info; 992 return ack_info;
992 } 993 }
993 994
994 bool QuicFramer::ProcessPacketHeader( 995 bool QuicFramer::ProcessPacketHeader(
995 QuicPacketHeader* header, 996 QuicPacketHeader* header,
996 const QuicEncryptedPacket& packet) { 997 const QuicEncryptedPacket& packet) {
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 QuicCongestionFeedbackFrame* frame) { 1411 QuicCongestionFeedbackFrame* frame) {
1411 uint8 feedback_type; 1412 uint8 feedback_type;
1412 if (!reader_->ReadBytes(&feedback_type, 1)) { 1413 if (!reader_->ReadBytes(&feedback_type, 1)) {
1413 set_detailed_error("Unable to read congestion feedback type."); 1414 set_detailed_error("Unable to read congestion feedback type.");
1414 return false; 1415 return false;
1415 } 1416 }
1416 frame->type = 1417 frame->type =
1417 static_cast<CongestionFeedbackType>(feedback_type); 1418 static_cast<CongestionFeedbackType>(feedback_type);
1418 1419
1419 switch (frame->type) { 1420 switch (frame->type) {
1420 case kInterArrival: { 1421 case kTimestamp: {
1421 CongestionFeedbackMessageInterArrival* inter_arrival = 1422 CongestionFeedbackMessageTimestamp* timestamp = &frame->timestamp;
1422 &frame->inter_arrival;
1423 uint8 num_received_packets; 1423 uint8 num_received_packets;
1424 if (!reader_->ReadBytes(&num_received_packets, 1)) { 1424 if (!reader_->ReadBytes(&num_received_packets, 1)) {
1425 set_detailed_error("Unable to read num received packets."); 1425 set_detailed_error("Unable to read num received packets.");
1426 return false; 1426 return false;
1427 } 1427 }
1428 1428
1429 if (num_received_packets > 0u) { 1429 if (num_received_packets > 0u) {
1430 uint64 smallest_received; 1430 uint64 smallest_received;
1431 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER, 1431 if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
1432 &smallest_received)) { 1432 &smallest_received)) {
1433 set_detailed_error("Unable to read smallest received."); 1433 set_detailed_error("Unable to read smallest received.");
1434 return false; 1434 return false;
1435 } 1435 }
1436 1436
1437 uint64 time_received_us; 1437 uint64 time_received_us;
1438 if (!reader_->ReadUInt64(&time_received_us)) { 1438 if (!reader_->ReadUInt64(&time_received_us)) {
1439 set_detailed_error("Unable to read time received."); 1439 set_detailed_error("Unable to read time received.");
1440 return false; 1440 return false;
1441 } 1441 }
1442 QuicTime time_received = creation_time_.Add( 1442 QuicTime time_received = creation_time_.Add(
1443 QuicTime::Delta::FromMicroseconds(time_received_us)); 1443 QuicTime::Delta::FromMicroseconds(time_received_us));
1444 1444
1445 inter_arrival->received_packet_times.insert( 1445 timestamp->received_packet_times.insert(
1446 make_pair(smallest_received, time_received)); 1446 make_pair(smallest_received, time_received));
1447 1447
1448 for (uint8 i = 0; i < num_received_packets - 1; ++i) { 1448 for (uint8 i = 0; i < num_received_packets - 1; ++i) {
1449 uint16 sequence_delta; 1449 uint16 sequence_delta;
1450 if (!reader_->ReadUInt16(&sequence_delta)) { 1450 if (!reader_->ReadUInt16(&sequence_delta)) {
1451 set_detailed_error( 1451 set_detailed_error(
1452 "Unable to read sequence delta in received packets."); 1452 "Unable to read sequence delta in received packets.");
1453 return false; 1453 return false;
1454 } 1454 }
1455 1455
1456 int32 time_delta_us; 1456 int32 time_delta_us;
1457 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { 1457 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
1458 set_detailed_error( 1458 set_detailed_error(
1459 "Unable to read time delta in received packets."); 1459 "Unable to read time delta in received packets.");
1460 return false; 1460 return false;
1461 } 1461 }
1462 QuicPacketSequenceNumber packet = smallest_received + sequence_delta; 1462 QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
1463 inter_arrival->received_packet_times.insert( 1463 timestamp->received_packet_times.insert(
1464 make_pair(packet, time_received.Add( 1464 make_pair(packet, time_received.Add(
1465 QuicTime::Delta::FromMicroseconds(time_delta_us)))); 1465 QuicTime::Delta::FromMicroseconds(time_delta_us))));
1466 } 1466 }
1467 } 1467 }
1468 break; 1468 break;
1469 } 1469 }
1470 case kTCP: { 1470 case kTCP: {
1471 CongestionFeedbackMessageTCP* tcp = &frame->tcp; 1471 CongestionFeedbackMessageTCP* tcp = &frame->tcp;
1472 // TODO(ianswett): Remove receive window, since it's constant.
1473 uint16 receive_window = 0; 1472 uint16 receive_window = 0;
1474 if (!reader_->ReadUInt16(&receive_window)) { 1473 if (!reader_->ReadUInt16(&receive_window)) {
1475 set_detailed_error("Unable to read receive window."); 1474 set_detailed_error("Unable to read receive window.");
1476 return false; 1475 return false;
1477 } 1476 }
1478 // Simple bit packing, don't send the 4 least significant bits. 1477 // Simple bit packing, don't send the 4 least significant bits.
1479 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4; 1478 tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
1480 break; 1479 break;
1481 } 1480 }
1482 default: 1481 default:
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1781 case ACK_FRAME: { 1780 case ACK_FRAME: {
1782 return GetAckFrameSize(*frame.ack_frame, sequence_number_length); 1781 return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
1783 } 1782 }
1784 case CONGESTION_FEEDBACK_FRAME: { 1783 case CONGESTION_FEEDBACK_FRAME: {
1785 size_t len = kQuicFrameTypeSize; 1784 size_t len = kQuicFrameTypeSize;
1786 const QuicCongestionFeedbackFrame& congestion_feedback = 1785 const QuicCongestionFeedbackFrame& congestion_feedback =
1787 *frame.congestion_feedback_frame; 1786 *frame.congestion_feedback_frame;
1788 len += 1; // Congestion feedback type. 1787 len += 1; // Congestion feedback type.
1789 1788
1790 switch (congestion_feedback.type) { 1789 switch (congestion_feedback.type) {
1791 case kInterArrival: { 1790 case kTimestamp: {
1792 const CongestionFeedbackMessageInterArrival& inter_arrival = 1791 const CongestionFeedbackMessageTimestamp& timestamp =
1793 congestion_feedback.inter_arrival; 1792 congestion_feedback.timestamp;
1794 len += 1; // Number received packets. 1793 len += 1; // Number received packets.
1795 if (inter_arrival.received_packet_times.size() > 0) { 1794 if (!timestamp.received_packet_times.empty()) {
1796 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received. 1795 len += PACKET_6BYTE_SEQUENCE_NUMBER; // Smallest received.
1797 len += 8; // Time. 1796 len += 8; // Time.
1798 // 2 bytes per sequence number delta plus 4 bytes per delta time. 1797 // 2 bytes per sequence number delta plus 4 bytes per delta time.
1799 len += PACKET_6BYTE_SEQUENCE_NUMBER * 1798 len += PACKET_6BYTE_SEQUENCE_NUMBER *
1800 (inter_arrival.received_packet_times.size() - 1); 1799 (timestamp.received_packet_times.size() - 1);
1801 } 1800 }
1802 break; 1801 break;
1803 } 1802 }
1804 case kTCP: 1803 case kTCP:
1805 len += 2; // Receive window. 1804 len += 2; // Receive window.
1806 break; 1805 break;
1807 default: 1806 default:
1808 set_detailed_error("Illegal feedback type."); 1807 set_detailed_error("Illegal feedback type.");
1809 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type; 1808 DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
1810 break; 1809 break;
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
2087 } 2086 }
2088 2087
2089 bool QuicFramer::AppendCongestionFeedbackFrame( 2088 bool QuicFramer::AppendCongestionFeedbackFrame(
2090 const QuicCongestionFeedbackFrame& frame, 2089 const QuicCongestionFeedbackFrame& frame,
2091 QuicDataWriter* writer) { 2090 QuicDataWriter* writer) {
2092 if (!writer->WriteBytes(&frame.type, 1)) { 2091 if (!writer->WriteBytes(&frame.type, 1)) {
2093 return false; 2092 return false;
2094 } 2093 }
2095 2094
2096 switch (frame.type) { 2095 switch (frame.type) {
2097 case kInterArrival: { 2096 case kTimestamp: {
2098 const CongestionFeedbackMessageInterArrival& inter_arrival = 2097 return AppendTimestampFrame(frame, writer);
2099 frame.inter_arrival;
2100 DCHECK_GE(numeric_limits<uint8>::max(),
2101 inter_arrival.received_packet_times.size());
2102 if (inter_arrival.received_packet_times.size() >
2103 numeric_limits<uint8>::max()) {
2104 return false;
2105 }
2106 // TODO(ianswett): Make num_received_packets a varint.
2107 uint8 num_received_packets =
2108 inter_arrival.received_packet_times.size();
2109 if (!writer->WriteBytes(&num_received_packets, 1)) {
2110 return false;
2111 }
2112 if (num_received_packets > 0) {
2113 TimeMap::const_iterator it =
2114 inter_arrival.received_packet_times.begin();
2115
2116 QuicPacketSequenceNumber lowest_sequence = it->first;
2117 if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
2118 lowest_sequence, writer)) {
2119 return false;
2120 }
2121
2122 QuicTime lowest_time = it->second;
2123 if (!writer->WriteUInt64(
2124 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
2125 return false;
2126 }
2127
2128 for (++it; it != inter_arrival.received_packet_times.end(); ++it) {
2129 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
2130 DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
2131 if (sequence_delta > numeric_limits<uint16>::max()) {
2132 return false;
2133 }
2134 if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
2135 return false;
2136 }
2137
2138 int32 time_delta_us =
2139 it->second.Subtract(lowest_time).ToMicroseconds();
2140 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
2141 return false;
2142 }
2143 }
2144 }
2145 break;
2146 } 2098 }
2147 case kTCP: { 2099 case kTCP: {
2148 const CongestionFeedbackMessageTCP& tcp = frame.tcp; 2100 const CongestionFeedbackMessageTCP& tcp = frame.tcp;
2149 DCHECK_LE(tcp.receive_window, 1u << 20); 2101 DCHECK_LE(tcp.receive_window, 1u << 20);
2150 // Simple bit packing, don't send the 4 least significant bits. 2102 // Simple bit packing, don't send the 4 least significant bits.
2151 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4); 2103 uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
2152 if (!writer->WriteUInt16(receive_window)) { 2104 if (!writer->WriteUInt16(receive_window)) {
2153 return false; 2105 return false;
2154 } 2106 }
2155 break; 2107 break;
2156 } 2108 }
2157 default: 2109 default:
2158 return false; 2110 return false;
2159 } 2111 }
2160 2112
2161 return true; 2113 return true;
2162 } 2114 }
2163 2115
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
2164 bool QuicFramer::AppendStopWaitingFrame( 2163 bool QuicFramer::AppendStopWaitingFrame(
2165 const QuicPacketHeader& header, 2164 const QuicPacketHeader& header,
2166 const QuicStopWaitingFrame& frame, 2165 const QuicStopWaitingFrame& frame,
2167 QuicDataWriter* writer) { 2166 QuicDataWriter* writer) {
2168 DCHECK_GE(header.packet_sequence_number, frame.least_unacked); 2167 DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
2169 const QuicPacketSequenceNumber least_unacked_delta = 2168 const QuicPacketSequenceNumber least_unacked_delta =
2170 header.packet_sequence_number - frame.least_unacked; 2169 header.packet_sequence_number - frame.least_unacked;
2171 const QuicPacketSequenceNumber length_shift = 2170 const QuicPacketSequenceNumber length_shift =
2172 header.public_header.sequence_number_length * 8; 2171 header.public_header.sequence_number_length * 8;
2173 if (!writer->WriteUInt8(frame.entropy_hash)) { 2172 if (!writer->WriteUInt8(frame.entropy_hash)) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2266 2265
2267 bool QuicFramer::RaiseError(QuicErrorCode error) { 2266 bool QuicFramer::RaiseError(QuicErrorCode error) {
2268 DVLOG(1) << "Error detail: " << detailed_error_; 2267 DVLOG(1) << "Error detail: " << detailed_error_;
2269 set_error(error); 2268 set_error(error);
2270 visitor_->OnError(this); 2269 visitor_->OnError(this);
2271 reader_.reset(NULL); 2270 reader_.reset(NULL);
2272 return false; 2271 return false;
2273 } 2272 }
2274 2273
2275 } // namespace net 2274 } // 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