Bluetooth: Add new structures for handling SMP Long Term Keys
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / bluetooth / hci_core.c
index 45e2d2a72b15cb257bcccd8a93178a9da881c39e..a28e637152fe1d81e8ea1fe1829bcd0800df73fd 100644 (file)
@@ -1163,6 +1163,18 @@ int hci_link_keys_clear(struct hci_dev *hdev)
        return 0;
 }
 
+int hci_smp_ltks_clear(struct hci_dev *hdev)
+{
+       struct smp_ltk *k, *tmp;
+
+       list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
+               list_del(&k->list);
+               kfree(k);
+       }
+
+       return 0;
+}
+
 struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
 {
        struct link_key *k;
@@ -1355,6 +1367,23 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
        return 0;
 }
 
+int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr)
+{
+       struct smp_ltk *k, *tmp;
+
+       list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
+               if (bacmp(bdaddr, &k->bdaddr))
+                       continue;
+
+               BT_DBG("%s removing %s", hdev->name, batostr(bdaddr));
+
+               list_del(&k->list);
+               kfree(k);
+       }
+
+       return 0;
+}
+
 /* HCI command timer function */
 static void hci_cmd_timer(unsigned long arg)
 {
@@ -1638,6 +1667,7 @@ int hci_register_dev(struct hci_dev *hdev)
        INIT_LIST_HEAD(&hdev->uuids);
 
        INIT_LIST_HEAD(&hdev->link_keys);
+       INIT_LIST_HEAD(&hdev->long_term_keys);
 
        INIT_LIST_HEAD(&hdev->remote_oob_data);
 
@@ -1739,6 +1769,7 @@ void hci_unregister_dev(struct hci_dev *hdev)
        hci_blacklist_clear(hdev);
        hci_uuids_clear(hdev);
        hci_link_keys_clear(hdev);
+       hci_smp_ltks_clear(hdev);
        hci_remote_oob_data_clear(hdev);
        hci_adv_entries_clear(hdev);
        hci_dev_unlock(hdev);