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,