| 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 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |