gfe-relnote: In QUIC, let GetMinAckFrameSize use actual ack_frame instead of passed in largest_observed_length. Protected by gfe2_reloadable_flag_quic_use_ack_frame_to_get_min_size. PiperOrigin-RevId: 299367386 Change-Id: Ia0958adfc45a59b03d9e184ea8d353dd729e6417
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index 6e7e589..771848e 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -468,6 +468,7 @@ // static size_t QuicFramer::GetMinAckFrameSize( QuicTransportVersion version, + const QuicAckFrame& ack_frame, QuicPacketNumberLength largest_observed_length) { if (VersionHasIetfQuicFrames(version)) { // The minimal ack frame consists of the following four fields: Largest @@ -475,6 +476,10 @@ // size of each is 1 byte. return kQuicFrameTypeSize + 4; } + if (GetQuicReloadableFlag(quic_use_ack_frame_to_get_min_size)) { + QUIC_RELOADABLE_FLAG_COUNT(quic_use_ack_frame_to_get_min_size); + largest_observed_length = GetMinPacketNumberLength(LargestAcked(ack_frame)); + } size_t min_size = kQuicFrameTypeSize + largest_observed_length + kQuicDeltaTimeLargestObservedSize; return min_size + kQuicNumTimestampsSize; @@ -793,6 +798,7 @@ bool can_truncate = frame.type == ACK_FRAME && free_bytes >= GetMinAckFrameSize(version_.transport_version, + *frame.ack_frame, PACKET_6BYTE_PACKET_NUMBER); if (can_truncate) { // Truncate the frame so the packet will not exceed kMaxOutgoingPacketSize. @@ -4675,7 +4681,7 @@ GetMinPacketNumberLength(QuicPacketNumber(ack_info.max_block_length)); ack_size = - GetMinAckFrameSize(version_.transport_version, largest_acked_length); + GetMinAckFrameSize(version_.transport_version, ack, largest_acked_length); // First ack block length. ack_size += ack_block_length; if (ack_info.num_ack_blocks != 0) { @@ -5140,7 +5146,8 @@ // Calculate available bytes for timestamps and ack blocks. int32_t available_timestamp_and_ack_block_bytes = writer->capacity() - writer->length() - ack_block_length - - GetMinAckFrameSize(version_.transport_version, largest_acked_length) - + GetMinAckFrameSize(version_.transport_version, frame, + largest_acked_length) - (new_ack_info.num_ack_blocks != 0 ? kNumberOfAckBlocksSize : 0); DCHECK_LE(0, available_timestamp_and_ack_block_bytes);
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h index 9863dc1..c05177c 100644 --- a/quic/core/quic_framer.h +++ b/quic/core/quic_framer.h
@@ -312,8 +312,11 @@ QuicByteCount length); // Size in bytes of all ack frame fields without the missing packets or ack // blocks. + // TODO(fayang): Remove |largest_observed_length| when deprecating + // quic_use_ack_frame_to_get_min_size. static size_t GetMinAckFrameSize( QuicTransportVersion version, + const QuicAckFrame& ack_frame, QuicPacketNumberLength largest_observed_length); // Size in bytes of a stop waiting frame. static size_t GetStopWaitingFrameSize(