summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Ghedini <alessandro@cloudflare.com>2021-05-24 13:20:36 +0100
committerDaniel Stenberg <daniel@haxx.se>2021-05-24 17:26:46 +0200
commit424aa64d54fd2c4baf69aa0c09bf5db347ff59f0 (patch)
tree2a71261c28e6d921b86cf2c48690672e78cdd860
parenta62e6435f4c110d14644bc8298d83c2e7b18dee5 (diff)
downloadcurl-424aa64d54fd2c4baf69aa0c09bf5db347ff59f0.tar.gz
quiche: update for network path aware API
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
-rwxr-xr-xconfigure.ac5
-rw-r--r--lib/vquic/quiche.c26
2 files changed, 24 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac
index 5c697618b..4d2f4dcc6 100755
--- a/configure.ac
+++ b/configure.ac
@@ -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
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
index d0d04780e..b62d88437 100644
--- a/lib/vquic/quiche.c
+++ b/lib/vquic/quiche.c
@@ -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);