Bluetooth: Handle command complete event for HCI Read Stored Link Keys
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 12 Jan 2015 17:21:25 +0000 (09:21 -0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 12 Jan 2015 19:54:16 +0000 (21:54 +0200)
When the HCI Read Stored Link Keys command completes it gives useful
information of the current stored keys and maximum keys a controller
can actually store. So process this event and store these information
in hci_dev structure.

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_event.c

index 89f4e3c..1f21fe4 100644 (file)
@@ -205,6 +205,8 @@ struct hci_dev {
        __u16           lmp_subver;
        __u16           voice_setting;
        __u8            num_iac;
+       __u8            stored_max_keys;
+       __u8            stored_num_keys;
        __u8            io_capability;
        __s8            inq_tx_power;
        __u16           page_scan_interval;
index 0881efd..b1580da 100644 (file)
@@ -214,6 +214,24 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
        hci_bdaddr_list_clear(&hdev->le_white_list);
 }
 
+static void hci_cc_read_stored_link_key(struct hci_dev *hdev,
+                                       struct sk_buff *skb)
+{
+       struct hci_rp_read_stored_link_key *rp = (void *)skb->data;
+       struct hci_cp_read_stored_link_key *sent;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, rp->status);
+
+       sent = hci_sent_cmd_data(hdev, HCI_OP_READ_STORED_LINK_KEY);
+       if (!sent)
+               return;
+
+       if (!rp->status && sent->read_all == 0x01) {
+               hdev->stored_max_keys = rp->max_keys;
+               hdev->stored_num_keys = rp->num_keys;
+       }
+}
+
 static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb)
 {
        __u8 status = *((__u8 *) skb->data);
@@ -2714,6 +2732,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
                hci_cc_reset(hdev, skb);
                break;
 
+       case HCI_OP_READ_STORED_LINK_KEY:
+               hci_cc_read_stored_link_key(hdev, skb);
+               break;
+
        case HCI_OP_WRITE_LOCAL_NAME:
                hci_cc_write_local_name(hdev, skb);
                break;