diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst index dc16c944886bd0..d0d7f6dce142ed 100644 --- a/Doc/whatsnew/3.15.rst +++ b/Doc/whatsnew/3.15.rst @@ -404,6 +404,13 @@ shelve (Contributed by Andrea Oliveri in :gh:`134004`.) +socket +------ + +* Add constants for the ISO-TP CAN protocol. + (Contributed by Patrick Menschel and Stefan Tatschner in :gh:`86819`.) + + sqlite3 ------- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index e10b34efa49842..0b93c36c70b705 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -2393,6 +2393,45 @@ def testCrucialConstants(self): socket.CAN_ISOTP socket.SOCK_DGRAM + @unittest.skipUnless(hasattr(socket, "SOL_CAN_ISOTP"), + "missing ") + def testISOTP(self): + socket.SOL_CAN_ISOTP + + socket.CAN_ISOTP_OPTS + socket.CAN_ISOTP_RECV_FC + + socket.CAN_ISOTP_TX_STMIN + socket.CAN_ISOTP_RX_STMIN + socket.CAN_ISOTP_LL_OPTS + + 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 not always available + # socket.CAN_ISOTP_SF_BROADCAST + + 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/Library/2025-08-22-09-53-45.gh-issue-86819.ECxvwx.rst b/Misc/NEWS.d/next/Library/2025-08-22-09-53-45.gh-issue-86819.ECxvwx.rst new file mode 100644 index 00000000000000..2cb980863884db --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-08-22-09-53-45.gh-issue-86819.ECxvwx.rst @@ -0,0 +1 @@ +:mod:`socket`: Add missing constants for ISO-TP sockets. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f76be53f6de4ef..b61844f932c804 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -8528,6 +8528,43 @@ socket_exec(PyObject *m) ADD_INT_MACRO(m, J1939_FILTER_MAX); #endif +#ifdef HAVE_LINUX_CAN_ISOTP_H + ADD_INT_MACRO(m, SOL_CAN_ISOTP); + + ADD_INT_MACRO(m, CAN_ISOTP_OPTS); + ADD_INT_MACRO(m, CAN_ISOTP_RECV_FC); + + ADD_INT_MACRO(m, CAN_ISOTP_TX_STMIN); + ADD_INT_MACRO(m, CAN_ISOTP_RX_STMIN); + ADD_INT_MACRO(m, CAN_ISOTP_LL_OPTS); + + ADD_INT_MACRO(m, CAN_ISOTP_LISTEN_MODE); + ADD_INT_MACRO(m, CAN_ISOTP_EXTEND_ADDR); + ADD_INT_MACRO(m, CAN_ISOTP_TX_PADDING); + ADD_INT_MACRO(m, CAN_ISOTP_RX_PADDING); + ADD_INT_MACRO(m, CAN_ISOTP_CHK_PAD_LEN); + ADD_INT_MACRO(m, CAN_ISOTP_CHK_PAD_DATA); + ADD_INT_MACRO(m, CAN_ISOTP_HALF_DUPLEX); + ADD_INT_MACRO(m, CAN_ISOTP_FORCE_TXSTMIN); + ADD_INT_MACRO(m, CAN_ISOTP_FORCE_RXSTMIN); + ADD_INT_MACRO(m, CAN_ISOTP_RX_EXT_ADDR); + ADD_INT_MACRO(m, CAN_ISOTP_WAIT_TX_DONE); +#ifdef CAN_ISOTP_SF_BROADCAST + ADD_INT_MACRO(m, CAN_ISOTP_SF_BROADCAST); +#endif + + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_FLAGS); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_EXT_ADDRESS); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_PAD_CONTENT); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_FRAME_TXTIME); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_RECV_BS); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_RECV_STMIN); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_RECV_WFTMAX); + + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_LL_MTU); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_LL_TX_DL); + ADD_INT_MACRO(m, CAN_ISOTP_DEFAULT_LL_TX_FLAGS); +#endif #ifdef SOL_RDS ADD_INT_MACRO(m, SOL_RDS); #endif diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 7fd929af5f27b4..ac770889ae87f2 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -165,6 +165,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 0461b72ad695eb..30562de4418516 100755 --- a/configure +++ b/configure @@ -12004,7 +12004,7 @@ then : fi -# On Linux, can.h, can/bcm.h, can/j1939.h, can/raw.h require sys/socket.h +# On Linux, can.h, can/bcm.h, can/isotp.h, can/j1939.h, can/raw.h require sys/socket.h # On NetBSD, netcan/can.h requires sys/socket.h ac_fn_c_check_header_compile "$LINENO" "linux/can.h" "ac_cv_header_linux_can_h" " #ifdef HAVE_SYS_SOCKET_H @@ -12027,6 +12027,17 @@ if test "x$ac_cv_header_linux_can_bcm_h" = xyes then : printf "%s\n" "#define HAVE_LINUX_CAN_BCM_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "linux/can/isotp.h" "ac_cv_header_linux_can_isotp_h" " +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +" +if test "x$ac_cv_header_linux_can_isotp_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_CAN_ISOTP_H 1" >>confdefs.h + fi ac_fn_c_check_header_compile "$LINENO" "linux/can/j1939.h" "ac_cv_header_linux_can_j1939_h" " #ifdef HAVE_SYS_SOCKET_H diff --git a/configure.ac b/configure.ac index 523afc1794706b..ac84ac65efb5c0 100644 --- a/configure.ac +++ b/configure.ac @@ -3053,10 +3053,10 @@ 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 +# On Linux, can.h, can/bcm.h, can/isotp.h, can/j1939.h, can/raw.h require sys/socket.h # On NetBSD, netcan/can.h requires sys/socket.h AC_CHECK_HEADERS( -[linux/can.h linux/can/bcm.h linux/can/j1939.h linux/can/raw.h netcan/can.h], +[linux/can.h linux/can/bcm.h linux/can/isotp.h linux/can/j1939.h linux/can/raw.h netcan/can.h], [], [], [ #ifdef HAVE_SYS_SOCKET_H #include diff --git a/pyconfig.h.in b/pyconfig.h.in index 0d6ad4465c0e93..eec1875eab6ca2 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -727,6 +727,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_H +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_ISOTP_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_CAN_J1939_H