gfe-relnote: In QUIC, deprecate queued_control_frames_ from QuicPacketGenerator. Protected by gfe2_reloadable_flag_quic_deprecate_queued_control_frames. Change void AddControlFrame(const QuicFrame& frame) to bool ConsumeRetransmittableControlFrame(const QuicFrame& frame). PiperOrigin-RevId: 246495306 Change-Id: I48a645ea0ef88636afb725abf88da5a4f3125a07
diff --git a/quic/core/quic_packet_generator.cc b/quic/core/quic_packet_generator.cc index d3d950c..7e98274 100644 --- a/quic/core/quic_packet_generator.cc +++ b/quic/core/quic_packet_generator.cc
@@ -30,7 +30,10 @@ random_generator_(random_generator), fully_pad_crypto_handshake_packets_(true), deprecate_ack_bundling_mode_( - GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)) {} + GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode)), + deprecate_queued_control_frames_( + deprecate_ack_bundling_mode_ && + GetQuicReloadableFlag(quic_deprecate_queued_control_frames)) {} QuicPacketGenerator::~QuicPacketGenerator() { DeleteFrames(&queued_control_frames_); @@ -53,14 +56,37 @@ SendQueuedFrames(/*flush=*/false); } -void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) { +bool QuicPacketGenerator::ConsumeRetransmittableControlFrame( + const QuicFrame& frame) { QUIC_BUG_IF(IsControlFrame(frame.type) && !GetControlFrameId(frame)) << "Adding a control frame with no control frame id: " << frame; + DCHECK(QuicUtils::IsRetransmittableFrame(frame.type)) << frame; if (deprecate_ack_bundling_mode_) { MaybeBundleAckOpportunistically(); } + if (deprecate_queued_control_frames_) { + QUIC_RELOADABLE_FLAG_COUNT(quic_deprecate_queued_control_frames); + if (packet_creator_.HasPendingFrames()) { + if (packet_creator_.AddSavedFrame(frame, next_transmission_type_)) { + // There is pending frames and current frame fits. + return true; + } + } + DCHECK(!packet_creator_.HasPendingFrames()); + if (frame.type != PING_FRAME && frame.type != CONNECTION_CLOSE_FRAME && + !delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, + NOT_HANDSHAKE)) { + // Do not check congestion window for ping or connection close frames. + return false; + } + const bool success = + packet_creator_.AddSavedFrame(frame, next_transmission_type_); + DCHECK(success); + return success; + } queued_control_frames_.push_back(frame); SendQueuedFrames(/*flush=*/false); + return true; } size_t QuicPacketGenerator::ConsumeCryptoData(EncryptionLevel level,