diff options
author | Gabe Appleton <gabe@gabeappleton.me> | 2019-06-24 09:58:56 (GMT) |
---|---|---|
committer | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-06-24 09:58:56 (GMT) |
commit | 2ac3bab2a6e1f9e17fc0c58a26e8425bb93cb0f5 (patch) | |
tree | 68715ed4b442e07baa1bc057ea4703b3746abd08 /Modules/socketmodule.c | |
parent | 770847a7db33b3d4c451b42372b6942687aa6121 (diff) | |
download | cpython-2ac3bab2a6e1f9e17fc0c58a26e8425bb93cb0f5.zip cpython-2ac3bab2a6e1f9e17fc0c58a26e8425bb93cb0f5.tar.gz cpython-2ac3bab2a6e1f9e17fc0c58a26e8425bb93cb0f5.tar.bz2 |
bpo-37345: Add formal UDPLITE support (GH-14258)
At the moment you can definitely use UDPLITE sockets on Linux systems, but it would be good if this support were formalized such that you can detect support at runtime easily.
At the moment, to make and use a UDPLITE socket requires something like the following code:
```
>>> import socket
>>> a = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 136)
>>> b = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 136)
>>> a.bind(('localhost', 44444))
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.setsockopt(136, 10, 16)
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.setsockopt(136, 10, 32)
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.setsockopt(136, 10, 64)
>>> b.sendto(b'test'*256, ('localhost', 44444))
```
If you look at this through Wireshark, you can see that the packets are different in that the checksums and checksum coverages change.
With the pull request that I am submitting momentarily, you could do the following code instead:
```
>>> import socket
>>> a = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
>>> b = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
>>> a.bind(('localhost', 44444))
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.set_send_checksum_coverage(16)
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.set_send_checksum_coverage(32)
>>> b.sendto(b'test'*256, ('localhost', 44444))
>>> b.set_send_checksum_coverage(64)
>>> b.sendto(b'test'*256, ('localhost', 44444))
```
One can also detect support for UDPLITE just by checking
```
>>> hasattr(socket, 'IPPROTO_UDPLITE')
```
https://bugs.python.org/issue37345
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r-- | Modules/socketmodule.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 36d13e7..73e64f2 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7737,6 +7737,17 @@ PyInit__socket(void) #else PyModule_AddIntConstant(m, "IPPROTO_UDP", 17); #endif +#ifdef IPPROTO_UDPLITE + PyModule_AddIntMacro(m, IPPROTO_UDPLITE); + #ifndef UDPLITE_SEND_CSCOV + #define UDPLITE_SEND_CSCOV 10 + #endif + PyModule_AddIntMacro(m, UDPLITE_SEND_CSCOV); + #ifndef UDPLITE_RECV_CSCOV + #define UDPLITE_RECV_CSCOV 11 + #endif + PyModule_AddIntMacro(m, UDPLITE_RECV_CSCOV); +#endif #ifdef IPPROTO_IDP PyModule_AddIntMacro(m, IPPROTO_IDP); #endif |