From: Tatsuhiro Tsujikawa Date: Tue, 12 Apr 2022 10:10:46 +0000 (+0900) Subject: quic: add Curl_quic_idle X-Git-Tag: curl-7_84_0~187 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6fcd3e6f5133aaff3af0ce84ce911df77874d106;p=thirdparty%2Fcurl.git quic: add Curl_quic_idle Add Curl_quic_idle which is called when no HTTP level read or write is performed. It is a good place to handle timer expiry for QUIC transport (.e.g, retransmission). Closes #8698 --- diff --git a/lib/quic.h b/lib/quic.h index f92720f5d6..d861b342ff 100644 --- a/lib/quic.h +++ b/lib/quic.h @@ -54,6 +54,7 @@ void Curl_quic_done(struct Curl_easy *data, bool premature); bool Curl_quic_data_pending(const struct Curl_easy *data); void Curl_quic_disconnect(struct Curl_easy *data, struct connectdata *conn, int tempindex); +CURLcode Curl_quic_idle(struct Curl_easy *data); #else /* ENABLE_QUIC */ #define Curl_quic_done_sending(x) diff --git a/lib/transfer.c b/lib/transfer.c index 315da876c4..b76e39a68e 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1222,6 +1222,14 @@ CURLcode Curl_readwrite(struct connectdata *conn, infof(data, "Done waiting for 100-continue"); } } + +#ifdef ENABLE_QUIC + if(conn->transport == TRNSPRT_QUIC) { + result = Curl_quic_idle(data); + if(result) + return result; + } +#endif } if(Curl_pgrsUpdate(data)) diff --git a/lib/vquic/msh3.c b/lib/vquic/msh3.c index f7bd315be1..4e4d0290f8 100644 --- a/lib/vquic/msh3.c +++ b/lib/vquic/msh3.c @@ -500,4 +500,16 @@ bool Curl_quic_data_pending(const struct Curl_easy *data) return stream->recv_header_len || stream->recv_data_len; } +/* + * Called from transfer.c:Curl_readwrite when neither HTTP level read + * nor write is performed. It is a good place to handle timer expiry + * for QUIC transport. + */ +CURLcode Curl_quic_idle(struct Curl_easy *data) +{ + (void)data; + H3BUGF(infof(data, "Curl_quic_idle")); + return CURLE_OK; +} + #endif /* USE_MSH3 */ diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c index 8862ac1193..a6d577a7b8 100644 --- a/lib/vquic/ngtcp2.c +++ b/lib/vquic/ngtcp2.c @@ -1894,4 +1894,26 @@ bool Curl_quic_data_pending(const struct Curl_easy *data) return Curl_dyn_len(&stream->overflow) > 0; } +/* + * Called from transfer.c:Curl_readwrite when neither HTTP level read + * nor write is performed. It is a good place to handle timer expiry + * for QUIC transport. + */ +CURLcode Curl_quic_idle(struct Curl_easy *data) +{ + struct connectdata *conn = data->conn; + curl_socket_t sockfd = conn->sock[FIRSTSOCKET]; + struct quicsocket *qs = conn->quic; + + if(ngtcp2_conn_get_expiry(qs->qconn) > timestamp()) { + return CURLE_OK; + } + + if(ng_flush_egress(data, sockfd, qs)) { + return CURLE_SEND_ERROR; + } + + return CURLE_OK; +} + #endif diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c index e4bea4d677..858630f210 100644 --- a/lib/vquic/quiche.c +++ b/lib/vquic/quiche.c @@ -864,4 +864,15 @@ bool Curl_quic_data_pending(const struct Curl_easy *data) return FALSE; } +/* + * Called from transfer.c:Curl_readwrite when neither HTTP level read + * nor write is performed. It is a good place to handle timer expiry + * for QUIC transport. + */ +CURLcode Curl_quic_idle(struct Curl_easy *data) +{ + (void)data; + return CURLE_OK; +} + #endif