Move QuicIetfTransportErrorCodes, QuicErrorCodeToIetfMapping,
and QuicErrorCodeToTransportErrorCode from quic_types to quic_error_codes, next
to closely related QuicHttp3ErrorCode.

gfe-relnote: Refactor, no functional change, not protected.
PiperOrigin-RevId: 305731890
Change-Id: Ibded7eedf8fb05b3fedbe13083715a7c9aded038
diff --git a/quic/core/quic_error_codes.cc b/quic/core/quic_error_codes.cc
index db97d32..1e75060 100644
--- a/quic/core/quic_error_codes.cc
+++ b/quic/core/quic_error_codes.cc
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 #include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
+#include "third_party/boringssl/src/include/openssl/ssl.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
+#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
 
 namespace quic {
 
@@ -206,5 +209,392 @@
   return "INVALID_ERROR_CODE";
 }
 
+std::string QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c) {
+  if (static_cast<uint64_t>(c) >= 0xff00u) {
+    return quiche::QuicheStrCat("Private(", static_cast<uint64_t>(c), ")");
+  }
+  if (c >= CRYPTO_ERROR_FIRST && c <= CRYPTO_ERROR_LAST) {
+    const int tls_error = static_cast<int>(c - CRYPTO_ERROR_FIRST);
+    const char* tls_error_description = SSL_alert_desc_string_long(tls_error);
+    if (strcmp("unknown", tls_error_description) != 0) {
+      return quiche::QuicheStrCat("CRYPTO_ERROR(", tls_error_description, ")");
+    }
+    return quiche::QuicheStrCat("CRYPTO_ERROR(unknown(", tls_error, "))");
+  }
+
+  switch (c) {
+    RETURN_STRING_LITERAL(NO_IETF_QUIC_ERROR);
+    RETURN_STRING_LITERAL(INTERNAL_ERROR);
+    RETURN_STRING_LITERAL(SERVER_BUSY_ERROR);
+    RETURN_STRING_LITERAL(FLOW_CONTROL_ERROR);
+    RETURN_STRING_LITERAL(STREAM_LIMIT_ERROR);
+    RETURN_STRING_LITERAL(STREAM_STATE_ERROR);
+    RETURN_STRING_LITERAL(FINAL_SIZE_ERROR);
+    RETURN_STRING_LITERAL(FRAME_ENCODING_ERROR);
+    RETURN_STRING_LITERAL(TRANSPORT_PARAMETER_ERROR);
+    RETURN_STRING_LITERAL(CONNECTION_ID_LIMIT_ERROR);
+    RETURN_STRING_LITERAL(PROTOCOL_VIOLATION);
+    RETURN_STRING_LITERAL(INVALID_TOKEN);
+    RETURN_STRING_LITERAL(CRYPTO_BUFFER_EXCEEDED);
+    // CRYPTO_ERROR is handled in the if before this switch, these cases do not
+    // change behavior and are only here to make the compiler happy.
+    case CRYPTO_ERROR_FIRST:
+    case CRYPTO_ERROR_LAST:
+      DCHECK(false) << "Unexpected error " << static_cast<uint64_t>(c);
+      break;
+  }
+
+  return quiche::QuicheStrCat("Unknown(", static_cast<uint64_t>(c), ")");
+}
+
+std::ostream& operator<<(std::ostream& os,
+                         const QuicIetfTransportErrorCodes& c) {
+  os << QuicIetfTransportErrorCodeString(c);
+  return os;
+}
+
+QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
+    QuicErrorCode error) {
+  switch (error) {
+    case QUIC_NO_ERROR:
+      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
+    case QUIC_INTERNAL_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_STREAM_DATA_AFTER_TERMINATION:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_PACKET_HEADER:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_FRAME_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_MISSING_PAYLOAD:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_FEC_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_OVERLAPPING_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_UNENCRYPTED_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_MAYBE_CORRUPTED_MEMORY:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_UNENCRYPTED_FEC_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_RST_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_CONNECTION_CLOSE_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_GOAWAY_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_WINDOW_UPDATE_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_BLOCKED_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_STOP_WAITING_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_PATH_CLOSE_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_ACK_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_MESSAGE_DATA:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_VERSION_NEGOTIATION_PACKET:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_PUBLIC_RST_PACKET:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_DECRYPTION_FAILURE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_ENCRYPTION_FAILURE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_PACKET_TOO_LARGE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_PEER_GOING_AWAY:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_STREAM_ID:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_PRIORITY:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_OPEN_STREAMS:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_TOO_MANY_AVAILABLE_STREAMS:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_PUBLIC_RESET:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_VERSION:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_HEADER_ID:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_NEGOTIATED_VALUE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_DECOMPRESSION_FAILURE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_NETWORK_IDLE_TIMEOUT:
+      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
+    case QUIC_HANDSHAKE_TIMEOUT:
+      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
+    case QUIC_ERROR_MIGRATING_ADDRESS:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_ERROR_MIGRATING_PORT:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_PACKET_WRITE_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_PACKET_READ_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_EMPTY_STREAM_FRAME_NO_FIN:
+      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
+    case QUIC_INVALID_HEADERS_STREAM_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA:
+      return {true, {static_cast<uint64_t>(FLOW_CONTROL_ERROR)}};
+    case QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_FLOW_CONTROL_INVALID_WINDOW:
+      return {true, {static_cast<uint64_t>(FLOW_CONTROL_ERROR)}};
+    case QUIC_CONNECTION_IP_POOLED:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_CANCELLED:
+      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
+    case QUIC_BAD_PACKET_LOSS_RATE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_PUBLIC_RESETS_POST_HANDSHAKE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_FAILED_TO_SERIALIZE_PACKET:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_RTOS:
+      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
+    case QUIC_HANDSHAKE_FAILED:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_TAGS_OUT_OF_ORDER:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_TOO_MANY_ENTRIES:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_INVALID_VALUE_LENGTH:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_CRYPTO_MESSAGE_TYPE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_CHANNEL_ID_SIGNATURE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_UNSUPPORTED_PROOF_DEMAND:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_INTERNAL_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CRYPTO_VERSION_NOT_SUPPORTED:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_NO_SUPPORT:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_TOO_MANY_REJECTS:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_PROOF_INVALID:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_DUPLICATE_TAG:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_SERVER_CONFIG_EXPIRED:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_CRYPTO_CHLO_TOO_LARGE:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_VERSION_NEGOTIATION_MISMATCH:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_BAD_MULTIPATH_FLAG:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_MULTIPATH_PATH_DOES_NOT_EXIST:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_MULTIPATH_PATH_NOT_ACTIVE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_IP_ADDRESS_CHANGED:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_STREAM_DATA_INTERVALS:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_STREAM_SEQUENCER_INVALID_STATE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_TOO_MANY_SESSIONS_ON_SERVER:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_STREAM_LENGTH_OVERFLOW:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_MAX_DATA_FRAME_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_MAX_STREAMS_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_STREAMS_BLOCKED_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_STREAM_BLOCKED_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_NEW_CONNECTION_ID_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_STOP_SENDING_FRAME_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_PATH_CHALLENGE_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_PATH_RESPONSE_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case IETF_QUIC_PROTOCOL_VIOLATION:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_INVALID_NEW_TOKEN:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM:
+      return {true, {static_cast<uint64_t>(STREAM_STATE_ERROR)}};
+    case QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_INVALID_RETIRE_CONNECTION_ID_DATA:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_STREAMS_BLOCKED_ERROR:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_MAX_STREAMS_ERROR:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_HTTP_DECODER_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_STALE_CONNECTION_CANCELLED:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_IETF_GQUIC_ERROR_MISSING:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_TRANSPORT_INVALID_CLIENT_INDICATION:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_QPACK_DECOMPRESSION_FAILED:
+      return {
+          false,
+          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_DECOMPRESSION_FAILED)}};
+    case QUIC_QPACK_ENCODER_STREAM_ERROR:
+      return {
+          false,
+          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_ENCODER_STREAM_ERROR)}};
+    case QUIC_QPACK_DECODER_STREAM_ERROR:
+      return {
+          false,
+          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_DECODER_STREAM_ERROR)}};
+    case QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_STREAM_MULTIPLE_OFFSET:
+      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
+    case QUIC_HTTP_FRAME_TOO_LARGE:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_EXCESSIVE_LOAD)}};
+    case QUIC_HTTP_FRAME_ERROR:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_ERROR)}};
+    case QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
+    case QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
+    case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
+    case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
+    case QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_STREAM_CREATION_ERROR)}};
+    case QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_STREAM_CREATION_ERROR)}};
+    case QUIC_HTTP_STREAM_WRONG_DIRECTION:
+      return {true, {static_cast<uint64_t>(STREAM_STATE_ERROR)}};
+    case QUIC_HTTP_CLOSED_CRITICAL_STREAM:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_CLOSED_CRITICAL_STREAM)}};
+    case QUIC_HTTP_MISSING_SETTINGS_FRAME:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_MISSING_SETTINGS)}};
+    case QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER:
+      return {false,
+              {static_cast<uint64_t>(
+                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_SETTINGS_ERROR)}};
+    case QUIC_HPACK_INDEX_VARINT_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_NAME_TOO_LONG:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_VALUE_TOO_LONG:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_NAME_HUFFMAN_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_VALUE_HUFFMAN_ERROR:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_INVALID_INDEX:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_INVALID_NAME_INDEX:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_TRUNCATED_BLOCK:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_FRAGMENT_TOO_LONG:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT:
+      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
+    case QUIC_LAST_ERROR:
+      return {false, {static_cast<uint64_t>(QUIC_LAST_ERROR)}};
+  }
+  // If it's an unknown code, indicate it's an application error code.
+  return {false, {NO_IETF_QUIC_ERROR}};
+}
+
 #undef RETURN_STRING_LITERAL  // undef for jumbo builds
