In quic, check quicconnection::shouldgeneratepacket for every crypto packet. protected by gfe2_reloadable_flag_quic_fix_checking_should_generate_packet. PiperOrigin-RevId: 311781975 Change-Id: I419d5446adb83f19927915d65e779b3cdb692532
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 4f089a4..5f20559 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -1700,7 +1700,8 @@ QUIC_BUG << "Attempt to send empty crypto frame"; return 0; } - if (!ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, IS_HANDSHAKE)) { + if (!GetQuicReloadableFlag(quic_fix_checking_should_generate_packet) && + !ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, IS_HANDSHAKE)) { return 0; } ScopedPacketFlusher flusher(this);
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc index d5555fc..4db87e2 100644 --- a/quic/core/quic_packet_creator.cc +++ b/quic/core/quic_packet_creator.cc
@@ -1287,7 +1287,13 @@ size_t total_bytes_consumed = 0; - while (total_bytes_consumed < write_length) { + while (total_bytes_consumed < write_length && + (!GetQuicReloadableFlag(quic_fix_checking_should_generate_packet) || + delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, + IS_HANDSHAKE))) { + if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) { + QUIC_RELOADABLE_FLAG_COUNT(quic_fix_checking_should_generate_packet); + } QuicFrame frame; if (!ConsumeCryptoDataToFillCurrentPacket( level, write_length - total_bytes_consumed,
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc index d1beea7..19267c9 100644 --- a/quic/core/quic_packet_creator_test.cc +++ b/quic/core/quic_packet_creator_test.cc
@@ -2679,6 +2679,37 @@ CheckPacketContains(contents, 0); } +TEST_F(QuicPacketCreatorMultiplePacketsTest, + ConsumeCryptoDataCheckShouldGeneratePacket) { + delegate_.SetCanNotWrite(); + + if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) { + EXPECT_CALL(delegate_, OnSerializedPacket(_)).Times(0); + } else { + EXPECT_CALL(delegate_, OnSerializedPacket(_)) + .WillOnce( + Invoke(this, &QuicPacketCreatorMultiplePacketsTest::SavePacket)); + } + std::string data = "crypto data"; + size_t consumed_bytes = + creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0); + creator_.Flush(); + if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) { + EXPECT_EQ(0u, consumed_bytes); + } else { + EXPECT_EQ(data.length(), consumed_bytes); + } + EXPECT_FALSE(creator_.HasPendingFrames()); + EXPECT_FALSE(creator_.HasPendingRetransmittableFrames()); + if (GetQuicReloadableFlag(quic_fix_checking_should_generate_packet)) { + return; + } + PacketContents contents; + contents.num_crypto_frames = 1; + contents.num_padding_frames = 1; + CheckPacketContains(contents, 0); +} + TEST_F(QuicPacketCreatorMultiplePacketsTest, ConsumeData_NotWritable) { delegate_.SetCanNotWrite();