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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 InFecGroup is_in_fec_group) { | 166 InFecGroup is_in_fec_group) { |
167 bool no_stream_frame_length = last_frame_in_packet && | 167 bool no_stream_frame_length = last_frame_in_packet && |
168 is_in_fec_group == NOT_IN_FEC_GROUP; | 168 is_in_fec_group == NOT_IN_FEC_GROUP; |
169 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + | 169 return kQuicFrameTypeSize + GetStreamIdSize(stream_id) + |
170 GetStreamOffsetSize(offset) + | 170 GetStreamOffsetSize(offset) + |
171 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); | 171 (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize); |
172 } | 172 } |
173 | 173 |
174 // static | 174 // static |
175 size_t QuicFramer::GetMinAckFrameSize( | 175 size_t QuicFramer::GetMinAckFrameSize( |
176 QuicSequenceNumberLength sequence_number_length, | |
177 QuicSequenceNumberLength largest_observed_length) { | 176 QuicSequenceNumberLength largest_observed_length) { |
178 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 177 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
179 largest_observed_length + kQuicDeltaTimeLargestObservedSize; | 178 largest_observed_length + kQuicDeltaTimeLargestObservedSize; |
180 } | 179 } |
181 | 180 |
182 // static | 181 // static |
183 size_t QuicFramer::GetStopWaitingFrameSize( | 182 size_t QuicFramer::GetStopWaitingFrameSize( |
184 QuicSequenceNumberLength sequence_number_length) { | 183 QuicSequenceNumberLength sequence_number_length) { |
185 return kQuicFrameTypeSize + kQuicEntropyHashSize + | 184 return kQuicFrameTypeSize + kQuicEntropyHashSize + |
186 sequence_number_length; | 185 sequence_number_length; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 sequence_number_length); | 293 sequence_number_length); |
295 if (frame_len <= free_bytes) { | 294 if (frame_len <= free_bytes) { |
296 // Frame fits within packet. Note that acks may be truncated. | 295 // Frame fits within packet. Note that acks may be truncated. |
297 return frame_len; | 296 return frame_len; |
298 } | 297 } |
299 // Only truncate the first frame in a packet, so if subsequent ones go | 298 // Only truncate the first frame in a packet, so if subsequent ones go |
300 // over, stop including more frames. | 299 // over, stop including more frames. |
301 if (!first_frame) { | 300 if (!first_frame) { |
302 return 0; | 301 return 0; |
303 } | 302 } |
304 bool can_truncate = frame.type == ACK_FRAME && | 303 bool can_truncate = |
305 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER, | 304 frame.type == ACK_FRAME && |
306 PACKET_6BYTE_SEQUENCE_NUMBER); | 305 free_bytes >= GetMinAckFrameSize(PACKET_6BYTE_SEQUENCE_NUMBER); |
307 if (can_truncate) { | 306 if (can_truncate) { |
308 // Truncate the frame so the packet will not exceed kMaxPacketSize. | 307 // 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. | 308 // Note that we may not use every byte of the writer in this case. |
310 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; | 309 DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes; |
311 return free_bytes; | 310 return free_bytes; |
312 } | 311 } |
313 if (!FLAGS_quic_allow_oversized_packets_for_test) { | 312 if (!FLAGS_quic_allow_oversized_packets_for_test) { |
314 return 0; | 313 return 0; |
315 } | 314 } |
316 LOG(DFATAL) << "Packet size too small to fit frame."; | 315 LOG(DFATAL) << "Packet size too small to fit frame."; |
(...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1721 | 1720 |
1722 size_t QuicFramer::GetAckFrameSize( | 1721 size_t QuicFramer::GetAckFrameSize( |
1723 const QuicAckFrame& ack, | 1722 const QuicAckFrame& ack, |
1724 QuicSequenceNumberLength sequence_number_length) { | 1723 QuicSequenceNumberLength sequence_number_length) { |
1725 AckFrameInfo ack_info = GetAckFrameInfo(ack); | 1724 AckFrameInfo ack_info = GetAckFrameInfo(ack); |
1726 QuicSequenceNumberLength largest_observed_length = | 1725 QuicSequenceNumberLength largest_observed_length = |
1727 GetMinSequenceNumberLength(ack.largest_observed); | 1726 GetMinSequenceNumberLength(ack.largest_observed); |
1728 QuicSequenceNumberLength missing_sequence_number_length = | 1727 QuicSequenceNumberLength missing_sequence_number_length = |
1729 GetMinSequenceNumberLength(ack_info.max_delta); | 1728 GetMinSequenceNumberLength(ack_info.max_delta); |
1730 | 1729 |
1731 size_t ack_size = GetMinAckFrameSize(sequence_number_length, | 1730 size_t ack_size = GetMinAckFrameSize(largest_observed_length); |
1732 largest_observed_length); | |
1733 if (!ack_info.nack_ranges.empty()) { | 1731 if (!ack_info.nack_ranges.empty()) { |
1734 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; | 1732 ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize; |
1735 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * | 1733 ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) * |
1736 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1734 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
1737 ack_size += min(ack.revived_packets.size(), | 1735 ack_size += min(ack.revived_packets.size(), |
1738 kMaxRevivedPackets) * largest_observed_length; | 1736 kMaxRevivedPackets) * largest_observed_length; |
1739 } | 1737 } |
1740 | 1738 |
1741 // In version 23, if the ack will be truncated due to too many nack ranges, | 1739 // In version 23, if the ack will be truncated due to too many nack ranges, |
1742 // then do not include the number of timestamps (1 byte). | 1740 // then do not include the number of timestamps (1 byte). |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 const QuicPacketHeader& header, | 1910 const QuicPacketHeader& header, |
1913 const QuicAckFrame& frame, | 1911 const QuicAckFrame& frame, |
1914 QuicDataWriter* writer) { | 1912 QuicDataWriter* writer) { |
1915 AckFrameInfo ack_info = GetAckFrameInfo(frame); | 1913 AckFrameInfo ack_info = GetAckFrameInfo(frame); |
1916 QuicPacketSequenceNumber ack_largest_observed = frame.largest_observed; | 1914 QuicPacketSequenceNumber ack_largest_observed = frame.largest_observed; |
1917 QuicSequenceNumberLength largest_observed_length = | 1915 QuicSequenceNumberLength largest_observed_length = |
1918 GetMinSequenceNumberLength(ack_largest_observed); | 1916 GetMinSequenceNumberLength(ack_largest_observed); |
1919 QuicSequenceNumberLength missing_sequence_number_length = | 1917 QuicSequenceNumberLength missing_sequence_number_length = |
1920 GetMinSequenceNumberLength(ack_info.max_delta); | 1918 GetMinSequenceNumberLength(ack_info.max_delta); |
1921 // Determine whether we need to truncate ranges. | 1919 // Determine whether we need to truncate ranges. |
1922 size_t available_range_bytes = writer->capacity() - writer->length() - | 1920 size_t available_range_bytes = |
1923 kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize - | 1921 writer->capacity() - writer->length() - kNumberOfRevivedPacketsSize - |
1924 GetMinAckFrameSize(header.public_header.sequence_number_length, | 1922 kNumberOfNackRangesSize - GetMinAckFrameSize(largest_observed_length); |
1925 largest_observed_length); | |
1926 size_t max_num_ranges = available_range_bytes / | 1923 size_t max_num_ranges = available_range_bytes / |
1927 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); | 1924 (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER); |
1928 max_num_ranges = min(kMaxNackRanges, max_num_ranges); | 1925 max_num_ranges = min(kMaxNackRanges, max_num_ranges); |
1929 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; | 1926 bool truncated = ack_info.nack_ranges.size() > max_num_ranges; |
1930 DVLOG_IF(1, truncated) << "Truncating ack from " | 1927 DVLOG_IF(1, truncated) << "Truncating ack from " |
1931 << ack_info.nack_ranges.size() << " ranges to " | 1928 << ack_info.nack_ranges.size() << " ranges to " |
1932 << max_num_ranges; | 1929 << max_num_ranges; |
1933 // Write out the type byte by setting the low order bits and doing shifts | 1930 // Write out the type byte by setting the low order bits and doing shifts |
1934 // to make room for the next bit flags to be set. | 1931 // to make room for the next bit flags to be set. |
1935 // Whether there are any nacks. | 1932 // Whether there are any nacks. |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2224 bool QuicFramer::RaiseError(QuicErrorCode error) { | 2221 bool QuicFramer::RaiseError(QuicErrorCode error) { |
2225 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) | 2222 DVLOG(1) << "Error: " << QuicUtils::ErrorToString(error) |
2226 << " detail: " << detailed_error_; | 2223 << " detail: " << detailed_error_; |
2227 set_error(error); | 2224 set_error(error); |
2228 visitor_->OnError(this); | 2225 visitor_->OnError(this); |
2229 reader_.reset(nullptr); | 2226 reader_.reset(nullptr); |
2230 return false; | 2227 return false; |
2231 } | 2228 } |
2232 | 2229 |
2233 } // namespace net | 2230 } // namespace net |
OLD | NEW |