diff --git a/lib/connect.c b/lib/connect.c index a50c09a338..a0f1f17400 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -1638,6 +1638,24 @@ CURLcode Curl_socket(struct Curl_easy *data, if(conn->transport == TRNSPRT_QUIC) { /* QUIC sockets need to be nonblocking */ (void)curlx_nonblock(*sockfd, TRUE); + switch(addr->family) { +#if defined(__linux__) && defined(IP_MTU_DISCOVER) + case AF_INET: { + int val = IP_PMTUDISC_DO; + (void)setsockopt(*sockfd, IPPROTO_IP, IP_MTU_DISCOVER, &val, + sizeof(val)); + break; + } +#endif +#if defined(__linux__) && defined(IPV6_MTU_DISCOVER) + case AF_INET6: { + int val = IPV6_PMTUDISC_DO; + (void)setsockopt(*sockfd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val, + sizeof(val)); + break; + } +#endif + } } #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID) diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c index f2acce123b..239e1d160f 100644 --- a/lib/vquic/ngtcp2.c +++ b/lib/vquic/ngtcp2.c @@ -1814,7 +1814,7 @@ static CURLcode ng_flush_egress(struct Curl_easy *data, int rv; ssize_t sent; ngtcp2_ssize outlen; - uint8_t out[NGTCP2_MAX_UDP_PAYLOAD_SIZE]; + uint8_t out[NGTCP2_MAX_PMTUD_UDP_PAYLOAD_SIZE]; ngtcp2_path_storage ps; ngtcp2_tstamp ts = timestamp(); ngtcp2_tstamp expiry; @@ -1924,7 +1924,10 @@ static CURLcode ng_flush_egress(struct Curl_easy *data, else { failf(data, "send() returned %zd (errno %d)", sent, SOCKERRNO); - return CURLE_SEND_ERROR; + if(SOCKERRNO != EMSGSIZE) { + return CURLE_SEND_ERROR; + } + /* UDP datagram is too large; caused by PMTUD. Just let it be lost. */ } } }