Commit 0d2bf134 authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Add support for background LE scanning

If we have one or more devices with HCI_AUTO_CONN_REPORT we should do
background scanning and emit mgmt_device_found events. This patch
modifies the hci_update_background_scan() function to extend the
conditions needed to trigger scanning, and adds the necessary code to
process_adv_report() to emit mgmt_device_found events.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 75ce208c
...@@ -5380,9 +5380,10 @@ void hci_update_background_scan(struct hci_dev *hdev) ...@@ -5380,9 +5380,10 @@ void hci_update_background_scan(struct hci_dev *hdev)
hci_req_init(&req, hdev); hci_req_init(&req, hdev);
if (list_empty(&hdev->pend_le_conns)) { if (list_empty(&hdev->pend_le_conns) && !hdev->pend_le_reports) {
/* If there is no pending LE connections, we should stop /* If there is no pending LE connections or devices
* the background scanning. * to be scanned for, we should stop the background
* scanning.
*/ */
/* If controller is not scanning we are done. */ /* If controller is not scanning we are done. */
......
...@@ -4225,11 +4225,32 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr, ...@@ -4225,11 +4225,32 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
bool match; bool match;
u32 flags; u32 flags;
/* Passive scanning shouldn't trigger any device found events */ /* Passive scanning shouldn't trigger any device found events,
* except for devices marked as CONN_REPORT for which we do send
* device found events.
*/
if (hdev->le_scan_type == LE_SCAN_PASSIVE) { if (hdev->le_scan_type == LE_SCAN_PASSIVE) {
struct hci_conn_params *param;
if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND) if (type == LE_ADV_IND || type == LE_ADV_DIRECT_IND)
check_pending_le_conn(hdev, bdaddr, bdaddr_type); check_pending_le_conn(hdev, bdaddr, bdaddr_type);
if (!hdev->pend_le_reports)
return;
if (type == LE_ADV_DIRECT_IND)
return;
param = hci_conn_params_lookup(hdev, bdaddr, bdaddr_type);
if (!param || param->auto_connect != HCI_AUTO_CONN_REPORT)
return; return;
if (type == LE_ADV_NONCONN_IND || type == LE_ADV_SCAN_IND)
flags = MGMT_DEV_FOUND_NOT_CONNECTABLE;
else
flags = 0;
mgmt_device_found(hdev, bdaddr, LE_LINK, bdaddr_type, NULL,
rssi, flags, data, len, NULL, 0);
} }
/* When receiving non-connectable or scannable undirected /* When receiving non-connectable or scannable undirected
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment