ngtcp2: Add an error code for QUIC connection errors

- Add new error code CURLE_QUIC_CONNECT_ERROR for QUIC connection
  errors.

Prior to this change CURLE_FAILED_INIT was used, but that was not
correct.

Closes https://github.com/curl/curl/pull/4754
This commit is contained in:
Emil Engler 2019-12-24 11:17:16 +01:00 committed by Jay Satiro
parent b700662b1c
commit cbb5429001
7 changed files with 25 additions and 14 deletions

View file

@ -259,6 +259,9 @@ An authentication function returned an error.
.IP "CURLE_HTTP3 (95)" .IP "CURLE_HTTP3 (95)"
A problem was detected in the HTTP/3 layer. This is somewhat generic and can A problem was detected in the HTTP/3 layer. This is somewhat generic and can
be one out of several problems, see the error buffer for details. be one out of several problems, see the error buffer for details.
.IP "CURLE_QUIC_CONNECT_ERROR (96)"
QUIC connection error. This error may be caused by an SSL library error. QUIC
is the protocol used for HTTP/3 transfers.
.IP "CURLE_OBSOLETE*" .IP "CURLE_OBSOLETE*"
These error codes will never be returned. They were used in an old libcurl These error codes will never be returned. They were used in an old libcurl
version and are currently unused. version and are currently unused.

View file

@ -152,6 +152,7 @@ CURLE_URL_MALFORMAT_USER 7.1 7.17.0
CURLE_USE_SSL_FAILED 7.17.0 CURLE_USE_SSL_FAILED 7.17.0
CURLE_WEIRD_SERVER_REPLY 7.51.0 CURLE_WEIRD_SERVER_REPLY 7.51.0
CURLE_WRITE_ERROR 7.1 CURLE_WRITE_ERROR 7.1
CURLE_QUIC_CONNECT_ERROR 7.69.0
CURLFILETYPE_DEVICE_BLOCK 7.21.0 CURLFILETYPE_DEVICE_BLOCK 7.21.0
CURLFILETYPE_DEVICE_CHAR 7.21.0 CURLFILETYPE_DEVICE_CHAR 7.21.0
CURLFILETYPE_DIRECTORY 7.21.0 CURLFILETYPE_DIRECTORY 7.21.0

View file

@ -600,6 +600,7 @@ typedef enum {
CURLE_AUTH_ERROR, /* 94 - an authentication function returned an CURLE_AUTH_ERROR, /* 94 - an authentication function returned an
error */ error */
CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */ CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */
CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */
CURL_LAST /* never use! */ CURL_LAST /* never use! */
} CURLcode; } CURLcode;

View file

@ -317,6 +317,9 @@ curl_easy_strerror(CURLcode error)
case CURLE_HTTP3: case CURLE_HTTP3:
return "HTTP/3 error"; return "HTTP/3 error";
case CURLE_QUIC_CONNECT_ERROR:
return "QUIC connection error";
/* error codes not used by current libcurl */ /* error codes not used by current libcurl */
case CURLE_OBSOLETE20: case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24: case CURLE_OBSOLETE24:

View file

