提交 da25cf6a 编写于 作者: M Marcel Holtmann 提交者: Johan Hedberg

Bluetooth: Report invalid RSSI for service discovery and background scan

When using Start Service Discovery and when background scanning is used
to report devices, the RSSI is reported or the value 127 is provided in
case RSSI in unavailable.

For Start Discovery the value 0 is reported to keep backwards
compatibility with the existing users.
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
上级 efb2513f
...@@ -75,6 +75,7 @@ struct discovery_state { ...@@ -75,6 +75,7 @@ struct discovery_state {
u32 last_adv_flags; u32 last_adv_flags;
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;
bool report_invalid_rssi;
s8 rssi; s8 rssi;
u16 uuid_count; u16 uuid_count;
u8 (*uuids)[16]; u8 (*uuids)[16];
...@@ -506,11 +507,13 @@ static inline void discovery_init(struct hci_dev *hdev) ...@@ -506,11 +507,13 @@ static inline void discovery_init(struct hci_dev *hdev)
INIT_LIST_HEAD(&hdev->discovery.all); INIT_LIST_HEAD(&hdev->discovery.all);
INIT_LIST_HEAD(&hdev->discovery.unknown); INIT_LIST_HEAD(&hdev->discovery.unknown);
INIT_LIST_HEAD(&hdev->discovery.resolve); INIT_LIST_HEAD(&hdev->discovery.resolve);
hdev->discovery.report_invalid_rssi = true;
hdev->discovery.rssi = HCI_RSSI_INVALID; hdev->discovery.rssi = HCI_RSSI_INVALID;
} }
static inline void hci_discovery_filter_clear(struct hci_dev *hdev) static inline void hci_discovery_filter_clear(struct hci_dev *hdev)
{ {
hdev->discovery.report_invalid_rssi = true;
hdev->discovery.rssi = HCI_RSSI_INVALID; hdev->discovery.rssi = HCI_RSSI_INVALID;
hdev->discovery.uuid_count = 0; hdev->discovery.uuid_count = 0;
kfree(hdev->discovery.uuids); kfree(hdev->discovery.uuids);
......
...@@ -3912,6 +3912,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev, ...@@ -3912,6 +3912,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
hci_discovery_filter_clear(hdev); hci_discovery_filter_clear(hdev);
hdev->discovery.type = cp->type; hdev->discovery.type = cp->type;
hdev->discovery.report_invalid_rssi = false;
hci_req_init(&req, hdev); hci_req_init(&req, hdev);
...@@ -7022,8 +7023,15 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ...@@ -7022,8 +7023,15 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
/* Reset invalid RSSI to 0 to keep backwards API compliance */ /* In case of device discovery with BR/EDR devices (pre 1.2), the
if (rssi == HCI_RSSI_INVALID) * RSSI value was reported as 0 when not available. This behavior
* is kept when using device discovery. This is required for full
* backwards compatibility with the API.
*
* However when using service discovery, the value 127 will be
* returned when the RSSI is not available.
*/
if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi)
rssi = 0; rssi = 0;
bacpy(&ev->addr.bdaddr, bdaddr); bacpy(&ev->addr.bdaddr, bdaddr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册