Skip to content

Commit

Permalink
ngtcp2: Add an error code for QUIC connection errors
Browse files Browse the repository at this point in the history
  • Loading branch information
emilengler committed Jan 3, 2020
1 parent 291ed52 commit 3a1eeea
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 14 deletions.
3 changes: 3 additions & 0 deletions docs/libcurl/libcurl-errors.3
Expand Up @@ -259,6 +259,9 @@ An authentication function returned an error.
.IP "CURLE_HTTP3 (95)"
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.
.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*"
These error codes will never be returned. They were used in an old libcurl
version and are currently unused.
Expand Down
1 change: 1 addition & 0 deletions docs/libcurl/symbols-in-versions
Expand Up @@ -152,6 +152,7 @@ CURLE_URL_MALFORMAT_USER 7.1 7.17.0
CURLE_USE_SSL_FAILED 7.17.0
CURLE_WEIRD_SERVER_REPLY 7.51.0
CURLE_WRITE_ERROR 7.1
CURLE_QUIC_CONNECT_ERROR 7.69.0
CURLFILETYPE_DEVICE_BLOCK 7.21.0
CURLFILETYPE_DEVICE_CHAR 7.21.0
CURLFILETYPE_DIRECTORY 7.21.0
Expand Down
1 change: 1 addition & 0 deletions include/curl/curl.h
Expand Up @@ -609,6 +609,7 @@ typedef enum {
CURLE_AUTH_ERROR, /* 94 - an authentication function returned an
error */
CURLE_HTTP3, /* 95 - An HTTP/3 layer problem */
CURLE_QUIC_CONNECT_ERROR, /* 96 - QUIC connection error */
CURL_LAST /* never use! */
} CURLcode;

Expand Down
3 changes: 3 additions & 0 deletions lib/strerror.c
Expand Up @@ -317,6 +317,9 @@ curl_easy_strerror(CURLcode error)
case CURLE_HTTP3:
return "HTTP/3 error";

case CURLE_QUIC_CONNECT_ERROR:
return "QUIC connection error";

/* error codes not used by current libcurl */
case CURLE_OBSOLETE20:
case CURLE_OBSOLETE24:
Expand Down
26 changes: 13 additions & 13 deletions lib/vquic/ngtcp2.c
Expand Up @@ -574,10 +574,10 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
qs->version = NGTCP2_PROTO_VER;
qs->sslctx = quic_ssl_ctx(data);
if(!qs->sslctx)
return CURLE_FAILED_INIT; /* TODO: better return code */
return CURLE_QUIC_CONNECT_ERROR;

if(quic_init_ssl(qs))
return CURLE_FAILED_INIT; /* TODO: better return code */
return CURLE_QUIC_CONNECT_ERROR;

qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
Expand All @@ -595,7 +595,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
&qs->local_addrlen);
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,
NULL);
Expand All @@ -609,7 +609,7 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
&ng_callbacks, &qs->settings, NULL, qs);
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);
nwrite = ngtcp2_encode_transport_params(
Expand All @@ -618,15 +618,15 @@ CURLcode Curl_quic_connect(struct connectdata *conn,
if(nwrite < 0) {
failf(data, "ngtcp2_encode_transport_params: %s\n",
ngtcp2_strerror((int)nwrite));
return CURLE_FAILED_INIT;
return CURLE_QUIC_CONNECT_ERROR;
}

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);
if(rc)
return CURLE_FAILED_INIT; /* TODO: better return code */
return CURLE_QUIC_CONNECT_ERROR;

return CURLE_OK;
}
Expand Down Expand Up @@ -998,7 +998,7 @@ static int init_ngh3_conn(struct quicsocket *qs)

if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
failf(qs->conn->data, "too few available QUIC streams");
return CURLE_FAILED_INIT;
return CURLE_QUIC_CONNECT_ERROR;
}

nghttp3_conn_settings_default(&qs->h3settings);
Expand All @@ -1015,32 +1015,32 @@ static int init_ngh3_conn(struct quicsocket *qs)

rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
if(rc) {
result = CURLE_FAILED_INIT;
result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}

rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
if(rc) {
result = CURLE_FAILED_INIT;
result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}

rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
if(rc) {
result = CURLE_FAILED_INIT;
result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}

rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
if(rc) {
result = CURLE_FAILED_INIT;
result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}

rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
qpack_dec_stream_id);
if(rc) {
result = CURLE_FAILED_INIT;
result = CURLE_QUIC_CONNECT_ERROR;
goto fail;
}

Expand Down
2 changes: 2 additions & 0 deletions packages/OS400/curl.inc.in
Expand Up @@ -602,6 +602,8 @@
d c 94
d CURLE_HTTP3...
d c 95
d CURLE_QUIC_CONNECT_ERROR...
d c 96
*
/if not defined(CURL_NO_OLDIES)
d CURLE_URL_MALFORMAT_USER...
Expand Down
3 changes: 2 additions & 1 deletion tests/data/test1538
Expand Up @@ -128,7 +128,8 @@ e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback
e94: An authentication function returned an error
e95: HTTP/3 error
e96: Unknown error
e96: QUIC connection error
e97: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
Expand Down

0 comments on commit 3a1eeea

Please sign in to comment.