Bluetooth: Fix discovery filter when no RSSI is available
authorMarcel Holtmann <marcel@holtmann.org>
Fri, 5 Dec 2014 12:03:34 +0000 (13:03 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Fri, 5 Dec 2014 12:14:26 +0000 (14:14 +0200)
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>
net/bluetooth/hci_event.c
net/bluetooth/mgmt.c

index f4e2a61bb6aa20568e270d4265dcd0864f5ad742..527dfdc9d8c81ec5ff671c4c4cb5074fe9acc81e 100644 (file)
@@ -2043,13 +2043,14 @@ static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
                data.pscan_mode         = info->pscan_mode;
                memcpy(data.dev_class, info->dev_class, 3);
                data.clock_offset       = info->clock_offset;
-               data.rssi               = 0x00;
+               data.rssi               = HCI_RSSI_INVALID;
                data.ssp_mode           = 0x00;
 
                flags = hci_inquiry_cache_update(hdev, &data, false);
 
                mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, 0x00,
-                                 info->dev_class, 0, flags, NULL, 0, NULL, 0);
+                                 info->dev_class, HCI_RSSI_INVALID,
+                                 flags, NULL, 0, NULL, 0);
        }
 
        hci_dev_unlock(hdev);
index 326609fa3bda47d09cfbfcb69e271f8252cd372c..3ca2818d1c8b39c9fe4990438efa427c42cd26a9 100644 (file)
@@ -7006,9 +7006,12 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
         * if such a RSSI threshold is specified. If a RSSI threshold has
         * been specified, then all results with a RSSI smaller than the
         * RSSI threshold will be dropped.
+        *
+        * For BR/EDR devices (pre 1.2) providing no RSSI during inquiry,
+        * the results are also dropped.
         */
        if (hdev->discovery.rssi != HCI_RSSI_INVALID &&
-           rssi < hdev->discovery.rssi)
+           (rssi < hdev->discovery.rssi || rssi == HCI_RSSI_INVALID))
                return;
 
        /* 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,
 
        memset(buf, 0, sizeof(buf));
 
+       /* Reset invalid RSSI to 0 to keep backwards API compliance */
+       if (rssi == HCI_RSSI_INVALID)
+               rssi = 0;
+
        bacpy(&ev->addr.bdaddr, bdaddr);
        ev->addr.type = link_to_bdaddr(link_type, addr_type);
        ev->rssi = rssi;