| Index: net/quic/quic_framer.cc
|
| diff --git a/net/quic/quic_framer.cc b/net/quic/quic_framer.cc
|
| index 09cd43df6372fb98e62d66b0147d51e603bc0aef..8ff2ee72d33f3c2e5bee36eb50f697b3b81f3d5a 100644
|
| --- a/net/quic/quic_framer.cc
|
| +++ b/net/quic/quic_framer.cc
|
| @@ -198,9 +198,12 @@ size_t QuicFramer::GetMinAckFrameSize(
|
| QuicVersion version,
|
| QuicSequenceNumberLength sequence_number_length,
|
| QuicSequenceNumberLength largest_observed_length) {
|
| - return kQuicFrameTypeSize + kQuicEntropyHashSize +
|
| - sequence_number_length + kQuicEntropyHashSize +
|
| + size_t len = kQuicFrameTypeSize + kQuicEntropyHashSize +
|
| largest_observed_length + kQuicDeltaTimeLargestObservedSize;
|
| + if (version <= QUIC_VERSION_15) {
|
| + len += sequence_number_length + kQuicEntropyHashSize;
|
| + }
|
| + return len;
|
| }
|
|
|
| // static
|
| @@ -298,21 +301,25 @@ size_t QuicFramer::GetSerializedFrameLength(
|
| size_t frame_len =
|
| ComputeFrameLength(frame, last_frame, is_in_fec_group,
|
| sequence_number_length);
|
| - if (frame_len > free_bytes) {
|
| - // Only truncate the first frame in a packet, so if subsequent ones go
|
| - // over, stop including more frames.
|
| - if (!first_frame) {
|
| - return 0;
|
| - }
|
| - if (CanTruncate(quic_version_, frame, free_bytes)) {
|
| - // Truncate the frame so the packet will not exceed kMaxPacketSize.
|
| - // Note that we may not use every byte of the writer in this case.
|
| - DVLOG(1) << "Truncating large frame";
|
| - return free_bytes;
|
| - } else if (!FLAGS_quic_allow_oversized_packets_for_test) {
|
| - return 0;
|
| - }
|
| + if (frame_len <= free_bytes) {
|
| + // Frame fits within packet. Note that acks may be truncated.
|
| + return frame_len;
|
| }
|
| + // Only truncate the first frame in a packet, so if subsequent ones go
|
| + // over, stop including more frames.
|
| + if (!first_frame) {
|
| + return 0;
|
| + }
|
| + if (CanTruncate(quic_version_, frame, free_bytes)) {
|
| + // Truncate the frame so the packet will not exceed kMaxPacketSize.
|
| + // Note that we may not use every byte of the writer in this case.
|
| + DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes;
|
| + return free_bytes;
|
| + }
|
| + if (!FLAGS_quic_allow_oversized_packets_for_test) {
|
| + return 0;
|
| + }
|
| + LOG(DFATAL) << "Packet size too small to fit frame.";
|
| return frame_len;
|
| }
|
|
|
| @@ -1818,11 +1825,11 @@ size_t QuicFramer::GetAckFrameSize(
|
| sequence_number_length,
|
| largest_observed_length);
|
| if (!ack_info.nack_ranges.empty()) {
|
| - ack_size += kNumberOfMissingPacketsSize + kNumberOfRevivedPacketsSize;
|
| - ack_size += ack_info.nack_ranges.size() *
|
| + ack_size += kNumberOfNackRangesSize + kNumberOfRevivedPacketsSize;
|
| + ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
|
| (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
|
| - ack_size +=
|
| - ack.received_info.revived_packets.size() * largest_observed_length;
|
| + ack_size += min(ack.received_info.revived_packets.size(),
|
| + kMaxRevivedPackets) * largest_observed_length;
|
| }
|
| return ack_size;
|
| }
|
| @@ -2028,18 +2035,17 @@ bool QuicFramer::AppendAckFrameAndTypeByte(
|
| GetMinSequenceNumberLength(ack_info.max_delta);
|
| // Determine whether we need to truncate ranges.
|
| size_t available_range_bytes = writer->capacity() - writer->length() -
|
| + kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize -
|
| GetMinAckFrameSize(quic_version_,
|
| header.public_header.sequence_number_length,
|
| - largest_observed_length) - kNumberOfRevivedPacketsSize;
|
| + largest_observed_length);
|
| size_t max_num_ranges = available_range_bytes /
|
| (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
|
| - max_num_ranges =
|
| - min(static_cast<size_t>(numeric_limits<uint8>::max()), max_num_ranges);
|
| + max_num_ranges = min(kMaxNackRanges, max_num_ranges);
|
| bool truncated = ack_info.nack_ranges.size() > max_num_ranges;
|
| DVLOG_IF(1, truncated) << "Truncating ack from "
|
| << ack_info.nack_ranges.size() << " ranges to "
|
| << max_num_ranges;
|
| -
|
| // Write out the type byte by setting the low order bits and doing shifts
|
| // to make room for the next bit flags to be set.
|
| // Whether there are any nacks.
|
| @@ -2141,9 +2147,8 @@ bool QuicFramer::AppendAckFrameAndTypeByte(
|
|
|
| // Append revived packets.
|
| // If not all the revived packets fit, only mention the ones that do.
|
| - uint8 num_revived_packets =
|
| - min(received_info.revived_packets.size(),
|
| - static_cast<size_t>(numeric_limits<uint8>::max()));
|
| + uint8 num_revived_packets = min(received_info.revived_packets.size(),
|
| + kMaxRevivedPackets);
|
| num_revived_packets = min(
|
| static_cast<size_t>(num_revived_packets),
|
| (writer->capacity() - writer->length()) / largest_observed_length);
|
|
|