mirror of
https://github.com/python/cpython.git
synced 2025-10-15 03:10:29 +00:00
gh-129288: Add optional l2_cid and l2_bdaddr_type in BTPROTO_L2CAP socket address tuple (#129293)
Add two optional, traling elements in the AF_BLUETOOTH socket address tuple: - l2_cid, to allow e.g raw LE ATT connections - l2_bdaddr_type. 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 commit is contained in:
parent
a083633fa0
commit
45a24f54af
4 changed files with 93 additions and 7 deletions
|
@ -1495,9 +1495,20 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
|
|||
PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
|
||||
PyObject *ret = NULL;
|
||||
if (addrobj) {
|
||||
ret = Py_BuildValue("Oi",
|
||||
addrobj,
|
||||
_BT_L2_MEMB(a, psm));
|
||||
/* Retain old format for non-LE address.
|
||||
(cid may be set for BR/EDR, but we're discarding it for now)
|
||||
*/
|
||||
if (_BT_L2_MEMB(a, bdaddr_type) == BDADDR_BREDR) {
|
||||
ret = Py_BuildValue("Oi",
|
||||
addrobj,
|
||||
_BT_L2_MEMB(a, psm));
|
||||
} else {
|
||||
ret = Py_BuildValue("OiiB",
|
||||
addrobj,
|
||||
_BT_L2_MEMB(a, psm),
|
||||
_BT_L2_MEMB(a, cid),
|
||||
_BT_L2_MEMB(a, bdaddr_type));
|
||||
}
|
||||
Py_DECREF(addrobj);
|
||||
}
|
||||
return ret;
|
||||
|
@ -2047,8 +2058,11 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
|||
struct sockaddr_l2 *addr = &addrbuf->bt_l2;
|
||||
memset(addr, 0, sizeof(struct sockaddr_l2));
|
||||
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
|
||||
if (!PyArg_ParseTuple(args, "si", &straddr,
|
||||
&_BT_L2_MEMB(addr, psm))) {
|
||||
_BT_L2_MEMB(addr, bdaddr_type) = BDADDR_BREDR;
|
||||
if (!PyArg_ParseTuple(args, "si|iB", &straddr,
|
||||
&_BT_L2_MEMB(addr, psm),
|
||||
&_BT_L2_MEMB(addr, cid),
|
||||
&_BT_L2_MEMB(addr, bdaddr_type))) {
|
||||
PyErr_Format(PyExc_OSError,
|
||||
"%s(): wrong format", caller);
|
||||
return 0;
|
||||
|
@ -7782,6 +7796,9 @@ socket_exec(PyObject *m)
|
|||
ADD_INT_MACRO(m, AF_BLUETOOTH);
|
||||
#ifdef BTPROTO_L2CAP
|
||||
ADD_INT_MACRO(m, BTPROTO_L2CAP);
|
||||
ADD_INT_MACRO(m, BDADDR_BREDR);
|
||||
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
|
||||
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
|
||||
#endif /* BTPROTO_L2CAP */
|
||||
#ifdef BTPROTO_HCI
|
||||
ADD_INT_MACRO(m, BTPROTO_HCI);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue