Skip to content

Commit fa14222

Browse files
Jakub Pawlowskiholtmann
authored andcommitted
Bluetooth: Enable new connection establishment procedure.
Currently, when trying to connect to already paired device that just rotated its RPA MAC address, old address would be used and connection would fail. In order to fix that, kernel must scan and receive advertisement with fresh RPA before connecting. This patch enables new connection establishment procedure. Instead of just sending HCI_OP_LE_CREATE_CONN to controller, "connect" will add device to kernel whitelist and start scan. If advertisement is received, it'll be compared against whitelist and then trigger connection if it matches. That fixes mentioned reconnect issue for already paired devices. It also make whole connection procedure more robust. We can try to connect to multiple devices at same time now, even though controller allow only one. Signed-off-by: Jakub Pawlowski <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
1 parent cc2b691 commit fa14222

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

net/bluetooth/l2cap_core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7113,8 +7113,10 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
71137113
else
71147114
role = HCI_ROLE_MASTER;
71157115

7116-
hcon = hci_connect_le(hdev, dst, dst_type, chan->sec_level,
7117-
HCI_LE_CONN_TIMEOUT, role);
7116+
hcon = hci_connect_le_scan(hdev, dst, dst_type,
7117+
chan->sec_level,
7118+
HCI_LE_CONN_TIMEOUT,
7119+
role);
71187120
} else {
71197121
u8 auth_type = l2cap_get_auth_type(chan);
71207122
hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);

net/bluetooth/mgmt.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3564,9 +3564,10 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
35643564
*/
35653565
hci_conn_params_add(hdev, &cp->addr.bdaddr, addr_type);
35663566

3567-
conn = hci_connect_le(hdev, &cp->addr.bdaddr, addr_type,
3568-
sec_level, HCI_LE_CONN_TIMEOUT,
3569-
HCI_ROLE_MASTER);
3567+
conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr,
3568+
addr_type, sec_level,
3569+
HCI_LE_CONN_TIMEOUT,
3570+
HCI_ROLE_MASTER);
35703571
}
35713572

35723573
if (IS_ERR(conn)) {

0 commit comments

Comments
 (0)