[Python-checkins] bpo-32394: Remove some TCP options on old version Windows. (GH-5523)
Miss Islington (bot)
webhook-mailer at python.org
Mon Feb 26 13:36:26 EST 2018
https://github.com/python/cpython/commit/53d3f8a89971bac3d2f454ff9f923066ecc3a6d9
commit: 53d3f8a89971bac3d2f454ff9f923066ecc3a6d9
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2018-02-26T10:36:17-08:00
summary:
bpo-32394: Remove some TCP options on old version Windows. (GH-5523)
(cherry picked from commit 19e7d48ce89422091f9af93038b9fee075d46e9e)
Co-authored-by: animalize <animalize at users.noreply.github.com>
files:
A Misc/NEWS.d/next/Library/2018-02-10-13-51-56.bpo-32394.dFM9SI.rst
M Doc/library/socket.rst
M Lib/test/test_socket.py
M Modules/socketmodule.c
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 04042ffdf1ac..4ce966981eba 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -320,9 +320,16 @@ Constants
``SO_DOMAIN``, ``SO_PROTOCOL``, ``SO_PEERSEC``, ``SO_PASSSEC``,
``TCP_USER_TIMEOUT``, ``TCP_CONGESTION`` were added.
+ .. versionchanged:: 3.6.5
+ On Windows, ``TCP_FASTOPEN``, ``TCP_KEEPCNT`` appear if run-time Windows
+ supports.
+
.. versionchanged:: 3.7
``TCP_NOTSENT_LOWAT`` was added.
+ On Windows, ``TCP_KEEPIDLE``, ``TCP_KEEPINTVL`` appear if run-time Windows
+ supports.
+
.. data:: AF_CAN
PF_CAN
SOL_CAN_*
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index b0e1b7471ee2..bff1dc2d0638 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -5945,6 +5945,27 @@ def test_sendmsg_afalg_args(self):
with self.assertRaises(TypeError):
sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
+ at unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
+class TestMSWindowsTCPFlags(unittest.TestCase):
+ knownTCPFlags = {
+ # avaliable since long time ago
+ 'TCP_MAXSEG',
+ 'TCP_NODELAY',
+ # available starting with Windows 10 1607
+ 'TCP_FASTOPEN',
+ # available starting with Windows 10 1703
+ 'TCP_KEEPCNT',
+ # available starting with Windows 10 1709
+ 'TCP_KEEPIDLE',
+ 'TCP_KEEPINTVL'
+ }
+
+ def test_new_tcp_flags(self):
+ provided = [s for s in dir(socket) if s.startswith('TCP')]
+ unknown = [s for s in provided if s not in self.knownTCPFlags]
+
+ self.assertEqual([], unknown,
+ "New TCP flags were discovered. See bpo-32394 for more information")
def test_main():
tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
@@ -6005,6 +6026,7 @@ def test_main():
SendfileUsingSendTest,
SendfileUsingSendfileTest,
])
+ tests.append(TestMSWindowsTCPFlags)
thread_info = support.threading_setup()
support.run_unittest(*tests)
diff --git a/Misc/NEWS.d/next/Library/2018-02-10-13-51-56.bpo-32394.dFM9SI.rst b/Misc/NEWS.d/next/Library/2018-02-10-13-51-56.bpo-32394.dFM9SI.rst
new file mode 100644
index 000000000000..ee5807619a93
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-02-10-13-51-56.bpo-32394.dFM9SI.rst
@@ -0,0 +1,2 @@
+socket: Remove TCP_FASTOPEN,TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL flags on
+older version Windows during run-time.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index c1b24c153e2b..c264d33b0b0f 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -305,6 +305,70 @@ if_indextoname(index) -- return the corresponding interface name\n\
/* Provides the IsWindows7SP1OrGreater() function */
#include <VersionHelpers.h>
+/* remove some flags on older version Windows during run-time.
+ https://msdn.microsoft.com/en-us/library/windows/desktop/ms738596.aspx */
+typedef struct {
+ DWORD build_number; /* available starting with this Win10 BuildNumber */
+ const char flag_name[20];
+} FlagRuntimeInfo;
+
+/* IMPORTANT: make sure the list ordered by descending build_number */
+static FlagRuntimeInfo win_runtime_flags[] = {
+ /* available starting with Windows 10 1709 */
+ {16299, "TCP_KEEPIDLE"},
+ {16299, "TCP_KEEPINTVL"},
+ /* available starting with Windows 10 1703 */
+ {15063, "TCP_KEEPCNT"},
+ /* available starting with Windows 10 1607 */
+ {14393, "TCP_FASTOPEN"}
+};
+
+static void
+remove_unusable_flags(PyObject *m)
+{
+ PyObject *dict;
+ OSVERSIONINFOEX info;
+ DWORDLONG dwlConditionMask;
+
+ dict = PyModule_GetDict(m);
+ if (dict == NULL) {
+ return;
+ }
+
+ /* set to Windows 10, except BuildNumber. */
+ memset(&info, 0, sizeof(info));
+ info.dwOSVersionInfoSize = sizeof(info);
+ info.dwMajorVersion = 10;
+ info.dwMinorVersion = 0;
+
+ /* set Condition Mask */
+ dwlConditionMask = 0;
+ VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
+ VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
+ VER_SET_CONDITION(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
+
+ for (int i=0; i<sizeof(win_runtime_flags)/sizeof(FlagRuntimeInfo); i++) {
+ info.dwBuildNumber = win_runtime_flags[i].build_number;
+ /* greater than or equal to the specified version?
+ Compatibility Mode will not cheat VerifyVersionInfo(...) */
+ if (VerifyVersionInfo(
+ &info,
+ VER_MAJORVERSION|VER_MINORVERSION|VER_BUILDNUMBER,
+ dwlConditionMask)) {
+ break;
+ }
+ else {
+ if (PyDict_GetItemString(
+ dict,
+ win_runtime_flags[i].flag_name) != NULL) {
+ PyDict_DelItemString(
+ dict,
+ win_runtime_flags[i].flag_name);
+ }
+ }
+ }
+}
+
#endif
#include <stddef.h>
@@ -7890,5 +7954,11 @@ PyInit__socket(void)
#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
netdb_lock = PyThread_allocate_lock();
#endif
+
+#ifdef MS_WINDOWS
+ /* remove some flags on older version Windows during run-time */
+ remove_unusable_flags(m);
+#endif
+
return m;
}
More information about the Python-checkins
mailing list