summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authornkinnan <nkinnan@users.noreply.github.com>2024-09-05 20:59:48 (GMT)
committerGitHub <noreply@github.com>2024-09-05 20:59:48 (GMT)
commitb5aa271f86229f126c21805ff2bd3b95526818a4 (patch)
tree3cb1d92269d3b99ec0909e662f07fa7919e6b721 /Modules
parent6e43928831a6f62b40f5e43ad4c12eff0a5f8639 (diff)
downloadcpython-b5aa271f86229f126c21805ff2bd3b95526818a4.zip
cpython-b5aa271f86229f126c21805ff2bd3b95526818a4.tar.gz
cpython-b5aa271f86229f126c21805ff2bd3b95526818a4.tar.bz2
gh-123476: Add support for TCP_QUICKACK socket setting to Windows (#123478)
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Steve Dower <steve.dower@microsoft.com>
Diffstat (limited to 'Modules')
-rw-r--r--Modules/socketmodule.c22
-rw-r--r--Modules/socketmodule.h3
2 files changed, 25 insertions, 0 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 3ffdaa4..77e0965 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3166,6 +3166,17 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args)
/* setsockopt(level, opt, flag) */
if (PyArg_ParseTuple(args, "iii:setsockopt",
&level, &optname, &flag)) {
+#ifdef MS_WINDOWS
+ if (optname == SIO_TCP_SET_ACK_FREQUENCY) {
+ int dummy;
+ res = WSAIoctl(s->sock_fd, SIO_TCP_SET_ACK_FREQUENCY, &flag,
+ sizeof(flag), NULL, 0, &dummy, NULL, NULL);
+ if (res >= 0) {
+ s->quickack = flag;
+ }
+ goto done;
+ }
+#endif
res = setsockopt(s->sock_fd, level, optname,
(char*)&flag, sizeof flag);
goto done;
@@ -3252,6 +3263,11 @@ sock_getsockopt(PySocketSockObject *s, PyObject *args)
return PyLong_FromUnsignedLong(vflag);
}
#endif
+#ifdef MS_WINDOWS
+ if (optname == SIO_TCP_SET_ACK_FREQUENCY) {
+ return PyLong_FromLong(s->quickack);
+ }
+#endif
flagsize = sizeof flag;
res = getsockopt(s->sock_fd, level, optname,
(void *)&flag, &flagsize);
@@ -5316,6 +5332,9 @@ sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
((PySocketSockObject *)new)->errorhandler = &set_error;
+#ifdef MS_WINDOWS
+ ((PySocketSockObject *)new)->quickack = 0;
+#endif
}
return new;
}
@@ -8616,6 +8635,9 @@ socket_exec(PyObject *m)
#ifdef TCP_CONNECTION_INFO
ADD_INT_MACRO(m, TCP_CONNECTION_INFO);
#endif
+#ifdef SIO_TCP_SET_ACK_FREQUENCY
+#define TCP_QUICKACK SIO_TCP_SET_ACK_FREQUENCY
+#endif
#ifdef TCP_QUICKACK
ADD_INT_MACRO(m, TCP_QUICKACK);
#endif
diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h
index 09fd70f..a77c620 100644
--- a/Modules/socketmodule.h
+++ b/Modules/socketmodule.h
@@ -325,6 +325,9 @@ typedef struct {
PyTime_t sock_timeout; /* Operation timeout in seconds;
0.0 means non-blocking */
struct _socket_state *state;
+#ifdef MS_WINDOWS
+ int quickack;
+#endif
} PySocketSockObject;
/* --- C API ----------------------------------------------------*/