Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e846244

Browse filesBrowse files
gh-132734: Add new constants for Bluetooth sockets (GH-132735)
1 parent 05d0559 commit e846244
Copy full SHA for e846244

File tree

Expand file treeCollapse file tree

5 files changed

+271
-8
lines changed
Filter options
Expand file treeCollapse file tree

5 files changed

+271
-8
lines changed

‎Doc/library/socket.rst

Copy file name to clipboardExpand all lines: Doc/library/socket.rst
+50-3Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -677,15 +677,62 @@ Constants
677677
These constants describe the Bluetooth address type when binding or
678678
connecting a :const:`BTPROTO_L2CAP` socket.
679679

680+
.. availability:: Linux, FreeBSD
681+
680682
.. versionadded:: 3.14
681683

684+
.. data:: SOL_RFCOMM
685+
SOL_L2CAP
686+
SOL_HCI
687+
SOL_SCO
688+
SOL_BLUETOOTH
689+
690+
Used in the level argument to the :meth:`~socket.setsockopt` and
691+
:meth:`~socket.getsockopt` methods of Bluetooth socket objects.
692+
693+
:const:`SOL_BLUETOOTH` is only available on Linux. Other constants
694+
are available if the corresponding protocol is supported.
695+
696+
.. data:: SO_L2CAP_*
697+
L2CAP_LM
698+
L2CAP_LM_*
699+
SO_RFCOMM_*
700+
RFCOMM_LM_*
701+
SO_SCO_*
702+
SO_BTH_*
703+
BT_*
704+
705+
Used in the option name and value argument to the :meth:`~socket.setsockopt`
706+
and :meth:`~socket.getsockopt` methods of Bluetooth socket objects.
707+
708+
:const:`!BT_*` and :const:`L2CAP_LM` are only available on Linux.
709+
:const:`!SO_BTH_*` are only available on Windows.
710+
Other constants may be available on Linux and various BSD platforms.
711+
712+
.. versionadded:: next
713+
682714
.. data:: HCI_FILTER
683715
HCI_TIME_STAMP
684716
HCI_DATA_DIR
717+
SO_HCI_EVT_FILTER
718+
SO_HCI_PKT_FILTER
685719

686-
For use with :const:`BTPROTO_HCI`. :const:`!HCI_FILTER` is only
687-
available on Linux and FreeBSD. :const:`!HCI_TIME_STAMP` and
688-
:const:`!HCI_DATA_DIR` are only available on Linux.
720+
Option names for use with :const:`BTPROTO_HCI`.
721+
Availability and format of the option values depend on platform.
722+
723+
.. versionchanged:: next
724+
Added :const:`!SO_HCI_EVT_FILTER` and :const:`!SO_HCI_PKT_FILTER`
725+
on NetBSD and DragonFly BSD.
726+
Added :const:`!HCI_DATA_DIR` on FreeBSD, NetBSD and DragonFly BSD.
727+
728+
.. data:: HCI_DEV_NONE
729+
730+
The ``device_id`` value used to create an HCI socket that isn't specific
731+
to a single Bluetooth adapter.
732+
733+
.. availability:: Linux
734+
735+
.. versionadded:: next
689736

690737
.. data:: HCI_CHANNEL_RAW
691738
HCI_CHANNEL_USER

‎Doc/whatsnew/3.14.rst

Copy file name to clipboardExpand all lines: Doc/whatsnew/3.14.rst
+26Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,32 @@ pydoc
10881088
(Contributed by Jelle Zijlstra in :gh:`101552`.)
10891089

10901090

1091+
socket
1092+
------
1093+
1094+
* Improve and fix support for Bluetooth sockets.
1095+
1096+
* Fix support of Bluetooth sockets on NetBSD and DragonFly BSD.
1097+
(Contributed by Serhiy Storchaka in :gh:`132429`.)
1098+
* Fix support for :const:`~socket.BTPROTO_HCI` on FreeBSD.
1099+
(Contributed by Victor Stinner in :gh:`111178`.)
1100+
* Add support for :const:`~socket.BTPROTO_SCO` on FreeBSD.
1101+
(Contributed by Serhiy Storchaka in :gh:`85302`.)
1102+
* Add support for *cid* and *bdaddr_type* in the address for
1103+
:const:`~socket.BTPROTO_L2CAP` on FreeBSD.
1104+
(Contributed by Serhiy Storchaka in :gh:`132429`.)
1105+
* Add support for *channel* in the address for
1106+
:const:`~socket.BTPROTO_HCI` on Linux.
1107+
(Contributed by Serhiy Storchaka in :gh:`70145`.)
1108+
* Accept an integer as the address for
1109+
:const:`~socket.BTPROTO_HCI` on Linux
1110+
(Contributed by Serhiy Storchaka in :gh:`132099`.)
1111+
* Return *cid* in :meth:`~socket.socket.getsockname` for
1112+
:const:`~socket.BTPROTO_L2CAP`.
1113+
(Contributed by Serhiy Storchaka in :gh:`132429`.)
1114+
* Add many new constants.
1115+
(Contributed by Serhiy Storchaka in :gh:`132734`.)
1116+
10911117
ssl
10921118
---
10931119

