Description
Feature or enhancement
Proposal:
As has been discussed previously (69242, 70145), "new" fields have been added in sockaddr_l2
, but are still not supported in CPython's socket
implementation.
- The lack of
l2_bdaddr_type
prevents opening L2CAP connection-oriented channels to Bluetooth LE devices. - Likewise, the missing
l2_cid
prevents raw access to e.g ATT.
My suggestion is to add support for a third and fourth optional element in the address tuple for l2_cid
and l2_bdaddr_type
respectively.
- Only one of
psm
andcid
can be non-zero. This is enforced by the kernel. l2_bdaddr_type
can take the value ofBDADDR_LE_PUBLIC
orBDADDR_LE_RANDOM
.BDADDR_BREDR
is implied if the element is missing, preserving compatibility with existing code.
I.e for LE CoC connection to PSM 0x80
sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
sock.connect((bdaddr, 0x80, 0, BDADDR_LE_RANDOM))
For a raw LE ATT connection:
CID_ATT = 0x04
sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
s.bind((BDADDR_ANY, 0, CID_ATT, BDADDR_LE_RANDOM))
s.connect((bdaddr, 0, CID_ATT, BDADDR_LE_RANDOM))
while keeping the existing format for classic BR/EDR L2CAP.
sock.connect((bdaddr, 0x80))
I have a working implementation of this locally (tested on Linux 6.11) and will file a PR for review as soon as I've got this issue number assigned.
This is my first attempt at contributing to CPython, so I apologize in advance for any mistakes in the process.
Edit 2025-01-26: Added CID field to proposal. PR to be updated.
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere