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(