blob: cf153e3eea76576cdce367404d82e04994884b15 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
renjietang360aa082020-04-24 13:53:56 -07005#include <cstdint>
vasilvv0a09b8f2020-04-27 08:08:55 -07006#include <cstring>
7
bnc0ed49eb2020-04-09 12:06:21 -07008#include "third_party/boringssl/src/include/openssl/ssl.h"
vasilvv0a09b8f2020-04-27 08:08:55 -07009#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
bnc0ed49eb2020-04-09 12:06:21 -070010#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
11#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050012
13namespace quic {
14
15#define RETURN_STRING_LITERAL(x) \
16 case x: \
17 return #x;
18
19const char* QuicRstStreamErrorCodeToString(QuicRstStreamErrorCode error) {
20 switch (error) {
21 RETURN_STRING_LITERAL(QUIC_STREAM_NO_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -050022 RETURN_STRING_LITERAL(QUIC_ERROR_PROCESSING_STREAM);
23 RETURN_STRING_LITERAL(QUIC_MULTIPLE_TERMINATION_OFFSETS);
24 RETURN_STRING_LITERAL(QUIC_BAD_APPLICATION_PAYLOAD);
bnccb0ffbc2020-04-13 10:53:11 -070025 RETURN_STRING_LITERAL(QUIC_STREAM_CONNECTION_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -050026 RETURN_STRING_LITERAL(QUIC_STREAM_PEER_GOING_AWAY);
27 RETURN_STRING_LITERAL(QUIC_STREAM_CANCELLED);
28 RETURN_STRING_LITERAL(QUIC_RST_ACKNOWLEDGEMENT);
29 RETURN_STRING_LITERAL(QUIC_REFUSED_STREAM);
QUICHE teama6ef0a62019-03-07 20:34:33 -050030 RETURN_STRING_LITERAL(QUIC_INVALID_PROMISE_URL);
31 RETURN_STRING_LITERAL(QUIC_UNAUTHORIZED_PROMISE_URL);
32 RETURN_STRING_LITERAL(QUIC_DUPLICATE_PROMISE_URL);
33 RETURN_STRING_LITERAL(QUIC_PROMISE_VARY_MISMATCH);
34 RETURN_STRING_LITERAL(QUIC_INVALID_PROMISE_METHOD);
35 RETURN_STRING_LITERAL(QUIC_PUSH_STREAM_TIMED_OUT);
36 RETURN_STRING_LITERAL(QUIC_HEADERS_TOO_LARGE);
37 RETURN_STRING_LITERAL(QUIC_STREAM_TTL_EXPIRED);
bnccb0ffbc2020-04-13 10:53:11 -070038 RETURN_STRING_LITERAL(QUIC_DATA_AFTER_CLOSE_OFFSET);
39 RETURN_STRING_LITERAL(QUIC_STREAM_GENERAL_PROTOCOL_ERROR);
40 RETURN_STRING_LITERAL(QUIC_STREAM_INTERNAL_ERROR);
41 RETURN_STRING_LITERAL(QUIC_STREAM_STREAM_CREATION_ERROR);
42 RETURN_STRING_LITERAL(QUIC_STREAM_CLOSED_CRITICAL_STREAM);
43 RETURN_STRING_LITERAL(QUIC_STREAM_FRAME_UNEXPECTED);
44 RETURN_STRING_LITERAL(QUIC_STREAM_FRAME_ERROR);
45 RETURN_STRING_LITERAL(QUIC_STREAM_EXCESSIVE_LOAD);
46 RETURN_STRING_LITERAL(QUIC_STREAM_ID_ERROR);
47 RETURN_STRING_LITERAL(QUIC_STREAM_SETTINGS_ERROR);
48 RETURN_STRING_LITERAL(QUIC_STREAM_MISSING_SETTINGS);
49 RETURN_STRING_LITERAL(QUIC_STREAM_REQUEST_REJECTED);
50 RETURN_STRING_LITERAL(QUIC_STREAM_REQUEST_INCOMPLETE);
51 RETURN_STRING_LITERAL(QUIC_STREAM_CONNECT_ERROR);
52 RETURN_STRING_LITERAL(QUIC_STREAM_VERSION_FALLBACK);
53 RETURN_STRING_LITERAL(QUIC_STREAM_DECOMPRESSION_FAILED);
54 RETURN_STRING_LITERAL(QUIC_STREAM_ENCODER_STREAM_ERROR);
55 RETURN_STRING_LITERAL(QUIC_STREAM_DECODER_STREAM_ERROR);
bnc12add152020-04-20 08:05:29 -070056 RETURN_STRING_LITERAL(QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE);
bnccb0ffbc2020-04-13 10:53:11 -070057 RETURN_STRING_LITERAL(QUIC_STREAM_LAST_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -050058 }
59 // Return a default value so that we return this when |error| doesn't match
60 // any of the QuicRstStreamErrorCodes. This can happen when the RstStream
61 // frame sent by the peer (attacker) has invalid error code.
62 return "INVALID_RST_STREAM_ERROR_CODE";
63}
64
65const char* QuicErrorCodeToString(QuicErrorCode error) {
66 switch (error) {
67 RETURN_STRING_LITERAL(QUIC_NO_ERROR);
68 RETURN_STRING_LITERAL(QUIC_INTERNAL_ERROR);
69 RETURN_STRING_LITERAL(QUIC_STREAM_DATA_AFTER_TERMINATION);
70 RETURN_STRING_LITERAL(QUIC_INVALID_PACKET_HEADER);
71 RETURN_STRING_LITERAL(QUIC_INVALID_FRAME_DATA);
72 RETURN_STRING_LITERAL(QUIC_MISSING_PAYLOAD);
73 RETURN_STRING_LITERAL(QUIC_INVALID_FEC_DATA);
74 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_DATA);
75 RETURN_STRING_LITERAL(QUIC_OVERLAPPING_STREAM_DATA);
76 RETURN_STRING_LITERAL(QUIC_UNENCRYPTED_STREAM_DATA);
77 RETURN_STRING_LITERAL(QUIC_INVALID_RST_STREAM_DATA);
78 RETURN_STRING_LITERAL(QUIC_INVALID_CONNECTION_CLOSE_DATA);
79 RETURN_STRING_LITERAL(QUIC_INVALID_GOAWAY_DATA);
80 RETURN_STRING_LITERAL(QUIC_INVALID_WINDOW_UPDATE_DATA);
81 RETURN_STRING_LITERAL(QUIC_INVALID_BLOCKED_DATA);
82 RETURN_STRING_LITERAL(QUIC_INVALID_STOP_WAITING_DATA);
83 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_CLOSE_DATA);
84 RETURN_STRING_LITERAL(QUIC_INVALID_ACK_DATA);
85 RETURN_STRING_LITERAL(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
86 RETURN_STRING_LITERAL(QUIC_INVALID_PUBLIC_RST_PACKET);
87 RETURN_STRING_LITERAL(QUIC_DECRYPTION_FAILURE);
88 RETURN_STRING_LITERAL(QUIC_ENCRYPTION_FAILURE);
89 RETURN_STRING_LITERAL(QUIC_PACKET_TOO_LARGE);
90 RETURN_STRING_LITERAL(QUIC_PEER_GOING_AWAY);
91 RETURN_STRING_LITERAL(QUIC_HANDSHAKE_FAILED);
92 RETURN_STRING_LITERAL(QUIC_CRYPTO_TAGS_OUT_OF_ORDER);
93 RETURN_STRING_LITERAL(QUIC_CRYPTO_TOO_MANY_ENTRIES);
94 RETURN_STRING_LITERAL(QUIC_CRYPTO_TOO_MANY_REJECTS);
95 RETURN_STRING_LITERAL(QUIC_CRYPTO_INVALID_VALUE_LENGTH)
96 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE);
97 RETURN_STRING_LITERAL(QUIC_CRYPTO_INTERNAL_ERROR);
98 RETURN_STRING_LITERAL(QUIC_CRYPTO_VERSION_NOT_SUPPORTED);
QUICHE teama6ef0a62019-03-07 20:34:33 -050099 RETURN_STRING_LITERAL(QUIC_CRYPTO_NO_SUPPORT);
100 RETURN_STRING_LITERAL(QUIC_INVALID_CRYPTO_MESSAGE_TYPE);
101 RETURN_STRING_LITERAL(QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER);
102 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND);
103 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP);
104 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND);
105 RETURN_STRING_LITERAL(QUIC_UNSUPPORTED_PROOF_DEMAND);
106 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_ID);
107 RETURN_STRING_LITERAL(QUIC_INVALID_PRIORITY);
108 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OPEN_STREAMS);
109 RETURN_STRING_LITERAL(QUIC_PUBLIC_RESET);
110 RETURN_STRING_LITERAL(QUIC_INVALID_VERSION);
111 RETURN_STRING_LITERAL(QUIC_INVALID_HEADER_ID);
112 RETURN_STRING_LITERAL(QUIC_INVALID_NEGOTIATED_VALUE);
113 RETURN_STRING_LITERAL(QUIC_DECOMPRESSION_FAILURE);
114 RETURN_STRING_LITERAL(QUIC_NETWORK_IDLE_TIMEOUT);
115 RETURN_STRING_LITERAL(QUIC_HANDSHAKE_TIMEOUT);
116 RETURN_STRING_LITERAL(QUIC_ERROR_MIGRATING_ADDRESS);
117 RETURN_STRING_LITERAL(QUIC_ERROR_MIGRATING_PORT);
118 RETURN_STRING_LITERAL(QUIC_PACKET_WRITE_ERROR);
119 RETURN_STRING_LITERAL(QUIC_PACKET_READ_ERROR);
120 RETURN_STRING_LITERAL(QUIC_EMPTY_STREAM_FRAME_NO_FIN);
121 RETURN_STRING_LITERAL(QUIC_INVALID_HEADERS_STREAM_DATA);
122 RETURN_STRING_LITERAL(QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE);
123 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA);
124 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA);
125 RETURN_STRING_LITERAL(QUIC_FLOW_CONTROL_INVALID_WINDOW);
126 RETURN_STRING_LITERAL(QUIC_CONNECTION_IP_POOLED);
127 RETURN_STRING_LITERAL(QUIC_PROOF_INVALID);
128 RETURN_STRING_LITERAL(QUIC_CRYPTO_DUPLICATE_TAG);
129 RETURN_STRING_LITERAL(QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT);
130 RETURN_STRING_LITERAL(QUIC_CRYPTO_SERVER_CONFIG_EXPIRED);
131 RETURN_STRING_LITERAL(QUIC_INVALID_CHANNEL_ID_SIGNATURE);
132 RETURN_STRING_LITERAL(QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED);
133 RETURN_STRING_LITERAL(QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO);
134 RETURN_STRING_LITERAL(QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE);
135 RETURN_STRING_LITERAL(QUIC_VERSION_NEGOTIATION_MISMATCH);
136 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS);
137 RETURN_STRING_LITERAL(QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS);
138 RETURN_STRING_LITERAL(QUIC_CONNECTION_CANCELLED);
139 RETURN_STRING_LITERAL(QUIC_BAD_PACKET_LOSS_RATE);
140 RETURN_STRING_LITERAL(QUIC_PUBLIC_RESETS_POST_HANDSHAKE);
141 RETURN_STRING_LITERAL(QUIC_FAILED_TO_SERIALIZE_PACKET);
142 RETURN_STRING_LITERAL(QUIC_TOO_MANY_AVAILABLE_STREAMS);
143 RETURN_STRING_LITERAL(QUIC_UNENCRYPTED_FEC_DATA);
144 RETURN_STRING_LITERAL(QUIC_BAD_MULTIPATH_FLAG);
145 RETURN_STRING_LITERAL(QUIC_IP_ADDRESS_CHANGED);
146 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS);
147 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES);
148 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
149 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM);
150 RETURN_STRING_LITERAL(QUIC_TOO_MANY_RTOS);
151 RETURN_STRING_LITERAL(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA);
152 RETURN_STRING_LITERAL(QUIC_MAYBE_CORRUPTED_MEMORY);
153 RETURN_STRING_LITERAL(QUIC_CRYPTO_CHLO_TOO_LARGE);
154 RETURN_STRING_LITERAL(QUIC_MULTIPATH_PATH_DOES_NOT_EXIST);
155 RETURN_STRING_LITERAL(QUIC_MULTIPATH_PATH_NOT_ACTIVE);
156 RETURN_STRING_LITERAL(QUIC_TOO_MANY_STREAM_DATA_INTERVALS);
157 RETURN_STRING_LITERAL(QUIC_STREAM_SEQUENCER_INVALID_STATE);
158 RETURN_STRING_LITERAL(QUIC_TOO_MANY_SESSIONS_ON_SERVER);
159 RETURN_STRING_LITERAL(QUIC_STREAM_LENGTH_OVERFLOW);
160 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG);
161 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500162 RETURN_STRING_LITERAL(QUIC_INVALID_MAX_DATA_FRAME_DATA);
163 RETURN_STRING_LITERAL(QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA);
164 RETURN_STRING_LITERAL(QUIC_INVALID_STREAM_BLOCKED_DATA);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700165 RETURN_STRING_LITERAL(QUIC_MAX_STREAMS_DATA);
166 RETURN_STRING_LITERAL(QUIC_STREAMS_BLOCKED_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500167 RETURN_STRING_LITERAL(QUIC_INVALID_NEW_CONNECTION_ID_DATA);
168 RETURN_STRING_LITERAL(QUIC_INVALID_RETIRE_CONNECTION_ID_DATA);
169 RETURN_STRING_LITERAL(QUIC_INVALID_STOP_SENDING_FRAME_DATA);
170 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_CHALLENGE_DATA);
171 RETURN_STRING_LITERAL(QUIC_INVALID_PATH_RESPONSE_DATA);
172 RETURN_STRING_LITERAL(QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED);
173 RETURN_STRING_LITERAL(QUIC_INVALID_MESSAGE_DATA);
174 RETURN_STRING_LITERAL(IETF_QUIC_PROTOCOL_VIOLATION);
175 RETURN_STRING_LITERAL(QUIC_INVALID_NEW_TOKEN);
176 RETURN_STRING_LITERAL(QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM);
177 RETURN_STRING_LITERAL(QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM);
fkastenholz3c4eabf2019-04-22 07:49:59 -0700178 RETURN_STRING_LITERAL(QUIC_STREAMS_BLOCKED_ERROR);
179 RETURN_STRING_LITERAL(QUIC_MAX_STREAMS_ERROR);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500180 RETURN_STRING_LITERAL(QUIC_HTTP_DECODER_ERROR);
181 RETURN_STRING_LITERAL(QUIC_STALE_CONNECTION_CANCELLED);
fkastenholze9d71a82019-04-09 05:12:13 -0700182 RETURN_STRING_LITERAL(QUIC_IETF_GQUIC_ERROR_MISSING);
renjietang28c04b72019-07-01 15:08:09 -0700183 RETURN_STRING_LITERAL(
184 QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM);
fayang83d7e3e2019-07-31 14:45:19 -0700185 RETURN_STRING_LITERAL(QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES);
vasilvvefc6af82019-10-11 12:46:56 -0700186 RETURN_STRING_LITERAL(QUIC_TRANSPORT_INVALID_CLIENT_INDICATION);
bnc13753e62019-10-17 04:40:09 -0700187 RETURN_STRING_LITERAL(QUIC_QPACK_DECOMPRESSION_FAILED);
188 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR);
189 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_ERROR);
renjietang15afba32019-10-23 14:32:35 -0700190 RETURN_STRING_LITERAL(QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET);
191 RETURN_STRING_LITERAL(QUIC_STREAM_MULTIPLE_OFFSET);
bncdfabdfb2020-01-17 17:46:40 -0800192 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_TOO_LARGE);
193 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_ERROR);
194 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM);
195 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM);
bnc3e8fe7c2020-03-10 17:44:58 -0700196 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM);
197 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM);
bncec3602c2020-03-12 17:57:59 -0700198 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM);
199 RETURN_STRING_LITERAL(QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM);
200 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_WRONG_DIRECTION);
bnc09c1eda2020-03-13 04:52:38 -0700201 RETURN_STRING_LITERAL(QUIC_HTTP_CLOSED_CRITICAL_STREAM);
bncf72ef0b2020-04-02 06:59:32 -0700202 RETURN_STRING_LITERAL(QUIC_HTTP_MISSING_SETTINGS_FRAME);
203 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER);
bnc9a7a6732020-04-14 06:08:02 -0700204 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_MAX_PUSH_ID);
renjietang360aa082020-04-24 13:53:56 -0700205 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_LIMIT_TOO_LOW);
renjietangd7afab22020-06-19 16:30:00 -0700206 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH);
207 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH);
bncaf8e3302020-07-27 07:42:59 -0700208 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_INVALID_STREAM_ID);
209 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS);
bnc77b46412020-02-21 08:09:09 -0800210 RETURN_STRING_LITERAL(QUIC_HPACK_INDEX_VARINT_ERROR);
211 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_LENGTH_VARINT_ERROR);
212 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR);
213 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_TOO_LONG);
214 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_TOO_LONG);
215 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_HUFFMAN_ERROR);
216 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_HUFFMAN_ERROR);
217 RETURN_STRING_LITERAL(QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE);
218 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_INDEX);
219 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_NAME_INDEX);
220 RETURN_STRING_LITERAL(QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED);
221 RETURN_STRING_LITERAL(
222 QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK);
223 RETURN_STRING_LITERAL(
224 QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING);
225 RETURN_STRING_LITERAL(QUIC_HPACK_TRUNCATED_BLOCK);
226 RETURN_STRING_LITERAL(QUIC_HPACK_FRAGMENT_TOO_LONG);
227 RETURN_STRING_LITERAL(QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT);
renjietanga5a2ca92020-06-15 13:19:36 -0700228 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_UNRETRANSMITTABLE);
229 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED);
230 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED);
fayang8bff33c2020-08-06 07:37:22 -0700231 RETURN_STRING_LITERAL(QUIC_SILENT_IDLE_TIMEOUT);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500232
233 RETURN_STRING_LITERAL(QUIC_LAST_ERROR);
234 // Intentionally have no default case, so we'll break the build
235 // if we add errors and don't put them here.
236 }
237 // Return a default value so that we return this when |error| doesn't match
238 // any of the QuicErrorCodes. This can happen when the ConnectionClose
239 // frame sent by the peer (attacker) has invalid error code.
240 return "INVALID_ERROR_CODE";
241}
242
bnc0ed49eb2020-04-09 12:06:21 -0700243std::string QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c) {
244 if (static_cast<uint64_t>(c) >= 0xff00u) {
245 return quiche::QuicheStrCat("Private(", static_cast<uint64_t>(c), ")");
246 }
247 if (c >= CRYPTO_ERROR_FIRST && c <= CRYPTO_ERROR_LAST) {
248 const int tls_error = static_cast<int>(c - CRYPTO_ERROR_FIRST);
249 const char* tls_error_description = SSL_alert_desc_string_long(tls_error);
250 if (strcmp("unknown", tls_error_description) != 0) {
251 return quiche::QuicheStrCat("CRYPTO_ERROR(", tls_error_description, ")");
252 }
253 return quiche::QuicheStrCat("CRYPTO_ERROR(unknown(", tls_error, "))");
254 }
255
256 switch (c) {
257 RETURN_STRING_LITERAL(NO_IETF_QUIC_ERROR);
258 RETURN_STRING_LITERAL(INTERNAL_ERROR);
259 RETURN_STRING_LITERAL(SERVER_BUSY_ERROR);
260 RETURN_STRING_LITERAL(FLOW_CONTROL_ERROR);
261 RETURN_STRING_LITERAL(STREAM_LIMIT_ERROR);
262 RETURN_STRING_LITERAL(STREAM_STATE_ERROR);
263 RETURN_STRING_LITERAL(FINAL_SIZE_ERROR);
264 RETURN_STRING_LITERAL(FRAME_ENCODING_ERROR);
265 RETURN_STRING_LITERAL(TRANSPORT_PARAMETER_ERROR);
266 RETURN_STRING_LITERAL(CONNECTION_ID_LIMIT_ERROR);
267 RETURN_STRING_LITERAL(PROTOCOL_VIOLATION);
268 RETURN_STRING_LITERAL(INVALID_TOKEN);
269 RETURN_STRING_LITERAL(CRYPTO_BUFFER_EXCEEDED);
270 // CRYPTO_ERROR is handled in the if before this switch, these cases do not
271 // change behavior and are only here to make the compiler happy.
272 case CRYPTO_ERROR_FIRST:
273 case CRYPTO_ERROR_LAST:
274 DCHECK(false) << "Unexpected error " << static_cast<uint64_t>(c);
275 break;
276 }
277
278 return quiche::QuicheStrCat("Unknown(", static_cast<uint64_t>(c), ")");
279}
280
281std::ostream& operator<<(std::ostream& os,
282 const QuicIetfTransportErrorCodes& c) {
283 os << QuicIetfTransportErrorCodeString(c);
284 return os;
285}
286
287QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
288 QuicErrorCode error) {
289 switch (error) {
290 case QUIC_NO_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700291 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700292 case QUIC_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700293 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700294 case QUIC_STREAM_DATA_AFTER_TERMINATION:
bnc0054cc62020-04-09 18:22:57 -0700295 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700296 case QUIC_INVALID_PACKET_HEADER:
bnc0054cc62020-04-09 18:22:57 -0700297 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700298 case QUIC_INVALID_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700299 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700300 case QUIC_MISSING_PAYLOAD:
bnc0054cc62020-04-09 18:22:57 -0700301 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700302 case QUIC_INVALID_FEC_DATA:
bnc0054cc62020-04-09 18:22:57 -0700303 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700304 case QUIC_INVALID_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700305 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700306 case QUIC_OVERLAPPING_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700307 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700308 case QUIC_UNENCRYPTED_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700309 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700310 case QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700311 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700312 case QUIC_MAYBE_CORRUPTED_MEMORY:
bnc0054cc62020-04-09 18:22:57 -0700313 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700314 case QUIC_UNENCRYPTED_FEC_DATA:
bnc0054cc62020-04-09 18:22:57 -0700315 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700316 case QUIC_INVALID_RST_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700317 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700318 case QUIC_INVALID_CONNECTION_CLOSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700319 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700320 case QUIC_INVALID_GOAWAY_DATA:
bnc0054cc62020-04-09 18:22:57 -0700321 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700322 case QUIC_INVALID_WINDOW_UPDATE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700323 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700324 case QUIC_INVALID_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700325 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700326 case QUIC_INVALID_STOP_WAITING_DATA:
bnc0054cc62020-04-09 18:22:57 -0700327 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700328 case QUIC_INVALID_PATH_CLOSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700329 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700330 case QUIC_INVALID_ACK_DATA:
bnc0054cc62020-04-09 18:22:57 -0700331 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700332 case QUIC_INVALID_MESSAGE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700333 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700334 case QUIC_INVALID_VERSION_NEGOTIATION_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700335 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700336 case QUIC_INVALID_PUBLIC_RST_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700337 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700338 case QUIC_DECRYPTION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700339 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700340 case QUIC_ENCRYPTION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700341 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700342 case QUIC_PACKET_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700343 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700344 case QUIC_PEER_GOING_AWAY:
bnc0054cc62020-04-09 18:22:57 -0700345 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700346 case QUIC_INVALID_STREAM_ID:
bnc0054cc62020-04-09 18:22:57 -0700347 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700348 case QUIC_INVALID_PRIORITY:
bnc0054cc62020-04-09 18:22:57 -0700349 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700350 case QUIC_TOO_MANY_OPEN_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700351 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700352 case QUIC_TOO_MANY_AVAILABLE_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700353 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700354 case QUIC_PUBLIC_RESET:
bnc0054cc62020-04-09 18:22:57 -0700355 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700356 case QUIC_INVALID_VERSION:
bnc0054cc62020-04-09 18:22:57 -0700357 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700358 case QUIC_INVALID_HEADER_ID:
bnc0054cc62020-04-09 18:22:57 -0700359 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700360 case QUIC_INVALID_NEGOTIATED_VALUE:
bnc0054cc62020-04-09 18:22:57 -0700361 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700362 case QUIC_DECOMPRESSION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700363 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700364 case QUIC_NETWORK_IDLE_TIMEOUT:
bnc0054cc62020-04-09 18:22:57 -0700365 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
fayang8bff33c2020-08-06 07:37:22 -0700366 case QUIC_SILENT_IDLE_TIMEOUT:
367 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700368 case QUIC_HANDSHAKE_TIMEOUT:
bnc0054cc62020-04-09 18:22:57 -0700369 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700370 case QUIC_ERROR_MIGRATING_ADDRESS:
bnc0054cc62020-04-09 18:22:57 -0700371 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700372 case QUIC_ERROR_MIGRATING_PORT:
bnc0054cc62020-04-09 18:22:57 -0700373 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700374 case QUIC_PACKET_WRITE_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700375 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700376 case QUIC_PACKET_READ_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700377 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700378 case QUIC_EMPTY_STREAM_FRAME_NO_FIN:
bnc0054cc62020-04-09 18:22:57 -0700379 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700380 case QUIC_INVALID_HEADERS_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700381 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700382 case QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700383 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700384 case QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA:
bnc0054cc62020-04-09 18:22:57 -0700385 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700386 case QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA:
bnc0054cc62020-04-09 18:22:57 -0700387 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700388 case QUIC_FLOW_CONTROL_INVALID_WINDOW:
bnc0054cc62020-04-09 18:22:57 -0700389 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700390 case QUIC_CONNECTION_IP_POOLED:
bnc0054cc62020-04-09 18:22:57 -0700391 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700392 case QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS:
bnc0054cc62020-04-09 18:22:57 -0700393 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700394 case QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS:
bnc0054cc62020-04-09 18:22:57 -0700395 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700396 case QUIC_CONNECTION_CANCELLED:
bnc0054cc62020-04-09 18:22:57 -0700397 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700398 case QUIC_BAD_PACKET_LOSS_RATE:
bnc0054cc62020-04-09 18:22:57 -0700399 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700400 case QUIC_PUBLIC_RESETS_POST_HANDSHAKE:
bnc0054cc62020-04-09 18:22:57 -0700401 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700402 case QUIC_FAILED_TO_SERIALIZE_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700403 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700404 case QUIC_TOO_MANY_RTOS:
bnc0054cc62020-04-09 18:22:57 -0700405 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700406 case QUIC_HANDSHAKE_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700407 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700408 case QUIC_CRYPTO_TAGS_OUT_OF_ORDER:
bnc0054cc62020-04-09 18:22:57 -0700409 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700410 case QUIC_CRYPTO_TOO_MANY_ENTRIES:
bnc0054cc62020-04-09 18:22:57 -0700411 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700412 case QUIC_CRYPTO_INVALID_VALUE_LENGTH:
bnc0054cc62020-04-09 18:22:57 -0700413 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700414 case QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE:
bnc0054cc62020-04-09 18:22:57 -0700415 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700416 case QUIC_INVALID_CRYPTO_MESSAGE_TYPE:
bnc0054cc62020-04-09 18:22:57 -0700417 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700418 case QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER:
bnc0054cc62020-04-09 18:22:57 -0700419 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700420 case QUIC_INVALID_CHANNEL_ID_SIGNATURE:
bnc0054cc62020-04-09 18:22:57 -0700421 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700422 case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
bnc0054cc62020-04-09 18:22:57 -0700423 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700424 case QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP:
bnc0054cc62020-04-09 18:22:57 -0700425 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700426 case QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND:
bnc0054cc62020-04-09 18:22:57 -0700427 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700428 case QUIC_UNSUPPORTED_PROOF_DEMAND:
bnc0054cc62020-04-09 18:22:57 -0700429 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700430 case QUIC_CRYPTO_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700431 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700432 case QUIC_CRYPTO_VERSION_NOT_SUPPORTED:
bnc0054cc62020-04-09 18:22:57 -0700433 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700434 case QUIC_CRYPTO_NO_SUPPORT:
bnc0054cc62020-04-09 18:22:57 -0700435 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700436 case QUIC_CRYPTO_TOO_MANY_REJECTS:
bnc0054cc62020-04-09 18:22:57 -0700437 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700438 case QUIC_PROOF_INVALID:
bnc0054cc62020-04-09 18:22:57 -0700439 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700440 case QUIC_CRYPTO_DUPLICATE_TAG:
bnc0054cc62020-04-09 18:22:57 -0700441 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700442 case QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT:
bnc0054cc62020-04-09 18:22:57 -0700443 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700444 case QUIC_CRYPTO_SERVER_CONFIG_EXPIRED:
bnc0054cc62020-04-09 18:22:57 -0700445 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700446 case QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700447 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700448 case QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO:
bnc0054cc62020-04-09 18:22:57 -0700449 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700450 case QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE:
bnc0054cc62020-04-09 18:22:57 -0700451 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700452 case QUIC_CRYPTO_CHLO_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700453 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700454 case QUIC_VERSION_NEGOTIATION_MISMATCH:
bnc0054cc62020-04-09 18:22:57 -0700455 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700456 case QUIC_BAD_MULTIPATH_FLAG:
bnc0054cc62020-04-09 18:22:57 -0700457 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700458 case QUIC_MULTIPATH_PATH_DOES_NOT_EXIST:
bnc0054cc62020-04-09 18:22:57 -0700459 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700460 case QUIC_MULTIPATH_PATH_NOT_ACTIVE:
bnc0054cc62020-04-09 18:22:57 -0700461 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700462 case QUIC_IP_ADDRESS_CHANGED:
bnc0054cc62020-04-09 18:22:57 -0700463 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700464 case QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700465 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700466 case QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES:
bnc0054cc62020-04-09 18:22:57 -0700467 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700468 case QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK:
bnc0054cc62020-04-09 18:22:57 -0700469 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700470 case QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700471 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700472 case QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG:
bnc0054cc62020-04-09 18:22:57 -0700473 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700474 case QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700475 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700476 case QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED:
bnc0054cc62020-04-09 18:22:57 -0700477 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700478 case QUIC_TOO_MANY_STREAM_DATA_INTERVALS:
bnc0054cc62020-04-09 18:22:57 -0700479 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700480 case QUIC_STREAM_SEQUENCER_INVALID_STATE:
bnc0054cc62020-04-09 18:22:57 -0700481 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700482 case QUIC_TOO_MANY_SESSIONS_ON_SERVER:
bnc0054cc62020-04-09 18:22:57 -0700483 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700484 case QUIC_STREAM_LENGTH_OVERFLOW:
bnc0054cc62020-04-09 18:22:57 -0700485 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700486 case QUIC_INVALID_MAX_DATA_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700487 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700488 case QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700489 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700490 case QUIC_MAX_STREAMS_DATA:
bnc0054cc62020-04-09 18:22:57 -0700491 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700492 case QUIC_STREAMS_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700493 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700494 case QUIC_INVALID_STREAM_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700495 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700496 case QUIC_INVALID_NEW_CONNECTION_ID_DATA:
bnc0054cc62020-04-09 18:22:57 -0700497 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700498 case QUIC_INVALID_STOP_SENDING_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700499 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700500 case QUIC_INVALID_PATH_CHALLENGE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700501 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700502 case QUIC_INVALID_PATH_RESPONSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700503 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700504 case IETF_QUIC_PROTOCOL_VIOLATION:
bnc0054cc62020-04-09 18:22:57 -0700505 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700506 case QUIC_INVALID_NEW_TOKEN:
bnc0054cc62020-04-09 18:22:57 -0700507 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700508 case QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700509 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700510 case QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700511 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700512 case QUIC_INVALID_RETIRE_CONNECTION_ID_DATA:
bnc0054cc62020-04-09 18:22:57 -0700513 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700514 case QUIC_STREAMS_BLOCKED_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700515 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700516 case QUIC_MAX_STREAMS_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700517 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700518 case QUIC_HTTP_DECODER_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700519 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700520 case QUIC_STALE_CONNECTION_CANCELLED:
bnc0054cc62020-04-09 18:22:57 -0700521 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700522 case QUIC_IETF_GQUIC_ERROR_MISSING:
bnc0054cc62020-04-09 18:22:57 -0700523 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700524 case QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700525 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700526 case QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES:
bnc0054cc62020-04-09 18:22:57 -0700527 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700528 case QUIC_TRANSPORT_INVALID_CLIENT_INDICATION:
bnc0054cc62020-04-09 18:22:57 -0700529 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700530 case QUIC_QPACK_DECOMPRESSION_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700531 return {false, static_cast<uint64_t>(
532 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED)};
bnc0ed49eb2020-04-09 12:06:21 -0700533 case QUIC_QPACK_ENCODER_STREAM_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700534 return {false, static_cast<uint64_t>(
535 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700536 case QUIC_QPACK_DECODER_STREAM_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700537 return {false, static_cast<uint64_t>(
538 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700539 case QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET:
bnc0054cc62020-04-09 18:22:57 -0700540 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700541 case QUIC_STREAM_MULTIPLE_OFFSET:
bnc0054cc62020-04-09 18:22:57 -0700542 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700543 case QUIC_HTTP_FRAME_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700544 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD)};
bnc0ed49eb2020-04-09 12:06:21 -0700545 case QUIC_HTTP_FRAME_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700546 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700547 case QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM:
548 return {false,
bnc0054cc62020-04-09 18:22:57 -0700549 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700550 case QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM:
551 return {false,
bnc0054cc62020-04-09 18:22:57 -0700552 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700553 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM:
554 return {false,
bnc0054cc62020-04-09 18:22:57 -0700555 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700556 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM:
557 return {false,
bnc0054cc62020-04-09 18:22:57 -0700558 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700559 case QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700560 return {false,
561 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700562 case QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700563 return {false,
564 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700565 case QUIC_HTTP_STREAM_WRONG_DIRECTION:
bnc0054cc62020-04-09 18:22:57 -0700566 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700567 case QUIC_HTTP_CLOSED_CRITICAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700568 return {false, static_cast<uint64_t>(
569 QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM)};
bnc0ed49eb2020-04-09 12:06:21 -0700570 case QUIC_HTTP_MISSING_SETTINGS_FRAME:
571 return {false,
bnc0054cc62020-04-09 18:22:57 -0700572 static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS)};
bnc0ed49eb2020-04-09 12:06:21 -0700573 case QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER:
bnc0054cc62020-04-09 18:22:57 -0700574 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
bnc9a7a6732020-04-14 06:08:02 -0700575 case QUIC_HTTP_INVALID_MAX_PUSH_ID:
576 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
renjietang360aa082020-04-24 13:53:56 -0700577 case QUIC_HTTP_STREAM_LIMIT_TOO_LOW:
578 return {false, static_cast<uint64_t>(
579 QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)};
renjietangd7afab22020-06-19 16:30:00 -0700580 case QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH:
renjietangc0dc4ce2020-06-16 16:35:45 -0700581 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
renjietangd7afab22020-06-19 16:30:00 -0700582 case QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH:
583 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bncaf8e3302020-07-27 07:42:59 -0700584 case QUIC_HTTP_GOAWAY_INVALID_STREAM_ID:
585 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
586 case QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS:
587 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700588 case QUIC_HPACK_INDEX_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700589 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700590 case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700591 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700592 case QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700593 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700594 case QUIC_HPACK_NAME_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700595 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700596 case QUIC_HPACK_VALUE_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700597 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700598 case QUIC_HPACK_NAME_HUFFMAN_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700599 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700600 case QUIC_HPACK_VALUE_HUFFMAN_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700601 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700602 case QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE:
bnc0054cc62020-04-09 18:22:57 -0700603 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700604 case QUIC_HPACK_INVALID_INDEX:
bnc0054cc62020-04-09 18:22:57 -0700605 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700606 case QUIC_HPACK_INVALID_NAME_INDEX:
bnc0054cc62020-04-09 18:22:57 -0700607 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700608 case QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED:
bnc0054cc62020-04-09 18:22:57 -0700609 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700610 case QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK:
bnc0054cc62020-04-09 18:22:57 -0700611 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700612 case QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING:
bnc0054cc62020-04-09 18:22:57 -0700613 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700614 case QUIC_HPACK_TRUNCATED_BLOCK:
bnc0054cc62020-04-09 18:22:57 -0700615 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700616 case QUIC_HPACK_FRAGMENT_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700617 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700618 case QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT:
bnc0054cc62020-04-09 18:22:57 -0700619 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
renjietanga5a2ca92020-06-15 13:19:36 -0700620 case QUIC_ZERO_RTT_UNRETRANSMITTABLE:
621 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
622 case QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED:
623 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
624 case QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED:
625 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700626 case QUIC_LAST_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700627 return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700628 }
bncefc38d42020-04-10 07:10:11 -0700629 // This function should not be called with unknown error code.
630 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700631}
632
bnccb0ffbc2020-04-13 10:53:11 -0700633// Convert a QuicRstStreamErrorCode to an application error code to be used in
634// an IETF QUIC RESET_STREAM frame
635uint64_t RstStreamErrorCodeToIetfResetStreamErrorCode(
636 QuicRstStreamErrorCode rst_stream_error_code) {
637 switch (rst_stream_error_code) {
638 case QUIC_STREAM_NO_ERROR:
ianswett5abb89b2020-04-13 14:48:51 -0700639 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
bnccb0ffbc2020-04-13 10:53:11 -0700640 case QUIC_ERROR_PROCESSING_STREAM:
641 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
642 case QUIC_MULTIPLE_TERMINATION_OFFSETS:
643 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
644 case QUIC_BAD_APPLICATION_PAYLOAD:
645 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
646 case QUIC_STREAM_CONNECTION_ERROR:
647 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
648 case QUIC_STREAM_PEER_GOING_AWAY:
649 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
650 case QUIC_STREAM_CANCELLED:
651 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
652 case QUIC_RST_ACKNOWLEDGEMENT:
ianswett5abb89b2020-04-13 14:48:51 -0700653 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
bnccb0ffbc2020-04-13 10:53:11 -0700654 case QUIC_REFUSED_STREAM:
655 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
656 case QUIC_INVALID_PROMISE_URL:
657 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
658 case QUIC_UNAUTHORIZED_PROMISE_URL:
659 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
660 case QUIC_DUPLICATE_PROMISE_URL:
661 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
662 case QUIC_PROMISE_VARY_MISMATCH:
663 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
664 case QUIC_INVALID_PROMISE_METHOD:
665 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
666 case QUIC_PUSH_STREAM_TIMED_OUT:
667 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
668 case QUIC_HEADERS_TOO_LARGE:
669 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
670 case QUIC_STREAM_TTL_EXPIRED:
671 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
672 case QUIC_DATA_AFTER_CLOSE_OFFSET:
673 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
674 case QUIC_STREAM_GENERAL_PROTOCOL_ERROR:
675 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
676 case QUIC_STREAM_INTERNAL_ERROR:
677 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
678 case QUIC_STREAM_STREAM_CREATION_ERROR:
679 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
680 case QUIC_STREAM_CLOSED_CRITICAL_STREAM:
681 return static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM);
682 case QUIC_STREAM_FRAME_UNEXPECTED:
683 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED);
684 case QUIC_STREAM_FRAME_ERROR:
685 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR);
686 case QUIC_STREAM_EXCESSIVE_LOAD:
687 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
688 case QUIC_STREAM_ID_ERROR:
689 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
690 case QUIC_STREAM_SETTINGS_ERROR:
691 return static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR);
692 case QUIC_STREAM_MISSING_SETTINGS:
693 return static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS);
694 case QUIC_STREAM_REQUEST_REJECTED:
695 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED);
696 case QUIC_STREAM_REQUEST_INCOMPLETE:
697 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE);
698 case QUIC_STREAM_CONNECT_ERROR:
699 return static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR);
700 case QUIC_STREAM_VERSION_FALLBACK:
701 return static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK);
702 case QUIC_STREAM_DECOMPRESSION_FAILED:
703 return static_cast<uint64_t>(
704 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED);
705 case QUIC_STREAM_ENCODER_STREAM_ERROR:
706 return static_cast<uint64_t>(
707 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
708 case QUIC_STREAM_DECODER_STREAM_ERROR:
709 return static_cast<uint64_t>(
710 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR);
bnc12add152020-04-20 08:05:29 -0700711 case QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE:
bnccb0ffbc2020-04-13 10:53:11 -0700712 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
713 case QUIC_STREAM_LAST_ERROR:
714 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
715 }
716 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
717}
718
719// Convert the application error code of an IETF QUIC RESET_STREAM frame
720// to QuicRstStreamErrorCode.
721QuicRstStreamErrorCode IetfResetStreamErrorCodeToRstStreamErrorCode(
722 uint64_t ietf_error_code) {
723 switch (ietf_error_code) {
ianswett5abb89b2020-04-13 14:48:51 -0700724 case static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR):
bnccb0ffbc2020-04-13 10:53:11 -0700725 return QUIC_STREAM_NO_ERROR;
726 case static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR):
727 return QUIC_STREAM_GENERAL_PROTOCOL_ERROR;
728 case static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR):
729 return QUIC_STREAM_INTERNAL_ERROR;
730 case static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR):
731 return QUIC_STREAM_STREAM_CREATION_ERROR;
732 case static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM):
733 return QUIC_STREAM_CLOSED_CRITICAL_STREAM;
734 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED):
735 return QUIC_STREAM_FRAME_UNEXPECTED;
736 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR):
737 return QUIC_STREAM_FRAME_ERROR;
738 case static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD):
739 return QUIC_STREAM_EXCESSIVE_LOAD;
740 case static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR):
741 return QUIC_STREAM_ID_ERROR;
742 case static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR):
743 return QUIC_STREAM_SETTINGS_ERROR;
744 case static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS):
745 return QUIC_STREAM_MISSING_SETTINGS;
746 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED):
747 return QUIC_STREAM_REQUEST_REJECTED;
748 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED):
749 return QUIC_STREAM_CANCELLED;
750 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE):
751 return QUIC_STREAM_REQUEST_INCOMPLETE;
752 case static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR):
753 return QUIC_STREAM_CONNECT_ERROR;
754 case static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK):
755 return QUIC_STREAM_VERSION_FALLBACK;
756 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECOMPRESSION_FAILED):
757 return QUIC_STREAM_DECOMPRESSION_FAILED;
758 case static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR):
759 return QUIC_STREAM_ENCODER_STREAM_ERROR;
760 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECODER_STREAM_ERROR):
761 return QUIC_STREAM_DECODER_STREAM_ERROR;
762 }
bnc12add152020-04-20 08:05:29 -0700763 return QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE;
bnccb0ffbc2020-04-13 10:53:11 -0700764}
765
QUICHE teama6ef0a62019-03-07 20:34:33 -0500766#undef RETURN_STRING_LITERAL // undef for jumbo builds
bnc0ed49eb2020-04-09 12:06:21 -0700767
QUICHE teama6ef0a62019-03-07 20:34:33 -0500768} // namespace quic