]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: hci_event: Fix enabling passive scanning
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 28 Feb 2025 18:12:54 +0000 (13:12 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 Mar 2025 19:54:11 +0000 (12:54 -0700)
[ 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: 9fcb18ef3acb ("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>
net/bluetooth/hci_event.c

index 388d46c6a043d49ea818e32835c0949ef3ef3bb0..d64117be62cc445d340922d9f7eaabe34447bc5a 100644 (file)
@@ -3393,23 +3393,30 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, void *data,
                hci_update_scan(hdev);
        }
 
-       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)
+       /* Re-enable passive scanning if disconnected device is marked
+        * as auto-connectable.
+        */
+       if (conn->type == LE_LINK) {
+               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;
-                       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;
-
-               default:
-                       break;
+                       default:
+                               break;
+                       }
                }
        }