|
@@ -1163,6 +1163,18 @@ int hci_link_keys_clear(struct hci_dev *hdev)
|
|
return 0;
|
|
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 *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
|
|
{
|
|
{
|
|
struct link_key *k;
|
|
struct link_key *k;
|
|
@@ -1355,6 +1367,23 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
|
|
return 0;
|
|
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 */
|
|
/* HCI command timer function */
|
|
static void hci_cmd_timer(unsigned long arg)
|
|
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->uuids);
|
|
|
|
|
|
INIT_LIST_HEAD(&hdev->link_keys);
|
|
INIT_LIST_HEAD(&hdev->link_keys);
|
|
|
|
+ INIT_LIST_HEAD(&hdev->long_term_keys);
|
|
|
|
|
|
INIT_LIST_HEAD(&hdev->remote_oob_data);
|
|
INIT_LIST_HEAD(&hdev->remote_oob_data);
|
|
|
|
|
|
@@ -1739,6 +1769,7 @@ void hci_unregister_dev(struct hci_dev *hdev)
|
|
hci_blacklist_clear(hdev);
|
|
hci_blacklist_clear(hdev);
|
|
hci_uuids_clear(hdev);
|
|
hci_uuids_clear(hdev);
|
|
hci_link_keys_clear(hdev);
|
|
hci_link_keys_clear(hdev);
|
|
|
|
+ hci_smp_ltks_clear(hdev);
|
|
hci_remote_oob_data_clear(hdev);
|
|
hci_remote_oob_data_clear(hdev);
|
|
hci_adv_entries_clear(hdev);
|
|
hci_adv_entries_clear(hdev);
|
|
hci_dev_unlock(hdev);
|
|
hci_dev_unlock(hdev);
|