diff options
author | nkinnan <nkinnan@users.noreply.github.com> | 2024-09-05 20:59:48 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-05 20:59:48 (GMT) |
commit | b5aa271f86229f126c21805ff2bd3b95526818a4 (patch) | |
tree | 3cb1d92269d3b99ec0909e662f07fa7919e6b721 /Modules | |
parent | 6e43928831a6f62b40f5e43ad4c12eff0a5f8639 (diff) | |
download | cpython-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.c | 22 | ||||
-rw-r--r-- | Modules/socketmodule.h | 3 |
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 ----------------------------------------------------*/ |