]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
quic: add Curl_quic_idle
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Tue, 12 Apr 2022 10:10:46 +0000 (19:10 +0900)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 16 May 2022 16:19:08 +0000 (18:19 +0200)
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

lib/quic.h
lib/transfer.c
lib/vquic/msh3.c
lib/vquic/ngtcp2.c
lib/vquic/quiche.c

index f92720f5d6eef2c02871814f4cb868680e69458a..d861b342ffc75f4c1b574a998e0e3f260c413a90 100644 (file)
@@ -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)
index 315da876c4a855d6222669fc08d935506172c0f2..b76e39a68efcdc7a8a5c9c5b4415f27de6e26759 100644 (file)
@@ -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))
index f7bd315be1bab005e9bf6d7072e73f34d94c14ba..4e4d0290f805e0d431b5c0a956d38c23831af9f0 100644 (file)
@@ -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 */
index 8862ac11933b9424bd93059def2a88b4b7b72617..a6d577a7b841d1b5f6de85ef8b2a7e8aaf46595c 100644 (file)
@@ -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
index e4bea4d677be0de22d39e351d3801424b06a6d2c..858630f210c3446db25caeae394ccc88ddacd68c 100644 (file)
@@ -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