Add SupportsEcn() interface to QuicPacketWriter. A follow-on will use this interface in QuicConnection.

PiperOrigin-RevId: 534582526
diff --git a/quiche/quic/core/batch_writer/quic_batch_writer_base.h b/quiche/quic/core/batch_writer/quic_batch_writer_base.h
index a33b8e2..9f9f226 100644
--- a/quiche/quic/core/batch_writer/quic_batch_writer_base.h
+++ b/quiche/quic/core/batch_writer/quic_batch_writer_base.h
@@ -52,6 +52,8 @@
 
   bool IsBatchMode() const final { return true; }
 
+  bool SupportsEcn() const override { return false; }
+
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& /*self_address*/,
       const QuicSocketAddress& /*peer_address*/) final {
diff --git a/quiche/quic/core/quic_default_packet_writer.h b/quiche/quic/core/quic_default_packet_writer.h
index c513362..1235e49 100644
--- a/quiche/quic/core/quic_default_packet_writer.h
+++ b/quiche/quic/core/quic_default_packet_writer.h
@@ -37,6 +37,7 @@
       const QuicSocketAddress& peer_address) const override;
   bool SupportsReleaseTime() const override;
   bool IsBatchMode() const override;
+  bool SupportsEcn() const override { return true; }
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& self_address,
       const QuicSocketAddress& peer_address) override;
diff --git a/quiche/quic/core/quic_packet_writer.h b/quiche/quic/core/quic_packet_writer.h
index c3b3fab..c684656 100644
--- a/quiche/quic/core/quic_packet_writer.h
+++ b/quiche/quic/core/quic_packet_writer.h
@@ -141,6 +141,9 @@
   // True=Batch mode. False=PassThrough mode.
   virtual bool IsBatchMode() const = 0;
 
+  // Returns true if the writer will mark ECN on packets it writes.
+  virtual bool SupportsEcn() const = 0;
+
   // PassThrough mode: Return {nullptr, nullptr}
   //
   // Batch mode:
diff --git a/quiche/quic/core/quic_packet_writer_wrapper.h b/quiche/quic/core/quic_packet_writer_wrapper.h
index 7d43fdc..6bbf7fe 100644
--- a/quiche/quic/core/quic_packet_writer_wrapper.h
+++ b/quiche/quic/core/quic_packet_writer_wrapper.h
@@ -36,6 +36,7 @@
       const QuicSocketAddress& peer_address) const override;
   bool SupportsReleaseTime() const override;
   bool IsBatchMode() const override;
+  bool SupportsEcn() const override { return writer_->SupportsEcn(); }
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& self_address,
       const QuicSocketAddress& peer_address) override;
diff --git a/quiche/quic/masque/masque_encapsulated_client.cc b/quiche/quic/masque/masque_encapsulated_client.cc
index 34adde4..f6bdc58 100644
--- a/quiche/quic/masque/masque_encapsulated_client.cc
+++ b/quiche/quic/masque/masque_encapsulated_client.cc
@@ -199,6 +199,8 @@
   bool SupportsReleaseTime() const override { return false; }
 
   bool IsBatchMode() const override { return false; }
+
+  bool SupportsEcn() const override { return false; }
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& /*self_address*/,
       const QuicSocketAddress& /*peer_address*/) override {
diff --git a/quiche/quic/qbone/qbone_stream_test.cc b/quiche/quic/qbone/qbone_stream_test.cc
index 16052bc..00e854f 100644
--- a/quiche/quic/qbone/qbone_stream_test.cc
+++ b/quiche/quic/qbone/qbone_stream_test.cc
@@ -123,6 +123,8 @@
 
   bool IsBatchMode() const override { return false; }
 
+  bool SupportsEcn() const override { return false; }
+
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& self_address,
       const QuicSocketAddress& peer_address) override {
diff --git a/quiche/quic/test_tools/first_flight.h b/quiche/quic/test_tools/first_flight.h
index 948511a..cd16f94 100644
--- a/quiche/quic/test_tools/first_flight.h
+++ b/quiche/quic/test_tools/first_flight.h
@@ -53,6 +53,7 @@
   }
   bool SupportsReleaseTime() const override { return false; }
   bool IsBatchMode() const override { return false; }
+  bool SupportsEcn() const override { return false; }
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& /*self_address*/,
       const QuicSocketAddress& /*peer_address*/) override {
diff --git a/quiche/quic/test_tools/quic_test_utils.h b/quiche/quic/test_tools/quic_test_utils.h
index e368259..ab1ec88 100644
--- a/quiche/quic/test_tools/quic_test_utils.h
+++ b/quiche/quic/test_tools/quic_test_utils.h
@@ -1196,6 +1196,7 @@
               (const QuicSocketAddress& peer_address), (const, override));
   MOCK_METHOD(bool, SupportsReleaseTime, (), (const, override));
   MOCK_METHOD(bool, IsBatchMode, (), (const, override));
+  MOCK_METHOD(bool, SupportsEcn, (), (const, override));
   MOCK_METHOD(QuicPacketBuffer, GetNextWriteLocation,
               (const QuicIpAddress& self_address,
                const QuicSocketAddress& peer_address),
@@ -1859,6 +1860,8 @@
 
   bool IsBatchMode() const override { return is_batch_mode_; }
 
+  bool SupportsEcn() const override { return true; }
+
   QuicPacketBuffer GetNextWriteLocation(
       const QuicIpAddress& /*self_address*/,
       const QuicSocketAddress& /*peer_address*/) override;
diff --git a/quiche/quic/test_tools/simulator/quic_endpoint_base.h b/quiche/quic/test_tools/simulator/quic_endpoint_base.h
index c734b81..bb3ae10 100644
--- a/quiche/quic/test_tools/simulator/quic_endpoint_base.h
+++ b/quiche/quic/test_tools/simulator/quic_endpoint_base.h
@@ -88,6 +88,7 @@
         const QuicSocketAddress& peer_address) const override;
     bool SupportsReleaseTime() const override;
     bool IsBatchMode() const override;
+    bool SupportsEcn() const override { return false; }
     QuicPacketBuffer GetNextWriteLocation(
         const QuicIpAddress& self_address,
         const QuicSocketAddress& peer_address) override;