Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
Bluetooth: Update resolving list when updating whitelist
Browse files Browse the repository at this point in the history
When the whitelist is updated, then also update the entries of the
resolving list for devices where IRKs are available.

Signed-off-by: Marcel Holtmann <[email protected]>
Signed-off-by: Sathish Narsimman <[email protected]>
Signed-off-by: Marcel Holtmann <[email protected]>
  • Loading branch information
holtmann committed Jul 30, 2020
1 parent e1d5723 commit 0eee35b
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions net/bluetooth/hci_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,21 @@ static void del_from_white_list(struct hci_request *req, bdaddr_t *bdaddr,
bt_dev_dbg(req->hdev, "Remove %pMR (0x%x) from whitelist", &cp.bdaddr,
cp.bdaddr_type);
hci_req_add(req, HCI_OP_LE_DEL_FROM_WHITE_LIST, sizeof(cp), &cp);

if (use_ll_privacy(req->hdev)) {
struct smp_irk *irk;

irk = hci_find_irk_by_addr(req->hdev, bdaddr, bdaddr_type);
if (irk) {
struct hci_cp_le_del_from_resolv_list cp;

cp.bdaddr_type = bdaddr_type;
bacpy(&cp.bdaddr, bdaddr);

hci_req_add(req, HCI_OP_LE_DEL_FROM_RESOLV_LIST,
sizeof(cp), &cp);
}
}
}

/* Adds connection to white list if needed. On error, returns -1. */
Expand All @@ -714,7 +729,7 @@ static int add_to_white_list(struct hci_request *req,
return -1;

/* White list can not be used with RPAs */
if (!allow_rpa &&
if (!allow_rpa && !use_ll_privacy(hdev) &&
hci_find_irk_by_addr(hdev, &params->addr, params->addr_type)) {
return -1;
}
Expand All @@ -732,6 +747,28 @@ static int add_to_white_list(struct hci_request *req,
cp.bdaddr_type);
hci_req_add(req, HCI_OP_LE_ADD_TO_WHITE_LIST, sizeof(cp), &cp);

if (use_ll_privacy(hdev)) {
struct smp_irk *irk;

irk = hci_find_irk_by_addr(hdev, &params->addr,
params->addr_type);
if (irk) {
struct hci_cp_le_add_to_resolv_list cp;

cp.bdaddr_type = params->addr_type;
bacpy(&cp.bdaddr, &params->addr);
memcpy(cp.peer_irk, irk->val, 16);

if (hci_dev_test_flag(hdev, HCI_PRIVACY))
memcpy(cp.local_irk, hdev->irk, 16);
else
memset(cp.local_irk, 0, 16);

hci_req_add(req, HCI_OP_LE_ADD_TO_RESOLV_LIST,
sizeof(cp), &cp);
}
}

return 0;
}

Expand Down Expand Up @@ -772,7 +809,7 @@ static u8 update_white_list(struct hci_request *req)
}

/* White list can not be used with RPAs */
if (!allow_rpa &&
if (!allow_rpa && !use_ll_privacy(hdev) &&
hci_find_irk_by_addr(hdev, &b->bdaddr, b->bdaddr_type)) {
return 0x00;
}
Expand Down

0 comments on commit 0eee35b

Please sign in to comment.