Add a QuicCoalescedPacket::ToString which will be used for net-log in chrome.
gfe-relnote: n/a (logging only)
PiperOrigin-RevId: 304000959
Change-Id: I989dfecb3c5c05ea86d3f2e285dd3e5a6c265b8c
diff --git a/quic/core/quic_coalesced_packet.cc b/quic/core/quic_coalesced_packet.cc
index 3dd9b24..6393f5d 100644
--- a/quic/core/quic_coalesced_packet.cc
+++ b/quic/core/quic_coalesced_packet.cc
@@ -6,6 +6,7 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
+#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
namespace quic {
@@ -49,9 +50,7 @@
QUIC_BUG << "Max packet length changes in the middle of the write path";
return false;
}
- if (!encrypted_buffers_[packet.encryption_level].empty() ||
- (packet.encryption_level == ENCRYPTION_INITIAL &&
- initial_packet_ != nullptr)) {
+ if (ContainsPacketOfEncryptionLevel(packet.encryption_level)) {
// Do not coalesce packets of the same encryption level.
return false;
}
@@ -116,4 +115,29 @@
return true;
}
+bool QuicCoalescedPacket::ContainsPacketOfEncryptionLevel(
+ EncryptionLevel level) const {
+ return !encrypted_buffers_[level].empty() ||
+ (level == ENCRYPTION_INITIAL && initial_packet_ != nullptr);
+}
+
+std::string QuicCoalescedPacket::ToString(size_t serialized_length) const {
+ // Total length and padding size.
+ std::string info = quiche::QuicheStrCat(
+ "total_length: ", serialized_length,
+ " padding_size: ", serialized_length - length_, " packets: {");
+ // Packets' encryption levels.
+ bool first_packet = true;
+ for (int8_t i = ENCRYPTION_INITIAL; i < NUM_ENCRYPTION_LEVELS; ++i) {
+ if (ContainsPacketOfEncryptionLevel(static_cast<EncryptionLevel>(i))) {
+ info = quiche::QuicheStrCat(
+ info, first_packet ? "" : ", ",
+ EncryptionLevelToString(static_cast<EncryptionLevel>(i)));
+ first_packet = false;
+ }
+ }
+ info = quiche::QuicheStrCat(info, "}");
+ return info;
+}
+
} // namespace quic
diff --git a/quic/core/quic_coalesced_packet.h b/quic/core/quic_coalesced_packet.h
index f03f875..1974f77 100644
--- a/quic/core/quic_coalesced_packet.h
+++ b/quic/core/quic_coalesced_packet.h
@@ -34,6 +34,8 @@
size_t buffer_len,
size_t* length_copied) const;
+ std::string ToString(size_t serialized_length) const;
+
const SerializedPacket* initial_packet() const {
return initial_packet_.get();
}
@@ -47,6 +49,9 @@
QuicPacketLength max_packet_length() const { return max_packet_length_; }
private:
+ // Returns true if this coalesced packet contains packet of |level|.
+ bool ContainsPacketOfEncryptionLevel(EncryptionLevel level) const;
+
// self/peer addresses are set when trying to coalesce the first packet.
// Packets with different self/peer addresses cannot be coalesced.
QuicSocketAddress self_address_;
diff --git a/quic/core/quic_coalesced_packet_test.cc b/quic/core/quic_coalesced_packet_test.cc
index 6e7c32a..0a7a51e 100644
--- a/quic/core/quic_coalesced_packet_test.cc
+++ b/quic/core/quic_coalesced_packet_test.cc
@@ -15,6 +15,8 @@
TEST(QuicCoalescedPacketTest, MaybeCoalescePacket) {
QuicCoalescedPacket coalesced;
+ EXPECT_EQ("total_length: 0 padding_size: 0 packets: {}",
+ coalesced.ToString(0));
SimpleBufferAllocator allocator;
EXPECT_EQ(0u, coalesced.length());
char buffer[1000];
@@ -30,6 +32,9 @@
&allocator, 1500));
EXPECT_EQ(1500u, coalesced.max_packet_length());
EXPECT_EQ(500u, coalesced.length());
+ EXPECT_EQ(
+ "total_length: 1500 padding_size: 1000 packets: {ENCRYPTION_INITIAL}",
+ coalesced.ToString(1500));
// Cannot coalesce packet of the same encryption level.
SerializedPacket packet2(QuicPacketNumber(2), PACKET_4BYTE_PACKET_NUMBER,
@@ -45,6 +50,10 @@
&allocator, 1500));
EXPECT_EQ(1500u, coalesced.max_packet_length());
EXPECT_EQ(1000u, coalesced.length());
+ EXPECT_EQ(
+ "total_length: 1500 padding_size: 500 packets: {ENCRYPTION_INITIAL, "
+ "ENCRYPTION_ZERO_RTT}",
+ coalesced.ToString(1500));
SerializedPacket packet4(QuicPacketNumber(4), PACKET_4BYTE_PACKET_NUMBER,
buffer, 500, false, false);