Replace quiche_error_code_wrapper platform API with a virtual method on the writer.

PiperOrigin-RevId: 439783894
diff --git a/common/platform/api/quiche_error_code_wrappers.h b/common/platform/api/quiche_error_code_wrappers.h
deleted file mode 100644
index ef08dce..0000000
--- a/common/platform/api/quiche_error_code_wrappers.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef QUICHE_COMMON_PLATFORM_API_QUICHE_ERROR_CODE_WRAPPERS_H_
-#define QUICHE_COMMON_PLATFORM_API_QUICHE_ERROR_CODE_WRAPPERS_H_
-
-#include "quiche_platform_impl/quiche_error_code_wrappers_impl.h"
-
-// TODO(vasilvv): ensure WRITE_STATUS_MSG_TOO_BIG works everywhere and remove
-// this.
-#define QUICHE_EMSGSIZE QUICHE_EMSGSIZE_IMPL
-
-#endif  // QUICHE_COMMON_PLATFORM_API_QUICHE_ERROR_CODE_WRAPPERS_H_
diff --git a/quic/core/batch_writer/quic_batch_writer_base.h b/quic/core/batch_writer/quic_batch_writer_base.h
index e7d1f12..bca8646 100644
--- a/quic/core/batch_writer/quic_batch_writer_base.h
+++ b/quic/core/batch_writer/quic_batch_writer_base.h
@@ -38,6 +38,10 @@
 
   void SetWritable() final { write_blocked_ = false; }
 
+  absl::optional<int> MessageTooBigErrorCode() const override {
+    return EMSGSIZE;
+  }
+
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& /*peer_address*/) const final {
     return kMaxOutgoingPacketSize;
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index 95b274a..b995d39 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -32,7 +32,6 @@
 #include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
 #include "quic/platform/api/quic_epoll.h"
-#include "quic/platform/api/quic_error_code_wrappers.h"
 #include "quic/platform/api/quic_expect_bug.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
@@ -5614,7 +5613,7 @@
         TypeByteIsServerHello(type_byte)) {
       QUIC_DVLOG(1) << "Return write error for packet containing ServerHello";
       error_returned_ = true;
-      return WriteResult(WRITE_STATUS_ERROR, QUIC_EMSGSIZE);
+      return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
     }
     return result;
   }
@@ -5698,7 +5697,7 @@
     } else if (!error_returned_) {
       QUIC_DVLOG(1) << "Return write error for short header packet";
       error_returned_ = true;
-      return WriteResult(WRITE_STATUS_ERROR, QUIC_EMSGSIZE);
+      return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
     }
     return QuicPacketWriterWrapper::WritePacket(buffer, buf_len, self_address,
                                                 peer_address, options);
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 0cc3296..0716c52 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -39,7 +39,6 @@
 #include "quic/core/quic_utils.h"
 #include "quic/platform/api/quic_bug_tracker.h"
 #include "quic/platform/api/quic_client_stats.h"
-#include "quic/platform/api/quic_error_code_wrappers.h"
 #include "quic/platform/api/quic_exported_stats.h"
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
@@ -3089,7 +3088,7 @@
         packet.encrypted_buffer.data(), packet.encrypted_buffer.length(),
         packet.self_address.host(), packet.peer_address, per_packet_options_);
     QUIC_DVLOG(1) << ENDPOINT << "Sending buffered packet, result: " << result;
