| 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 |