https://github.com/python/cpython/commit/e84624450dc0494271119018c699372245d724d9
commit: e84624450dc0494271119018c699372245d724d9
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-04-22T11:02:13Z
summary:
gh-132734: Add new constants for Bluetooth sockets (GH-132735)
files:
A Misc/NEWS.d/next/Library/2025-04-19-19-58-27.gh-issue-132734.S6F9Cs.rst
M Doc/library/socket.rst
M Doc/whatsnew/3.14.rst
M Lib/test/test_socket.py
M Modules/socketmodule.c
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 2b1fae57c668de..d3f94016937a24 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -677,15 +677,62 @@ Constants
These constants describe the Bluetooth address type when binding or
connecting a :const:`BTPROTO_L2CAP` socket.
+ .. availability:: Linux, FreeBSD
+
.. versionadded:: 3.14
+.. data:: SOL_RFCOMM
+ SOL_L2CAP
+ SOL_HCI
+ SOL_SCO
+ SOL_BLUETOOTH
+
+ Used in the level argument to the :meth:`~socket.setsockopt` and
+ :meth:`~socket.getsockopt` methods of Bluetooth socket objects.
+
+ :const:`SOL_BLUETOOTH` is only available on Linux. Other constants
+ are available if the corresponding protocol is supported.
+
+.. data:: SO_L2CAP_*
+ L2CAP_LM
+ L2CAP_LM_*
+ SO_RFCOMM_*
+ RFCOMM_LM_*
+ SO_SCO_*
+ SO_BTH_*
+ BT_*
+
+ Used in the option name and value argument to the :meth:`~socket.setsockopt`
+ and :meth:`~socket.getsockopt` methods of Bluetooth socket objects.
+
+ :const:`!BT_*` and :const:`L2CAP_LM` are only available on Linux.
+ :const:`!SO_BTH_*` are only available on Windows.
+ Other constants may be available on Linux and various BSD platforms.
+
+ .. versionadded:: next
+
.. data:: HCI_FILTER
HCI_TIME_STAMP
HCI_DATA_DIR
+ SO_HCI_EVT_FILTER
+ SO_HCI_PKT_FILTER
- For use with :const:`BTPROTO_HCI`. :const:`!HCI_FILTER` is only
- available on Linux and FreeBSD. :const:`!HCI_TIME_STAMP` and
- :const:`!HCI_DATA_DIR` are only available on Linux.
+ Option names for use with :const:`BTPROTO_HCI`.
+ Availability and format of the option values depend on platform.
+
+ .. versionchanged:: next
+ Added :const:`!SO_HCI_EVT_FILTER` and :const:`!SO_HCI_PKT_FILTER`
+ on NetBSD and DragonFly BSD.
+ Added :const:`!HCI_DATA_DIR` on FreeBSD, NetBSD and DragonFly BSD.
+
+.. data:: HCI_DEV_NONE
+
+ The ``device_id`` value used to create an HCI socket that isn't specific
+ to a single Bluetooth adapter.
+
+ .. availability:: Linux
+
+ .. versionadded:: next
.. data:: HCI_CHANNEL_RAW
HCI_CHANNEL_USER
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index 373708763ac027..904a3ce6d597e9 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -1088,6 +1088,32 @@ pydoc
(Contributed by Jelle Zijlstra in :gh:`101552`.)
+socket
+------
+
+* Improve and fix support for Bluetooth sockets.
+
+ * Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
+ (Contributed by Serhiy Storchaka in :gh:`132429`.)
+ * Fix support for :const:`~socket.BTPROTO_HCI` on FreeBSD.
+ (Contributed by Victor Stinner in :gh:`111178`.)
+ * Add support for :const:`~socket.BTPROTO_SCO` on FreeBSD.
+ (Contributed by Serhiy Storchaka in :gh:`85302`.)
+ * Add support for *cid* and *bdaddr_type* in the address for
+ :const:`~socket.BTPROTO_L2CAP` on FreeBSD.
+ (Contributed by Serhiy Storchaka in :gh:`132429`.)
+ * Add support for *channel* in the address for
+ :const:`~socket.BTPROTO_HCI` on Linux.
+ (Contributed by Serhiy Storchaka in :gh:`70145`.)
+ * Accept an integer as the address for
+ :const:`~socket.BTPROTO_HCI` on Linux
+ (Contributed by Serhiy Storchaka in :gh:`132099`.)
+ * Return *cid* in :meth:`~socket.socket.getsockname` for
+ :const:`~socket.BTPROTO_L2CAP`.
+ (Contributed by Serhiy Storchaka in :gh:`132429`.)
+ * Add many new constants.
+ (Contributed by Serhiy Storchaka in :gh:`132734`.)
+
ssl
---
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index 8a3793b9072b78..ed45180a5f7d99 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -2606,7 +2606,7 @@ def testSocketBufferSize(self):
socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
[email protected](HAVE_SOCKET_BLUETOOTH,
[email protected](hasattr(socket, 'AF_BLUETOOTH'),
'Bluetooth sockets required for this test.')
class BasicBluetoothTest(unittest.TestCase):
@@ -2615,19 +2615,79 @@ def testBluetoothConstants(self):
socket.BDADDR_LOCAL
socket.AF_BLUETOOTH
socket.BTPROTO_RFCOMM
+ socket.SOL_RFCOMM
+
+ if sys.platform == "win32":
+ socket.SO_BTH_ENCRYPT
+ socket.SO_BTH_MTU
+ socket.SO_BTH_MTU_MAX
+ socket.SO_BTH_MTU_MIN
if sys.platform != "win32":
socket.BTPROTO_HCI
socket.SOL_HCI
socket.BTPROTO_L2CAP
+ socket.SOL_L2CAP
socket.BTPROTO_SCO
+ socket.SOL_SCO
+ socket.HCI_DATA_DIR
if sys.platform == "linux":
+ socket.SOL_BLUETOOTH
+ socket.HCI_DEV_NONE
socket.HCI_CHANNEL_RAW
socket.HCI_CHANNEL_USER
socket.HCI_CHANNEL_MONITOR
socket.HCI_CHANNEL_CONTROL
socket.HCI_CHANNEL_LOGGING
+ socket.HCI_TIME_STAMP
+ socket.BT_SECURITY
+ socket.BT_SECURITY_SDP
+ socket.BT_FLUSHABLE
+ socket.BT_POWER
+ socket.BT_CHANNEL_POLICY
+ socket.BT_CHANNEL_POLICY_BREDR_ONLY
+ socket.BT_PHY
+ socket.BT_PHY_BR_1M_1SLOT
+ socket.BT_MODE
+ socket.BT_MODE_BASIC
+ socket.BT_VOICE
+ socket.BT_VOICE_TRANSPARENT
+ socket.BT_VOICE_CVSD_16BIT
+ socket.BT_CODEC
+ socket.L2CAP_LM
+ socket.L2CAP_LM_MASTER
+ socket.L2CAP_LM_AUTH
+
+ if sys.platform in ("linux", "freebsd"):
+ socket.BDADDR_BREDR
+ socket.BDADDR_LE_PUBLIC
+ socket.BDADDR_LE_RANDOM
+ socket.HCI_FILTER
+
+ if sys.platform.startswith(("freebsd", "netbsd", "dragonfly")):
+ socket.SO_L2CAP_IMTU
+ socket.SO_L2CAP_FLUSH
+ socket.SO_RFCOMM_MTU
+ socket.SO_RFCOMM_FC_INFO
+ socket.SO_SCO_MTU
+
+ if sys.platform == "freebsd":
+ socket.SO_SCO_CONNINFO
+
+ if sys.platform.startswith(("netbsd", "dragonfly")):
+ socket.SO_HCI_EVT_FILTER
+ socket.SO_HCI_PKT_FILTER
+ socket.SO_L2CAP_IQOS
+ socket.SO_L2CAP_LM
+ socket.L2CAP_LM_AUTH
+ socket.SO_RFCOMM_LM
+ socket.RFCOMM_LM_AUTH
+ socket.SO_SCO_HANDLE
+
[email protected](HAVE_SOCKET_BLUETOOTH,
+ 'Bluetooth sockets required for this test.')
+class BluetoothTest(unittest.TestCase):
def testCreateRfcommSocket(self):
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM,
socket.BTPROTO_RFCOMM) as s:
diff --git
a/Misc/NEWS.d/next/Library/2025-04-19-19-58-27.gh-issue-132734.S6F9Cs.rst
b/Misc/NEWS.d/next/Library/2025-04-19-19-58-27.gh-issue-132734.S6F9Cs.rst
new file mode 100644
index 00000000000000..e0825227d6ed01
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-04-19-19-58-27.gh-issue-132734.S6F9Cs.rst
@@ -0,0 +1 @@
+Add new constants for Bluetooth :mod:`sockets <socket>`.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index f55a9583b8586a..22b94e4b03a27c 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -208,6 +208,12 @@ shutdown(how) -- shut down traffic in one or both
directions\n\
# include <sys/ioctl.h>
#endif
+#ifdef HAVE_BLUETOOTH_H
+# include <netbt/l2cap.h>
+# include <netbt/rfcomm.h>
+# include <netbt/hci.h>
+# include <netbt/sco.h>
+#endif
#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
/* make sure that the reentrant (gethostbyaddr_r etc)
@@ -474,6 +480,7 @@ remove_unusable_flags(PyObject *m)
# define BTPROTO_SCO BLUETOOTH_PROTO_SCO
# define SOL_HCI SOL_HCI_RAW
# define HCI_FILTER SO_HCI_RAW_FILTER
+# define HCI_DATA_DIR SO_HCI_RAW_DIRECTION
# define sockaddr_l2 sockaddr_l2cap
# define sockaddr_rc sockaddr_rfcomm
# define hci_dev hci_node
@@ -491,7 +498,10 @@ remove_unusable_flags(PyObject *m)
# define bt_sco bt
# define bt_hci bt
# define bt_cid bt_channel
+# define SOL_L2CAP BTPROTO_L2CAP
+# define SOL_RFCOMM BTPROTO_RFCOMM
# define SOL_HCI BTPROTO_HCI
+# define SOL_SCO BTPROTO_SCO
# define HCI_DATA_DIR SO_HCI_DIRECTION
# define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
# define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
@@ -7879,38 +7889,157 @@ socket_exec(PyObject *m)
ADD_INT_MACRO(m, AF_BLUETOOTH);
#ifdef BTPROTO_L2CAP
ADD_INT_MACRO(m, BTPROTO_L2CAP);
+ ADD_INT_MACRO(m, SOL_L2CAP);
#if defined(BDADDR_BREDR)
ADD_INT_MACRO(m, BDADDR_BREDR);
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
#endif
+#ifdef SO_L2CAP_IMTU
+ ADD_INT_MACRO(m, SO_L2CAP_IMTU);
+ ADD_INT_MACRO(m, SO_L2CAP_OMTU);
+ ADD_INT_MACRO(m, SO_L2CAP_FLUSH);
+#endif
+#ifdef SO_L2CAP_IQOS
+ ADD_INT_MACRO(m, SO_L2CAP_IQOS);
+ ADD_INT_MACRO(m, SO_L2CAP_OQOS);
+#endif
+#ifdef SO_L2CAP_ENCRYPTED
+ ADD_INT_MACRO(m, SO_L2CAP_ENCRYPTED);
+#endif
+#ifdef L2CAP_LM
+ ADD_INT_MACRO(m, L2CAP_LM);
+ ADD_INT_MACRO(m, L2CAP_LM_MASTER);
+ ADD_INT_MACRO(m, L2CAP_LM_AUTH);
+ ADD_INT_MACRO(m, L2CAP_LM_ENCRYPT);
+ ADD_INT_MACRO(m, L2CAP_LM_TRUSTED);
+ ADD_INT_MACRO(m, L2CAP_LM_RELIABLE);
+ ADD_INT_MACRO(m, L2CAP_LM_SECURE);
+#endif
+#ifdef SO_L2CAP_LM
+ ADD_INT_MACRO(m, SO_L2CAP_LM);
+ ADD_INT_MACRO(m, L2CAP_LM_AUTH);
+ ADD_INT_MACRO(m, L2CAP_LM_ENCRYPT);
+ ADD_INT_MACRO(m, L2CAP_LM_SECURE);
+#endif
#endif /* BTPROTO_L2CAP */
#ifdef BTPROTO_HCI
ADD_INT_MACRO(m, BTPROTO_HCI);
ADD_INT_MACRO(m, SOL_HCI);
-#if defined(HCI_CHANNEL_RAW)
+#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
+ ADD_INT_MACRO(m, HCI_DEV_NONE);
ADD_INT_MACRO(m, HCI_CHANNEL_RAW);
ADD_INT_MACRO(m, HCI_CHANNEL_USER);
ADD_INT_MACRO(m, HCI_CHANNEL_MONITOR);
ADD_INT_MACRO(m, HCI_CHANNEL_CONTROL);
ADD_INT_MACRO(m, HCI_CHANNEL_LOGGING);
#endif
-#if defined(HCI_FILTER)
+#ifdef HCI_FILTER
ADD_INT_MACRO(m, HCI_FILTER);
#endif
-#if defined(HCI_TIME_STAMP)
- ADD_INT_MACRO(m, HCI_TIME_STAMP);
+#ifdef HCI_DATA_DIR
ADD_INT_MACRO(m, HCI_DATA_DIR);
#endif
+#ifdef HCI_TIME_STAMP
+ ADD_INT_MACRO(m, HCI_TIME_STAMP);
+#endif
+#ifdef SO_HCI_EVT_FILTER
+ ADD_INT_MACRO(m, SO_HCI_EVT_FILTER);
+ ADD_INT_MACRO(m, SO_HCI_PKT_FILTER);
+#endif
#endif /* BTPROTO_HCI */
#ifdef BTPROTO_RFCOMM
ADD_INT_MACRO(m, BTPROTO_RFCOMM);
+ ADD_INT_MACRO(m, SOL_RFCOMM);
+#ifdef SO_RFCOMM_MTU
+ ADD_INT_MACRO(m, SO_RFCOMM_MTU);
+ ADD_INT_MACRO(m, SO_RFCOMM_FC_INFO);
+#endif
+#ifdef SO_RFCOMM_LM
+ ADD_INT_MACRO(m, SO_RFCOMM_LM);
+ ADD_INT_MACRO(m, RFCOMM_LM_AUTH);
+ ADD_INT_MACRO(m, RFCOMM_LM_ENCRYPT);
+ ADD_INT_MACRO(m, RFCOMM_LM_SECURE);
+#endif
+#ifdef MS_WINDOWS_DESKTOP
+ ADD_INT_MACRO(m, SO_BTH_ENCRYPT);
+ ADD_INT_MACRO(m, SO_BTH_MTU);
+ ADD_INT_MACRO(m, SO_BTH_MTU_MAX);
+ ADD_INT_MACRO(m, SO_BTH_MTU_MIN);
+#endif
#endif /* BTPROTO_RFCOMM */
ADD_STR_CONST(m, "BDADDR_ANY", "00:00:00:00:00:00");
ADD_STR_CONST(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
#ifdef BTPROTO_SCO
ADD_INT_MACRO(m, BTPROTO_SCO);
+ ADD_INT_MACRO(m, SOL_SCO);
+#ifdef SO_SCO_MTU
+ ADD_INT_MACRO(m, SO_SCO_MTU);
+#endif
+#ifdef SO_SCO_CONNINFO
+ ADD_INT_MACRO(m, SO_SCO_CONNINFO);
+#endif
+#ifdef SO_SCO_HANDLE
+ ADD_INT_MACRO(m, SO_SCO_HANDLE);
+#endif
#endif /* BTPROTO_SCO */
+#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
+ ADD_INT_MACRO(m, SOL_BLUETOOTH);
+ ADD_INT_MACRO(m, BT_SECURITY);
+ ADD_INT_MACRO(m, BT_SECURITY_SDP);
+ ADD_INT_MACRO(m, BT_SECURITY_LOW);
+ ADD_INT_MACRO(m, BT_SECURITY_MEDIUM);
+ ADD_INT_MACRO(m, BT_SECURITY_HIGH);
+#ifdef BT_SECURITY_FIPS
+ ADD_INT_MACRO(m, BT_SECURITY_FIPS);
+#endif
+#ifdef BT_DEFER_SETUP
+ ADD_INT_MACRO(m, BT_DEFER_SETUP);
+#endif
+ ADD_INT_MACRO(m, BT_FLUSHABLE);
+ ADD_INT_MACRO(m, BT_FLUSHABLE_OFF);
+ ADD_INT_MACRO(m, BT_FLUSHABLE_ON);
+ ADD_INT_MACRO(m, BT_POWER);
+ ADD_INT_MACRO(m, BT_POWER_FORCE_ACTIVE_OFF);
+ ADD_INT_MACRO(m, BT_POWER_FORCE_ACTIVE_ON);
+ ADD_INT_MACRO(m, BT_CHANNEL_POLICY);
+ ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_ONLY);
+ ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_PREFERRED);
+ ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_PREFERRED);
+ ADD_INT_MACRO(m, BT_VOICE);
+ ADD_INT_MACRO(m, BT_VOICE_TRANSPARENT);
+ ADD_INT_MACRO(m, BT_VOICE_CVSD_16BIT);
+#ifdef BT_VOICE_TRANSPARENT_16BIT
+ ADD_INT_MACRO(m, BT_VOICE_TRANSPARENT_16BIT);
+#endif
+ ADD_INT_MACRO(m, BT_SNDMTU);
+ ADD_INT_MACRO(m, BT_RCVMTU);
+ ADD_INT_MACRO(m, BT_PHY);
+ ADD_INT_MACRO(m, BT_PHY_BR_1M_1SLOT);
+ ADD_INT_MACRO(m, BT_PHY_BR_1M_3SLOT);
+ ADD_INT_MACRO(m, BT_PHY_BR_1M_5SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_2M_1SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_2M_3SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_2M_5SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_3M_1SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_3M_3SLOT);
+ ADD_INT_MACRO(m, BT_PHY_EDR_3M_5SLOT);
+ ADD_INT_MACRO(m, BT_PHY_LE_1M_TX);
+ ADD_INT_MACRO(m, BT_PHY_LE_1M_RX);
+ ADD_INT_MACRO(m, BT_PHY_LE_2M_TX);
+ ADD_INT_MACRO(m, BT_PHY_LE_2M_RX);
+ ADD_INT_MACRO(m, BT_PHY_LE_CODED_TX);
+ ADD_INT_MACRO(m, BT_PHY_LE_CODED_RX);
+ ADD_INT_MACRO(m, BT_MODE);
+ ADD_INT_MACRO(m, BT_MODE_BASIC);
+ ADD_INT_MACRO(m, BT_MODE_ERTM);
+ ADD_INT_MACRO(m, BT_MODE_STREAMING);
+ ADD_INT_MACRO(m, BT_MODE_LE_FLOWCTL);
+ ADD_INT_MACRO(m, BT_MODE_EXT_FLOWCTL);
+ ADD_INT_MACRO(m, BT_PKT_STATUS);
+ ADD_INT_MACRO(m, BT_ISO_QOS);
+ ADD_INT_MACRO(m, BT_CODEC);
+#endif /* HAVE_BLUETOOTH_BLUETOOTH_H */
#endif /* USE_BLUETOOTH */
#ifdef AF_CAN
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]