‎Lib/test/test_socket.py

Copy file name to clipboardExpand all lines: Lib/test/test_socket.py
+61-1Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2606,7 +2606,7 @@ def testSocketBufferSize(self):
26062606
socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
26072607

26082608

2609-
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2609+
@unittest.skipUnless(hasattr(socket, 'AF_BLUETOOTH'),
26102610
'Bluetooth sockets required for this test.')
26112611
class BasicBluetoothTest(unittest.TestCase):
26122612

@@ -2615,19 +2615,79 @@ def testBluetoothConstants(self):
26152615
socket.BDADDR_LOCAL
26162616
socket.AF_BLUETOOTH
26172617
socket.BTPROTO_RFCOMM
2618+
socket.SOL_RFCOMM
2619+
2620+
if sys.platform == "win32":
2621+
socket.SO_BTH_ENCRYPT
2622+
socket.SO_BTH_MTU
2623+
socket.SO_BTH_MTU_MAX
2624+
socket.SO_BTH_MTU_MIN
26182625

26192626
if sys.platform != "win32":
26202627
socket.BTPROTO_HCI
26212628
socket.SOL_HCI
26222629
socket.BTPROTO_L2CAP
2630+
socket.SOL_L2CAP
26232631
socket.BTPROTO_SCO
2632+
socket.SOL_SCO
2633+
socket.HCI_DATA_DIR
26242634

26252635
if sys.platform == "linux":
2636+
socket.SOL_BLUETOOTH
2637+
socket.HCI_DEV_NONE
26262638
socket.HCI_CHANNEL_RAW
26272639
socket.HCI_CHANNEL_USER
26282640
socket.HCI_CHANNEL_MONITOR
26292641
socket.HCI_CHANNEL_CONTROL
26302642
socket.HCI_CHANNEL_LOGGING
2643+
socket.HCI_TIME_STAMP
2644+
socket.BT_SECURITY
2645+
socket.BT_SECURITY_SDP
2646+
socket.BT_FLUSHABLE
2647+
socket.BT_POWER
2648+
socket.BT_CHANNEL_POLICY
2649+
socket.BT_CHANNEL_POLICY_BREDR_ONLY
2650+
socket.BT_PHY
2651+
socket.BT_PHY_BR_1M_1SLOT
2652+
socket.BT_MODE
2653+
socket.BT_MODE_BASIC
2654+
socket.BT_VOICE
2655+
socket.BT_VOICE_TRANSPARENT
2656+
socket.BT_VOICE_CVSD_16BIT
2657+
socket.BT_CODEC
2658+
socket.L2CAP_LM
2659+
socket.L2CAP_LM_MASTER
2660+
socket.L2CAP_LM_AUTH
2661+
2662+
if sys.platform in ("linux", "freebsd"):
2663+
socket.BDADDR_BREDR
2664+
socket.BDADDR_LE_PUBLIC
2665+
socket.BDADDR_LE_RANDOM
2666+
socket.HCI_FILTER
2667+
2668+
if sys.platform.startswith(("freebsd", "netbsd", "dragonfly")):
2669+
socket.SO_L2CAP_IMTU
2670+
socket.SO_L2CAP_FLUSH
2671+
socket.SO_RFCOMM_MTU
2672+
socket.SO_RFCOMM_FC_INFO
2673+
socket.SO_SCO_MTU
2674+
2675+
if sys.platform == "freebsd":
2676+
socket.SO_SCO_CONNINFO
2677+
2678+
if sys.platform.startswith(("netbsd", "dragonfly")):
2679+
socket.SO_HCI_EVT_FILTER
2680+
socket.SO_HCI_PKT_FILTER
2681+
socket.SO_L2CAP_IQOS
2682+
socket.SO_L2CAP_LM
2683+
socket.L2CAP_LM_AUTH
2684+
socket.SO_RFCOMM_LM
2685+
socket.RFCOMM_LM_AUTH
2686+
socket.SO_SCO_HANDLE
2687+
2688+
@unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
2689+
'Bluetooth sockets required for this test.')
2690+
class BluetoothTest(unittest.TestCase):
26312691

