Bluetooth: hci_event: Fix enabling passive scanning
[ Upstream commit 0bdd88971519cfa8a76d1a4dde182e74cfbd5d5c ]
Passive scanning shall only be enabled when disconnecting LE links,
otherwise it may start result in triggering scanning when e.g. an ISO
link disconnects:
> HCI Event: LE Meta Event (0x3e) plen 29
LE Connected Isochronous Stream Established (0x19)
Status: Success (0x00)
Connection Handle: 257
CIG Synchronization Delay: 0 us (0x000000)
CIS Synchronization Delay: 0 us (0x000000)
Central to Peripheral Latency: 10000 us (0x002710)
Peripheral to Central Latency: 10000 us (0x002710)
Central to Peripheral PHY: LE 2M (0x02)
Peripheral to Central PHY: LE 2M (0x02)
Number of Subevents: 1
Central to Peripheral Burst Number: 1
Peripheral to Central Burst Number: 1
Central to Peripheral Flush Timeout: 2
Peripheral to Central Flush Timeout: 2
Central to Peripheral MTU: 320
Peripheral to Central MTU: 160
ISO Interval: 10.00 msec (0x0008)
...
> HCI Event: Disconnect Complete (0x05) plen 4
Status: Success (0x00)
Handle: 257
Reason: Remote User Terminated Connection (0x13)
< HCI Command: LE Set Extended Scan Enable (0x08|0x0042) plen 6
Extended scan: Enabled (0x01)
Filter duplicates: Enabled (0x01)
Duration: 0 msec (0x0000)
Period: 0.00 sec (0x0000)
Fixes: 9fcb18ef3a ("Bluetooth: Introduce LE auto connect options")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a5158d67bf
commit
0677a4f3c0
+22
-15
@@ -3393,23 +3393,30 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data,
|
|||||||
hci_update_scan(hdev);
|
hci_update_scan(hdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
params = hci_conn_params_lookup(hdev, &conn->dst, conn->dst_type);
|
/* Re-enable passive scanning if disconnected device is marked
|
||||||
if (params) {
|
* as auto-connectable.
|
||||||
switch (params->auto_connect) {
|
*/
|
||||||
case HCI_AUTO_CONN_LINK_LOSS:
|
if (conn->type == LE_LINK) {
|
||||||
if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
|
params = hci_conn_params_lookup(hdev, &conn->dst,
|
||||||
|
conn->dst_type);
|
||||||
|
if (params) {
|
||||||
|
switch (params->auto_connect) {
|
||||||
|
case HCI_AUTO_CONN_LINK_LOSS:
|
||||||
|
if (ev->reason != HCI_ERROR_CONNECTION_TIMEOUT)
|
||||||
|
break;
|
||||||
|
fallthrough;
|
||||||
|
|
||||||
|
case HCI_AUTO_CONN_DIRECT:
|
||||||
|
case HCI_AUTO_CONN_ALWAYS:
|
||||||
|
hci_pend_le_list_del_init(params);
|
||||||
|
hci_pend_le_list_add(params,
|
||||||
|
&hdev->pend_le_conns);
|
||||||
|
hci_update_passive_scan(hdev);
|
||||||
break;
|
break;
|
||||||
fallthrough;
|
|
||||||
|
|
||||||
case HCI_AUTO_CONN_DIRECT:
|
default:
|
||||||
case HCI_AUTO_CONN_ALWAYS:
|
break;
|
||||||
hci_pend_le_list_del_init(params);
|
}
|
||||||
hci_pend_le_list_add(params, &hdev->pend_le_conns);
|
|
||||||
hci_update_passive_scan(hdev);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user