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