Skip to content

Commit e846244

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

File tree

5 files changed

+271
-8
lines changed

5 files changed

+271
-8
lines changed

Doc/library/socket.rst

Lines 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

Lines 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

Lines 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:
Lines 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

Lines 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)