Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Bluetooth LE L2CAP Connection-oriented channels through AF_BLUETOOTH/BTPROTO_L2CAP socket #129288

Open
themadinventor opened this issue Jan 25, 2025 · 0 comments
Labels
type-feature A feature request or enhancement

Comments

@themadinventor
Copy link

themadinventor commented Jan 25, 2025

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 and cid can be non-zero. This is enforced by the kernel.
  • l2_bdaddr_type can take the value of BDADDR_LE_PUBLIC or BDADDR_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

Links to previous discussion of this feature:

#69242
#70145

Linked PRs

@themadinventor themadinventor added the type-feature A feature request or enhancement label Jan 25, 2025
themadinventor added a commit to themadinventor/cpython that referenced this issue Jan 25, 2025
…ress tuple

To be able to connect L2CAP sockets to Bluetooth LE devices, the l2_bdaddr_type must be set to BDADDR_LE_PUBLIC or BDADDR_LE_RANDOM.
This change adds support for providing the l2_bdaddr_type as an optional, traliing element in the address tuple passed to connect()
themadinventor added a commit to themadinventor/cpython that referenced this issue Jan 25, 2025
… socket.BDADDR_RANDOM only if defined for target

Add check that BDADDR_BREDR is defined as Windows build may set USE_BLUETOOTH but not BDADDR_*
themadinventor added a commit to themadinventor/cpython that referenced this issue Jan 26, 2025
…ss tuple

This change adds support for the CID field in the socket address tuple. This allows e.g raw LE ATT connections.
themadinventor added a commit to themadinventor/cpython that referenced this issue Jan 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type-feature A feature request or enhancement
Projects
None yet
Development

No branches or pull requests

1 participant