Bluetooth: Add extra discovery fields for storing filter information
authorJakub Pawlowski <jpawlowski@google.com>
Fri, 5 Dec 2014 09:55:55 +0000 (10:55 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Fri, 5 Dec 2014 10:37:33 +0000 (12:37 +0200)
With the upcoming addition of support for Start Service Discovery, the
discovery handling needs to filter on RSSI and UUID values. For that
they need to be stored in the discovery handling. This patch adds the
appropiate fields and also make sure they are reset when discovery
has been stopped.

Signed-off-by: Jakub Pawlowski <jpawlowski@google.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c
net/bluetooth/mgmt.c

index 1dae7001fc3196923bc612809093bbdf99837646..83ca58b9f4c13c6290ae51dba65568f4a0aaf4a5 100644 (file)
@@ -75,6 +75,9 @@ struct discovery_state {
        u32                     last_adv_flags;
        u8                      last_adv_data[HCI_MAX_AD_LENGTH];
        u8                      last_adv_data_len;
+       s8                      rssi;
+       u16                     uuid_count;
+       u8                      (*uuids)[16];
 };
 
 struct hci_conn_hash {
@@ -503,6 +506,7 @@ static inline void discovery_init(struct hci_dev *hdev)
        INIT_LIST_HEAD(&hdev->discovery.all);
        INIT_LIST_HEAD(&hdev->discovery.unknown);
        INIT_LIST_HEAD(&hdev->discovery.resolve);
+       hdev->discovery.rssi = HCI_RSSI_INVALID;
 }
 
 bool hci_discovery_active(struct hci_dev *hdev);
index f0018562b028170247f036a7b190368e31d08ea2..42f86dc3fb40d1135f59ee4b7d513def02ccfca8 100644 (file)
@@ -2052,6 +2052,20 @@ void hci_discovery_set_state(struct hci_dev *hdev, int state)
        case DISCOVERY_STOPPED:
                hci_update_background_scan(hdev);
 
+               /* Reset RSSI and UUID filters to ensure Start Discovery
+                * and Start Service Discovery operate properly no matter
+                * which one started the previous discovery.
+                *
+                * While the Start Discovery and Start Service Discovery
+                * operations will set proper values for RSSI and UUID
+                * count, it is important to actually free the allocated
+                * list of UUIDs here.
+                */
+               hdev->discovery.rssi = HCI_RSSI_INVALID;
+               hdev->discovery.uuid_count = 0;
+               kfree(hdev->discovery.uuids);
+               hdev->discovery.uuids = NULL;
+
                if (old_state != DISCOVERY_STARTING)
                        mgmt_discovering(hdev, 0);
                break;
index 415ba41793265017730523c2f294c58c3f38a975..b6a0f3e6b719f7ac0fff422b41c9ce37ced9142c 100644 (file)
@@ -3867,6 +3867,8 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
        }
 
        hdev->discovery.type = cp->type;
+       hdev->discovery.rssi = HCI_RSSI_INVALID;
+       hdev->discovery.uuid_count = 0;
 
        hci_req_init(&req, hdev);