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\'.