+
 }  // namespace quic
diff --git a/quic/core/quic_error_codes.h b/quic/core/quic_error_codes.h
index 0548e9b..7051993 100644
--- a/quic/core/quic_error_codes.h
+++ b/quic/core/quic_error_codes.h
@@ -431,6 +431,50 @@
 // Returns the name of the QuicErrorCode as a char*
 QUIC_EXPORT_PRIVATE const char* QuicErrorCodeToString(QuicErrorCode error);
 
+// Wire values for QUIC transport errors.
+// https://quicwg.org/base-drafts/draft-ietf-quic-transport.html#name-transport-error-codes
+enum QuicIetfTransportErrorCodes : uint64_t {
+  NO_IETF_QUIC_ERROR = 0x0,
+  INTERNAL_ERROR = 0x1,
+  SERVER_BUSY_ERROR = 0x2,
+  FLOW_CONTROL_ERROR = 0x3,
+  STREAM_LIMIT_ERROR = 0x4,
+  STREAM_STATE_ERROR = 0x5,
+  FINAL_SIZE_ERROR = 0x6,
+  FRAME_ENCODING_ERROR = 0x7,
+  TRANSPORT_PARAMETER_ERROR = 0x8,
+  CONNECTION_ID_LIMIT_ERROR = 0x9,
+  PROTOCOL_VIOLATION = 0xA,
+  INVALID_TOKEN = 0xB,
+  CRYPTO_BUFFER_EXCEEDED = 0xD,
+  CRYPTO_ERROR_FIRST = 0x100,
+  CRYPTO_ERROR_LAST = 0x1FF,
+};
+
+QUIC_EXPORT_PRIVATE std::string QuicIetfTransportErrorCodeString(
+    QuicIetfTransportErrorCodes c);
+
+QUIC_EXPORT_PRIVATE std::ostream& operator<<(
+    std::ostream& os,
+    const QuicIetfTransportErrorCodes& c);
+
+// Returns the mapping of the QuicErrorCode to an IETF TransportErrorCode. If
+// first element of the pair is false, it means that an IETF Application Close
+// should be done instead.
+
+struct QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping {
+  bool is_transport_close_;
+  union {
+    uint64_t application_error_code_;
+    QuicIetfTransportErrorCodes transport_error_code_;
+  };
+};
+
+// Convert QuicErrorCode to transport or application IETF error code
+// to be used in CONNECTION_CLOSE frames.
+QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping
+QuicErrorCodeToTransportErrorCode(QuicErrorCode error);
+
 // Wire values for HTTP/3 errors.
 // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#http-error-codes
 enum class QuicHttp3ErrorCode {
diff --git a/quic/core/quic_error_codes_test.cc b/quic/core/quic_error_codes_test.cc
index f9928bd..de3ebcb 100644
--- a/quic/core/quic_error_codes_test.cc
+++ b/quic/core/quic_error_codes_test.cc
@@ -4,6 +4,9 @@
 
 #include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
 
+#include <cstdint>
+
+#include "third_party/boringssl/src/include/openssl/ssl.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
 
 namespace quic {
@@ -21,6 +24,76 @@
   EXPECT_STREQ("QUIC_NO_ERROR", QuicErrorCodeToString(QUIC_NO_ERROR));
 }
 
+TEST_F(QuicErrorCodesTest, QuicIetfTransportErrorCodeString) {
+  EXPECT_EQ("Private(65280)",
+            QuicIetfTransportErrorCodeString(
+                static_cast<quic::QuicIetfTransportErrorCodes>(0xff00u)));
+
+  EXPECT_EQ("CRYPTO_ERROR(missing extension)",
+            QuicIetfTransportErrorCodeString(
+                static_cast<quic::QuicIetfTransportErrorCodes>(
+                    CRYPTO_ERROR_FIRST + SSL_AD_MISSING_EXTENSION)));
+
+  EXPECT_EQ("NO_IETF_QUIC_ERROR",
+            QuicIetfTransportErrorCodeString(NO_IETF_QUIC_ERROR));
+  EXPECT_EQ("INTERNAL_ERROR", QuicIetfTransportErrorCodeString(INTERNAL_ERROR));
+  EXPECT_EQ("SERVER_BUSY_ERROR",
+            QuicIetfTransportErrorCodeString(SERVER_BUSY_ERROR));
+  EXPECT_EQ("FLOW_CONTROL_ERROR",
+            QuicIetfTransportErrorCodeString(FLOW_CONTROL_ERROR));
+  EXPECT_EQ("STREAM_LIMIT_ERROR",
+            QuicIetfTransportErrorCodeString(STREAM_LIMIT_ERROR));
+  EXPECT_EQ("STREAM_STATE_ERROR",
+            QuicIetfTransportErrorCodeString(STREAM_STATE_ERROR));
+  EXPECT_EQ("FINAL_SIZE_ERROR",
+            QuicIetfTransportErrorCodeString(FINAL_SIZE_ERROR));
+  EXPECT_EQ("FRAME_ENCODING_ERROR",
+            QuicIetfTransportErrorCodeString(FRAME_ENCODING_ERROR));
+  EXPECT_EQ("TRANSPORT_PARAMETER_ERROR",
+            QuicIetfTransportErrorCodeString(TRANSPORT_PARAMETER_ERROR));
+  EXPECT_EQ("CONNECTION_ID_LIMIT_ERROR",
+            QuicIetfTransportErrorCodeString(CONNECTION_ID_LIMIT_ERROR));
+  EXPECT_EQ("PROTOCOL_VIOLATION",
+            QuicIetfTransportErrorCodeString(PROTOCOL_VIOLATION));
+  EXPECT_EQ("INVALID_TOKEN", QuicIetfTransportErrorCodeString(INVALID_TOKEN));
+  EXPECT_EQ("CRYPTO_BUFFER_EXCEEDED",
+            QuicIetfTransportErrorCodeString(CRYPTO_BUFFER_EXCEEDED));
+
+  EXPECT_EQ("Unknown(1024)",
+            QuicIetfTransportErrorCodeString(
+                static_cast<quic::QuicIetfTransportErrorCodes>(0x400)));
+}
+
+TEST_F(QuicErrorCodesTest, QuicErrorCodeToTransportErrorCode) {
+  for (int internal_error_code = 0; internal_error_code < QUIC_LAST_ERROR;
+       ++internal_error_code) {
+    std::string internal_error_code_string =
+        QuicErrorCodeToString(static_cast<QuicErrorCode>(internal_error_code));
+    if (internal_error_code_string == "INVALID_ERROR_CODE") {
+      // Not a valid QuicErrorCode.
+      continue;
+    }
+    QuicErrorCodeToIetfMapping ietf_error_code =
+        QuicErrorCodeToTransportErrorCode(
+            static_cast<QuicErrorCode>(internal_error_code));
+    if (ietf_error_code.is_transport_close_) {
+      QuicIetfTransportErrorCodes transport_error_code =
+          ietf_error_code.transport_error_code_;
+      bool is_valid_transport_error_code = transport_error_code <= 0x0d;
+      EXPECT_TRUE(is_valid_transport_error_code) << internal_error_code_string;
+    } else {
+      // Non-transport errors are application errors, either HTTP/3 or QPACK.
+      uint64_t application_error_code = ietf_error_code.application_error_code_;
+      bool is_valid_http3_error_code =
+          application_error_code >= 0x100 && application_error_code <= 0x110;
+      bool is_valid_qpack_error_code =
+          application_error_code >= 0x200 && application_error_code <= 0x202;
+      EXPECT_TRUE(is_valid_http3_error_code || is_valid_qpack_error_code)
+          << internal_error_code_string;
+    }
+  }
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic
diff --git a/quic/core/quic_types.cc b/quic/core/quic_types.cc
index 38775b2..75144e3 100644
--- a/quic/core/quic_types.cc
+++ b/quic/core/quic_types.cc
@@ -6,7 +6,6 @@
 
 #include <cstdint>
 
-#include "third_party/boringssl/src/include/openssl/ssl.h"
 #include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
 #include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
 
@@ -85,392 +84,6 @@
   case x:                        \
     return #x;
 
-std::string QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c) {
-  if (static_cast<uint64_t>(c) >= 0xff00u) {
-    return quiche::QuicheStrCat("Private(", static_cast<uint64_t>(c), ")");
-  }
-  if (c >= CRYPTO_ERROR_FIRST && c <= CRYPTO_ERROR_LAST) {
-    const int tls_error = static_cast<int>(c - CRYPTO_ERROR_FIRST);
-    const char* tls_error_description = SSL_alert_desc_string_long(tls_error);
-    if (strcmp("unknown", tls_error_description) != 0) {
-      return quiche::QuicheStrCat("CRYPTO_ERROR(", tls_error_description, ")");
-    }
-    return quiche::QuicheStrCat("CRYPTO_ERROR(unknown(", tls_error, "))");
-  }
-
-  switch (c) {
-    RETURN_STRING_LITERAL(NO_IETF_QUIC_ERROR);
-    RETURN_STRING_LITERAL(INTERNAL_ERROR);
-    RETURN_STRING_LITERAL(SERVER_BUSY_ERROR);
-    RETURN_STRING_LITERAL(FLOW_CONTROL_ERROR);
-    RETURN_STRING_LITERAL(STREAM_LIMIT_ERROR);
-    RETURN_STRING_LITERAL(STREAM_STATE_ERROR);
-    RETURN_STRING_LITERAL(FINAL_SIZE_ERROR);
-    RETURN_STRING_LITERAL(FRAME_ENCODING_ERROR);
-    RETURN_STRING_LITERAL(TRANSPORT_PARAMETER_ERROR);
-    RETURN_STRING_LITERAL(CONNECTION_ID_LIMIT_ERROR);
-    RETURN_STRING_LITERAL(PROTOCOL_VIOLATION);
-    RETURN_STRING_LITERAL(INVALID_TOKEN);
-    RETURN_STRING_LITERAL(CRYPTO_BUFFER_EXCEEDED);
-    // CRYPTO_ERROR is handled in the if before this switch, these cases do not
-    // change behavior and are only here to make the compiler happy.
-    case CRYPTO_ERROR_FIRST:
-    case CRYPTO_ERROR_LAST:
-      DCHECK(false) << "Unexpected error " << static_cast<uint64_t>(c);
-      break;
-  }
-
-  return quiche::QuicheStrCat("Unknown(", static_cast<uint64_t>(c), ")");
-}
-
-std::ostream& operator<<(std::ostream& os,
-                         const QuicIetfTransportErrorCodes& c) {
-  os << QuicIetfTransportErrorCodeString(c);
-  return os;
-}
-
-QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
-    QuicErrorCode error) {
-  switch (error) {
-    case QUIC_NO_ERROR:
-      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
-    case QUIC_INTERNAL_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_STREAM_DATA_AFTER_TERMINATION:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_PACKET_HEADER:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_FRAME_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_MISSING_PAYLOAD:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_FEC_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_OVERLAPPING_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_UNENCRYPTED_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_MAYBE_CORRUPTED_MEMORY:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_UNENCRYPTED_FEC_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_RST_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_CONNECTION_CLOSE_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_GOAWAY_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_WINDOW_UPDATE_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_BLOCKED_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_STOP_WAITING_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_PATH_CLOSE_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_ACK_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_MESSAGE_DATA:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_VERSION_NEGOTIATION_PACKET:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_PUBLIC_RST_PACKET:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_DECRYPTION_FAILURE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_ENCRYPTION_FAILURE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_PACKET_TOO_LARGE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_PEER_GOING_AWAY:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_STREAM_ID:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_PRIORITY:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_OPEN_STREAMS:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_TOO_MANY_AVAILABLE_STREAMS:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_PUBLIC_RESET:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_VERSION:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_HEADER_ID:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_NEGOTIATED_VALUE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_DECOMPRESSION_FAILURE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_NETWORK_IDLE_TIMEOUT:
-      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
-    case QUIC_HANDSHAKE_TIMEOUT:
-      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
-    case QUIC_ERROR_MIGRATING_ADDRESS:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_ERROR_MIGRATING_PORT:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_PACKET_WRITE_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_PACKET_READ_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_EMPTY_STREAM_FRAME_NO_FIN:
-      return {true, {static_cast<uint64_t>(FRAME_ENCODING_ERROR)}};
-    case QUIC_INVALID_HEADERS_STREAM_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA:
-      return {true, {static_cast<uint64_t>(FLOW_CONTROL_ERROR)}};
-    case QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_FLOW_CONTROL_INVALID_WINDOW:
-      return {true, {static_cast<uint64_t>(FLOW_CONTROL_ERROR)}};
-    case QUIC_CONNECTION_IP_POOLED:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_CANCELLED:
-      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
-    case QUIC_BAD_PACKET_LOSS_RATE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_PUBLIC_RESETS_POST_HANDSHAKE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_FAILED_TO_SERIALIZE_PACKET:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_RTOS:
-      return {true, {static_cast<uint64_t>(NO_IETF_QUIC_ERROR)}};
-    case QUIC_HANDSHAKE_FAILED:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_TAGS_OUT_OF_ORDER:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_TOO_MANY_ENTRIES:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_INVALID_VALUE_LENGTH:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_CRYPTO_MESSAGE_TYPE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_CHANNEL_ID_SIGNATURE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_UNSUPPORTED_PROOF_DEMAND:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_INTERNAL_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CRYPTO_VERSION_NOT_SUPPORTED:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_NO_SUPPORT:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_TOO_MANY_REJECTS:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_PROOF_INVALID:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_DUPLICATE_TAG:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_SERVER_CONFIG_EXPIRED:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_CRYPTO_CHLO_TOO_LARGE:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_VERSION_NEGOTIATION_MISMATCH:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_BAD_MULTIPATH_FLAG:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_MULTIPATH_PATH_DOES_NOT_EXIST:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_MULTIPATH_PATH_NOT_ACTIVE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_IP_ADDRESS_CHANGED:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_STREAM_DATA_INTERVALS:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_STREAM_SEQUENCER_INVALID_STATE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_TOO_MANY_SESSIONS_ON_SERVER:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_STREAM_LENGTH_OVERFLOW:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_MAX_DATA_FRAME_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_MAX_STREAMS_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_STREAMS_BLOCKED_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_STREAM_BLOCKED_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_NEW_CONNECTION_ID_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_STOP_SENDING_FRAME_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_PATH_CHALLENGE_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_PATH_RESPONSE_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case IETF_QUIC_PROTOCOL_VIOLATION:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_INVALID_NEW_TOKEN:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM:
-      return {true, {static_cast<uint64_t>(STREAM_STATE_ERROR)}};
-    case QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_INVALID_RETIRE_CONNECTION_ID_DATA:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_STREAMS_BLOCKED_ERROR:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_MAX_STREAMS_ERROR:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_HTTP_DECODER_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_STALE_CONNECTION_CANCELLED:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_IETF_GQUIC_ERROR_MISSING:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_TRANSPORT_INVALID_CLIENT_INDICATION:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_QPACK_DECOMPRESSION_FAILED:
-      return {
-          false,
-          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_DECOMPRESSION_FAILED)}};
-    case QUIC_QPACK_ENCODER_STREAM_ERROR:
-      return {
-          false,
-          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_ENCODER_STREAM_ERROR)}};
-    case QUIC_QPACK_DECODER_STREAM_ERROR:
-      return {
-          false,
-          {static_cast<uint64_t>(IETF_QUIC_HTTP_QPACK_DECODER_STREAM_ERROR)}};
-    case QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_STREAM_MULTIPLE_OFFSET:
-      return {true, {static_cast<uint64_t>(PROTOCOL_VIOLATION)}};
-    case QUIC_HTTP_FRAME_TOO_LARGE:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_EXCESSIVE_LOAD)}};
-    case QUIC_HTTP_FRAME_ERROR:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_ERROR)}};
-    case QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
-    case QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
-    case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
-    case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_FRAME_UNEXPECTED)}};
-    case QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_STREAM_CREATION_ERROR)}};
-    case QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_STREAM_CREATION_ERROR)}};
-    case QUIC_HTTP_STREAM_WRONG_DIRECTION:
-      return {true, {static_cast<uint64_t>(STREAM_STATE_ERROR)}};
-    case QUIC_HTTP_CLOSED_CRITICAL_STREAM:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_CLOSED_CRITICAL_STREAM)}};
-    case QUIC_HTTP_MISSING_SETTINGS_FRAME:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_MISSING_SETTINGS)}};
-    case QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER:
-      return {false,
-              {static_cast<uint64_t>(
-                  QuicHttp3ErrorCode::IETF_QUIC_HTTP3_SETTINGS_ERROR)}};
-    case QUIC_HPACK_INDEX_VARINT_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_NAME_TOO_LONG:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_VALUE_TOO_LONG:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_NAME_HUFFMAN_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_VALUE_HUFFMAN_ERROR:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_INVALID_INDEX:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_INVALID_NAME_INDEX:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_TRUNCATED_BLOCK:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_FRAGMENT_TOO_LONG:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT:
-      return {true, {static_cast<uint64_t>(INTERNAL_ERROR)}};
-    case QUIC_LAST_ERROR:
-      return {false, {static_cast<uint64_t>(QUIC_LAST_ERROR)}};
-  }
-  // If it's an unknown code, indicate it's an application error code.
-  return {false, {NO_IETF_QUIC_ERROR}};
-}
-
 std::string QuicIetfFrameTypeString(QuicIetfFrameType t) {
   if (IS_IETF_STREAM_FRAME(t)) {
     return "IETF_STREAM";
@@ -657,4 +270,6 @@
   return os;
 }
 
+#undef RETURN_STRING_LITERAL  // undef for jumbo builds
+
 }  // namespace quic
