gfe-relnote: Add QuicSession::WriteCryptoData and move encryption level settings from crypto stream to this method. No functional change expected. not protected.
PiperOrigin-RevId: 298384187
Change-Id: I52e37ec54c59bc4edbe41f2f3d1e2f9fb95afa42
diff --git a/quic/core/quic_crypto_stream.cc b/quic/core/quic_crypto_stream.cc
index 86603a9..81d8547 100644
--- a/quic/core/quic_crypto_stream.cc
+++ b/quic/core/quic_crypto_stream.cc
@@ -173,11 +173,8 @@
return;
}
- EncryptionLevel current_level = session()->connection()->encryption_level();
- session()->connection()->SetDefaultEncryptionLevel(level);
size_t bytes_consumed =
- session()->connection()->SendCryptoData(level, data.length(), offset);
- session()->connection()->SetDefaultEncryptionLevel(current_level);
+ stream_delegate()->WriteCryptoData(level, data.length(), offset);
send_buffer->OnStreamDataConsumed(bytes_consumed);
}
@@ -246,15 +243,12 @@
void QuicCryptoStream::WritePendingCryptoRetransmission() {
QUIC_BUG_IF(!QuicVersionUsesCryptoFrames(session()->transport_version()))
<< "Versions less than 47 don't write CRYPTO frames";
- EncryptionLevel current_encryption_level =
- session()->connection()->encryption_level();
for (EncryptionLevel level :
{ENCRYPTION_INITIAL, ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
QuicStreamSendBuffer* send_buffer = &substreams_[level].send_buffer;
- session()->connection()->SetDefaultEncryptionLevel(level);
while (send_buffer->HasPendingRetransmission()) {
auto pending = send_buffer->NextPendingRetransmission();
- size_t bytes_consumed = session()->connection()->SendCryptoData(
+ size_t bytes_consumed = stream_delegate()->WriteCryptoData(
level, pending.length, pending.offset);
send_buffer->OnStreamDataRetransmitted(pending.offset, bytes_consumed);
if (bytes_consumed < pending.length) {
@@ -262,7 +256,6 @@
}
}
}
- session()->connection()->SetDefaultEncryptionLevel(current_encryption_level);
}
void QuicCryptoStream::WritePendingRetransmission() {
@@ -431,13 +424,10 @@
if (retransmission.Empty()) {
return;
}
- EncryptionLevel current_encryption_level =
- session()->connection()->encryption_level();
for (const auto& interval : retransmission) {
size_t retransmission_offset = interval.min();
size_t retransmission_length = interval.max() - interval.min();
- session()->connection()->SetDefaultEncryptionLevel(crypto_frame->level);
- size_t bytes_consumed = session()->connection()->SendCryptoData(
+ size_t bytes_consumed = stream_delegate()->WriteCryptoData(
crypto_frame->level, retransmission_length, retransmission_offset);
send_buffer->OnStreamDataRetransmitted(retransmission_offset,
bytes_consumed);
@@ -445,14 +435,11 @@
break;
}
}
- session()->connection()->SetDefaultEncryptionLevel(current_encryption_level);
}
void QuicCryptoStream::WriteBufferedCryptoFrames() {
QUIC_BUG_IF(!QuicVersionUsesCryptoFrames(session()->transport_version()))
<< "Versions less than 47 don't use CRYPTO frames";
- EncryptionLevel current_encryption_level =
- session()->connection()->encryption_level();
for (EncryptionLevel level :
{ENCRYPTION_INITIAL, ENCRYPTION_ZERO_RTT, ENCRYPTION_FORWARD_SECURE}) {
QuicStreamSendBuffer* send_buffer = &substreams_[level].send_buffer;
@@ -462,8 +449,7 @@
// No buffered data for this encryption level.
continue;
}
- session()->connection()->SetDefaultEncryptionLevel(level);
- size_t bytes_consumed = session()->connection()->SendCryptoData(
+ size_t bytes_consumed = stream_delegate()->WriteCryptoData(
level, data_length, send_buffer->stream_bytes_written());
send_buffer->OnStreamDataConsumed(bytes_consumed);
if (bytes_consumed < data_length) {
@@ -471,7 +457,6 @@
break;
}
}
- session()->connection()->SetDefaultEncryptionLevel(current_encryption_level);
}
bool QuicCryptoStream::HasBufferedCryptoFrames() const {
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 1cc1d90..ebcb28a 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -768,6 +768,19 @@
return data;
}
+size_t QuicSession::WriteCryptoData(EncryptionLevel level,
+ size_t write_length,
+ QuicStreamOffset offset) {
+ DCHECK(QuicVersionUsesCryptoFrames(transport_version()));
+ const auto current_level = connection()->encryption_level();
+ connection_->SetDefaultEncryptionLevel(level);
+ const auto bytes_consumed =
+ connection_->SendCryptoData(level, write_length, offset);
+ // Restores encryption level.
+ connection_->SetDefaultEncryptionLevel(current_level);
+ return bytes_consumed;
+}
+
bool QuicSession::WriteControlFrame(const QuicFrame& frame) {
return connection_->SendControlFrame(frame);
}
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 4549878..84b1500 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -276,6 +276,10 @@
bool is_retransmission,
quiche::QuicheOptional<EncryptionLevel> level) override;
+ size_t WriteCryptoData(EncryptionLevel level,
+ size_t write_length,
+ QuicStreamOffset offset) override;
+
// Called by the QuicCryptoStream when a handshake message is sent.
virtual void OnCryptoHandshakeMessageSent(
const CryptoHandshakeMessage& message);
diff --git a/quic/core/stream_delegate_interface.h b/quic/core/stream_delegate_interface.h
index 898baa5..440b01a 100644
--- a/quic/core/stream_delegate_interface.h
+++ b/quic/core/stream_delegate_interface.h
@@ -30,6 +30,10 @@
StreamSendingState state,
bool is_retransmission,
quiche::QuicheOptional<EncryptionLevel> level) = 0;
+ // Called to write crypto data.
+ virtual size_t WriteCryptoData(EncryptionLevel level,
+ size_t write_length,
+ QuicStreamOffset offset) = 0;
// Called on stream creation.
virtual void RegisterStreamPriority(
QuicStreamId id,