]> www.infradead.org Git - users/willy/pagecache.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)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 7 Mar 2025 17:43:30 +0000 (12:43 -0500)
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>
net/bluetooth/hci_event.c

index 2cc7a93063501c327d623175d1e3fe3c9c3fa0c8..903b0b52692aa62a849311c4cc3cdb5e999f5805 100644 (file)
@@ -3391,23 +3391,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;
+                       }
                }
        }