Commit ff5cd29f authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Store also RSSI for pending advertising reports

Especially in crowded environments it can become frequent that we have
to send out whatever pending event there is stored. Since user space
has its own filtering of small RSSI changes sending a 0 value will
essentially force user space to wake up the higher layers (e.g. over
D-Bus) even though the RSSI didn't actually change more than the
threshold value.

This patch adds storing also of the RSSI for pending advertising reports
so that we report an as accurate RSSI as possible when we have to send
out the stored information to user space.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 474ee066
...@@ -70,6 +70,7 @@ struct discovery_state { ...@@ -70,6 +70,7 @@ struct discovery_state {
__u32 timestamp; __u32 timestamp;
bdaddr_t last_adv_addr; bdaddr_t last_adv_addr;
u8 last_adv_addr_type; u8 last_adv_addr_type;
s8 last_adv_rssi;
u8 last_adv_data[HCI_MAX_AD_LENGTH]; u8 last_adv_data[HCI_MAX_AD_LENGTH];
u8 last_adv_data_len; u8 last_adv_data_len;
}; };
......
...@@ -1049,12 +1049,13 @@ static void clear_pending_adv_report(struct hci_dev *hdev) ...@@ -1049,12 +1049,13 @@ static void clear_pending_adv_report(struct hci_dev *hdev)
} }
static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr, static void store_pending_adv_report(struct hci_dev *hdev, bdaddr_t *bdaddr,
u8 bdaddr_type, u8 *data, u8 len) u8 bdaddr_type, s8 rssi, u8 *data, u8 len)
{ {
struct discovery_state *d = &hdev->discovery; struct discovery_state *d = &hdev->discovery;
bacpy(&d->last_adv_addr, bdaddr); bacpy(&d->last_adv_addr, bdaddr);
d->last_adv_addr_type = bdaddr_type; d->last_adv_addr_type = bdaddr_type;
d->last_adv_rssi = rssi;
memcpy(d->last_adv_data, data, len); memcpy(d->last_adv_data, data, len);
d->last_adv_data_len = len; d->last_adv_data_len = len;
} }
...@@ -4040,7 +4041,7 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr, ...@@ -4040,7 +4041,7 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
*/ */
if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) { if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
store_pending_adv_report(hdev, bdaddr, bdaddr_type, store_pending_adv_report(hdev, bdaddr, bdaddr_type,
data, len); rssi, data, len);
return; return;
} }
...@@ -4061,8 +4062,9 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr, ...@@ -4061,8 +4062,9 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
/* Send out whatever is in the cache, but skip duplicates */ /* Send out whatever is in the cache, but skip duplicates */
if (!match) if (!match)
mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK, mgmt_device_found(hdev, &d->last_adv_addr, LE_LINK,
d->last_adv_addr_type, NULL, 0, d->last_adv_addr_type, NULL,
0, 1, d->last_adv_data, d->last_adv_rssi, 0, 1,
d->last_adv_data,
d->last_adv_data_len, NULL, 0); d->last_adv_data_len, NULL, 0);
/* If the new report will trigger a SCAN_REQ store it for /* If the new report will trigger a SCAN_REQ store it for
...@@ -4070,7 +4072,7 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr, ...@@ -4070,7 +4072,7 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
*/ */
if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) { if (type == LE_ADV_IND || type == LE_ADV_SCAN_IND) {
store_pending_adv_report(hdev, bdaddr, bdaddr_type, store_pending_adv_report(hdev, bdaddr, bdaddr_type,
data, len); rssi, data, len);
return; return;
} }
......
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