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 |