Fix bytes accounting for buffered coalesced packets. Protected by FLAGS_quic_reloadable_flag_quic_fix_bytes_accounting_for_buffered_coalesced_packets. PiperOrigin-RevId: 457607469
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index f5bf7be..2c8d341 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -5971,31 +5971,38 @@ } QUIC_DVLOG(1) << ENDPOINT << "Sending coalesced packet " << coalesced_packet_.ToString(length); - + if (GetQuicReloadableFlag( + quic_fix_bytes_accounting_for_buffered_coalesced_packets)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_fix_bytes_accounting_for_buffered_coalesced_packets); + } if (!buffered_packets_.empty() || HandleWriteBlocked()) { QUIC_DVLOG(1) << ENDPOINT << "Buffering coalesced packet of len: " << length; buffered_packets_.emplace_back( buffer, static_cast<QuicPacketLength>(length), coalesced_packet_.self_address(), coalesced_packet_.peer_address()); - return true; - } - - WriteResult result = writer_->WritePacket( - buffer, length, coalesced_packet_.self_address().host(), - coalesced_packet_.peer_address(), per_packet_options_); - if (IsWriteError(result.status)) { - OnWriteError(result.error_code); - return false; - } - if (IsWriteBlockedStatus(result.status)) { - visitor_->OnWriteBlocked(); - if (result.status != WRITE_STATUS_BLOCKED_DATA_BUFFERED) { - QUIC_DVLOG(1) << ENDPOINT - << "Buffering coalesced packet of len: " << length; - buffered_packets_.emplace_back( - buffer, static_cast<QuicPacketLength>(length), - coalesced_packet_.self_address(), coalesced_packet_.peer_address()); + if (!GetQuicReloadableFlag( + quic_fix_bytes_accounting_for_buffered_coalesced_packets)) { + return true; + } + } else { + WriteResult result = writer_->WritePacket( + buffer, length, coalesced_packet_.self_address().host(), + coalesced_packet_.peer_address(), per_packet_options_); + if (IsWriteError(result.status)) { + OnWriteError(result.error_code); + return false; + } + if (IsWriteBlockedStatus(result.status)) { + visitor_->OnWriteBlocked(); + if (result.status != WRITE_STATUS_BLOCKED_DATA_BUFFERED) { + QUIC_DVLOG(1) << ENDPOINT + << "Buffering coalesced packet of len: " << length; + buffered_packets_.emplace_back( + buffer, static_cast<QuicPacketLength>(length), + coalesced_packet_.self_address(), coalesced_packet_.peer_address()); + } } } // Account for added padding.
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index d33a090..0fea5c6 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -15472,6 +15472,27 @@ QuicTime::Delta::FromSeconds(5)); } +TEST_P(QuicConnectionTest, FixBytesAccountingForBufferedCoalescedPackets) { + if (!connection_.version().CanSendCoalescedPackets()) { + return; + } + connection_.SetEncrypter(ENCRYPTION_INITIAL, + std::make_unique<TaggingEncrypter>(0x01)); + // Write is blocked. + EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AnyNumber()); + writer_->SetWriteBlocked(); + connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); + QuicConnectionPeer::SendPing(&connection_); + const QuicConnectionStats& stats = connection_.GetStats(); + if (GetQuicReloadableFlag( + quic_fix_bytes_accounting_for_buffered_coalesced_packets)) { + // Verify padding is accounted. + EXPECT_EQ(stats.bytes_sent, connection_.max_packet_length()); + } else { + EXPECT_LT(stats.bytes_sent, connection_.max_packet_length()); + } +} + } // namespace } // namespace test } // namespace quic
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h index 82d2e6e..8c26b10 100644 --- a/quiche/quic/core/quic_flags_list.h +++ b/quiche/quic/core/quic_flags_list.h
@@ -29,6 +29,8 @@ QUIC_FLAG(quic_restart_flag_quic_support_release_time_for_gso, false) // If true, TlsHandshaker::AdvanceHandshake will check if connection is closed after SSL_do_handshake. QUIC_FLAG(quic_reloadable_flag_quic_tls_handshaker_check_connection_closed, true) +// If true, account added padding when coalesced packets get buffered. +QUIC_FLAG(quic_reloadable_flag_quic_fix_bytes_accounting_for_buffered_coalesced_packets, true) // If true, ack frequency frame can be sent from server to client. QUIC_FLAG(quic_reloadable_flag_quic_can_send_ack_frequency, true) // If true, allow client to enable BBRv2 on server via connection option \'B2ON\'.