]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cf-socket: improve SO_SNDBUF update for Winsock
authorJay Satiro <raysatiro@yahoo.com>
Sun, 26 May 2024 18:56:24 +0000 (14:56 -0400)
committerJay Satiro <raysatiro@yahoo.com>
Thu, 30 May 2024 17:56:37 +0000 (13:56 -0400)
- Rename: Curl_sndbufset => Curl_sndbuf_init

- Rename: win_update_buffer_size => win_update_sndbuf_size

- Save the last set SO_SNDBUF size to compare against so that we can
  avoid setsockopt calls every second.

This is a follow-up to 0b520e12 which moved the SO_SNDBUF update check
into cf-socket. This change improves it further by making the function
names easier to understand and reducing the amount of setsockopt calls.

Closes https://github.com/curl/curl/pull/13827

lib/cf-socket.c
lib/cf-socket.h
lib/ftp.c

index b5edaff71774ec6095c30adf854ed442ffeecd3f..a6a609f7b5dcde5a97d810e416b87fcaf74ac59c 100644 (file)
@@ -370,7 +370,7 @@ int Curl_socket_close(struct Curl_easy *data, struct connectdata *conn,
 #define DETECT_OS_PREVISTA 1
 #define DETECT_OS_VISTA_OR_LATER 2
 
-void Curl_sndbufset(curl_socket_t sockfd)
+void Curl_sndbuf_init(curl_socket_t sockfd)
 {
   int val = CURL_MAX_WRITE_SIZE + 32;
   int curval = 0;
@@ -395,24 +395,6 @@ void Curl_sndbufset(curl_socket_t sockfd)
 
   setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char *)&val, sizeof(val));
 }
-
-#ifndef SIO_IDEAL_SEND_BACKLOG_QUERY
-#define SIO_IDEAL_SEND_BACKLOG_QUERY 0x4004747B
-#endif
-
-static void win_update_buffer_size(curl_socket_t sockfd)
-{
-  int result;
-  ULONG ideal;
-  DWORD ideallen;
-  result = WSAIoctl(sockfd, SIO_IDEAL_SEND_BACKLOG_QUERY, 0, 0,
-                    &ideal, sizeof(ideal), &ideallen, 0, 0);
-  if(result == 0) {
-    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF,
-               (const char *)&ideal, sizeof(ideal));
-  }
-}
-
 #endif /* USE_WINSOCK */
 
 #ifndef CURL_DISABLE_BINDLOCAL
@@ -789,7 +771,8 @@ struct cf_socket_ctx {
   struct curltime connected_at;      /* when socket connected/got first byte */
   struct curltime first_byte_at;     /* when first byte was recvd */
 #ifdef USE_WINSOCK
-  struct curltime last_sndbuf_update; /* last update of sendbuf */
+  struct curltime last_sndbuf_query_at;  /* when SO_SNDBUF last queried */
+  ULONG sndbuf_size;                     /* the last set SO_SNDBUF size */
 #endif
   int error;                         /* errno of last failure or 0 */
 #ifdef DEBUGBUILD
@@ -1025,7 +1008,7 @@ static CURLcode cf_socket_open(struct Curl_cfilter *cf,
 
   nosigpipe(data, ctx->sock);
 
-  Curl_sndbufset(ctx->sock);
+  Curl_sndbuf_init(ctx->sock);
 
   if(is_tcp && data->set.tcp_keepalive)
     tcpkeepalive(data, ctx->sock);
@@ -1285,6 +1268,32 @@ static bool cf_socket_data_pending(struct Curl_cfilter *cf,
   return (readable > 0 && (readable & CURL_CSELECT_IN));
 }
 
+#ifdef USE_WINSOCK
+
+#ifndef SIO_IDEAL_SEND_BACKLOG_QUERY
+#define SIO_IDEAL_SEND_BACKLOG_QUERY 0x4004747B
+#endif
+
+static void win_update_sndbuf_size(struct cf_socket_ctx *ctx)
+{
+  ULONG ideal;
+  DWORD ideallen;
+  struct curltime n = Curl_now();
+
+  if(Curl_timediff(n, ctx->last_sndbuf_query_at) > 1000) {
+    if(!WSAIoctl(ctx->sock, SIO_IDEAL_SEND_BACKLOG_QUERY, 0, 0,
+                  &ideal, sizeof(ideal), &ideallen, 0, 0) &&
+       ideal != ctx->sndbuf_size &&
+       !setsockopt(ctx->sock, SOL_SOCKET, SO_SNDBUF,
+                   (const char *)&ideal, sizeof(ideal))) {
+      ctx->sndbuf_size = ideal;
+    }
+    ctx->last_sndbuf_query_at = n;
+  }
+}
+
+#endif /* USE_WINSOCK */
+
 static ssize_t cf_socket_send(struct Curl_cfilter *cf, struct Curl_easy *data,
                               const void *buf, size_t len, CURLcode *err)
 {
@@ -1358,13 +1367,8 @@ static ssize_t cf_socket_send(struct Curl_cfilter *cf, struct Curl_easy *data,
   }
 
 #if defined(USE_WINSOCK)
-  if(!*err) {
-    struct curltime n = Curl_now();
-    if(Curl_timediff(n, ctx->last_sndbuf_update) > 1000) {
-      win_update_buffer_size(ctx->sock);
-      ctx->last_sndbuf_update = n;
-    }
-  }
+  if(!*err)
+    win_update_sndbuf_size(ctx);
 #endif
 
   CURL_TRC_CF(data, cf, "send(len=%zu) -> %d, err=%d",
index 058af5009898db3c0ca8815a7f2e325d682c6c0b..38a4e5511dac4ba699a9a58c78a81cc3e749e834 100644 (file)
@@ -81,9 +81,9 @@ int Curl_socket_close(struct Curl_easy *data, struct connectdata *conn,
    Buffer Size
 
 */
-void Curl_sndbufset(curl_socket_t sockfd);
+void Curl_sndbuf_init(curl_socket_t sockfd);
 #else
-#define Curl_sndbufset(y) Curl_nop_stmt
+#define Curl_sndbuf_init(y) Curl_nop_stmt
 #endif
 
 /**
index b88d4d7b0f1e23cb54d11ed3acc9db645e31b197..5b0d4a30143f87f8d99e080eddc9a8c76141357e 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -654,7 +654,7 @@ static CURLcode InitiateTransfer(struct Curl_easy *data)
     Curl_pgrsSetUploadSize(data, data->state.infilesize);
 
     /* set the SO_SNDBUF for the secondary socket for those who need it */
-    Curl_sndbufset(conn->sock[SECONDARYSOCKET]);
+    Curl_sndbuf_init(conn->sock[SECONDARYSOCKET]);
 
     Curl_xfer_setup(data, -1, -1, FALSE, SECONDARYSOCKET);
   }