gfe-relnote: Allow sending CRYPTO frames without full padding. Protected by QUIC_VERSION_99
PiperOrigin-RevId: 247997458
Change-Id: I5439247d841c3298a77f7c914e527186f83e3f72
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index fa6fda7..ea2450d 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -178,9 +178,9 @@
}
offset += frame.stream_frame.data_length;
} else {
- if (!creator_.ConsumeCryptoData(ENCRYPTION_INITIAL,
- reject.length() - offset, offset,
- NOT_RETRANSMISSION, &frame)) {
+ if (!creator_.ConsumeCryptoData(
+ ENCRYPTION_INITIAL, reject.length() - offset, offset,
+ /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame)) {
QUIC_BUG << "Unable to consume crypto data into an empty packet.";
return;
}
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 8199307..dddc8e7 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -161,6 +161,7 @@
bool QuicPacketCreator::ConsumeCryptoData(EncryptionLevel level,
size_t write_length,
QuicStreamOffset offset,
+ bool needs_full_padding,
TransmissionType transmission_type,
QuicFrame* frame) {
if (!CreateCryptoFrame(level, write_length, offset, frame)) {
@@ -172,7 +173,9 @@
//
// TODO(nharper): Check what the IETF drafts say about padding out initial
// messages and change this as appropriate.
- needs_full_padding_ = true;
+ if (needs_full_padding) {
+ needs_full_padding_ = true;
+ }
return AddFrame(*frame, /*save_retransmittable_frames*/ true,
transmission_type);
}
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h
index 367ca11..bceeae9 100644
--- a/quic/core/quic_packet_creator.h
+++ b/quic/core/quic_packet_creator.h
@@ -112,6 +112,7 @@
bool ConsumeCryptoData(EncryptionLevel level,
size_t write_length,
QuicStreamOffset offset,
+ bool needs_full_padding,
TransmissionType transmission_type,
QuicFrame* frame);
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index bd212de..637960f 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -601,6 +601,7 @@
std::string data = "crypto data";
QuicFrame frame;
ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(), 0,
+ /*needs_full_padding=*/true,
NOT_RETRANSMISSION, &frame));
EXPECT_EQ(frame.crypto_frame->data_length, data.length());
EXPECT_TRUE(creator_.HasPendingFrames());
@@ -745,9 +746,9 @@
EXPECT_LT(0u, bytes_consumed);
} else {
producer_.SaveCryptoData(ENCRYPTION_INITIAL, kOffset, data);
- ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data.length(),
- kOffset, NOT_RETRANSMISSION,
- &frame));
+ ASSERT_TRUE(creator_.ConsumeCryptoData(
+ ENCRYPTION_INITIAL, data.length(), kOffset,
+ /*needs_full_padding=*/true, NOT_RETRANSMISSION, &frame));
size_t bytes_consumed = frame.crypto_frame->data_length;
EXPECT_LT(0u, bytes_consumed);
}
diff --git a/quic/core/quic_packet_generator.cc b/quic/core/quic_packet_generator.cc
index b90880e..ee15df0 100644
--- a/quic/core/quic_packet_generator.cc
+++ b/quic/core/quic_packet_generator.cc
@@ -111,7 +111,8 @@
QuicFrame frame;
if (!packet_creator_.ConsumeCryptoData(
level, write_length - total_bytes_consumed,
- offset + total_bytes_consumed, next_transmission_type_, &frame)) {
+ offset + total_bytes_consumed, fully_pad_crypto_handshake_packets_,
+ next_transmission_type_, &frame)) {
// The only pending data in the packet is non-retransmittable frames. I'm
// assuming here that they won't occupy so much of the packet that a
// CRYPTO frame won't fit.
diff --git a/quic/core/quic_packet_generator_test.cc b/quic/core/quic_packet_generator_test.cc
index 43c3a7f..1d66439 100644
--- a/quic/core/quic_packet_generator_test.cc
+++ b/quic/core/quic_packet_generator_test.cc
@@ -614,16 +614,29 @@
EXPECT_CALL(delegate_, OnSerializedPacket(_))
.WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
- MakeIOVector("foo", &iov_);
- QuicConsumedData consumed = generator_.ConsumeData(
- QuicUtils::GetCryptoStreamId(framer_.transport_version()), &iov_, 1u,
- iov_.iov_len, 0, NO_FIN);
- EXPECT_EQ(3u, consumed.bytes_consumed);
+ std::string data = "foo";
+ MakeIOVector(data, &iov_);
+ size_t bytes_consumed = 0;
+ if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
+ bytes_consumed = generator_.ConsumeCryptoData(ENCRYPTION_INITIAL, data, 0);
+ } else {
+ bytes_consumed =
+ generator_
+ .ConsumeData(
+ QuicUtils::GetCryptoStreamId(framer_.transport_version()),
+ &iov_, 1u, iov_.iov_len, 0, NO_FIN)
+ .bytes_consumed;
+ }
+ EXPECT_EQ(3u, bytes_consumed);
EXPECT_FALSE(generator_.HasQueuedFrames());
EXPECT_FALSE(generator_.HasRetransmittableFrames());
PacketContents contents;
- contents.num_stream_frames = 1;
+ if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
+ contents.num_crypto_frames = 1;
+ } else {
+ contents.num_stream_frames = 1;
+ }
contents.num_padding_frames = 0;
CheckPacketContains(contents, 0);
@@ -631,7 +644,13 @@
// Packet is not fully padded, but we want to future packets to be larger.
ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength());
- EXPECT_EQ(27, packets_[0].encrypted_length);
+ size_t expected_packet_length = 27;
+ if (QuicVersionUsesCryptoFrames(framer_.transport_version())) {
+ // The framing of CRYPTO frames is slightly different than that of stream
+ // frames, so the expected packet length differs slightly.
+ expected_packet_length = 28;
+ }
+ EXPECT_EQ(expected_packet_length, packets_[0].encrypted_length);
}
TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) {