-    if (IsMsgTooBig(result) &&
+    if (IsMsgTooBig(writer_, result) &&
         packet.encrypted_buffer.length() > long_term_mtu_) {
       // When MSG_TOO_BIG is returned, the system typically knows what the
       // actual MTU is, so there is no need to probe further.
@@ -3530,7 +3529,7 @@
 
   // In some cases, an MTU probe can cause EMSGSIZE. This indicates that the
   // MTU discovery is permanently unsuccessful.
-  if (IsMsgTooBig(result)) {
+  if (IsMsgTooBig(writer_, result)) {
     if (is_mtu_discovery) {
       // When MSG_TOO_BIG is returned, the system typically knows what the
       // actual MTU is, so there is no need to probe further.
@@ -3824,9 +3823,12 @@
   }
 }
 
-bool QuicConnection::IsMsgTooBig(const WriteResult& result) {
+bool QuicConnection::IsMsgTooBig(const QuicPacketWriter* writer,
+                                 const WriteResult& result) {
+  absl::optional<int> writer_error_code = writer->MessageTooBigErrorCode();
   return (result.status == WRITE_STATUS_MSG_TOO_BIG) ||
-         (IsWriteError(result.status) && result.error_code == QUIC_EMSGSIZE);
+         (writer_error_code.has_value() && IsWriteError(result.status) &&
+          result.error_code == *writer_error_code);
 }
 
 bool QuicConnection::ShouldDiscardPacket(EncryptionLevel encryption_level) {
@@ -3883,22 +3885,20 @@
   const std::string error_details = absl::StrCat(
       "Write failed with error: ", error_code, " (", strerror(error_code), ")");
   QUIC_LOG_FIRST_N(ERROR, 2) << ENDPOINT << error_details;
-  switch (error_code) {
-    case QUIC_EMSGSIZE:
-      CloseConnection(QUIC_PACKET_WRITE_ERROR, error_details,
-                      ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
-      break;
-    default:
-      // We can't send an error as the socket is presumably borked.
-      if (version().HasIetfInvariantHeader()) {
-        QUIC_CODE_COUNT(quic_tear_down_local_connection_on_write_error_ietf);
-      } else {
-        QUIC_CODE_COUNT(
-            quic_tear_down_local_connection_on_write_error_non_ietf);
-      }
-      CloseConnection(QUIC_PACKET_WRITE_ERROR, error_details,
-                      ConnectionCloseBehavior::SILENT_CLOSE);
+  absl::optional<int> writer_error_code = writer_->MessageTooBigErrorCode();
+  if (writer_error_code.has_value() && error_code == *writer_error_code) {
+    CloseConnection(QUIC_PACKET_WRITE_ERROR, error_details,
+                    ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+    return;
   }
+  // We can't send an error as the socket is presumably borked.
+  if (version().HasIetfInvariantHeader()) {
+    QUIC_CODE_COUNT(quic_tear_down_local_connection_on_write_error_ietf);
+  } else {
+    QUIC_CODE_COUNT(quic_tear_down_local_connection_on_write_error_non_ietf);
+  }
+  CloseConnection(QUIC_PACKET_WRITE_ERROR, error_details,
+                  ConnectionCloseBehavior::SILENT_CLOSE);
 }
 
 QuicPacketBuffer QuicConnection::GetPacketBuffer() {
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 17c0830..7f4ac8b 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -599,7 +599,7 @@
   void OnWriteError(int error_code);
 
   // Whether |result| represents a MSG TOO BIG write error.
-  bool IsMsgTooBig(const WriteResult& result);
+  bool IsMsgTooBig(const QuicPacketWriter* writer, const WriteResult& result);
 
   // If the socket is not blocked, writes queued packets.
   void WriteIfNotBlocked();
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 6061fd5..6cab381 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -34,7 +34,6 @@
 #include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
 #include "quic/core/quic_versions.h"
-#include "quic/platform/api/quic_error_code_wrappers.h"
 #include "quic/platform/api/quic_expect_bug.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_ip_address.h"
@@ -12320,7 +12319,7 @@
   uint32_t num_packets_write_attempts = writer_->packets_write_attempts();
 
   writer_->SetShouldWriteFail();
-  writer_->SetWriteError(QUIC_EMSGSIZE);
+  writer_->SetWriteError(*writer_->MessageTooBigErrorCode());
   const QuicSocketAddress kNewPeerAddress(QuicIpAddress::Any4(), 12345);
   EXPECT_CALL(visitor_, OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
       .Times(0u);
diff --git a/quic/core/quic_default_packet_writer.cc b/quic/core/quic_default_packet_writer.cc
index e71169a..23ff3c2 100644
--- a/quic/core/quic_default_packet_writer.cc
+++ b/quic/core/quic_default_packet_writer.cc
@@ -41,6 +41,10 @@
   write_blocked_ = false;
 }
 
+absl::optional<int> QuicDefaultPacketWriter::MessageTooBigErrorCode() const {
+  return EMSGSIZE;
+}
+
 QuicByteCount QuicDefaultPacketWriter::GetMaxPacketSize(
     const QuicSocketAddress& /*peer_address*/) const {
   return kMaxOutgoingPacketSize;
diff --git a/quic/core/quic_default_packet_writer.h b/quic/core/quic_default_packet_writer.h
index df30f24..f332c96 100644
--- a/quic/core/quic_default_packet_writer.h
+++ b/quic/core/quic_default_packet_writer.h
@@ -31,6 +31,7 @@
                           PerPacketOptions* options) override;
   bool IsWriteBlocked() const override;
   void SetWritable() override;
+  absl::optional<int> MessageTooBigErrorCode() const override;
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& peer_address) const override;
   bool SupportsReleaseTime() const override;
diff --git a/quic/core/quic_packet_writer.h b/quic/core/quic_packet_writer.h
index 107c818..78b576a 100644
--- a/quic/core/quic_packet_writer.h
+++ b/quic/core/quic_packet_writer.h
@@ -8,6 +8,7 @@
 #include <cstddef>
 #include <utility>
 
+#include "absl/types/optional.h"
 #include "quic/core/quic_packets.h"
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_ip_address.h"
@@ -114,6 +115,11 @@
   // is received or an asynchronous write completes.
   virtual void SetWritable() = 0;
 
+  // The error code used by the writer to indicate that the write failed due to
+  // supplied packet being too big.  This is equivalent to returning
+  // WRITE_STATUS_MSG_TOO_BIG as a status.
+  virtual absl::optional<int> MessageTooBigErrorCode() const = 0;
+
   // Returns the maximum size of the packet which can be written using this
   // writer for the supplied peer address.  This size may actually exceed the
   // size of a valid QUIC packet.
diff --git a/quic/core/quic_packet_writer_wrapper.cc b/quic/core/quic_packet_writer_wrapper.cc
index 6f7c54e..62ec0cf 100644
--- a/quic/core/quic_packet_writer_wrapper.cc
+++ b/quic/core/quic_packet_writer_wrapper.cc
@@ -32,6 +32,10 @@
   writer_->SetWritable();
 }
 
+absl::optional<int> QuicPacketWriterWrapper::MessageTooBigErrorCode() const {
+  return writer_->MessageTooBigErrorCode();
+}
+
 QuicByteCount QuicPacketWriterWrapper::GetMaxPacketSize(
     const QuicSocketAddress& peer_address) const {
   return writer_->GetMaxPacketSize(peer_address);
diff --git a/quic/core/quic_packet_writer_wrapper.h b/quic/core/quic_packet_writer_wrapper.h
index e6dac04..a7f2d01 100644
--- a/quic/core/quic_packet_writer_wrapper.h
+++ b/quic/core/quic_packet_writer_wrapper.h
@@ -31,6 +31,7 @@
                           PerPacketOptions* options) override;
   bool IsWriteBlocked() const override;
   void SetWritable() override;
+  absl::optional<int> MessageTooBigErrorCode() const override;
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& peer_address) const override;
   bool SupportsReleaseTime() const override;
diff --git a/quic/masque/masque_encapsulated_epoll_client.cc b/quic/masque/masque_encapsulated_epoll_client.cc
index 8891e4a..047d25c 100644
--- a/quic/masque/masque_encapsulated_epoll_client.cc
+++ b/quic/masque/masque_encapsulated_epoll_client.cc
@@ -39,6 +39,10 @@
 
   void SetWritable() override {}
 
+  absl::optional<int> MessageTooBigErrorCode() const override {
+    return EMSGSIZE;
+  }
+
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& /*peer_address*/) const override {
     return kMasqueMaxEncapsulatedPacketSize;
diff --git a/quic/platform/api/quic_error_code_wrappers.h b/quic/platform/api/quic_error_code_wrappers.h
deleted file mode 100644
index 173c240..0000000
--- a/quic/platform/api/quic_error_code_wrappers.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef QUICHE_QUIC_PLATFORM_API_QUIC_ERROR_CODE_WRAPPERS_H_
-#define QUICHE_QUIC_PLATFORM_API_QUIC_ERROR_CODE_WRAPPERS_H_
-
-#include "common/platform/api/quiche_error_code_wrappers.h"
-
-// TODO(vasilvv): ensure WRITE_STATUS_MSG_TOO_BIG works everywhere and remove
-// this.
-#define QUIC_EMSGSIZE QUICHE_EMSGSIZE
-
-#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_ERROR_CODE_WRAPPERS_H_
diff --git a/quic/qbone/qbone_stream_test.cc b/quic/qbone/qbone_stream_test.cc
index c2c862a..0ec7871 100644
--- a/quic/qbone/qbone_stream_test.cc
+++ b/quic/qbone/qbone_stream_test.cc
@@ -108,6 +108,10 @@
 
   void SetWritable() override {}
 
+  absl::optional<int> MessageTooBigErrorCode() const override {
+    return absl::nullopt;
+  }
+
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& peer_address) const override {
     return 0;
diff --git a/quic/test_tools/first_flight.h b/quic/test_tools/first_flight.h
index 448a189..7c6123d 100644
--- a/quic/test_tools/first_flight.h
+++ b/quic/test_tools/first_flight.h
@@ -44,6 +44,9 @@
   // Overrides for QuicPacketWriter.
   bool IsWriteBlocked() const override { return false; }
   void SetWritable() override {}
+  absl::optional<int> MessageTooBigErrorCode() const override {
+    return absl::nullopt;
+  }
   QuicByteCount GetMaxPacketSize(
       const QuicSocketAddress& /*peer_address*/) const override {
     return kMaxOutgoingPacketSize;
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index 9bc950f..17804a1 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -28,7 +28,6 @@
 #include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
 #include "quic/core/quic_versions.h"
-#include "quic/platform/api/quic_error_code_wrappers.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
 #include "quic/test_tools/crypto_test_utils.h"
@@ -1452,10 +1451,10 @@
   }
   if (next_packet_too_large_) {
     next_packet_too_large_ = false;
-    return WriteResult(WRITE_STATUS_ERROR, QUIC_EMSGSIZE);
+    return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
   }
   if (always_get_packet_too_large_) {
-    return WriteResult(WRITE_STATUS_ERROR, QUIC_EMSGSIZE);
+    return WriteResult(WRITE_STATUS_ERROR, *MessageTooBigErrorCode());
   }
   if (IsWriteBlocked()) {
     return WriteResult(is_write_blocked_data_buffered_
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 82262eb..7e474b5 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -1148,6 +1148,8 @@
               (override));
   MOCK_METHOD(bool, IsWriteBlocked, (), (const, override));
   MOCK_METHOD(void, SetWritable, (), (override));
+  MOCK_METHOD(absl::optional<int>, MessageTooBigErrorCode, (),
+              (const, override));
   MOCK_METHOD(QuicByteCount, GetMaxPacketSize,
               (const QuicSocketAddress& peer_address), (const, override));
   MOCK_METHOD(bool, SupportsReleaseTime, (), (const, override));
@@ -1745,6 +1747,8 @@
 
   bool IsWriteBlocked() const override { return write_blocked_; }
 
+  absl::optional<int> MessageTooBigErrorCode() const override { return 0x1234; }
+
   void SetWriteBlocked() { write_blocked_ = true; }
 
   void SetWritable() override { write_blocked_ = false; }
diff --git a/quic/test_tools/simulator/quic_endpoint_base.cc b/quic/test_tools/simulator/quic_endpoint_base.cc
index b4882b8..e66af8b 100644
--- a/quic/test_tools/simulator/quic_endpoint_base.cc
+++ b/quic/test_tools/simulator/quic_endpoint_base.cc
@@ -165,6 +165,10 @@
   is_blocked_ = false;
 }
 
+absl::optional<int> QuicEndpointBase::Writer::MessageTooBigErrorCode() const {
+  return absl::nullopt;
+}
+
 QuicByteCount QuicEndpointBase::Writer::GetMaxPacketSize(
     const QuicSocketAddress& /*peer_address*/) const {
   return kMaxOutgoingPacketSize;
diff --git a/quic/test_tools/simulator/quic_endpoint_base.h b/quic/test_tools/simulator/quic_endpoint_base.h
index 8fbb9c0..9578c79 100644
--- a/quic/test_tools/simulator/quic_endpoint_base.h
+++ b/quic/test_tools/simulator/quic_endpoint_base.h
@@ -84,6 +84,7 @@
                             PerPacketOptions* options) override;
     bool IsWriteBlocked() const override;
     void SetWritable() override;
+    absl::optional<int> MessageTooBigErrorCode() const override;
     QuicByteCount GetMaxPacketSize(
         const QuicSocketAddress& peer_address) const override;
     bool SupportsReleaseTime() const override;