@ -574,10 +574,10 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
qs->version = NGTCP2_PROTO_VER; qs->version = NGTCP2_PROTO_VER;
qs->sslctx = quic_ssl_ctx(data); qs->sslctx = quic_ssl_ctx(data);
if(!qs->sslctx) if(!qs->sslctx)
return CURLE_FAILED_INIT; /* TODO: better return code */ return CURLE_QUIC_CONNECT_ERROR;
if(quic_init_ssl(qs)) if(quic_init_ssl(qs))
return CURLE_FAILED_INIT; /* TODO: better return code */ return CURLE_QUIC_CONNECT_ERROR;
qs->dcid.datalen = NGTCP2_MAX_CIDLEN; qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN); result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
@ -595,7 +595,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr, rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
&qs->local_addrlen); &qs->local_addrlen);
if(rv == -1) if(rv == -1)
return CURLE_FAILED_INIT; return CURLE_QUIC_CONNECT_ERROR;
ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen, ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
NULL); NULL);
@ -609,7 +609,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER, rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
&ng_callbacks, &qs->settings, NULL, qs); &ng_callbacks, &qs->settings, NULL, qs);
if(rc) if(rc)
return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */ return CURLE_QUIC_CONNECT_ERROR;
ngtcp2_conn_get_local_transport_params(qs->qconn, &params); ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
nwrite = ngtcp2_encode_transport_params( nwrite = ngtcp2_encode_transport_params(
@ -618,15 +618,15 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
if(nwrite < 0) { if(nwrite < 0) {
failf(data, "ngtcp2_encode_transport_params: %s\n", failf(data, "ngtcp2_encode_transport_params: %s\n",
ngtcp2_strerror((int)nwrite)); ngtcp2_strerror((int)nwrite));
return CURLE_FAILED_INIT; return CURLE_QUIC_CONNECT_ERROR;
} }
if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite)) if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
return CURLE_FAILED_INIT; return CURLE_QUIC_CONNECT_ERROR;
rc = setup_initial_crypto_context(qs); rc = setup_initial_crypto_context(qs);
if(rc) if(rc)
return CURLE_FAILED_INIT; /* TODO: better return code */ return CURLE_QUIC_CONNECT_ERROR;
return CURLE_OK; return CURLE_OK;
} }
@ -998,7 +998,7 @@ static int init_ngh3_conn(struct quicsocket *qs)
if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) { if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
failf(qs->conn->data, "too few available QUIC streams"); failf(qs->conn->data, "too few available QUIC streams");
return CURLE_FAILED_INIT; return CURLE_QUIC_CONNECT_ERROR;
} }
nghttp3_conn_settings_default(&qs->h3settings); nghttp3_conn_settings_default(&qs->h3settings);
@ -1015,32 +1015,32 @@ static int init_ngh3_conn(struct quicsocket *qs)
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL); rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
if(rc) { if(rc) {
result = CURLE_FAILED_INIT; result = CURLE_QUIC_CONNECT_ERROR;
goto fail; goto fail;
} }
rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id); rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
if(rc) { if(rc) {
result = CURLE_FAILED_INIT; result = CURLE_QUIC_CONNECT_ERROR;
goto fail; goto fail;
} }
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL); rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
if(rc) { if(rc) {
result = CURLE_FAILED_INIT; result = CURLE_QUIC_CONNECT_ERROR;
goto fail; goto fail;
} }
rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL); rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
if(rc) { if(rc) {
result = CURLE_FAILED_INIT; result = CURLE_QUIC_CONNECT_ERROR;
goto fail; goto fail;
} }
rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id, rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
qpack_dec_stream_id); qpack_dec_stream_id);
if(rc) { if(rc) {
result = CURLE_FAILED_INIT; result = CURLE_QUIC_CONNECT_ERROR;
goto fail; goto fail;
} }

View file

@ -602,6 +602,8 @@
d c 94 d c 94
d CURLE_HTTP3... d CURLE_HTTP3...
d c 95 d c 95
d CURLE_QUIC_CONNECT_ERROR...
d c 96
* *
/if not defined(CURL_NO_OLDIES) /if not defined(CURL_NO_OLDIES)
d CURLE_URL_MALFORMAT_USER... d CURLE_URL_MALFORMAT_USER...

View file

@ -128,7 +128,8 @@ e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback e93: API function called from within callback
e94: An authentication function returned an error e94: An authentication function returned an error
e95: HTTP/3 error e95: HTTP/3 error
e96: Unknown error e96: QUIC connection error
e97: Unknown error
m-1: Please call curl_multi_perform() soon m-1: Please call curl_multi_perform() soon
m0: No error m0: No error
m1: Invalid multi handle m1: Invalid multi handle