aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/hci_core.h3
-rw-r--r--net/bluetooth/mgmt.c12
2 files changed, 13 insertions, 2 deletions
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index f07b1450b3c2..3c7827005c25 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -75,6 +75,7 @@ struct discovery_state {
75 u32 last_adv_flags; 75 u32 last_adv_flags;
76 u8 last_adv_data[HCI_MAX_AD_LENGTH]; 76 u8 last_adv_data[HCI_MAX_AD_LENGTH];
77 u8 last_adv_data_len; 77 u8 last_adv_data_len;
78 bool report_invalid_rssi;
78 s8 rssi; 79 s8 rssi;
79 u16 uuid_count; 80 u16 uuid_count;
80 u8 (*uuids)[16]; 81 u8 (*uuids)[16];
@@ -506,11 +507,13 @@ static inline void discovery_init(struct hci_dev *hdev)
506 INIT_LIST_HEAD(&hdev->discovery.all); 507 INIT_LIST_HEAD(&hdev->discovery.all);
507 INIT_LIST_HEAD(&hdev->discovery.unknown); 508 INIT_LIST_HEAD(&hdev->discovery.unknown);
508 INIT_LIST_HEAD(&hdev->discovery.resolve); 509 INIT_LIST_HEAD(&hdev->discovery.resolve);
510 hdev->discovery.report_invalid_rssi = true;
509 hdev->discovery.rssi = HCI_RSSI_INVALID; 511 hdev->discovery.rssi = HCI_RSSI_INVALID;
510} 512}
511 513
512static inline void hci_discovery_filter_clear(struct hci_dev *hdev) 514static inline void hci_discovery_filter_clear(struct hci_dev *hdev)
513{ 515{
516 hdev->discovery.report_invalid_rssi = true;
514 hdev->discovery.rssi = HCI_RSSI_INVALID; 517 hdev->discovery.rssi = HCI_RSSI_INVALID;
515 hdev->discovery.uuid_count = 0; 518 hdev->discovery.uuid_count = 0;
516 kfree(hdev->discovery.uuids); 519 kfree(hdev->discovery.uuids);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 3ca2818d1c8b..a91e484886fe 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -3912,6 +3912,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
3912 hci_discovery_filter_clear(hdev); 3912 hci_discovery_filter_clear(hdev);
3913 3913
3914 hdev->discovery.type = cp->type; 3914 hdev->discovery.type = cp->type;
3915 hdev->discovery.report_invalid_rssi = false;
3915 3916
3916 hci_req_init(&req, hdev); 3917 hci_req_init(&req, hdev);
3917 3918
@@ -7022,8 +7023,15 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7022 7023
7023 memset(buf, 0, sizeof(buf)); 7024 memset(buf, 0, sizeof(buf));
7024 7025
7025 /* Reset invalid RSSI to 0 to keep backwards API compliance */ 7026 /* In case of device discovery with BR/EDR devices (pre 1.2), the
7026 if (rssi == HCI_RSSI_INVALID) 7027 * RSSI value was reported as 0 when not available. This behavior
7028 * is kept when using device discovery. This is required for full
7029 * backwards compatibility with the API.
7030 *
7031 * However when using service discovery, the value 127 will be
7032 * returned when the RSSI is not available.
7033 */
7034 if (rssi == HCI_RSSI_INVALID && !hdev->discovery.report_invalid_rssi)
7027 rssi = 0; 7035 rssi = 0;
7028 7036
7029 bacpy(&ev->addr.bdaddr, bdaddr); 7037 bacpy(&ev->addr.bdaddr, bdaddr);