26322692
def testCreateRfcommSocket(self):
26332693
with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add new constants for Bluetooth :mod:`sockets <socket>`.

‎Modules/socketmodule.c

Copy file name to clipboardExpand all lines: Modules/socketmodule.c
+133-4Lines changed: 133 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ shutdown(how) -- shut down traffic in one or both directions\n\
208208
# include <sys/ioctl.h>
209209
#endif
210210

211+
#ifdef HAVE_BLUETOOTH_H
212+
# include <netbt/l2cap.h>
213+
# include <netbt/rfcomm.h>
214+
# include <netbt/hci.h>
215+
# include <netbt/sco.h>
216+
#endif
211217

212218
#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
213219
/* make sure that the reentrant (gethostbyaddr_r etc)
@@ -474,6 +480,7 @@ remove_unusable_flags(PyObject *m)
474480
# define BTPROTO_SCO BLUETOOTH_PROTO_SCO
475481
# define SOL_HCI SOL_HCI_RAW
476482
# define HCI_FILTER SO_HCI_RAW_FILTER
483+
# define HCI_DATA_DIR SO_HCI_RAW_DIRECTION
477484
# define sockaddr_l2 sockaddr_l2cap
478485
# define sockaddr_rc sockaddr_rfcomm
479486
# define hci_dev hci_node
@@ -491,7 +498,10 @@ remove_unusable_flags(PyObject *m)
491498
# define bt_sco bt
492499
# define bt_hci bt
493500
# define bt_cid bt_channel
501+
# define SOL_L2CAP BTPROTO_L2CAP
502+
# define SOL_RFCOMM BTPROTO_RFCOMM
494503
# define SOL_HCI BTPROTO_HCI
504+
# define SOL_SCO BTPROTO_SCO
495505
# define HCI_DATA_DIR SO_HCI_DIRECTION
496506
# define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
497507
# define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
@@ -7879,38 +7889,157 @@ socket_exec(PyObject *m)
78797889
ADD_INT_MACRO(m, AF_BLUETOOTH);
78807890
#ifdef BTPROTO_L2CAP
78817891
ADD_INT_MACRO(m, BTPROTO_L2CAP);
7892+
ADD_INT_MACRO(m, SOL_L2CAP);
78827893
#if defined(BDADDR_BREDR)
78837894
ADD_INT_MACRO(m, BDADDR_BREDR);
78847895
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
78857896
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
78867897
#endif
7898+
#ifdef SO_L2CAP_IMTU
7899+
ADD_INT_MACRO(m, SO_L2CAP_IMTU);
7900+
ADD_INT_MACRO(m, SO_L2CAP_OMTU);
7901+
ADD_INT_MACRO(m, SO_L2CAP_FLUSH);
7902+
#endif
7903+
#ifdef SO_L2CAP_IQOS
7904+
ADD_INT_MACRO(m, SO_L2CAP_IQOS);
7905+
ADD_INT_MACRO(m, SO_L2CAP_OQOS);
7906+
#endif
7907+
#ifdef SO_L2CAP_ENCRYPTED
7908+
ADD_INT_MACRO(m, SO_L2CAP_ENCRYPTED);
7909+
#endif
7910+
#ifdef L2CAP_LM
7911+
ADD_INT_MACRO(m, L2CAP_LM);
7912+
ADD_INT_MACRO(m, L2CAP_LM_MASTER);
7913+
ADD_INT_MACRO(m, L2CAP_LM_AUTH);
7914+
ADD_INT_MACRO(m, L2CAP_LM_ENCRYPT);
7915+
ADD_INT_MACRO(m, L2CAP_LM_TRUSTED);
7916+
ADD_INT_MACRO(m, L2CAP_LM_RELIABLE);
7917+
ADD_INT_MACRO(m, L2CAP_LM_SECURE);
7918+
#endif
7919+
#ifdef SO_L2CAP_LM
7920+
ADD_INT_MACRO(m, SO_L2CAP_LM);
7921+
ADD_INT_MACRO(m, L2CAP_LM_AUTH);
7922+
ADD_INT_MACRO(m, L2CAP_LM_ENCRYPT);
7923+
ADD_INT_MACRO(m, L2CAP_LM_SECURE);
7924+
#endif
78877925
#endif /* BTPROTO_L2CAP */
78887926
#ifdef BTPROTO_HCI
78897927
ADD_INT_MACRO(m, BTPROTO_HCI);
78907928
ADD_INT_MACRO(m, SOL_HCI);
7891-
#if defined(HCI_CHANNEL_RAW)
7929+
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
7930+
ADD_INT_MACRO(m, HCI_DEV_NONE);
78927931
ADD_INT_MACRO(m, HCI_CHANNEL_RAW);
78937932
ADD_INT_MACRO(m, HCI_CHANNEL_USER);
78947933
ADD_INT_MACRO(m, HCI_CHANNEL_MONITOR);
78957934
ADD_INT_MACRO(m, HCI_CHANNEL_CONTROL);
78967935
ADD_INT_MACRO(m, HCI_CHANNEL_LOGGING);
78977936
#endif
7898-
#if defined(HCI_FILTER)
7937+
#ifdef HCI_FILTER
78997938
ADD_INT_MACRO(m, HCI_FILTER);
79007939
#endif
7901-
#if defined(HCI_TIME_STAMP)
7902-
ADD_INT_MACRO(m, HCI_TIME_STAMP);
7940+
#ifdef HCI_DATA_DIR
79037941
ADD_INT_MACRO(m, HCI_DATA_DIR);
79047942
#endif
7943+
#ifdef HCI_TIME_STAMP
7944+
ADD_INT_MACRO(m, HCI_TIME_STAMP);
7945+
#endif
7946+
#ifdef SO_HCI_EVT_FILTER
7947+
ADD_INT_MACRO(m, SO_HCI_EVT_FILTER);
7948+
ADD_INT_MACRO(m, SO_HCI_PKT_FILTER);
7949+
#endif
79057950
#endif /* BTPROTO_HCI */
79067951
#ifdef BTPROTO_RFCOMM
79077952
ADD_INT_MACRO(m, BTPROTO_RFCOMM);
7953+
ADD_INT_MACRO(m, SOL_RFCOMM);
7954+
#ifdef SO_RFCOMM_MTU
7955+
ADD_INT_MACRO(m, SO_RFCOMM_MTU);
7956+
ADD_INT_MACRO(m, SO_RFCOMM_FC_INFO);
7957+
#endif
7958+
#ifdef SO_RFCOMM_LM
7959+
ADD_INT_MACRO(m, SO_RFCOMM_LM);
7960+
ADD_INT_MACRO(m, RFCOMM_LM_AUTH);
7961+
ADD_INT_MACRO(m, RFCOMM_LM_ENCRYPT);
7962+
ADD_INT_MACRO(m, RFCOMM_LM_SECURE);
7963+
#endif
7964+
#ifdef MS_WINDOWS_DESKTOP
7965+
ADD_INT_MACRO(m, SO_BTH_ENCRYPT);
7966+
ADD_INT_MACRO(m, SO_BTH_MTU);
7967+
ADD_INT_MACRO(m, SO_BTH_MTU_MAX);
7968+
ADD_INT_MACRO(m, SO_BTH_MTU_MIN);
7969+
#endif
79087970
#endif /* BTPROTO_RFCOMM */
79097971
ADD_STR_CONST(m, "BDADDR_ANY", "00:00:00:00:00:00");
79107972
ADD_STR_CONST(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
79117973
#ifdef BTPROTO_SCO
79127974
ADD_INT_MACRO(m, BTPROTO_SCO);
7975+
ADD_INT_MACRO(m, SOL_SCO);
7976+
#ifdef SO_SCO_MTU
7977+
ADD_INT_MACRO(m, SO_SCO_MTU);
7978+
#endif
7979+
#ifdef SO_SCO_CONNINFO
7980+
ADD_INT_MACRO(m, SO_SCO_CONNINFO);
7981+
#endif
7982+
#ifdef SO_SCO_HANDLE
7983+
ADD_INT_MACRO(m, SO_SCO_HANDLE);
7984+
#endif
79137985
#endif /* BTPROTO_SCO */
7986+
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
7987+
ADD_INT_MACRO(m, SOL_BLUETOOTH);
7988+
ADD_INT_MACRO(m, BT_SECURITY);
7989+
ADD_INT_MACRO(m, BT_SECURITY_SDP);
7990+
ADD_INT_MACRO(m, BT_SECURITY_LOW);
7991+
ADD_INT_MACRO(m, BT_SECURITY_MEDIUM);
7992+
ADD_INT_MACRO(m, BT_SECURITY_HIGH);
7993+
#ifdef BT_SECURITY_FIPS
7994+
ADD_INT_MACRO(m, BT_SECURITY_FIPS);
7995+
#endif
7996+
#ifdef BT_DEFER_SETUP
7997+
ADD_INT_MACRO(m, BT_DEFER_SETUP);
7998+
#endif
7999+
ADD_INT_MACRO(m, BT_FLUSHABLE);
8000+
ADD_INT_MACRO(m, BT_FLUSHABLE_OFF);
8001+
ADD_INT_MACRO(m, BT_FLUSHABLE_ON);
8002+
ADD_INT_MACRO(m, BT_POWER);
8003+
ADD_INT_MACRO(m, BT_POWER_FORCE_ACTIVE_OFF);
8004+
ADD_INT_MACRO(m, BT_POWER_FORCE_ACTIVE_ON);
8005+
ADD_INT_MACRO(m, BT_CHANNEL_POLICY);
8006+
ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_ONLY);
8007+
ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_PREFERRED);
8008+
ADD_INT_MACRO(m, BT_CHANNEL_POLICY_BREDR_PREFERRED);
8009+
ADD_INT_MACRO(m, BT_VOICE);
8010+
ADD_INT_MACRO(m, BT_VOICE_TRANSPARENT);
8011+
ADD_INT_MACRO(m, BT_VOICE_CVSD_16BIT);
8012+
#ifdef BT_VOICE_TRANSPARENT_16BIT
8013+
ADD_INT_MACRO(m, BT_VOICE_TRANSPARENT_16BIT);
8014+
#endif
8015+
ADD_INT_MACRO(m, BT_SNDMTU);
8016+
ADD_INT_MACRO(m, BT_RCVMTU);
8017+
ADD_INT_MACRO(m, BT_PHY);
8018+
ADD_INT_MACRO(m, BT_PHY_BR_1M_1SLOT);
8019+
ADD_INT_MACRO(m, BT_PHY_BR_1M_3SLOT);
8020+
ADD_INT_MACRO(m, BT_PHY_BR_1M_5SLOT);
8021+
ADD_INT_MACRO(m, BT_PHY_EDR_2M_1SLOT);
8022+
ADD_INT_MACRO(m, BT_PHY_EDR_2M_3SLOT);
8023+
ADD_INT_MACRO(m, BT_PHY_EDR_2M_5SLOT);
8024+
ADD_INT_MACRO(m, BT_PHY_EDR_3M_1SLOT);
8025+
ADD_INT_MACRO(m, BT_PHY_EDR_3M_3SLOT);
8026+
ADD_INT_MACRO(m, BT_PHY_EDR_3M_5SLOT);
8027+
ADD_INT_MACRO(m, BT_PHY_LE_1M_TX);
8028+
ADD_INT_MACRO(m, BT_PHY_LE_1M_RX);
8029+
ADD_INT_MACRO(m, BT_PHY_LE_2M_TX);
8030+
ADD_INT_MACRO(m, BT_PHY_LE_2M_RX);
8031+
ADD_INT_MACRO(m, BT_PHY_LE_CODED_TX);
8032+
ADD_INT_MACRO(m, BT_PHY_LE_CODED_RX);
8033+
ADD_INT_MACRO(m, BT_MODE);
8034+
ADD_INT_MACRO(m, BT_MODE_BASIC);
8035+
ADD_INT_MACRO(m, BT_MODE_ERTM);
8036+
ADD_INT_MACRO(m, BT_MODE_STREAMING);
8037+
ADD_INT_MACRO(m, BT_MODE_LE_FLOWCTL);
8038+
ADD_INT_MACRO(m, BT_MODE_EXT_FLOWCTL);
8039+
ADD_INT_MACRO(m, BT_PKT_STATUS);
8040+
ADD_INT_MACRO(m, BT_ISO_QOS);
8041+
ADD_INT_MACRO(m, BT_CODEC);
8042+
#endif /* HAVE_BLUETOOTH_BLUETOOTH_H */
79148043
#endif /* USE_BLUETOOTH */
79158044

79168045
#ifdef AF_CAN

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.