Hi, Could you please review and provide your valuable feedback ? > soft reminder > > > Soft reminder. > > > > > Add the definitions for adding entries to the LE resolve list and > > > removing entries from the LE resolve list. When the LE resolve list > > > gets changed via HCI commands make sure that the internal storage of > > > the resolve list entries gets updated. > > > > > > Signed-off-by: Ankit Navik <ankit.p.navik@xxxxxxxxx> > > > --- > > > include/net/bluetooth/hci.h | 14 +++++++++ > > > include/net/bluetooth/hci_core.h | 15 ++++++++++ > > > net/bluetooth/hci_core.c | 63 > > > ++++++++++++++++++++++++++++++++++++++++ > > > net/bluetooth/hci_event.c | 47 ++++++++++++++++++++++++++++++ > > > 4 files changed, 139 insertions(+) > > > > > > diff --git a/include/net/bluetooth/hci.h > > > b/include/net/bluetooth/hci.h index > > > 4af1a3a..1abcd14 100644 > > > --- a/include/net/bluetooth/hci.h > > > +++ b/include/net/bluetooth/hci.h > > > @@ -1490,6 +1490,20 @@ struct hci_cp_le_write_def_data_len { > > > __le16 tx_time; > > > } __packed; > > > > > > +#define HCI_OP_LE_ADD_TO_RESOLV_LIST 0x2027 > > > +struct hci_cp_le_add_to_resolv_list { > > > + __u8 bdaddr_type; > > > + bdaddr_t bdaddr; > > > + __u8 peer_irk[16]; > > > + __u8 local_irk[16]; > > > +} __packed; > > > + > > > +#define HCI_OP_LE_DEL_FROM_RESOLV_LIST 0x2028 > > > +struct hci_cp_le_del_from_resolv_list { > > > + __u8 bdaddr_type; > > > + bdaddr_t bdaddr; > > > +} __packed; > > > + > > > #define HCI_OP_LE_CLEAR_RESOLV_LIST 0x2029 > > > > > > #define HCI_OP_LE_READ_RESOLV_LIST_SIZE 0x202a > > > diff --git a/include/net/bluetooth/hci_core.h > > > b/include/net/bluetooth/hci_core.h > > > index 3a1ae0d..89580de 100644 > > > --- a/include/net/bluetooth/hci_core.h > > > +++ b/include/net/bluetooth/hci_core.h > > > @@ -103,6 +103,14 @@ struct bdaddr_list { > > > u8 bdaddr_type; > > > }; > > > > > > +struct bdaddr_list_with_irk { > > > + struct list_head list; > > > + bdaddr_t bdaddr; > > > + u8 bdaddr_type; > > > + u8 peer_irk[16]; > > > + u8 local_irk[16]; > > > +}; > > > + > > > struct bt_uuid { > > > struct list_head list; > > > u8 uuid[16]; > > > @@ -1050,8 +1058,15 @@ static inline void hci_set_drvdata(struct > > > hci_dev *hdev, void *data) > > > > > > struct bdaddr_list *hci_bdaddr_list_lookup(struct list_head *list, > > > bdaddr_t *bdaddr, u8 type); > > > +struct bdaddr_list_with_irk *hci_bdaddr_list_lookup_with_irk( > > > + struct list_head *list, bdaddr_t *bdaddr, > > > + u8 type); > > > int hci_bdaddr_list_add(struct list_head *list, bdaddr_t *bdaddr, > > > u8 type); > > > +int hci_bdaddr_list_add_with_irk(struct list_head *list, bdaddr_t *bdaddr, > > > + u8 type, u8 *peer_irk, u8 *local_irk); > > > int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, > > > u8 type); > > > +int hci_bdaddr_list_del_with_irk(struct list_head *list, bdaddr_t *bdaddr, > > > + u8 type); > > > void hci_bdaddr_list_clear(struct list_head *list); > > > > > > struct hci_conn_params *hci_conn_params_lookup(struct hci_dev > > > *hdev, diff -- git a/net/bluetooth/hci_core.c > > > b/net/bluetooth/hci_core.c index > > > af1675d..d74dd1c8 100644 > > > --- a/net/bluetooth/hci_core.c > > > +++ b/net/bluetooth/hci_core.c > > > @@ -2774,6 +2774,20 @@ struct bdaddr_list > > > *hci_bdaddr_list_lookup(struct list_head *bdaddr_list, > > > return NULL; > > > } > > > > > > +struct bdaddr_list_with_irk *hci_bdaddr_list_lookup_with_irk( > > > + struct list_head *bdaddr_list, bdaddr_t > > > *bdaddr, > > > + u8 type) > > > +{ > > > + struct bdaddr_list_with_irk *b; > > > + > > > + list_for_each_entry(b, bdaddr_list, list) { > > > + if (!bacmp(&b->bdaddr, bdaddr) && b->bdaddr_type == type) > > > + return b; > > > + } > > > + > > > + return NULL; > > > +} > > > + > > > void hci_bdaddr_list_clear(struct list_head *bdaddr_list) { > > > struct bdaddr_list *b, *n; > > > @@ -2806,6 +2820,35 @@ int hci_bdaddr_list_add(struct list_head > > > *list, bdaddr_t *bdaddr, u8 type) > > > return 0; > > > } > > > > > > +int hci_bdaddr_list_add_with_irk(struct list_head *list, bdaddr_t *bdaddr, > > > + u8 type, u8 *peer_irk, u8 *local_irk) { > > > + struct bdaddr_list_with_irk *entry; > > > + > > > + if (!bacmp(bdaddr, BDADDR_ANY)) > > > + return -EBADF; > > > + > > > + if (hci_bdaddr_list_lookup(list, bdaddr, type)) > > > + return -EEXIST; > > > + > > > + entry = kzalloc(sizeof(*entry), GFP_KERNEL); > > > + if (!entry) > > > + return -ENOMEM; > > > + > > > + bacpy(&entry->bdaddr, bdaddr); > > > + entry->bdaddr_type = type; > > > + > > > + if (peer_irk) > > > + memcpy(entry->peer_irk, peer_irk, 16); > > > + > > > + if (local_irk) > > > + memcpy(entry->local_irk, local_irk, 16); > > > + > > > + list_add(&entry->list, list); > > > + > > > + return 0; > > > +} > > > + > > > int hci_bdaddr_list_del(struct list_head *list, bdaddr_t *bdaddr, u8 type) { > > > struct bdaddr_list *entry; > > > @@ -2825,6 +2868,26 @@ int hci_bdaddr_list_del(struct list_head > > > *list, bdaddr_t *bdaddr, u8 type) > > > return 0; > > > } > > > > > > +int hci_bdaddr_list_del_with_irk(struct list_head *list, bdaddr_t *bdaddr, > > > + u8 type) > > > +{ > > > + struct bdaddr_list_with_irk *entry; > > > + > > > + if (!bacmp(bdaddr, BDADDR_ANY)) { > > > + hci_bdaddr_list_clear(list); > > > + return 0; > > > + } > > > + > > > + entry = hci_bdaddr_list_lookup_with_irk(list, bdaddr, type); > > > + if (!entry) > > > + return -ENOENT; > > > + > > > + list_del(&entry->list); > > > + kfree(entry); > > > + > > > + return 0; > > > +} > > > + > > > /* This function requires the caller holds hdev->lock */ struct > > > hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, > > > bdaddr_t *addr, u8 addr_type) diff > > --git > > > a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index > > > 3029d79..188ab46 100644 > > > --- a/net/bluetooth/hci_event.c > > > +++ b/net/bluetooth/hci_event.c > > > @@ -1307,6 +1307,45 @@ static void > > > hci_cc_le_write_def_data_len(struct > > > hci_dev *hdev, > > > hdev->le_def_tx_time = le16_to_cpu(sent->tx_time); } > > > > > > +static void hci_cc_le_add_to_resolv_list(struct hci_dev *hdev, > > > + struct sk_buff *skb) > > > +{ > > > + struct hci_cp_le_add_to_resolv_list *sent; > > > + __u8 status = *((__u8 *) skb->data); > > > + > > > + BT_DBG("%s status 0x%2.2x", hdev->name, status); > > > + > > > + if (status) > > > + return; > > > + > > > + sent = hci_sent_cmd_data(hdev, HCI_OP_LE_ADD_TO_RESOLV_LIST); > > > + if (!sent) > > > + return; > > > + > > > + hci_bdaddr_list_add_with_irk(&hdev->le_resolv_list, &sent->bdaddr, > > > + sent->bdaddr_type, sent->peer_irk, > > > + sent->local_irk); > > > +} > > > + > > > +static void hci_cc_le_del_from_resolv_list(struct hci_dev *hdev, > > > + struct sk_buff *skb) > > > +{ > > > + struct hci_cp_le_del_from_resolv_list *sent; > > > + __u8 status = *((__u8 *) skb->data); > > > + > > > + BT_DBG("%s status 0x%2.2x", hdev->name, status); > > > + > > > + if (status) > > > + return; > > > + > > > + sent = hci_sent_cmd_data(hdev, HCI_OP_LE_DEL_FROM_RESOLV_LIST); > > > + if (!sent) > > > + return; > > > + > > > + hci_bdaddr_list_del_with_irk(&hdev->le_resolv_list, &sent->bdaddr, > > > + sent->bdaddr_type); > > > +} > > > + > > > static void hci_cc_le_clear_resolv_list(struct hci_dev *hdev, > > > struct sk_buff *skb) > > > { > > > @@ -3042,6 +3081,14 @@ static void hci_cmd_complete_evt(struct > > > hci_dev *hdev, struct sk_buff *skb, > > > hci_cc_le_write_def_data_len(hdev, skb); > > > break; > > > > > > + case HCI_OP_LE_ADD_TO_RESOLV_LIST: > > > + hci_cc_le_add_to_resolv_list(hdev, skb); > > > + break; > > > + > > > + case HCI_OP_LE_DEL_FROM_RESOLV_LIST: > > > + hci_cc_le_del_from_resolv_list(hdev, skb); > > > + break; > > > + > > > case HCI_OP_LE_CLEAR_RESOLV_LIST: > > > hci_cc_le_clear_resolv_list(hdev, skb); > > > break; > > > -- > > > 1.9.1 > > > > Regards, > > Ankit > > Regards, > Ankit Regards, Ankit