aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth/mgmt.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2014-12-05 07:03:34 -0500
committerJohan Hedberg <johan.hedberg@intel.com>2014-12-05 07:14:26 -0500
commitefb2513fd6278d97d2114ab87f019f4fed01c037 (patch)
tree1c72ebae48237246efa072a32a897f3451ffb9f9 /net/bluetooth/mgmt.c
parent189f6ad21faf73da26a4944a1893be871c079733 (diff)
Bluetooth: Fix discovery filter when no RSSI is available
When no RSSI value is available then make sure that the result is filtered out when the RSSI threshold filter is active. This means that all Bluetooth 1.1 or earlier devices will not report any results when using a RSSI threshold filter. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'net/bluetooth/mgmt.c')
-rw-r--r--net/bluetooth/mgmt.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 326609fa3bda..3ca2818d1c8b 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -7006,9 +7006,12 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7006 * if such a RSSI threshold is specified. If a RSSI threshold has 7006 * if such a RSSI threshold is specified. If a RSSI threshold has
7007 * been specified, then all results with a RSSI smaller than the 7007 * been specified, then all results with a RSSI smaller than the
7008 * RSSI threshold will be dropped. 7008 * RSSI threshold will be dropped.
7009 *
7010 * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
7011 * the results are also dropped.
7009 */ 7012 */
7010 if (hdev->discovery.rssi != HCI_RSSI_INVALID && 7013 if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
7011 rssi < hdev->discovery.rssi) 7014 (rssi < hdev->discovery.rssi || rssi == HCI_RSSI_INVALID))
7012 return; 7015 return;
7013 7016
7014 /* Make sure that the buffer is big enough. The 5 extra bytes 7017 /* Make sure that the buffer is big enough. The 5 extra bytes
@@ -7019,6 +7022,10 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
7019 7022
7020 memset(buf, 0, sizeof(buf)); 7023 memset(buf, 0, sizeof(buf));
7021 7024
7025 /* Reset invalid RSSI to 0 to keep backwards API compliance */
7026 if (rssi == HCI_RSSI_INVALID)
7027 rssi = 0;
7028
7022 bacpy(&ev->addr.bdaddr, bdaddr); 7029 bacpy(&ev->addr.bdaddr, bdaddr);
7023 ev->addr.type = link_to_bdaddr(link_type, addr_type); 7030 ev->addr.type = link_to_bdaddr(link_type, addr_type);
7024 ev->rssi = rssi; 7031 ev->rssi = rssi;