Send random payload of length [0, 4] for grease HTTP/3 frame.
gfe-relnote: protected by disabled v99 flag.
PiperOrigin-RevId: 294541036
Change-Id: Ic9e62e81704a25e6aaee273641e6ca3fc014736d
diff --git a/quic/core/http/http_encoder.cc b/quic/core/http/http_encoder.cc
index 5aeb44c..dfc7946 100644
--- a/quic/core/http/http_encoder.cc
+++ b/quic/core/http/http_encoder.cc
@@ -8,6 +8,7 @@
#include "net/third_party/quiche/src/quic/core/crypto/quic_random.h"
#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
+#include "net/third_party/quiche/src/quic/core/quic_types.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
@@ -248,30 +249,42 @@
// static
QuicByteCount HttpEncoder::SerializeGreasingFrame(
std::unique_ptr<char[]>* output) {
- // To not congest the network, a greasing frame only contains a uint8_t as
- // payload.
uint64_t frame_type;
- uint8_t frame_payload;
+ QuicByteCount payload_length;
+ std::string payload;
if (!GetQuicFlag(FLAGS_quic_enable_http3_grease_randomness)) {
frame_type = 0x40;
- frame_payload = 20;
+ payload_length = 1;
+ payload = "a";
} else {
uint32_t result;
QuicRandom::GetInstance()->RandBytes(&result, sizeof(result));
frame_type = 0x1fULL * static_cast<uint64_t>(result) + 0x21ULL;
- QuicRandom::GetInstance()->RandBytes(&frame_payload, sizeof(frame_payload));
+
+ // The payload length is random but within [0, 3];
+ payload_length = result % 4;
+
+ if (payload_length > 0) {
+ std::unique_ptr<char[]> buffer(new char[payload_length]);
+ QuicRandom::GetInstance()->RandBytes(buffer.get(), payload_length);
+ payload = std::string(buffer.get(), payload_length);
+ }
}
- QuicByteCount total_length =
- QuicDataWriter::GetVarInt62Len(frame_type) +
- QuicDataWriter::GetVarInt62Len(sizeof(frame_payload)) +
- sizeof(frame_payload);
+ QuicByteCount total_length = QuicDataWriter::GetVarInt62Len(frame_type) +
+ QuicDataWriter::GetVarInt62Len(payload_length) +
+ payload_length;
output->reset(new char[total_length]);
QuicDataWriter writer(total_length, output->get());
- if (writer.WriteVarInt62(frame_type) &&
- writer.WriteVarInt62(sizeof(frame_payload)) &&
- writer.WriteUInt8(frame_payload)) {
+ bool success =
+ writer.WriteVarInt62(frame_type) && writer.WriteVarInt62(payload_length);
+
+ if (payload_length > 0) {
+ success &= writer.WriteBytes(payload.data(), payload_length);
+ }
+
+ if (success) {
return total_length;
}
diff --git a/quic/core/http/quic_send_control_stream_test.cc b/quic/core/http/quic_send_control_stream_test.cc
index 66fcbcd..1bc10bf 100644
--- a/quic/core/http/quic_send_control_stream_test.cc
+++ b/quic/core/http/quic_send_control_stream_test.cc
@@ -124,8 +124,8 @@
"4040" // 0x40 as the reserved settings id
"14" // 20
"4040" // 0x40 as the reserved frame type
- "01" // 8 bytes for uint8_t
- "14"); // 20
+ "01" // 1 byte frame length
+ "61"); // payload "a"
auto buffer = std::make_unique<char[]>(expected_write_data.size());
QuicDataWriter writer(expected_write_data.size(), buffer.get());