]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
quiche: update for network path aware API
authorAlessandro Ghedini <alessandro@cloudflare.com>
Mon, 24 May 2021 12:20:36 +0000 (13:20 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 24 May 2021 15:26:46 +0000 (17:26 +0200)
Latest version of quiche requires the application to pass the peer
address of received packets, and it provides the address for outgoing
packets back.

Closes #7120

configure.ac
lib/vquic/quiche.c

index 5c697618b9f2755f32e4f4f52a19291fffbd0acd..4d2f4dcc6dcf5c5dfd6fdd35405d8eb4e1539f0c 100755 (executable)
@@ -2925,6 +2925,11 @@ if test X"$want_quiche" != Xno; then
           CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
           export CURL_LIBRARY_PATH
           AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]),
+          [],
+          [
+AC_INCLUDES_DEFAULT
+#include <sys/socket.h>
+          ]
        )
       ],
         dnl not found, revert back to clean variables
index d0d04780ed01bc97a9828cd3cda2d95482995716..b62d88437a16a2383f6a0753e7a9c761297f0ede 100644 (file)
@@ -226,7 +226,7 @@ CURLcode Curl_quic_connect(struct Curl_easy *data,
     quiche_config_log_keys(qs->cfg);
 
   qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
-                            sizeof(qs->scid), qs->cfg);
+                            sizeof(qs->scid), addr, addrlen, qs->cfg);
   if(!qs->conn) {
     failf(data, "can't create quiche connection");
     return CURLE_OUT_OF_MEMORY;
@@ -360,6 +360,9 @@ static CURLcode process_ingress(struct Curl_easy *data, int sockfd,
   ssize_t recvd;
   uint8_t *buf = (uint8_t *)data->state.buffer;
   size_t bufsize = data->set.buffer_size;
+  struct sockaddr_storage from;
+  socklen_t from_len;
+  quiche_recv_info recv_info;
 
   DEBUGASSERT(qs->conn);
 
@@ -367,17 +370,24 @@ static CURLcode process_ingress(struct Curl_easy *data, int sockfd,
   quiche_conn_on_timeout(qs->conn);
 
   do {
-    recvd = recv(sockfd, buf, bufsize, 0);
+    from_len = sizeof(from);
+
+    recvd = recvfrom(sockfd, buf, bufsize, 0,
+                     (struct sockaddr *)&from, &from_len);
+
     if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK)))
       break;
 
     if(recvd < 0) {
-      failf(data, "quiche: recv() unexpectedly returned %zd "
+      failf(data, "quiche: recvfrom() unexpectedly returned %zd "
             "(errno: %d, socket %d)", recvd, SOCKERRNO, sockfd);
       return CURLE_RECV_ERROR;
     }
 
-    recvd = quiche_conn_recv(qs->conn, buf, recvd);
+    recv_info.from = (struct sockaddr *) &from;
+    recv_info.from_len = from_len;
+
+    recvd = quiche_conn_recv(qs->conn, buf, recvd, &recv_info);
     if(recvd == QUICHE_ERR_DONE)
       break;
 
@@ -400,9 +410,10 @@ static CURLcode flush_egress(struct Curl_easy *data, int sockfd,
   ssize_t sent;
   uint8_t out[1200];
   int64_t timeout_ns;
+  quiche_send_info send_info;
 
   do {
-    sent = quiche_conn_send(qs->conn, out, sizeof(out));
+    sent = quiche_conn_send(qs->conn, out, sizeof(out), &send_info);
     if(sent == QUICHE_ERR_DONE)
       break;
 
@@ -411,9 +422,10 @@ static CURLcode flush_egress(struct Curl_easy *data, int sockfd,
       return CURLE_SEND_ERROR;
     }
 
-    sent = send(sockfd, out, sent, 0);
+    sent = sendto(sockfd, out, sent, 0,
+                  (struct sockaddr *)&send_info.to, send_info.to_len);
     if(sent < 0) {
-      failf(data, "send() returned %zd", sent);
+      failf(data, "sendto() returned %zd", sent);
       return CURLE_SEND_ERROR;
     }
   } while(1);