Introduce Legacy Version Encapsulation
This feature allows modern QUIC versions to encapsulate their first flight in Q043 packets, to support SNI-extraction middleboxes that do not support modern versions. More details in the design document at <go/quic-legacy-encaps>.
Introduce legacy version encapsulation, protected by gfe2_reloadable_flag_quic_dispatcher_legacy_version_encapsulation.
PiperOrigin-RevId: 317921151
Change-Id: I2dd8a3641caf3fd3d283613de3d117c1bdbea632
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 7672a37..f933a5a 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -165,6 +165,8 @@
if (length == max_packet_length_) {
return;
}
+ QUIC_DVLOG(1) << "Updating packet creator max packet length from "
+ << max_packet_length_ << " to " << length;
max_packet_length_ = length;
max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
@@ -283,6 +285,10 @@
bool needs_full_padding,
TransmissionType transmission_type,
QuicFrame* frame) {
+ QUIC_DVLOG(2) << "ConsumeCryptoDataToFillCurrentPacket " << level
+ << " write_length " << write_length << " offset " << offset
+ << (needs_full_padding ? " needs_full_padding" : "") << " "
+ << transmission_type;
if (!CreateCryptoFrame(level, write_length, offset, frame)) {
return false;
}
@@ -1339,6 +1345,8 @@
size_t QuicPacketCreator::ConsumeCryptoData(EncryptionLevel level,
size_t write_length,
QuicStreamOffset offset) {
+ QUIC_DVLOG(2) << "ConsumeCryptoData " << level << " write_length "
+ << write_length << " offset " << offset;
QUIC_BUG_IF(!flusher_attached_) << "Packet flusher is not attached when "
"generator tries to write crypto data.";
MaybeBundleAckOpportunistically();
@@ -1595,7 +1603,8 @@
/* last_frame_in_packet= */ true, GetPacketNumberLength());
}
if (frame_len == 0) {
- // Current open packet is full.
+ QUIC_DVLOG(1) << "Flushing because current open packet is full when adding "
+ << frame;
FlushCurrentPacket();
return false;
}
@@ -1718,6 +1727,10 @@
}
}
+ if (disable_padding_override_) {
+ needs_full_padding_ = false;
+ }
+
// Header protection requires a minimum plaintext packet size.
size_t extra_padding_bytes = 0;
if (framer_->version().HasHeaderProtection()) {