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;