| 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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 191 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
| 192 GetStreamOffsetSize(offset) + | 192 GetStreamOffsetSize(offset) + |
| 193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | 193 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); |
| 194 } | 194 } |
| 195 | 195 |
| 196 // static | 196 // static |
| 197 size_t QuicFramer::GetMinAckFrameSize( | 197 size_t QuicFramer::GetMinAckFrameSize( |
| 198 QuicVersion version, | 198 QuicVersion version, |
| 199 QuicSequenceNumberLength sequence_number_length, | 199 QuicSequenceNumberLength sequence_number_length, |
| 200 QuicSequenceNumberLength largest_observed_length) { | 200 QuicSequenceNumberLength largest_observed_length) { |
| 201 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 201 size_t len = kQuicFrameTypeSize + kQuicEntropyHashSize + |
| 202 sequence_number_length + kQuicEntropyHashSize + | |
| 203 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 202 largest_observed_length + kQuicDeltaTimeLargestObservedSize; |
| 203 if (version <= QUIC_VERSION_15) { |
| 204 len += sequence_number_length + kQuicEntropyHashSize; |
| 205 } |
| 206 return len; |
| 204 } | 207 } |
| 205 | 208 |
| 206 // static | 209 // static |
| 207 size_t QuicFramer::GetStopWaitingFrameSize( | 210 size_t QuicFramer::GetStopWaitingFrameSize( |
| 208 QuicSequenceNumberLength sequence_number_length) { | 211 QuicSequenceNumberLength sequence_number_length) { |
| 209 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 212 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
| 210 sequence_number_length; | 213 sequence_number_length; |
| 211 } | 214 } |
| 212 | 215 |
| 213 // static | 216 // static |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 bool last_frame, | 294 bool last_frame, |
| 292 InFecGroup is_in_fec_group, | 295 InFecGroup is_in_fec_group, |
| 293 QuicSequenceNumberLength sequence_number_length) { | 296 QuicSequenceNumberLength sequence_number_length) { |
| 294 if (frame.type == PADDING_FRAME) { | 297 if (frame.type == PADDING_FRAME) { |
| 295 // PADDING implies end of packet. | 298 // PADDING implies end of packet. |
| 296 return free_bytes; | 299 return free_bytes; |
| 297 } | 300 } |
| 298 size_t frame_len = | 301 size_t frame_len = |
| 299 ComputeFrameLength(frame, last_frame, is_in_fec_group, | 302 ComputeFrameLength(frame, last_frame, is_in_fec_group, |
| 300 sequence_number_length); | 303 sequence_number_length); |
| 301 if (frame_len > free_bytes) { | 304 if (frame_len <= free_bytes) { |
| 302 // Only truncate the first frame in a packet, so if subsequent ones go | 305 // Frame fits within packet. Note that acks may be truncated. |
| 303 // over, stop including more frames. | 306 return frame_len; |
| 304 if (!first_frame) { | |
| 305 return 0; | |
| 306 } | |
| 307 if (CanTruncate(quic_version_, frame, free_bytes)) { | |
| 308 // Truncate the frame so the packet will not exceed kMaxPacketSize. | |
| 309 // Note that we may not use every byte of the writer in this case. | |
| 310 DVLOG(1) << "Truncating large frame"; | |
| 311 return free_bytes; | |
| 312 } else if (!FLAGS_quic_allow_oversized_packets_for_test) { | |
| 313 return 0; | |
| 314 } | |
| 315 } | 307 } |
| 308 // Only truncate the first frame in a packet, so if subsequent ones go |
| 309 // over, stop including more frames. |
| 310 if (!first_frame) { |
| 311 return 0; |
| 312 } |
| 313 if (CanTruncate(quic_version_, frame, free_bytes)) { |
| 314 // Truncate the frame so the packet will not exceed kMaxPacketSize. |
| 315 // Note that we may not use every byte of the writer in this case. |
| 316 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; |
| 317 return free_bytes; |
| 318 } |
| 319 if (!FLAGS_quic_allow_oversized_packets_for_test) { |
| 320 return 0; |
| 321 } |
| 322 LOG(DFATAL) << "Packet size too small to fit frame."; |
| 316 return frame_len; | 323 return frame_len; |
| 317 } | 324 } |
| 318 | 325 |
| 319 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } | 326 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) { } |
| 320 | 327 |
| 321 QuicFramer::AckFrameInfo::~AckFrameInfo() { } | 328 QuicFramer::AckFrameInfo::~AckFrameInfo() { } |
| 322 | 329 |
| 323 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( | 330 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash( |
| 324 const QuicPacketHeader& header) const { | 331 const QuicPacketHeader& header) const { |
| 325 return header.entropy_flag << (header.packet_sequence_number % 8); | 332 return header.entropy_flag << (header.packet_sequence_number % 8); |
| (...skipping 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1811 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1818 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
| 1812 QuicSequenceNumberLength largest_observed_length = | 1819 QuicSequenceNumberLength largest_observed_length = |
| 1813 GetMinSequenceNumberLength(ack.received_info.largest_observed); | 1820 GetMinSequenceNumberLength(ack.received_info.largest_observed); |
| 1814 QuicSequenceNumberLength missing_sequence_number_length = | 1821 QuicSequenceNumberLength missing_sequence_number_length = |
| 1815 GetMinSequenceNumberLength(ack_info.max_delta); | 1822 GetMinSequenceNumberLength(ack_info.max_delta); |
| 1816 | 1823 |
| 1817 size_t ack_size = GetMinAckFrameSize(quic_version_, | 1824 size_t ack_size = GetMinAckFrameSize(quic_version_, |
| 1818 sequence_number_length, | 1825 sequence_number_length, |
| 1819 largest_observed_length); | 1826 largest_observed_length); |
| 1820 if (!ack_info.nack_ranges.empty()) { | 1827 if (!ack_info.nack_ranges.empty()) { |
| 1821 ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize; | 1828 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; |
| 1822 ack_size += ack_info.nack_ranges.size() * | 1829 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * |
| 1823 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1830 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 1824 ack_size += | 1831 ack_size += min(ack.received_info.revived_packets.size(), |
| 1825 ack.received_info.revived_packets.size() * largest_observed_length; | 1832 kMaxRevivedPackets) * largest_observed_length; |
| 1826 } | 1833 } |
| 1827 return ack_size; | 1834 return ack_size; |
| 1828 } | 1835 } |
| 1829 | 1836 |
| 1830 size_t QuicFramer::ComputeFrameLength( | 1837 size_t QuicFramer::ComputeFrameLength( |
| 1831 const QuicFrame& frame, | 1838 const QuicFrame& frame, |
| 1832 bool last_frame_in_packet, | 1839 bool last_frame_in_packet, |
| 1833 InFecGroup is_in_fec_group, | 1840 InFecGroup is_in_fec_group, |
| 1834 QuicSequenceNumberLength sequence_number_length) { | 1841 QuicSequenceNumberLength sequence_number_length) { |
| 1835 switch (frame.type) { | 1842 switch (frame.type) { |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2021 QuicDataWriter* writer) { | 2028 QuicDataWriter* writer) { |
| 2022 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 2029 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
| 2023 QuicPacketSequenceNumber ack_largest_observed = | 2030 QuicPacketSequenceNumber ack_largest_observed = |
| 2024 frame.received_info.largest_observed; | 2031 frame.received_info.largest_observed; |
| 2025 QuicSequenceNumberLength largest_observed_length = | 2032 QuicSequenceNumberLength largest_observed_length = |
| 2026 GetMinSequenceNumberLength(ack_largest_observed); | 2033 GetMinSequenceNumberLength(ack_largest_observed); |
| 2027 QuicSequenceNumberLength missing_sequence_number_length = | 2034 QuicSequenceNumberLength missing_sequence_number_length = |
| 2028 GetMinSequenceNumberLength(ack_info.max_delta); | 2035 GetMinSequenceNumberLength(ack_info.max_delta); |
| 2029 // Determine whether we need to truncate ranges. | 2036 // Determine whether we need to truncate ranges. |
| 2030 size_t available_range_bytes = writer->capacity() - writer->length() - | 2037 size_t available_range_bytes = writer->capacity() - writer->length() - |
| 2038 kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize - |
| 2031 GetMinAckFrameSize(quic_version_, | 2039 GetMinAckFrameSize(quic_version_, |
| 2032 header.public_header.sequence_number_length, | 2040 header.public_header.sequence_number_length, |
| 2033 largest_observed_length) - kNumberOfRevivedPacketsSize; | 2041 largest_observed_length); |
| 2034 size_t max_num_ranges = available_range_bytes / | 2042 size_t max_num_ranges = available_range_bytes / |
| 2035 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 2043 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
| 2036 max_num_ranges = | 2044 max_num_ranges = min(kMaxNackRanges, max_num_ranges); |
| 2037 min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges); | |
| 2038 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 2045 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
| 2039 DVLOG_IF(1, truncated) << "Truncating ack from " | 2046 DVLOG_IF(1, truncated) << "Truncating ack from " |
| 2040 << ack_info.nack_ranges.size() << " ranges to " | 2047 << ack_info.nack_ranges.size() << " ranges to " |
| 2041 << max_num_ranges; | 2048 << max_num_ranges; |
| 2042 | |
| 2043 // Write out the type byte by setting the low order bits and doing shifts | 2049 // Write out the type byte by setting the low order bits and doing shifts |
| 2044 // to make room for the next bit flags to be set. | 2050 // to make room for the next bit flags to be set. |
| 2045 // Whether there are any nacks. | 2051 // Whether there are any nacks. |
| 2046 uint8 type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; | 2052 uint8 type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask; |
| 2047 | 2053 |
| 2048 // truncating bit. | 2054 // truncating bit. |
| 2049 type_byte <<= kQuicAckTruncatedShift; | 2055 type_byte <<= kQuicAckTruncatedShift; |
| 2050 type_byte |= truncated ? kQuicAckTruncatedMask : 0; | 2056 type_byte |= truncated ? kQuicAckTruncatedMask : 0; |
| 2051 | 2057 |
| 2052 // Largest observed sequence number length. | 2058 // Largest observed sequence number length. |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2134 return false; | 2140 return false; |
| 2135 } | 2141 } |
| 2136 // Subtract 1 so a missing_delta of 0 means an adjacent range. | 2142 // Subtract 1 so a missing_delta of 0 means an adjacent range. |
| 2137 last_sequence_written = ack_iter->first - 1; | 2143 last_sequence_written = ack_iter->first - 1; |
| 2138 ++num_ranges_written; | 2144 ++num_ranges_written; |
| 2139 } | 2145 } |
| 2140 DCHECK_EQ(num_missing_ranges, num_ranges_written); | 2146 DCHECK_EQ(num_missing_ranges, num_ranges_written); |
| 2141 | 2147 |
| 2142 // Append revived packets. | 2148 // Append revived packets. |
| 2143 // If not all the revived packets fit, only mention the ones that do. | 2149 // If not all the revived packets fit, only mention the ones that do. |
| 2144 uint8 num_revived_packets = | 2150 uint8 num_revived_packets = min(received_info.revived_packets.size(), |
| 2145 min(received_info.revived_packets.size(), | 2151 kMaxRevivedPackets); |
| 2146 static_cast<size_t>(numeric_limits<uint8>::max())); | |
| 2147 num_revived_packets = min( | 2152 num_revived_packets = min( |
| 2148 static_cast<size_t>(num_revived_packets), | 2153 static_cast<size_t>(num_revived_packets), |
| 2149 (writer->capacity() - writer->length()) / largest_observed_length); | 2154 (writer->capacity() - writer->length()) / largest_observed_length); |
| 2150 if (!writer->WriteBytes(&num_revived_packets, 1)) { | 2155 if (!writer->WriteBytes(&num_revived_packets, 1)) { |
| 2151 return false; | 2156 return false; |
| 2152 } | 2157 } |
| 2153 | 2158 |
| 2154 SequenceNumberSet::const_iterator iter = | 2159 SequenceNumberSet::const_iterator iter = |
| 2155 received_info.revived_packets.begin(); | 2160 received_info.revived_packets.begin(); |
| 2156 for (int i = 0; i < num_revived_packets; ++i, ++iter) { | 2161 for (int i = 0; i < num_revived_packets; ++i, ++iter) { |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2352 | 2357 |
| 2353 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2358 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 2354 DVLOG(1) << "Error detail: " << detailed_error_; | 2359 DVLOG(1) << "Error detail: " << detailed_error_; |
| 2355 set_error(error); | 2360 set_error(error); |
| 2356 visitor_->OnError(this); | 2361 visitor_->OnError(this); |
| 2357 reader_.reset(NULL); | 2362 reader_.reset(NULL); |
| 2358 return false; | 2363 return false; |
| 2359 } | 2364 } |
| 2360 | 2365 |
| 2361 } // namespace net | 2366 } // namespace net |
| OLD | NEW |