diff --git a/quic/core/quic_types.h b/quic/core/quic_types.h
index 9e801cd..84f86d9 100644
--- a/quic/core/quic_types.h
+++ b/quic/core/quic_types.h
@@ -548,47 +548,6 @@
 // A vector of lost packets.
 typedef QuicInlinedVector<LostPacket, 2> LostPacketVector;
 
-enum QuicIetfTransportErrorCodes : uint64_t {
-  NO_IETF_QUIC_ERROR = 0x0,
-  INTERNAL_ERROR = 0x1,
-  SERVER_BUSY_ERROR = 0x2,
-  FLOW_CONTROL_ERROR = 0x3,
-  STREAM_LIMIT_ERROR = 0x4,
-  STREAM_STATE_ERROR = 0x5,
-  FINAL_SIZE_ERROR = 0x6,
-  FRAME_ENCODING_ERROR = 0x7,
-  TRANSPORT_PARAMETER_ERROR = 0x8,
-  CONNECTION_ID_LIMIT_ERROR = 0x9,
-  PROTOCOL_VIOLATION = 0xA,
-  INVALID_TOKEN = 0xB,
-  CRYPTO_BUFFER_EXCEEDED = 0xD,
-  CRYPTO_ERROR_FIRST = 0x100,
-  CRYPTO_ERROR_LAST = 0x1FF,
-};
-QUIC_EXPORT_PRIVATE std::string QuicIetfTransportErrorCodeString(
-    QuicIetfTransportErrorCodes c);
-
-QUIC_EXPORT_PRIVATE std::ostream& operator<<(
-    std::ostream& os,
-    const QuicIetfTransportErrorCodes& c);
-
-// Returns the mapping of the QuicErrorCode to an IETF TransportErrorCode. If
-// first element of the pair is false, it means that an IETF Application Close
-// should be done instead.
-
-struct QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping {
-  bool is_transport_close_;
-  union {
-    uint64_t application_error_code_;
-    QuicIetfTransportErrorCodes transport_error_code_;
-  };
-};
-
-// Convert QuicErrorCode to transport or application IETF error code
-// to be used in CONNECTION_CLOSE frames.
-QUIC_EXPORT_PRIVATE QuicErrorCodeToIetfMapping
-QuicErrorCodeToTransportErrorCode(QuicErrorCode error);
-
 // Please note, this value cannot used directly for packet serialization.
 enum QuicLongHeaderType : uint8_t {
   VERSION_NEGOTIATION,
diff --git a/quic/core/quic_types_test.cc b/quic/core/quic_types_test.cc
deleted file mode 100644
index 485c3b6..0000000
--- a/quic/core/quic_types_test.cc
+++ /dev/null
@@ -1,91 +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.
-
-#include "net/third_party/quiche/src/quic/core/quic_types.h"
-
-#include <cstdint>
-
-#include "third_party/boringssl/src/include/openssl/ssl.h"
-#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
-#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
-
-namespace quic {
-namespace test {
-namespace {
-
-class QuicTypesTest : public QuicTest {};
-
-TEST_F(QuicTypesTest, QuicIetfTransportErrorCodeString) {
-  EXPECT_EQ("Private(65280)",
-            QuicIetfTransportErrorCodeString(
-                static_cast<quic::QuicIetfTransportErrorCodes>(0xff00u)));
-
-  EXPECT_EQ("CRYPTO_ERROR(missing extension)",
-            QuicIetfTransportErrorCodeString(
-                static_cast<quic::QuicIetfTransportErrorCodes>(
-                    CRYPTO_ERROR_FIRST + SSL_AD_MISSING_EXTENSION)));
-
-  EXPECT_EQ("NO_IETF_QUIC_ERROR",
-            QuicIetfTransportErrorCodeString(NO_IETF_QUIC_ERROR));
-  EXPECT_EQ("INTERNAL_ERROR", QuicIetfTransportErrorCodeString(INTERNAL_ERROR));
-  EXPECT_EQ("SERVER_BUSY_ERROR",
-            QuicIetfTransportErrorCodeString(SERVER_BUSY_ERROR));
-  EXPECT_EQ("FLOW_CONTROL_ERROR",
-            QuicIetfTransportErrorCodeString(FLOW_CONTROL_ERROR));
-  EXPECT_EQ("STREAM_LIMIT_ERROR",
-            QuicIetfTransportErrorCodeString(STREAM_LIMIT_ERROR));
-  EXPECT_EQ("STREAM_STATE_ERROR",
-            QuicIetfTransportErrorCodeString(STREAM_STATE_ERROR));
-  EXPECT_EQ("FINAL_SIZE_ERROR",
-            QuicIetfTransportErrorCodeString(FINAL_SIZE_ERROR));
-  EXPECT_EQ("FRAME_ENCODING_ERROR",
-            QuicIetfTransportErrorCodeString(FRAME_ENCODING_ERROR));
-  EXPECT_EQ("TRANSPORT_PARAMETER_ERROR",
-            QuicIetfTransportErrorCodeString(TRANSPORT_PARAMETER_ERROR));
-  EXPECT_EQ("CONNECTION_ID_LIMIT_ERROR",
-            QuicIetfTransportErrorCodeString(CONNECTION_ID_LIMIT_ERROR));
-  EXPECT_EQ("PROTOCOL_VIOLATION",
-            QuicIetfTransportErrorCodeString(PROTOCOL_VIOLATION));
-  EXPECT_EQ("INVALID_TOKEN", QuicIetfTransportErrorCodeString(INVALID_TOKEN));
-  EXPECT_EQ("CRYPTO_BUFFER_EXCEEDED",
-            QuicIetfTransportErrorCodeString(CRYPTO_BUFFER_EXCEEDED));
-
-  EXPECT_EQ("Unknown(1024)",
-            QuicIetfTransportErrorCodeString(
-                static_cast<quic::QuicIetfTransportErrorCodes>(0x400)));
-}
-
-TEST_F(QuicTypesTest, QuicErrorCodeToTransportErrorCode) {
-  for (int internal_error_code = 0; internal_error_code < QUIC_LAST_ERROR;
-       ++internal_error_code) {
-    std::string internal_error_code_string =
-        QuicErrorCodeToString(static_cast<QuicErrorCode>(internal_error_code));
-    if (internal_error_code_string == "INVALID_ERROR_CODE") {
-      // Not a valid QuicErrorCode.
-      continue;
-    }
-    QuicErrorCodeToIetfMapping ietf_error_code =
-        QuicErrorCodeToTransportErrorCode(
-            static_cast<QuicErrorCode>(internal_error_code));
-    if (ietf_error_code.is_transport_close_) {
-      QuicIetfTransportErrorCodes transport_error_code =
-          ietf_error_code.transport_error_code_;
-      bool is_valid_transport_error_code = transport_error_code <= 0x0d;
-      EXPECT_TRUE(is_valid_transport_error_code) << internal_error_code_string;
-    } else {
-      // Non-transport errors are application errors, either HTTP/3 or QPACK.
-      uint64_t application_error_code = ietf_error_code.application_error_code_;
-      bool is_valid_http3_error_code =
-          application_error_code >= 0x100 && application_error_code <= 0x110;
-      bool is_valid_qpack_error_code =
-          application_error_code >= 0x200 && application_error_code <= 0x202;
-      EXPECT_TRUE(is_valid_http3_error_code || is_valid_qpack_error_code)
-          << internal_error_code_string;
-    }
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace quic