Skip to content

Commit 702f477

Browse files
gh-129288: Add optional bdaddr_type in BTPROTO_L2CAP socket address 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()
1 parent e635bf2 commit 702f477

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

Modules/socketmodule.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,9 +1493,17 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
14931493
PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
14941494
PyObject *ret = NULL;
14951495
if (addrobj) {
1496-
ret = Py_BuildValue("Oi",
1497-
addrobj,
1498-
_BT_L2_MEMB(a, psm));
1496+
// Retain old format for non-LE address
1497+
if (_BT_L2_MEMB(a, bdaddr_type) == BDADDR_BREDR) {
1498+
ret = Py_BuildValue("Oi",
1499+
addrobj,
1500+
_BT_L2_MEMB(a, psm));
1501+
} else {
1502+
ret = Py_BuildValue("OiB",
1503+
addrobj,
1504+
_BT_L2_MEMB(a, psm),
1505+
_BT_L2_MEMB(a, bdaddr_type));
1506+
}
14991507
Py_DECREF(addrobj);
15001508
}
15011509
return ret;
@@ -2045,8 +2053,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20452053
struct sockaddr_l2 *addr = &addrbuf->bt_l2;
20462054
memset(addr, 0, sizeof(struct sockaddr_l2));
20472055
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
2048-
if (!PyArg_ParseTuple(args, "si", &straddr,
2049-
&_BT_L2_MEMB(addr, psm))) {
2056+
_BT_L2_MEMB(addr, bdaddr_type) = BDADDR_BREDR;
2057+
if (!PyArg_ParseTuple(args, "si|B", &straddr,
2058+
&_BT_L2_MEMB(addr, psm),
2059+
&_BT_L2_MEMB(addr, bdaddr_type))) {
20502060
PyErr_Format(PyExc_OSError,
20512061
"%s(): wrong format", caller);
20522062
return 0;
@@ -7743,6 +7753,9 @@ socket_exec(PyObject *m)
77437753
#ifdef BTPROTO_SCO
77447754
ADD_INT_MACRO(m, BTPROTO_SCO);
77457755
#endif /* BTPROTO_SCO */
7756+
ADD_INT_MACRO(m, BDADDR_BREDR);
7757+
ADD_INT_MACRO(m, BDADDR_LE_PUBLIC);
7758+
ADD_INT_MACRO(m, BDADDR_LE_RANDOM);
77467759
#endif /* USE_BLUETOOTH */
77477760

77487761
#ifdef AF_CAN

0 commit comments

Comments
 (0)