Send SETTINGS_QPACK_BLOCKED_STREAMS in QuicSendControlStream.

gfe-relnote: n/a, change to QUIC v99-only code.  Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 268688607
Change-Id: Id25ac721e4e095c44934e12763039fc068e05f43
diff --git a/quic/core/http/quic_send_control_stream.cc b/quic/core/http/quic_send_control_stream.cc
index 507380d..d1e0e62 100644
--- a/quic/core/http/quic_send_control_stream.cc
+++ b/quic/core/http/quic_send_control_stream.cc
@@ -14,11 +14,13 @@
     QuicStreamId id,
     QuicSession* session,
     uint64_t qpack_maximum_dynamic_table_capacity,
+    uint64_t qpack_maximum_blocked_streams,
     uint64_t max_inbound_header_list_size)
     : QuicStream(id, session, /*is_static = */ true, WRITE_UNIDIRECTIONAL),
       settings_sent_(false),
       qpack_maximum_dynamic_table_capacity_(
           qpack_maximum_dynamic_table_capacity),
+      qpack_maximum_blocked_streams_(qpack_maximum_blocked_streams),
       max_inbound_header_list_size_(max_inbound_header_list_size) {}
 
 void QuicSendControlStream::OnStreamReset(const QuicRstStreamFrame& /*frame*/) {
@@ -43,10 +45,12 @@
                     nullptr);
 
   SettingsFrame settings;
-  settings.values[SETTINGS_MAX_HEADER_LIST_SIZE] =
-      max_inbound_header_list_size_;
   settings.values[SETTINGS_QPACK_MAX_TABLE_CAPACITY] =
       qpack_maximum_dynamic_table_capacity_;
+  settings.values[SETTINGS_QPACK_BLOCKED_STREAMS] =
+      qpack_maximum_blocked_streams_;
+  settings.values[SETTINGS_MAX_HEADER_LIST_SIZE] =
+      max_inbound_header_list_size_;
 
   std::unique_ptr<char[]> buffer;
   QuicByteCount frame_length =
diff --git a/quic/core/http/quic_send_control_stream.h b/quic/core/http/quic_send_control_stream.h
index 2e8959b..aa8fff1 100644
--- a/quic/core/http/quic_send_control_stream.h
+++ b/quic/core/http/quic_send_control_stream.h
@@ -22,6 +22,7 @@
   QuicSendControlStream(QuicStreamId id,
                         QuicSession* session,
                         uint64_t qpack_maximum_dynamic_table_capacity,
+                        uint64_t qpack_maximum_blocked_streams,
                         uint64_t max_inbound_header_list_size);
   QuicSendControlStream(const QuicSendControlStream&) = delete;
   QuicSendControlStream& operator=(const QuicSendControlStream&) = delete;
@@ -52,6 +53,8 @@
 
   // SETTINGS_QPACK_MAX_TABLE_CAPACITY value to send.
   const uint64_t qpack_maximum_dynamic_table_capacity_;
+  // SETTINGS_QPACK_BLOCKED_STREAMS value to send.
+  const uint64_t qpack_maximum_blocked_streams_;
   // SETTINGS_MAX_HEADER_LIST_SIZE value to send.
   const uint64_t max_inbound_header_list_size_;
 };
diff --git a/quic/core/http/quic_send_control_stream_test.cc b/quic/core/http/quic_send_control_stream_test.cc
index 6ee06bd..5c6a1a9 100644
--- a/quic/core/http/quic_send_control_stream_test.cc
+++ b/quic/core/http/quic_send_control_stream_test.cc
@@ -86,19 +86,22 @@
   }
 
   session_.set_qpack_maximum_dynamic_table_capacity(255);
+  session_.set_qpack_maximum_blocked_streams(16);
   session_.set_max_inbound_header_list_size(1024);
 
   Initialize();
   testing::InSequence s;
 
   std::string expected_write_data = QuicTextUtils::HexDecode(
-      "00"      // stream type: control stream
-      "04"      // frame type: SETTINGS frame
-      "06"      // frame length
-      "01"      // SETTINGS_QPACK_MAX_TABLE_CAPACITY
-      "40ff"    // 255
-      "06"      // SETTINGS_MAX_HEADER_LIST_SIZE
-      "4400");  // 1024
+      "00"    // stream type: control stream
+      "04"    // frame type: SETTINGS frame
+      "08"    // frame length
+      "01"    // SETTINGS_QPACK_MAX_TABLE_CAPACITY
+      "40ff"  // 255
+      "06"    // SETTINGS_MAX_HEADER_LIST_SIZE
+      "4400"  // 1024
+      "07"    // SETTINGS_QPACK_BLOCKED_STREAMS
+      "10");  // 16
 
   auto buffer = std::make_unique<char[]>(expected_write_data.size());
   QuicDataWriter writer(expected_write_data.size(), buffer.get());
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index a2bb509..8980fc2 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -391,8 +391,6 @@
         std::make_unique<QpackDecoder>(qpack_maximum_dynamic_table_capacity_,
                                        qpack_maximum_blocked_streams_, this);
     MaybeInitializeHttp3UnidirectionalStreams();
-    // TODO(b/112770235): Send SETTINGS_QPACK_BLOCKED_STREAMS with value
-    // qpack_maximum_blocked_streams_.
   }
 
   spdy_framer_visitor_->set_max_header_list_size(max_inbound_header_list_size_);
@@ -960,7 +958,8 @@
   if (!send_control_stream_ && CanOpenNextOutgoingUnidirectionalStream()) {
     auto send_control = std::make_unique<QuicSendControlStream>(
         GetNextOutgoingUnidirectionalStreamId(), this,
-        qpack_maximum_dynamic_table_capacity_, max_inbound_header_list_size_);
+        qpack_maximum_dynamic_table_capacity_, qpack_maximum_blocked_streams_,
+        max_inbound_header_list_size_);
     send_control_stream_ = send_control.get();
     ActivateStream(std::move(send_control));
   }