blob: 9abde9f52b15a28ab0a89fa51b8e39ca2446c6f7 [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);
bnc4e440102020-10-20 17:32:29 -0700190 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_INTEGER_TOO_LARGE);
191 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_STRING_LITERAL_TOO_LONG);
192 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_HUFFMAN_ENCODING_ERROR);
193 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_INVALID_STATIC_ENTRY);
194 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_STATIC);
195 RETURN_STRING_LITERAL(
196 QUIC_QPACK_ENCODER_STREAM_INSERTION_INVALID_RELATIVE_INDEX);
197 RETURN_STRING_LITERAL(
198 QUIC_QPACK_ENCODER_STREAM_INSERTION_DYNAMIC_ENTRY_NOT_FOUND);
199 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_DYNAMIC);
200 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_LITERAL);
201 RETURN_STRING_LITERAL(
202 QUIC_QPACK_ENCODER_STREAM_DUPLICATE_INVALID_RELATIVE_INDEX);
203 RETURN_STRING_LITERAL(
204 QUIC_QPACK_ENCODER_STREAM_DUPLICATE_DYNAMIC_ENTRY_NOT_FOUND);
205 RETURN_STRING_LITERAL(QUIC_QPACK_ENCODER_STREAM_SET_DYNAMIC_TABLE_CAPACITY);
206 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE);
207 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INVALID_ZERO_INCREMENT);
208 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INCREMENT_OVERFLOW);
209 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_IMPOSSIBLE_INSERT_COUNT);
210 RETURN_STRING_LITERAL(QUIC_QPACK_DECODER_STREAM_INCORRECT_ACKNOWLEDGEMENT);
renjietang15afba32019-10-23 14:32:35 -0700211 RETURN_STRING_LITERAL(QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET);
212 RETURN_STRING_LITERAL(QUIC_STREAM_MULTIPLE_OFFSET);
bncdfabdfb2020-01-17 17:46:40 -0800213 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_TOO_LARGE);
214 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_ERROR);
215 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM);
216 RETURN_STRING_LITERAL(QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM);
bnc3e8fe7c2020-03-10 17:44:58 -0700217 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM);
218 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM);
bncec3602c2020-03-12 17:57:59 -0700219 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM);
220 RETURN_STRING_LITERAL(QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM);
221 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_WRONG_DIRECTION);
bnc09c1eda2020-03-13 04:52:38 -0700222 RETURN_STRING_LITERAL(QUIC_HTTP_CLOSED_CRITICAL_STREAM);
bncf72ef0b2020-04-02 06:59:32 -0700223 RETURN_STRING_LITERAL(QUIC_HTTP_MISSING_SETTINGS_FRAME);
224 RETURN_STRING_LITERAL(QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER);
bnc9a7a6732020-04-14 06:08:02 -0700225 RETURN_STRING_LITERAL(QUIC_HTTP_INVALID_MAX_PUSH_ID);
renjietang360aa082020-04-24 13:53:56 -0700226 RETURN_STRING_LITERAL(QUIC_HTTP_STREAM_LIMIT_TOO_LOW);
renjietangd7afab22020-06-19 16:30:00 -0700227 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH);
228 RETURN_STRING_LITERAL(QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH);
bncaf8e3302020-07-27 07:42:59 -0700229 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_INVALID_STREAM_ID);
230 RETURN_STRING_LITERAL(QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS);
renjietang21fc64c2020-09-22 10:59:50 -0700231 RETURN_STRING_LITERAL(QUIC_HTTP_RECEIVE_SPDY_SETTING);
renjietang0c9148a2020-09-30 12:59:14 -0700232 RETURN_STRING_LITERAL(QUIC_HTTP_RECEIVE_SPDY_FRAME);
bnc77b46412020-02-21 08:09:09 -0800233 RETURN_STRING_LITERAL(QUIC_HPACK_INDEX_VARINT_ERROR);
234 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_LENGTH_VARINT_ERROR);
235 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR);
236 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_TOO_LONG);
237 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_TOO_LONG);
238 RETURN_STRING_LITERAL(QUIC_HPACK_NAME_HUFFMAN_ERROR);
239 RETURN_STRING_LITERAL(QUIC_HPACK_VALUE_HUFFMAN_ERROR);
240 RETURN_STRING_LITERAL(QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE);
241 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_INDEX);
242 RETURN_STRING_LITERAL(QUIC_HPACK_INVALID_NAME_INDEX);
243 RETURN_STRING_LITERAL(QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED);
244 RETURN_STRING_LITERAL(
245 QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK);
246 RETURN_STRING_LITERAL(
247 QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING);
248 RETURN_STRING_LITERAL(QUIC_HPACK_TRUNCATED_BLOCK);
249 RETURN_STRING_LITERAL(QUIC_HPACK_FRAGMENT_TOO_LONG);
250 RETURN_STRING_LITERAL(QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT);
renjietanga5a2ca92020-06-15 13:19:36 -0700251 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_UNRETRANSMITTABLE);
252 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED);
253 RETURN_STRING_LITERAL(QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED);
fayang8bff33c2020-08-06 07:37:22 -0700254 RETURN_STRING_LITERAL(QUIC_SILENT_IDLE_TIMEOUT);
fayangd01e9962020-09-24 11:29:31 -0700255 RETURN_STRING_LITERAL(QUIC_MISSING_WRITE_KEYS);
mattmd0744852020-10-16 14:42:01 -0700256 RETURN_STRING_LITERAL(QUIC_KEY_UPDATE_ERROR);
257 RETURN_STRING_LITERAL(QUIC_AEAD_LIMIT_REACHED);
bnc3913be72020-11-11 10:07:17 -0800258 RETURN_STRING_LITERAL(QUIC_MAX_AGE_TIMEOUT);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500259
260 RETURN_STRING_LITERAL(QUIC_LAST_ERROR);
261 // Intentionally have no default case, so we'll break the build
262 // if we add errors and don't put them here.
263 }
264 // Return a default value so that we return this when |error| doesn't match
265 // any of the QuicErrorCodes. This can happen when the ConnectionClose
266 // frame sent by the peer (attacker) has invalid error code.
267 return "INVALID_ERROR_CODE";
268}
269
bnc0ed49eb2020-04-09 12:06:21 -0700270std::string QuicIetfTransportErrorCodeString(QuicIetfTransportErrorCodes c) {
271 if (static_cast<uint64_t>(c) >= 0xff00u) {
272 return quiche::QuicheStrCat("Private(", static_cast<uint64_t>(c), ")");
273 }
274 if (c >= CRYPTO_ERROR_FIRST && c <= CRYPTO_ERROR_LAST) {
275 const int tls_error = static_cast<int>(c - CRYPTO_ERROR_FIRST);
276 const char* tls_error_description = SSL_alert_desc_string_long(tls_error);
277 if (strcmp("unknown", tls_error_description) != 0) {
278 return quiche::QuicheStrCat("CRYPTO_ERROR(", tls_error_description, ")");
279 }
280 return quiche::QuicheStrCat("CRYPTO_ERROR(unknown(", tls_error, "))");
281 }
282
283 switch (c) {
284 RETURN_STRING_LITERAL(NO_IETF_QUIC_ERROR);
285 RETURN_STRING_LITERAL(INTERNAL_ERROR);
286 RETURN_STRING_LITERAL(SERVER_BUSY_ERROR);
287 RETURN_STRING_LITERAL(FLOW_CONTROL_ERROR);
288 RETURN_STRING_LITERAL(STREAM_LIMIT_ERROR);
289 RETURN_STRING_LITERAL(STREAM_STATE_ERROR);
290 RETURN_STRING_LITERAL(FINAL_SIZE_ERROR);
291 RETURN_STRING_LITERAL(FRAME_ENCODING_ERROR);
292 RETURN_STRING_LITERAL(TRANSPORT_PARAMETER_ERROR);
293 RETURN_STRING_LITERAL(CONNECTION_ID_LIMIT_ERROR);
294 RETURN_STRING_LITERAL(PROTOCOL_VIOLATION);
295 RETURN_STRING_LITERAL(INVALID_TOKEN);
296 RETURN_STRING_LITERAL(CRYPTO_BUFFER_EXCEEDED);
mattmd0744852020-10-16 14:42:01 -0700297 RETURN_STRING_LITERAL(KEY_UPDATE_ERROR);
298 RETURN_STRING_LITERAL(AEAD_LIMIT_REACHED);
bnc0ed49eb2020-04-09 12:06:21 -0700299 // CRYPTO_ERROR is handled in the if before this switch, these cases do not
300 // change behavior and are only here to make the compiler happy.
301 case CRYPTO_ERROR_FIRST:
302 case CRYPTO_ERROR_LAST:
303 DCHECK(false) << "Unexpected error " << static_cast<uint64_t>(c);
304 break;
305 }
306
307 return quiche::QuicheStrCat("Unknown(", static_cast<uint64_t>(c), ")");
308}
309
310std::ostream& operator<<(std::ostream& os,
311 const QuicIetfTransportErrorCodes& c) {
312 os << QuicIetfTransportErrorCodeString(c);
313 return os;
314}
315
316QuicErrorCodeToIetfMapping QuicErrorCodeToTransportErrorCode(
317 QuicErrorCode error) {
318 switch (error) {
319 case QUIC_NO_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700320 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700321 case QUIC_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700322 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700323 case QUIC_STREAM_DATA_AFTER_TERMINATION:
bnc0054cc62020-04-09 18:22:57 -0700324 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700325 case QUIC_INVALID_PACKET_HEADER:
bnc0054cc62020-04-09 18:22:57 -0700326 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700327 case QUIC_INVALID_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700328 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700329 case QUIC_MISSING_PAYLOAD:
bnc0054cc62020-04-09 18:22:57 -0700330 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700331 case QUIC_INVALID_FEC_DATA:
bnc0054cc62020-04-09 18:22:57 -0700332 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700333 case QUIC_INVALID_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700334 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700335 case QUIC_OVERLAPPING_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700336 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700337 case QUIC_UNENCRYPTED_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700338 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700339 case QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700340 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700341 case QUIC_MAYBE_CORRUPTED_MEMORY:
bnc0054cc62020-04-09 18:22:57 -0700342 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700343 case QUIC_UNENCRYPTED_FEC_DATA:
bnc0054cc62020-04-09 18:22:57 -0700344 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700345 case QUIC_INVALID_RST_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700346 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700347 case QUIC_INVALID_CONNECTION_CLOSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700348 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700349 case QUIC_INVALID_GOAWAY_DATA:
bnc0054cc62020-04-09 18:22:57 -0700350 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700351 case QUIC_INVALID_WINDOW_UPDATE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700352 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700353 case QUIC_INVALID_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700354 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700355 case QUIC_INVALID_STOP_WAITING_DATA:
bnc0054cc62020-04-09 18:22:57 -0700356 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700357 case QUIC_INVALID_PATH_CLOSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700358 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700359 case QUIC_INVALID_ACK_DATA:
bnc0054cc62020-04-09 18:22:57 -0700360 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700361 case QUIC_INVALID_MESSAGE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700362 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700363 case QUIC_INVALID_VERSION_NEGOTIATION_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700364 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700365 case QUIC_INVALID_PUBLIC_RST_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700366 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700367 case QUIC_DECRYPTION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700368 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700369 case QUIC_ENCRYPTION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700370 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700371 case QUIC_PACKET_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700372 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700373 case QUIC_PEER_GOING_AWAY:
bnc0054cc62020-04-09 18:22:57 -0700374 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700375 case QUIC_INVALID_STREAM_ID:
bnc0054cc62020-04-09 18:22:57 -0700376 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700377 case QUIC_INVALID_PRIORITY:
bnc0054cc62020-04-09 18:22:57 -0700378 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700379 case QUIC_TOO_MANY_OPEN_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700380 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700381 case QUIC_TOO_MANY_AVAILABLE_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700382 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700383 case QUIC_PUBLIC_RESET:
bnc0054cc62020-04-09 18:22:57 -0700384 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700385 case QUIC_INVALID_VERSION:
bnc0054cc62020-04-09 18:22:57 -0700386 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700387 case QUIC_INVALID_HEADER_ID:
bnc0054cc62020-04-09 18:22:57 -0700388 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700389 case QUIC_INVALID_NEGOTIATED_VALUE:
bnc0054cc62020-04-09 18:22:57 -0700390 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700391 case QUIC_DECOMPRESSION_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700392 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700393 case QUIC_NETWORK_IDLE_TIMEOUT:
bnc0054cc62020-04-09 18:22:57 -0700394 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
fayang8bff33c2020-08-06 07:37:22 -0700395 case QUIC_SILENT_IDLE_TIMEOUT:
396 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700397 case QUIC_HANDSHAKE_TIMEOUT:
bnc0054cc62020-04-09 18:22:57 -0700398 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700399 case QUIC_ERROR_MIGRATING_ADDRESS:
bnc0054cc62020-04-09 18:22:57 -0700400 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700401 case QUIC_ERROR_MIGRATING_PORT:
bnc0054cc62020-04-09 18:22:57 -0700402 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700403 case QUIC_PACKET_WRITE_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700404 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700405 case QUIC_PACKET_READ_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700406 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700407 case QUIC_EMPTY_STREAM_FRAME_NO_FIN:
bnc0054cc62020-04-09 18:22:57 -0700408 return {true, static_cast<uint64_t>(FRAME_ENCODING_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700409 case QUIC_INVALID_HEADERS_STREAM_DATA:
bnc0054cc62020-04-09 18:22:57 -0700410 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700411 case QUIC_HEADERS_STREAM_DATA_DECOMPRESS_FAILURE:
bnc0054cc62020-04-09 18:22:57 -0700412 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700413 case QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA:
bnc0054cc62020-04-09 18:22:57 -0700414 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700415 case QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA:
bnc0054cc62020-04-09 18:22:57 -0700416 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700417 case QUIC_FLOW_CONTROL_INVALID_WINDOW:
bnc0054cc62020-04-09 18:22:57 -0700418 return {true, static_cast<uint64_t>(FLOW_CONTROL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700419 case QUIC_CONNECTION_IP_POOLED:
bnc0054cc62020-04-09 18:22:57 -0700420 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700421 case QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS:
bnc0054cc62020-04-09 18:22:57 -0700422 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700423 case QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS:
bnc0054cc62020-04-09 18:22:57 -0700424 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700425 case QUIC_CONNECTION_CANCELLED:
bnc0054cc62020-04-09 18:22:57 -0700426 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700427 case QUIC_BAD_PACKET_LOSS_RATE:
bnc0054cc62020-04-09 18:22:57 -0700428 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700429 case QUIC_PUBLIC_RESETS_POST_HANDSHAKE:
bnc0054cc62020-04-09 18:22:57 -0700430 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700431 case QUIC_FAILED_TO_SERIALIZE_PACKET:
bnc0054cc62020-04-09 18:22:57 -0700432 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700433 case QUIC_TOO_MANY_RTOS:
bnc0054cc62020-04-09 18:22:57 -0700434 return {true, static_cast<uint64_t>(NO_IETF_QUIC_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700435 case QUIC_HANDSHAKE_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700436 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700437 case QUIC_CRYPTO_TAGS_OUT_OF_ORDER:
bnc0054cc62020-04-09 18:22:57 -0700438 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700439 case QUIC_CRYPTO_TOO_MANY_ENTRIES:
bnc0054cc62020-04-09 18:22:57 -0700440 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700441 case QUIC_CRYPTO_INVALID_VALUE_LENGTH:
bnc0054cc62020-04-09 18:22:57 -0700442 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700443 case QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE:
bnc0054cc62020-04-09 18:22:57 -0700444 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700445 case QUIC_INVALID_CRYPTO_MESSAGE_TYPE:
bnc0054cc62020-04-09 18:22:57 -0700446 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700447 case QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER:
bnc0054cc62020-04-09 18:22:57 -0700448 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700449 case QUIC_INVALID_CHANNEL_ID_SIGNATURE:
bnc0054cc62020-04-09 18:22:57 -0700450 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700451 case QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND:
bnc0054cc62020-04-09 18:22:57 -0700452 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700453 case QUIC_CRYPTO_MESSAGE_PARAMETER_NO_OVERLAP:
bnc0054cc62020-04-09 18:22:57 -0700454 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700455 case QUIC_CRYPTO_MESSAGE_INDEX_NOT_FOUND:
bnc0054cc62020-04-09 18:22:57 -0700456 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700457 case QUIC_UNSUPPORTED_PROOF_DEMAND:
bnc0054cc62020-04-09 18:22:57 -0700458 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700459 case QUIC_CRYPTO_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700460 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700461 case QUIC_CRYPTO_VERSION_NOT_SUPPORTED:
bnc0054cc62020-04-09 18:22:57 -0700462 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700463 case QUIC_CRYPTO_NO_SUPPORT:
bnc0054cc62020-04-09 18:22:57 -0700464 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700465 case QUIC_CRYPTO_TOO_MANY_REJECTS:
bnc0054cc62020-04-09 18:22:57 -0700466 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700467 case QUIC_PROOF_INVALID:
bnc0054cc62020-04-09 18:22:57 -0700468 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700469 case QUIC_CRYPTO_DUPLICATE_TAG:
bnc0054cc62020-04-09 18:22:57 -0700470 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700471 case QUIC_CRYPTO_ENCRYPTION_LEVEL_INCORRECT:
bnc0054cc62020-04-09 18:22:57 -0700472 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700473 case QUIC_CRYPTO_SERVER_CONFIG_EXPIRED:
bnc0054cc62020-04-09 18:22:57 -0700474 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700475 case QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700476 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700477 case QUIC_CRYPTO_MESSAGE_WHILE_VALIDATING_CLIENT_HELLO:
bnc0054cc62020-04-09 18:22:57 -0700478 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700479 case QUIC_CRYPTO_UPDATE_BEFORE_HANDSHAKE_COMPLETE:
bnc0054cc62020-04-09 18:22:57 -0700480 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700481 case QUIC_CRYPTO_CHLO_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700482 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700483 case QUIC_VERSION_NEGOTIATION_MISMATCH:
bnc0054cc62020-04-09 18:22:57 -0700484 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700485 case QUIC_BAD_MULTIPATH_FLAG:
bnc0054cc62020-04-09 18:22:57 -0700486 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700487 case QUIC_MULTIPATH_PATH_DOES_NOT_EXIST:
bnc0054cc62020-04-09 18:22:57 -0700488 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700489 case QUIC_MULTIPATH_PATH_NOT_ACTIVE:
bnc0054cc62020-04-09 18:22:57 -0700490 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700491 case QUIC_IP_ADDRESS_CHANGED:
bnc0054cc62020-04-09 18:22:57 -0700492 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700493 case QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS:
bnc0054cc62020-04-09 18:22:57 -0700494 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700495 case QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES:
bnc0054cc62020-04-09 18:22:57 -0700496 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700497 case QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK:
bnc0054cc62020-04-09 18:22:57 -0700498 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700499 case QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700500 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700501 case QUIC_CONNECTION_MIGRATION_DISABLED_BY_CONFIG:
bnc0054cc62020-04-09 18:22:57 -0700502 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700503 case QUIC_CONNECTION_MIGRATION_INTERNAL_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700504 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700505 case QUIC_CONNECTION_MIGRATION_HANDSHAKE_UNCONFIRMED:
bnc0054cc62020-04-09 18:22:57 -0700506 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700507 case QUIC_TOO_MANY_STREAM_DATA_INTERVALS:
bnc0054cc62020-04-09 18:22:57 -0700508 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700509 case QUIC_STREAM_SEQUENCER_INVALID_STATE:
bnc0054cc62020-04-09 18:22:57 -0700510 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700511 case QUIC_TOO_MANY_SESSIONS_ON_SERVER:
bnc0054cc62020-04-09 18:22:57 -0700512 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700513 case QUIC_STREAM_LENGTH_OVERFLOW:
bnc0054cc62020-04-09 18:22:57 -0700514 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700515 case QUIC_INVALID_MAX_DATA_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700516 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700517 case QUIC_INVALID_MAX_STREAM_DATA_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700518 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700519 case QUIC_MAX_STREAMS_DATA:
bnc0054cc62020-04-09 18:22:57 -0700520 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700521 case QUIC_STREAMS_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700522 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700523 case QUIC_INVALID_STREAM_BLOCKED_DATA:
bnc0054cc62020-04-09 18:22:57 -0700524 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700525 case QUIC_INVALID_NEW_CONNECTION_ID_DATA:
bnc0054cc62020-04-09 18:22:57 -0700526 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700527 case QUIC_INVALID_STOP_SENDING_FRAME_DATA:
bnc0054cc62020-04-09 18:22:57 -0700528 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700529 case QUIC_INVALID_PATH_CHALLENGE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700530 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700531 case QUIC_INVALID_PATH_RESPONSE_DATA:
bnc0054cc62020-04-09 18:22:57 -0700532 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700533 case IETF_QUIC_PROTOCOL_VIOLATION:
bnc0054cc62020-04-09 18:22:57 -0700534 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700535 case QUIC_INVALID_NEW_TOKEN:
bnc0054cc62020-04-09 18:22:57 -0700536 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700537 case QUIC_DATA_RECEIVED_ON_WRITE_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700538 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700539 case QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700540 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700541 case QUIC_INVALID_RETIRE_CONNECTION_ID_DATA:
bnc0054cc62020-04-09 18:22:57 -0700542 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700543 case QUIC_STREAMS_BLOCKED_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700544 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700545 case QUIC_MAX_STREAMS_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700546 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700547 case QUIC_HTTP_DECODER_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700548 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700549 case QUIC_STALE_CONNECTION_CANCELLED:
bnc0054cc62020-04-09 18:22:57 -0700550 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700551 case QUIC_IETF_GQUIC_ERROR_MISSING:
bnc0054cc62020-04-09 18:22:57 -0700552 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700553 case QUIC_WINDOW_UPDATE_RECEIVED_ON_READ_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700554 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700555 case QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES:
bnc0054cc62020-04-09 18:22:57 -0700556 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700557 case QUIC_TRANSPORT_INVALID_CLIENT_INDICATION:
bnc0054cc62020-04-09 18:22:57 -0700558 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700559 case QUIC_QPACK_DECOMPRESSION_FAILED:
bnc0054cc62020-04-09 18:22:57 -0700560 return {false, static_cast<uint64_t>(
561 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED)};
bnc0ed49eb2020-04-09 12:06:21 -0700562 case QUIC_QPACK_ENCODER_STREAM_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700563 return {false, static_cast<uint64_t>(
564 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700565 case QUIC_QPACK_DECODER_STREAM_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700566 return {false, static_cast<uint64_t>(
567 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
bnc4e440102020-10-20 17:32:29 -0700568 case QUIC_QPACK_ENCODER_STREAM_INTEGER_TOO_LARGE:
569 return {false, static_cast<uint64_t>(
570 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
571 case QUIC_QPACK_ENCODER_STREAM_STRING_LITERAL_TOO_LONG:
572 return {false, static_cast<uint64_t>(
573 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
574 case QUIC_QPACK_ENCODER_STREAM_HUFFMAN_ENCODING_ERROR:
575 return {false, static_cast<uint64_t>(
576 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
577 case QUIC_QPACK_ENCODER_STREAM_INVALID_STATIC_ENTRY:
578 return {false, static_cast<uint64_t>(
579 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
580 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_STATIC:
581 return {false, static_cast<uint64_t>(
582 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
583 case QUIC_QPACK_ENCODER_STREAM_INSERTION_INVALID_RELATIVE_INDEX:
584 return {false, static_cast<uint64_t>(
585 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
586 case QUIC_QPACK_ENCODER_STREAM_INSERTION_DYNAMIC_ENTRY_NOT_FOUND:
587 return {false, static_cast<uint64_t>(
588 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
589 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_DYNAMIC:
590 return {false, static_cast<uint64_t>(
591 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
592 case QUIC_QPACK_ENCODER_STREAM_ERROR_INSERTING_LITERAL:
593 return {false, static_cast<uint64_t>(
594 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
595 case QUIC_QPACK_ENCODER_STREAM_DUPLICATE_INVALID_RELATIVE_INDEX:
596 return {false, static_cast<uint64_t>(
597 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
598 case QUIC_QPACK_ENCODER_STREAM_DUPLICATE_DYNAMIC_ENTRY_NOT_FOUND:
599 return {false, static_cast<uint64_t>(
600 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
601 case QUIC_QPACK_ENCODER_STREAM_SET_DYNAMIC_TABLE_CAPACITY:
602 return {false, static_cast<uint64_t>(
603 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR)};
604 case QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE:
605 return {false, static_cast<uint64_t>(
606 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
607 case QUIC_QPACK_DECODER_STREAM_INVALID_ZERO_INCREMENT:
608 return {false, static_cast<uint64_t>(
609 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
610 case QUIC_QPACK_DECODER_STREAM_INCREMENT_OVERFLOW:
611 return {false, static_cast<uint64_t>(
612 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
613 case QUIC_QPACK_DECODER_STREAM_IMPOSSIBLE_INSERT_COUNT:
614 return {false, static_cast<uint64_t>(
615 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
616 case QUIC_QPACK_DECODER_STREAM_INCORRECT_ACKNOWLEDGEMENT:
617 return {false, static_cast<uint64_t>(
618 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700619 case QUIC_STREAM_DATA_BEYOND_CLOSE_OFFSET:
bnc0054cc62020-04-09 18:22:57 -0700620 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700621 case QUIC_STREAM_MULTIPLE_OFFSET:
bnc0054cc62020-04-09 18:22:57 -0700622 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
bnc0ed49eb2020-04-09 12:06:21 -0700623 case QUIC_HTTP_FRAME_TOO_LARGE:
bnc0054cc62020-04-09 18:22:57 -0700624 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD)};
bnc0ed49eb2020-04-09 12:06:21 -0700625 case QUIC_HTTP_FRAME_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700626 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700627 case QUIC_HTTP_FRAME_UNEXPECTED_ON_SPDY_STREAM:
628 return {false,
bnc0054cc62020-04-09 18:22:57 -0700629 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700630 case QUIC_HTTP_FRAME_UNEXPECTED_ON_CONTROL_STREAM:
631 return {false,
bnc0054cc62020-04-09 18:22:57 -0700632 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700633 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM:
634 return {false,
bnc0054cc62020-04-09 18:22:57 -0700635 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700636 case QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_CONTROL_STREAM:
637 return {false,
bnc0054cc62020-04-09 18:22:57 -0700638 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700639 case QUIC_HTTP_DUPLICATE_UNIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700640 return {false,
641 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700642 case QUIC_HTTP_SERVER_INITIATED_BIDIRECTIONAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700643 return {false,
644 static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700645 case QUIC_HTTP_STREAM_WRONG_DIRECTION:
bnc0054cc62020-04-09 18:22:57 -0700646 return {true, static_cast<uint64_t>(STREAM_STATE_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700647 case QUIC_HTTP_CLOSED_CRITICAL_STREAM:
bnc0054cc62020-04-09 18:22:57 -0700648 return {false, static_cast<uint64_t>(
649 QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM)};
bnc0ed49eb2020-04-09 12:06:21 -0700650 case QUIC_HTTP_MISSING_SETTINGS_FRAME:
651 return {false,
bnc0054cc62020-04-09 18:22:57 -0700652 static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS)};
bnc0ed49eb2020-04-09 12:06:21 -0700653 case QUIC_HTTP_DUPLICATE_SETTING_IDENTIFIER:
bnc0054cc62020-04-09 18:22:57 -0700654 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
bnc9a7a6732020-04-14 06:08:02 -0700655 case QUIC_HTTP_INVALID_MAX_PUSH_ID:
656 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
renjietang360aa082020-04-24 13:53:56 -0700657 case QUIC_HTTP_STREAM_LIMIT_TOO_LOW:
658 return {false, static_cast<uint64_t>(
659 QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR)};
renjietangd7afab22020-06-19 16:30:00 -0700660 case QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH:
renjietangc0dc4ce2020-06-16 16:35:45 -0700661 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
renjietangd7afab22020-06-19 16:30:00 -0700662 case QUIC_HTTP_ZERO_RTT_REJECTION_SETTINGS_MISMATCH:
663 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bncaf8e3302020-07-27 07:42:59 -0700664 case QUIC_HTTP_GOAWAY_INVALID_STREAM_ID:
665 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
666 case QUIC_HTTP_GOAWAY_ID_LARGER_THAN_PREVIOUS:
667 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR)};
renjietang21fc64c2020-09-22 10:59:50 -0700668 case QUIC_HTTP_RECEIVE_SPDY_SETTING:
669 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR)};
renjietang0c9148a2020-09-30 12:59:14 -0700670 case QUIC_HTTP_RECEIVE_SPDY_FRAME:
671 return {false,
672 static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED)};
bnc0ed49eb2020-04-09 12:06:21 -0700673 case QUIC_HPACK_INDEX_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700674 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700675 case QUIC_HPACK_NAME_LENGTH_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700676 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700677 case QUIC_HPACK_VALUE_LENGTH_VARINT_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700678 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700679 case QUIC_HPACK_NAME_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700680 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700681 case QUIC_HPACK_VALUE_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700682 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700683 case QUIC_HPACK_NAME_HUFFMAN_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700684 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700685 case QUIC_HPACK_VALUE_HUFFMAN_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700686 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700687 case QUIC_HPACK_MISSING_DYNAMIC_TABLE_SIZE_UPDATE:
bnc0054cc62020-04-09 18:22:57 -0700688 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700689 case QUIC_HPACK_INVALID_INDEX:
bnc0054cc62020-04-09 18:22:57 -0700690 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700691 case QUIC_HPACK_INVALID_NAME_INDEX:
bnc0054cc62020-04-09 18:22:57 -0700692 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700693 case QUIC_HPACK_DYNAMIC_TABLE_SIZE_UPDATE_NOT_ALLOWED:
bnc0054cc62020-04-09 18:22:57 -0700694 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700695 case QUIC_HPACK_INITIAL_TABLE_SIZE_UPDATE_IS_ABOVE_LOW_WATER_MARK:
bnc0054cc62020-04-09 18:22:57 -0700696 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700697 case QUIC_HPACK_TABLE_SIZE_UPDATE_IS_ABOVE_ACKNOWLEDGED_SETTING:
bnc0054cc62020-04-09 18:22:57 -0700698 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700699 case QUIC_HPACK_TRUNCATED_BLOCK:
bnc0054cc62020-04-09 18:22:57 -0700700 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700701 case QUIC_HPACK_FRAGMENT_TOO_LONG:
bnc0054cc62020-04-09 18:22:57 -0700702 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700703 case QUIC_HPACK_COMPRESSED_HEADER_SIZE_EXCEEDS_LIMIT:
bnc0054cc62020-04-09 18:22:57 -0700704 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
renjietanga5a2ca92020-06-15 13:19:36 -0700705 case QUIC_ZERO_RTT_UNRETRANSMITTABLE:
706 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
707 case QUIC_ZERO_RTT_REJECTION_LIMIT_REDUCED:
708 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
709 case QUIC_ZERO_RTT_RESUMPTION_LIMIT_REDUCED:
710 return {true, static_cast<uint64_t>(PROTOCOL_VIOLATION)};
fayangd01e9962020-09-24 11:29:31 -0700711 case QUIC_MISSING_WRITE_KEYS:
712 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
mattmd0744852020-10-16 14:42:01 -0700713 case QUIC_KEY_UPDATE_ERROR:
714 return {true, static_cast<uint64_t>(KEY_UPDATE_ERROR)};
715 case QUIC_AEAD_LIMIT_REACHED:
716 return {true, static_cast<uint64_t>(AEAD_LIMIT_REACHED)};
bnc3913be72020-11-11 10:07:17 -0800717 case QUIC_MAX_AGE_TIMEOUT:
718 return {false, static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700719 case QUIC_LAST_ERROR:
bnc0054cc62020-04-09 18:22:57 -0700720 return {false, static_cast<uint64_t>(QUIC_LAST_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700721 }
bncefc38d42020-04-10 07:10:11 -0700722 // This function should not be called with unknown error code.
723 return {true, static_cast<uint64_t>(INTERNAL_ERROR)};
bnc0ed49eb2020-04-09 12:06:21 -0700724}
725
bnccb0ffbc2020-04-13 10:53:11 -0700726// Convert a QuicRstStreamErrorCode to an application error code to be used in
727// an IETF QUIC RESET_STREAM frame
728uint64_t RstStreamErrorCodeToIetfResetStreamErrorCode(
729 QuicRstStreamErrorCode rst_stream_error_code) {
730 switch (rst_stream_error_code) {
731 case QUIC_STREAM_NO_ERROR:
ianswett5abb89b2020-04-13 14:48:51 -0700732 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
bnccb0ffbc2020-04-13 10:53:11 -0700733 case QUIC_ERROR_PROCESSING_STREAM:
734 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
735 case QUIC_MULTIPLE_TERMINATION_OFFSETS:
736 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
737 case QUIC_BAD_APPLICATION_PAYLOAD:
738 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
739 case QUIC_STREAM_CONNECTION_ERROR:
740 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
741 case QUIC_STREAM_PEER_GOING_AWAY:
742 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
743 case QUIC_STREAM_CANCELLED:
744 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
745 case QUIC_RST_ACKNOWLEDGEMENT:
ianswett5abb89b2020-04-13 14:48:51 -0700746 return static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR);
bnccb0ffbc2020-04-13 10:53:11 -0700747 case QUIC_REFUSED_STREAM:
748 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
749 case QUIC_INVALID_PROMISE_URL:
750 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
751 case QUIC_UNAUTHORIZED_PROMISE_URL:
752 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
753 case QUIC_DUPLICATE_PROMISE_URL:
754 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
755 case QUIC_PROMISE_VARY_MISMATCH:
756 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
757 case QUIC_INVALID_PROMISE_METHOD:
758 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
759 case QUIC_PUSH_STREAM_TIMED_OUT:
760 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
761 case QUIC_HEADERS_TOO_LARGE:
762 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
763 case QUIC_STREAM_TTL_EXPIRED:
764 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED);
765 case QUIC_DATA_AFTER_CLOSE_OFFSET:
766 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
767 case QUIC_STREAM_GENERAL_PROTOCOL_ERROR:
768 return static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR);
769 case QUIC_STREAM_INTERNAL_ERROR:
770 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
771 case QUIC_STREAM_STREAM_CREATION_ERROR:
772 return static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR);
773 case QUIC_STREAM_CLOSED_CRITICAL_STREAM:
774 return static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM);
775 case QUIC_STREAM_FRAME_UNEXPECTED:
776 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED);
777 case QUIC_STREAM_FRAME_ERROR:
778 return static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR);
779 case QUIC_STREAM_EXCESSIVE_LOAD:
780 return static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD);
781 case QUIC_STREAM_ID_ERROR:
782 return static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR);
783 case QUIC_STREAM_SETTINGS_ERROR:
784 return static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR);
785 case QUIC_STREAM_MISSING_SETTINGS:
786 return static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS);
787 case QUIC_STREAM_REQUEST_REJECTED:
788 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED);
789 case QUIC_STREAM_REQUEST_INCOMPLETE:
790 return static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE);
791 case QUIC_STREAM_CONNECT_ERROR:
792 return static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR);
793 case QUIC_STREAM_VERSION_FALLBACK:
794 return static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK);
795 case QUIC_STREAM_DECOMPRESSION_FAILED:
796 return static_cast<uint64_t>(
797 QuicHttpQpackErrorCode::DECOMPRESSION_FAILED);
798 case QUIC_STREAM_ENCODER_STREAM_ERROR:
799 return static_cast<uint64_t>(
800 QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR);
801 case QUIC_STREAM_DECODER_STREAM_ERROR:
802 return static_cast<uint64_t>(
803 QuicHttpQpackErrorCode::DECODER_STREAM_ERROR);
bnc12add152020-04-20 08:05:29 -0700804 case QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE:
bnccb0ffbc2020-04-13 10:53:11 -0700805 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
806 case QUIC_STREAM_LAST_ERROR:
807 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
808 }
809 return static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR);
810}
811
812// Convert the application error code of an IETF QUIC RESET_STREAM frame
813// to QuicRstStreamErrorCode.
814QuicRstStreamErrorCode IetfResetStreamErrorCodeToRstStreamErrorCode(
815 uint64_t ietf_error_code) {
816 switch (ietf_error_code) {
ianswett5abb89b2020-04-13 14:48:51 -0700817 case static_cast<uint64_t>(QuicHttp3ErrorCode::HTTP3_NO_ERROR):
bnccb0ffbc2020-04-13 10:53:11 -0700818 return QUIC_STREAM_NO_ERROR;
819 case static_cast<uint64_t>(QuicHttp3ErrorCode::GENERAL_PROTOCOL_ERROR):
820 return QUIC_STREAM_GENERAL_PROTOCOL_ERROR;
821 case static_cast<uint64_t>(QuicHttp3ErrorCode::INTERNAL_ERROR):
822 return QUIC_STREAM_INTERNAL_ERROR;
823 case static_cast<uint64_t>(QuicHttp3ErrorCode::STREAM_CREATION_ERROR):
824 return QUIC_STREAM_STREAM_CREATION_ERROR;
825 case static_cast<uint64_t>(QuicHttp3ErrorCode::CLOSED_CRITICAL_STREAM):
826 return QUIC_STREAM_CLOSED_CRITICAL_STREAM;
827 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_UNEXPECTED):
828 return QUIC_STREAM_FRAME_UNEXPECTED;
829 case static_cast<uint64_t>(QuicHttp3ErrorCode::FRAME_ERROR):
830 return QUIC_STREAM_FRAME_ERROR;
831 case static_cast<uint64_t>(QuicHttp3ErrorCode::EXCESSIVE_LOAD):
832 return QUIC_STREAM_EXCESSIVE_LOAD;
833 case static_cast<uint64_t>(QuicHttp3ErrorCode::ID_ERROR):
834 return QUIC_STREAM_ID_ERROR;
835 case static_cast<uint64_t>(QuicHttp3ErrorCode::SETTINGS_ERROR):
836 return QUIC_STREAM_SETTINGS_ERROR;
837 case static_cast<uint64_t>(QuicHttp3ErrorCode::MISSING_SETTINGS):
838 return QUIC_STREAM_MISSING_SETTINGS;
839 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_REJECTED):
840 return QUIC_STREAM_REQUEST_REJECTED;
841 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_CANCELLED):
842 return QUIC_STREAM_CANCELLED;
843 case static_cast<uint64_t>(QuicHttp3ErrorCode::REQUEST_INCOMPLETE):
844 return QUIC_STREAM_REQUEST_INCOMPLETE;
845 case static_cast<uint64_t>(QuicHttp3ErrorCode::CONNECT_ERROR):
846 return QUIC_STREAM_CONNECT_ERROR;
847 case static_cast<uint64_t>(QuicHttp3ErrorCode::VERSION_FALLBACK):
848 return QUIC_STREAM_VERSION_FALLBACK;
849 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECOMPRESSION_FAILED):
850 return QUIC_STREAM_DECOMPRESSION_FAILED;
851 case static_cast<uint64_t>(QuicHttpQpackErrorCode::ENCODER_STREAM_ERROR):
852 return QUIC_STREAM_ENCODER_STREAM_ERROR;
853 case static_cast<uint64_t>(QuicHttpQpackErrorCode::DECODER_STREAM_ERROR):
854 return QUIC_STREAM_DECODER_STREAM_ERROR;
855 }
bnc12add152020-04-20 08:05:29 -0700856 return QUIC_STREAM_UNKNOWN_APPLICATION_ERROR_CODE;
bnccb0ffbc2020-04-13 10:53:11 -0700857}
858
QUICHE teama6ef0a62019-03-07 20:34:33 -0500859#undef RETURN_STRING_LITERAL // undef for jumbo builds
bnc0ed49eb2020-04-09 12:06:21 -0700860
QUICHE teama6ef0a62019-03-07 20:34:33 -0500861} // namespace quic