diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 926679e6f32dc5..54f176a9e3e103 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -1175,6 +1175,9 @@ The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. Add option to create MPTCP sockets with ``IPPROTO_MPTCP`` (Contributed by Rui Cunha in :issue:`43571`.) +Add constants for IsoTp CAN protocol. +(Contributed by Patrick Menschel in :issue:`42653`.) + ssl --- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 828d1f3dcc6701..af6d631b758663 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -2166,6 +2166,49 @@ def testCrucialConstants(self): socket.CAN_ISOTP socket.SOCK_DGRAM + @unittest.skipUnless(hasattr(socket, "SOL_CAN_ISOTP"), + 'Constants from isotp.h required for this test.') + def testIsoTpConstants(self): + socket.SOL_CAN_ISOTP + + # for socket options affecting the socket (not the global system) + socket.CAN_ISOTP_OPTS + socket.CAN_ISOTP_RECV_FC + + # sockopts to force stmin timer values for protocol regression tests + socket.CAN_ISOTP_TX_STMIN + socket.CAN_ISOTP_RX_STMIN + socket.CAN_ISOTP_LL_OPTS + + # flags for isotp behaviour + socket.CAN_ISOTP_LISTEN_MODE + socket.CAN_ISOTP_EXTEND_ADDR + socket.CAN_ISOTP_TX_PADDING + socket.CAN_ISOTP_RX_PADDING + socket.CAN_ISOTP_CHK_PAD_LEN + socket.CAN_ISOTP_CHK_PAD_DATA + socket.CAN_ISOTP_HALF_DUPLEX + socket.CAN_ISOTP_FORCE_TXSTMIN + socket.CAN_ISOTP_FORCE_RXSTMIN + socket.CAN_ISOTP_RX_EXT_ADDR + socket.CAN_ISOTP_WAIT_TX_DONE + # This constant is new and not always available + # socket.CAN_ISOTP_SF_BROADCAST + + # default values + socket.CAN_ISOTP_DEFAULT_FLAGS + socket.CAN_ISOTP_DEFAULT_EXT_ADDRESS + socket.CAN_ISOTP_DEFAULT_PAD_CONTENT + socket.CAN_ISOTP_DEFAULT_FRAME_TXTIME + socket.CAN_ISOTP_DEFAULT_RECV_BS + socket.CAN_ISOTP_DEFAULT_EXT_ADDRESS + socket.CAN_ISOTP_DEFAULT_RECV_STMIN + socket.CAN_ISOTP_DEFAULT_RECV_WFTMAX + + socket.CAN_ISOTP_DEFAULT_LL_MTU + socket.CAN_ISOTP_DEFAULT_LL_TX_DL + socket.CAN_ISOTP_DEFAULT_LL_TX_FLAGS + def testCreateSocket(self): with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: pass diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-05-19-19-41-15.bpo-42653.qvfUpA.rst b/Misc/NEWS.d/next/Core and Builtins/2021-05-19-19-41-15.bpo-42653.qvfUpA.rst new file mode 100644 index 00000000000000..aa6e4b115b346f --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-05-19-19-41-15.bpo-42653.qvfUpA.rst @@ -0,0 +1 @@ +Add constants for IsoTp CAN protocol. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 79559c04d5104d..7ec6343f22a5e3 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7785,6 +7785,48 @@ PyInit__socket(void) PyModule_AddIntMacro(m, J1939_FILTER_MAX); #endif +#ifdef HAVE_LINUX_CAN_ISOTP_H + PyModule_AddIntMacro(m, SOL_CAN_ISOTP); + + /* for socket options affecting the socket (not the global system) */ + PyModule_AddIntMacro(m, CAN_ISOTP_OPTS); + PyModule_AddIntMacro(m, CAN_ISOTP_RECV_FC); + + /* sockopts to force stmin timer values for protocol regression tests */ + PyModule_AddIntMacro(m, CAN_ISOTP_TX_STMIN); + PyModule_AddIntMacro(m, CAN_ISOTP_RX_STMIN); + PyModule_AddIntMacro(m, CAN_ISOTP_LL_OPTS); + + /* flags for isotp behaviour */ + PyModule_AddIntMacro(m, CAN_ISOTP_LISTEN_MODE); + PyModule_AddIntMacro(m, CAN_ISOTP_EXTEND_ADDR); + PyModule_AddIntMacro(m, CAN_ISOTP_TX_PADDING); + PyModule_AddIntMacro(m, CAN_ISOTP_RX_PADDING); + PyModule_AddIntMacro(m, CAN_ISOTP_CHK_PAD_LEN); + PyModule_AddIntMacro(m, CAN_ISOTP_CHK_PAD_DATA); + PyModule_AddIntMacro(m, CAN_ISOTP_HALF_DUPLEX); + PyModule_AddIntMacro(m, CAN_ISOTP_FORCE_TXSTMIN); + PyModule_AddIntMacro(m, CAN_ISOTP_FORCE_RXSTMIN); + PyModule_AddIntMacro(m, CAN_ISOTP_RX_EXT_ADDR); + PyModule_AddIntMacro(m, CAN_ISOTP_WAIT_TX_DONE); +#ifdef CAN_ISOTP_SF_BROADCAST + /* This constant is new and not always available */ + PyModule_AddIntMacro(m, CAN_ISOTP_SF_BROADCAST); +#endif + + /* default values */ + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_FLAGS); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_EXT_ADDRESS); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_PAD_CONTENT); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_FRAME_TXTIME); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_RECV_BS); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_RECV_STMIN); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_RECV_WFTMAX); + + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_LL_MTU); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_LL_TX_DL); + PyModule_AddIntMacro(m, CAN_ISOTP_DEFAULT_LL_TX_FLAGS); +#endif #ifdef SOL_RDS PyModule_AddIntMacro(m, SOL_RDS); #endif diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index e4f375d5e8100a..ec60990fe388da 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -144,6 +144,10 @@ typedef int socklen_t; #include #endif +#ifdef HAVE_LINUX_CAN_ISOTP_H +#include +#endif + #ifdef HAVE_LINUX_CAN_J1939_H #include #endif diff --git a/configure b/configure index e1d450131fe5a0..bd8d509f262fd4 100755 --- a/configure +++ b/configure @@ -8405,8 +8405,8 @@ fi done -# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h -for ac_header in linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h +# On Linux, can.h, can/bcm.h, can/isotp.h, can/j1939.h, can/raw.h require sys/socket.h +for ac_header in linux/can.h linux/can/bcm.h linux/can/isotp.h linux/can/j1939.h linux/can/raw.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " diff --git a/configure.ac b/configure.ac index 4fc269a7309299..d6856441431d35 100644 --- a/configure.ac +++ b/configure.ac @@ -2269,8 +2269,8 @@ AC_CHECK_HEADERS(linux/vm_sockets.h,,,[ #endif ]) -# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h -AC_CHECK_HEADERS(linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h,,,[ +# On Linux, can.h, can/bcm.h, can/isotp.h, can/j1939.h, can/raw.h require sys/socket.h +AC_CHECK_HEADERS(linux/can.h linux/can/bcm.h linux/can/isotp.h linux/can/j1939.h linux/can/raw.h,,,[ #ifdef HAVE_SYS_SOCKET_H #include #endif diff --git a/pyconfig.h.in b/pyconfig.h.in index 63438d857a070c..2c7a3086e565e1 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -643,6 +643,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_J1939_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_ISOTP_H + /* Define if compiling using Linux 3.6 or later. */ #undef HAVE_LINUX_CAN_RAW_FD_FRAMES