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,