Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Lib/test/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,8 @@ def testSendtoErrors(self):
def testCrucialConstants(self):
# Testing for mission critical constants
socket.AF_INET
if socket.has_ipv6:
socket.AF_INET6
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
Expand All @@ -875,6 +877,23 @@ def testCrucialConstants(self):
socket.SOL_SOCKET
socket.SO_REUSEADDR

def testCrucialIpProtoConstants(self):
socket.IPPROTO_TCP
socket.IPPROTO_UDP
if socket.has_ipv6:
socket.IPPROTO_IPV6

@unittest.skipUnless(os.name == "nt", "Windows specific")
def testWindowsSpecificConstants(self):
socket.IPPROTO_ICLFXBM
socket.IPPROTO_ST
socket.IPPROTO_CBT
socket.IPPROTO_IGP
socket.IPPROTO_RDP
socket.IPPROTO_PGM
socket.IPPROTO_L2TP
socket.IPPROTO_SCTP

def testHostnameRes(self):
# Testing hostname resolution mechanisms
hostname = socket.gethostname()
Expand Down
27 changes: 27 additions & 0 deletions Misc/NEWS.d/next/Windows/2019-03-05-18-09-43.bpo-29515.vwUTv0.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Add the following socket module constants on Windows:
IPPROTO_AH
IPPROTO_CBT
IPPROTO_DSTOPTS
IPPROTO_EGP
IPPROTO_ESP
IPPROTO_FRAGMENT
IPPROTO_GGP
IPPROTO_HOPOPTS
IPPROTO_ICLFXBM
IPPROTO_ICMPV6
IPPROTO_IDP
IPPROTO_IGMP
IPPROTO_IGP
IPPROTO_IPV4
IPPROTO_IPV6
IPPROTO_L2TP
IPPROTO_MAX
IPPROTO_ND
IPPROTO_NONE
IPPROTO_PGM
IPPROTO_PIM
IPPROTO_PUP
IPPROTO_RDP
IPPROTO_ROUTING
IPPROTO_SCTP
IPPROTO_ST
47 changes: 46 additions & 1 deletion Modules/socketmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,40 @@ if_indextoname(index) -- return the corresponding interface name\n\
# include <fcntl.h>
# endif

/* Macros based on the IPPROTO enum, see: https://bugs.python.org/issue29515 */
#ifdef MS_WINDOWS
#define IPPROTO_ICMP IPPROTO_ICMP
#define IPPROTO_IGMP IPPROTO_IGMP
#define IPPROTO_GGP IPPROTO_GGP
#define IPPROTO_TCP IPPROTO_TCP
#define IPPROTO_PUP IPPROTO_PUP
#define IPPROTO_UDP IPPROTO_UDP
#define IPPROTO_IDP IPPROTO_IDP
#define IPPROTO_ND IPPROTO_ND
#define IPPROTO_RAW IPPROTO_RAW
#define IPPROTO_MAX IPPROTO_MAX
#define IPPROTO_HOPOPTS IPPROTO_HOPOPTS
#define IPPROTO_IPV4 IPPROTO_IPV4
#define IPPROTO_IPV6 IPPROTO_IPV6
#define IPPROTO_ROUTING IPPROTO_ROUTING
#define IPPROTO_FRAGMENT IPPROTO_FRAGMENT
#define IPPROTO_ESP IPPROTO_ESP
#define IPPROTO_AH IPPROTO_AH
#define IPPROTO_ICMPV6 IPPROTO_ICMPV6
#define IPPROTO_NONE IPPROTO_NONE
#define IPPROTO_DSTOPTS IPPROTO_DSTOPTS
#define IPPROTO_EGP IPPROTO_EGP
#define IPPROTO_PIM IPPROTO_PIM
#define IPPROTO_ICLFXBM IPPROTO_ICLFXBM // WinSock2 only
#define IPPROTO_ST IPPROTO_ST // WinSock2 only
#define IPPROTO_CBT IPPROTO_CBT // WinSock2 only
#define IPPROTO_IGP IPPROTO_IGP // WinSock2 only
#define IPPROTO_RDP IPPROTO_RDP // WinSock2 only
#define IPPROTO_PGM IPPROTO_PGM // WinSock2 only
#define IPPROTO_L2TP IPPROTO_L2TP // WinSock2 only
#define IPPROTO_SCTP IPPROTO_SCTP // WinSock2 only
#endif /* MS_WINDOWS */

/* Provides the IsWindows7SP1OrGreater() function */
#include <versionhelpers.h>

Expand Down Expand Up @@ -355,7 +389,7 @@ remove_unusable_flags(PyObject *m)

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?
/* greater than or equal to the specified version?
Compatibility Mode will not cheat VerifyVersionInfo(...) */
if (VerifyVersionInfo(
&info,
Expand Down Expand Up @@ -7658,6 +7692,17 @@ PyInit__socket(void)
PyModule_AddIntMacro(m, IPPROTO_MAX);
#endif

#ifdef MS_WINDOWS
PyModule_AddIntMacro(m, IPPROTO_ICLFXBM);
PyModule_AddIntMacro(m, IPPROTO_ST);
PyModule_AddIntMacro(m, IPPROTO_CBT);
PyModule_AddIntMacro(m, IPPROTO_IGP);
PyModule_AddIntMacro(m, IPPROTO_RDP);
PyModule_AddIntMacro(m, IPPROTO_PGM);
PyModule_AddIntMacro(m, IPPROTO_L2TP);
PyModule_AddIntMacro(m, IPPROTO_SCTP);
#endif

#ifdef SYSPROTO_CONTROL
PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
#endif
Expand Down