1444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************
2444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
3444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  Copyright (C) 1999-2012 Broadcom Corporation
4444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
5444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  Licensed under the Apache License, Version 2.0 (the "License");
6444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  you may not use this file except in compliance with the License.
7444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  You may obtain a copy of the License at:
8444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
9444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  http://www.apache.org/licenses/LICENSE-2.0
10444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
11444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  Unless required by applicable law or agreed to in writing, software
12444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  distributed under the License is distributed on an "AS IS" BASIS,
13444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  See the License for the specific language governing permissions and
15444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  limitations under the License.
16444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
17444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ******************************************************************************/
18444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
19444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************
20444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
21444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *  This file contains functions for BLE controller based privacy.
22444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *
23444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ******************************************************************************/
24444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include <string.h>
25444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "bt_target.h"
26444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2784baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#if (BLE_PRIVACY_SPT == TRUE)
28be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski#include "ble_advertiser.h"
29444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "bt_types.h"
30444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btm_int.h"
31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h"
32444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "device/include/controller.h"
33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcimsgs.h"
34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "vendor_hcidefs.h"
35444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
36444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/* RPA offload VSC specifics */
37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_IRK_ENABLE 0x01
38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_ADD_IRK_ENTRY 0x02
39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_REMOVE_IRK_ENTRY 0x03
40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_CLEAR_IRK_LIST 0x04
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_READ_IRK_ENTRY 0x05
42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_CS_RESOLVE_ADDR 0x00000001
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_IRK_ENABLE_LEN 2
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
45911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_ADD_IRK_LEN 24
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_REMOVE_IRK_LEN 8
47911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_CLEAR_IRK_LEN 1
48911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_READ_IRK_LEN 2
49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#define BTM_BLE_META_ADD_WL_ATTR_LEN 9
50444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
51444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
52ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *         Functions implemented controller based privacy using Resolving List
53ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
54444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
55ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_enq_resolving_list_pending
57ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
58ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      add target address into resolving pending operation queue
59ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
60ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       target_bda: target device address
61ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  add_entry: true for add entry, false for remove entry
62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
63ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
65ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
669e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_ble_enq_resolving_list_pending(const RawAddress& pseudo_bda,
67c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                        uint8_t op_code) {
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_RESOLVE_Q* p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q;
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
70c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  p_q->resolve_q_random_pseudo[p_q->q_next] = pseudo_bda;
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_q->resolve_q_action[p_q->q_next] = op_code;
72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_q->q_next++;
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_q->q_next %= controller_get_interface()->get_ble_resolving_list_max_size();
74444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
75444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
76444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_brcm_find_resolving_pending_entry
79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      check to see if the action is in pending list
81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       true: action pending;
83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  false: new action
84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
87ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
889e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool btm_ble_brcm_find_resolving_pending_entry(const RawAddress& pseudo_addr,
89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                               uint8_t action) {
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_RESOLVE_Q* p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q;
91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  for (uint8_t i = p_q->q_pending; i != p_q->q_next;) {
93c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    if (p_q->resolve_q_random_pseudo[i] == pseudo_addr &&
94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        action == p_q->resolve_q_action[i])
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return true;
96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i++;
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i %= controller_get_interface()->get_ble_resolving_list_max_size();
99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_deq_resolving_pending
106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
1079ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      dequeue target address from resolving pending operation
1089ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  queue
109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
110ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       pseudo_addr: pseudo_addr device address
111ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1159e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool btm_ble_deq_resolving_pending(RawAddress& pseudo_addr) {
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_RESOLVE_Q* p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q;
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_q->q_next != p_q->q_pending) {
119c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    pseudo_addr = p_q->resolve_q_random_pseudo[p_q->q_pending];
120aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski    p_q->resolve_q_random_pseudo[p_q->q_pending] = RawAddress::kEmpty;
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_q->q_pending++;
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_q->q_pending %=
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        controller_get_interface()->get_ble_resolving_list_max_size();
124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return true;
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
126e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return false;
128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_clear_irk_index
133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      clear IRK list index mask for availability
135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_clear_irk_index(uint8_t index) {
140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t byte;
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t bit;
142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (index < controller_get_interface()->get_ble_resolving_list_max_size()) {
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    byte = index / 8;
145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bit = index % 8;
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_cb.ble_ctr_cb.irk_list_mask[byte] &= (~(1 << bit));
147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
148e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun}
149e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
150e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/*******************************************************************************
151ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
152ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_find_irk_index
153ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
154ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      find the first available IRK list index
155ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          index from 0 ~ max (127 default)
157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t btm_ble_find_irk_index(void) {
160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t i = 0;
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t byte;
162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t bit;
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  while (i < controller_get_interface()->get_ble_resolving_list_max_size()) {
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    byte = i / 8;
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    bit = i % 8;
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if ((btm_cb.ble_ctr_cb.irk_list_mask[byte] & (1 << bit)) == 0) {
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.irk_list_mask[byte] |= (1 << bit);
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return i;
171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    i++;
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
174e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_ERROR("%s failed, list full", __func__);
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return i;
177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_update_resolving_list
182ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
183ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      update resolving list entry in host maintained record
184ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
185ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
187ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1889e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btm_ble_update_resolving_list(const RawAddress& pseudo_bda, bool add) {
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(pseudo_bda);
190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec == NULL) return;
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (add) {
193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->ble.in_controller_list |= BTM_RESOLVING_LIST_BIT;
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!controller_get_interface()->supports_ble_privacy())
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->ble.resolving_list_index = btm_ble_find_irk_index();
196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_dev_rec->ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT;
198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!controller_get_interface()->supports_ble_privacy()) {
199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* clear IRK list index mask */
200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_clear_irk_index(p_dev_rec->ble.resolving_list_index);
201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_dev_rec->ble.resolving_list_index = 0;
202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool clear_resolving_list_bit(void* data, void* context) {
207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev_rec = static_cast<tBTM_SEC_DEV_REC*>(data);
208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_dev_rec->ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT;
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
210cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
211cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
213ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
214ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_clear_resolving_list_complete
215ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when command complete for
217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  clear resolving list
218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_clear_resolving_list_complete(uint8_t* p, uint16_t evt_len) {
223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status = 0;
224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s status=%d", __func__, status);
227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS) {
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (evt_len >= 3) {
230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* VSC complete has one extra byte for op code and list size, skip it here
231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       */
232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p++;
233e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* updated the available list size, and current list size */
235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      uint8_t irk_list_sz_max = 0;
236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      STREAM_TO_UINT8(irk_list_sz_max, p);
237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (controller_get_interface()->get_ble_resolving_list_max_size() == 0)
239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_resolving_list_init(irk_list_sz_max);
240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      uint8_t irk_mask_size = (irk_list_sz_max % 8) ? (irk_list_sz_max / 8 + 1)
242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                                    : (irk_list_sz_max / 8);
243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      memset(btm_cb.ble_ctr_cb.irk_list_mask, 0, irk_mask_size);
244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_cb.ble_ctr_cb.resolving_list_avail_size =
247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        controller_get_interface()->get_ble_resolving_list_max_size();
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s resolving_list_avail_size=%d", __func__,
250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                    btm_cb.ble_ctr_cb.resolving_list_avail_size);
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    list_foreach(btm_cb.sec_dev_rec, clear_resolving_list_bit, NULL);
253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
257ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
258ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_add_resolving_list_entry_complete
259ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
260ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when command complete for
261ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  add resolving list entry
262ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
263ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
264ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
265ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_add_resolving_list_entry_complete(uint8_t* p, uint16_t evt_len) {
267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s status = %d", __func__, status);
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
2729e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  RawAddress pseudo_bda;
273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!btm_ble_deq_resolving_pending(pseudo_bda)) {
274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("no pending resolving list operation");
275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS) {
279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* privacy 1.2 command complete does not have these extra byte */
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (evt_len > 2) {
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* VSC complete has one extra byte for op code, skip it here */
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p++;
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p);
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else
285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.resolving_list_avail_size--;
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (status ==
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson             HCI_ERR_MEMORY_FULL) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED  */
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  {
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_cb.ble_ctr_cb.resolving_list_avail_size = 0;
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s Resolving list Full ", __func__);
291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_remove_resolving_list_entry_complete
297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when command complete for
299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  remove resolving list entry
300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_remove_resolving_list_entry_complete(uint8_t* p,
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                                  uint16_t evt_len) {
3069e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  RawAddress pseudo_bda;
307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status;
308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s status = %d", __func__, status);
312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!btm_ble_deq_resolving_pending(pseudo_bda)) {
314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("%s no pending resolving list operation", __func__);
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS) {
319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* proprietary: spec does not have these extra bytes */
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (evt_len > 2) {
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p++; /* skip opcode */
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p);
323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.resolving_list_avail_size++;
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
327e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
330ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_read_resolving_list_entry_complete
331ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
332ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called when command complete for
333ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  remove resolving list entry
334ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
335ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_read_resolving_list_entry_complete(uint8_t* p, uint16_t evt_len) {
339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t status, rra_type = BTM_BLE_ADDR_PSEUDO;
3409e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  RawAddress rra, pseudo_bda;
341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  STREAM_TO_UINT8(status, p);
343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s status = %d", __func__, status);
345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!btm_ble_deq_resolving_pending(pseudo_bda)) {
347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("no pending resolving list operation");
348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (status == HCI_SUCCESS) {
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* proprietary spec has extra bytes */
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (evt_len > 8) {
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      /* skip subcode, index, IRK value, address type, identity addr type */
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p += (2 + 16 + 1 + 6);
356b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski      STREAM_TO_BDADDR(rra, p);
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
358c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski      VLOG(2) << __func__ << " peer_addr: " << rra;
359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
360b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski      STREAM_TO_BDADDR(rra, p);
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_refresh_peer_resolvable_private_addr(pseudo_bda, rra, rra_type);
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                VSC that implement controller based privacy
367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
369ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_vsc_op_cmpl
371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      IRK operation VSC complete handler
373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters
375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_resolving_list_vsc_op_cmpl(tBTM_VSC_CMPL* p_params) {
380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t *p = p_params->p_param_buf, op_subcode;
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint16_t evt_len = p_params->param_len;
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  op_subcode = *(p + 1);
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s op_subcode = %d", __func__, op_subcode);
386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST) {
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_clear_resolving_list_complete(p, evt_len);
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY) {
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_add_resolving_list_entry_complete(p, evt_len);
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY) {
392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_remove_resolving_list_entry_complete(p, evt_len);
393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY) {
394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_read_resolving_list_entry_complete(p, evt_len);
395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else if (op_subcode == BTM_BLE_META_IRK_ENABLE) {
396911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* RPA offloading enable/disabled */
397911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_remove_resolving_list_entry
403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function to remove an IRK entry from the list
405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       ble_addr_type: address type
407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  ble_addr: LE adddress
408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          status
410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
411ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
412911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS btm_ble_remove_resolving_list_entry(tBTM_SEC_DEV_REC* p_dev_rec) {
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if controller does not support RPA offloading or privacy 1.2, skip */
414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->get_ble_resolving_list_max_size() == 0)
415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_WRONG_MODE;
416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->supports_ble_privacy()) {
418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_rm_device_resolving_list(p_dev_rec->ble.static_addr_type,
419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                            p_dev_rec->ble.static_addr);
420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t param[20] = {0};
422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* p = param;
423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY);
425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
426b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski    BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr);
427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC,
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              BTM_BLE_META_REMOVE_IRK_LEN, param,
430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              btm_ble_resolving_list_vsc_op_cmpl);
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr,
434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     BTM_BLE_META_REMOVE_IRK_ENTRY);
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return BTM_CMD_STARTED;
436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_clear_resolving_list
441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
442ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function clears the resolving  list
443ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
444ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       None.
445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_clear_resolving_list(void) {
448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->supports_ble_privacy()) {
449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_clear_resolving_list();
450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t param[20] = {0};
452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* p = param;
453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(p, BTM_BLE_META_CLEAR_IRK_LIST);
455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC,
456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              BTM_BLE_META_CLEAR_IRK_LEN, param,
457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              btm_ble_resolving_list_vsc_op_cmpl);
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_read_resolving_list_entry
464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function read an IRK entry by index
466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       entry index.
468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          status
470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
472911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS btm_ble_read_resolving_list_entry(tBTM_SEC_DEV_REC* p_dev_rec) {
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT))
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return BTM_WRONG_MODE;
475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->supports_ble_privacy()) {
477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_read_resolvable_addr_peer(p_dev_rec->ble.static_addr_type,
478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                             p_dev_rec->ble.static_addr);
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t param[20] = {0};
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t* p = param;
482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(p, BTM_BLE_META_READ_IRK_ENTRY);
484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(p, p_dev_rec->ble.resolving_list_index);
485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_META_READ_IRK_LEN,
487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              param, btm_ble_resolving_list_vsc_op_cmpl);
488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr,
491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     BTM_BLE_META_READ_IRK_ENTRY);
492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return BTM_CMD_STARTED;
494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson}
495877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
496877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
497ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
498ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_suspend_resolving_list_activity
499ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
5009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function suspends all resolving list activity,
5019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  including scanning, initiating, and advertising, if
5029ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  resolving list is being enabled.
503ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
504ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters
505ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
506ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if suspended; false otherwise
507ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
508ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_ble_suspend_resolving_list_activity(void) {
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
511877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if resolving list is not enabled, do not need to terminate any activity */
513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if asking for stop all activity */
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if already suspended */
515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ble_cb->suspended_rl_state != BTM_BLE_RL_IDLE) return true;
516877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* direct connection active, wait until it completed */
518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_ble_get_conn_st() == BLE_DIR_CONN) {
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_ERROR("resolving list can not be edited, EnQ now");
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
522877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE;
524877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ble_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE) {
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_stop_adv();
527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ble_cb->suspended_rl_state |= BTM_BLE_RL_ADV;
528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
529877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
530be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski  // If it's non-VSC implementation, suspend
5315f984c9fa3d58ccbbb3a2431f8c476b23eba1fcaSubramanian Srinivasan  if (BleAdvertisingManager::IsInitialized() &&
532be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski      (controller_get_interface()->supports_ble_extended_advertising() ||
533be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski       BTM_BleMaxMultiAdvInstanceCount() == 0)) {
534be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski    BleAdvertisingManager::Get()->Suspend();
535be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski  }
536be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_stop_scan();
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ble_cb->suspended_rl_state |= BTM_BLE_RL_SCAN;
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_ble_suspend_bg_conn())
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_ble_cb->suspended_rl_state |= BTM_BLE_RL_INIT;
544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
546877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
547877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
548877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resume_resolving_list_activity
551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function resumes the resolving list activity, including
553ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  scanning, initiating, and advertising, if any of these
554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  activities has been suspended earlier.
555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_resume_resolving_list_activity(void) {
560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_CB* p_ble_cb = &btm_cb.ble_ctr_cb;
561877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_ADV) btm_ble_start_adv();
563877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
564be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski  // If it's non-VSC implementation, resume
5655f984c9fa3d58ccbbb3a2431f8c476b23eba1fcaSubramanian Srinivasan  if (BleAdvertisingManager::IsInitialized() &&
566be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski      (controller_get_interface()->supports_ble_extended_advertising() ||
567be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski       BTM_BleMaxMultiAdvInstanceCount() == 0)) {
568be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski    BleAdvertisingManager::Get()->Resume();
569be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski  }
570be8d3f542517246c9cc8b3b02f2519baf300c53fJakub Pawlowski
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_SCAN) btm_ble_start_scan();
572877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_INIT) btm_ble_resume_bg_conn();
574877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE;
576877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
577877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
578877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
580ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_vendor_enable_irk_feature
581ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function is called to enable or disable the RRA
583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  offloading feature.
584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       enable: enable or disable the RRA offloading feature
586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_vendor_enable_irk_feature(bool enable) {
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t param[20], *p;
590877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p = param;
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(param, 0, 20);
593877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* select feature based on control block settings */
595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE);
596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(p, enable ? 0x01 : 0x00);
597877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN,
599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            param, btm_ble_resolving_list_vsc_op_cmpl);
600877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
601877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
602877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_exe_disable_resolving_list
605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      execute resolving list disable
607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_ble_exe_disable_resolving_list(void) {
612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!btm_ble_suspend_resolving_list_activity()) return false;
613877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!controller_get_interface()->supports_ble_privacy())
615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_vendor_enable_irk_feature(false);
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_set_addr_resolution_enable(false);
618877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
620877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
621877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
622877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_exe_enable_resolving_list
625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      enable LE resolve address list
627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_exe_enable_resolving_list(void) {
632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!btm_ble_suspend_resolving_list_activity()) return;
633877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (!controller_get_interface()->supports_ble_privacy())
635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_vendor_enable_irk_feature(true);
636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btsnd_hcic_ble_set_addr_resolution_enable(true);
638877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
639877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
640877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_disable_resolving_list
643ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
644ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Disable LE Address resolution
645ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_ble_disable_resolving_list(uint8_t rl_mask, bool to_resume) {
650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t rl_state = btm_cb.ble_ctr_cb.rl_state;
651877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if controller does not support RPA offloading or privacy 1.2, skip */
653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->get_ble_resolving_list_max_size() == 0)
654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
655877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.ble_ctr_cb.rl_state &= ~rl_mask;
657877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (rl_state != BTM_BLE_RL_IDLE &&
659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.rl_state == BTM_BLE_RL_IDLE) {
660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_ble_exe_disable_resolving_list()) {
661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (to_resume) btm_ble_resume_resolving_list_activity();
662877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return true;
664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      return false;
666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
667877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
669877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
670877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
671444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_load_dev
674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
6759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description      This function adds a device which is using RPA into the
6769ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson *                  white list.
677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
678ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       pointer to device security record
679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true if device added, otherwise falase.
681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_ble_resolving_list_load_dev(tBTM_SEC_DEV_REC* p_dev_rec) {
684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  bool rt = false;
685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t rl_mask = btm_cb.ble_ctr_cb.rl_state;
686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", __func__,
688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  btm_cb.ble_ctr_cb.privacy_mode);
689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if controller does not support RPA offloading or privacy 1.2, skip */
691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->get_ble_resolving_list_max_size() == 0)
692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", __func__,
695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                  btm_cb.ble_ctr_cb.privacy_mode);
696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* only add RPA enabled device into resolving list */
698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_dev_rec != NULL && /* RPA is being used and PID is known */
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      ((p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0 ||
700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson       (p_dev_rec->ble.key_type & BTM_LE_KEY_LID) != 0)) {
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) &&
702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_brcm_find_resolving_pending_entry(
703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_dev_rec->bd_addr, BTM_BLE_META_ADD_IRK_ENTRY) == false) {
704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      if (btm_cb.ble_ctr_cb.resolving_list_avail_size > 0) {
705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (rl_mask) {
706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          if (!btm_ble_disable_resolving_list(rl_mask, false)) return false;
707444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_update_resolving_list(p_dev_rec->bd_addr, true);
710911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (controller_get_interface()->supports_ble_privacy()) {
711911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          uint8_t* peer_irk = p_dev_rec->ble.keys.irk;
712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          uint8_t* local_irk = btm_cb.devcb.id_keys.irk;
713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
714aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski          if (p_dev_rec->ble.static_addr.IsEmpty()) {
715c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski            p_dev_rec->ble.static_addr = p_dev_rec->bd_addr;
716911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson            p_dev_rec->ble.static_addr_type = p_dev_rec->ble.ble_addr_type;
717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          }
718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
719911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_TRACE_DEBUG("%s:adding device to controller resolving list",
720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                          __func__);
721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          // use identical IRK for now
722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btsnd_hcic_ble_add_device_resolving_list(
723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr,
724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson              peer_irk, local_irk);
725f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
726ba78601034bd61d345a3ac92b297831ff8e6978aJakub Pawlowski          if (controller_get_interface()->supports_ble_set_privacy_mode()) {
727f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski            BTM_TRACE_DEBUG("%s: adding device privacy mode", __func__);
728f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski            btsnd_hcic_ble_set_privacy_mode(p_dev_rec->ble.static_addr_type,
729f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski                                            p_dev_rec->ble.static_addr, 0x01);
730f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski          }
731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        } else {
732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          uint8_t param[40] = {0};
733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          uint8_t* p = param;
734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY);
736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN);
737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type);
738b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski          BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr);
739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC,
741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    BTM_BLE_META_ADD_IRK_LEN, param,
742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    btm_ble_resolving_list_vsc_op_cmpl);
743444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        rt = true;
746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr,
747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                           BTM_BLE_META_ADD_IRK_ENTRY);
748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        /* if resolving list has been turned on, re-enable it */
750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        if (rl_mask)
751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_ble_enable_resolving_list(rl_mask);
752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        else
753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_ble_enable_resolving_list(BTM_BLE_RL_INIT);
754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      }
755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    } else {
756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      BTM_TRACE_ERROR("Device already in Resolving list");
757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      rt = true;
758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    }
759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("Device not a RPA enabled device");
761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return rt;
763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
764444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
765444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_remove_dev
768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
769ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      This function removes the device from resolving list
770ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
771ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters
772ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
773ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          status
774ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
775ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_resolving_list_remove_dev(tBTM_SEC_DEV_REC* p_dev_rec) {
777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t rl_mask = btm_cb.ble_ctr_cb.rl_state;
778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BTM_TRACE_EVENT("%s", __func__);
780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (rl_mask) {
781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (!btm_ble_disable_resolving_list(rl_mask, false)) return;
782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) &&
785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_brcm_find_resolving_pending_entry(
786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          p_dev_rec->bd_addr, BTM_BLE_META_REMOVE_IRK_ENTRY) == false) {
787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_update_resolving_list(p_dev_rec->bd_addr, false);
788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_remove_resolving_list_entry(p_dev_rec);
789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  } else {
790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("Device not in resolving list");
791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if resolving list has been turned on, re-enable it */
794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (rl_mask) btm_ble_enable_resolving_list(rl_mask);
795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
796444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
797444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
798ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
799ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_enable_resolving_list
800ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      enable LE resolve address list
802ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
803ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
804ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_enable_resolving_list(uint8_t rl_mask) {
807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t rl_state = btm_cb.ble_ctr_cb.rl_state;
808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.ble_ctr_cb.rl_state |= rl_mask;
810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (rl_state == BTM_BLE_RL_IDLE &&
811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE &&
812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      controller_get_interface()->get_ble_resolving_list_max_size() != 0) {
813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_exe_enable_resolving_list();
814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_resume_resolving_list_activity();
815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
820ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_empty
821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      check to see if resoving list is empty or not
823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          true: empty; false non-empty
825ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
826ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_ble_resolving_list_empty(void) {
828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return (controller_get_interface()->get_ble_resolving_list_max_size() ==
829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson          btm_cb.ble_ctr_cb.resolving_list_avail_size);
830444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
831444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool is_on_resolving_list(void* data, void* context) {
833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_SEC_DEV_REC* p_dev = static_cast<tBTM_SEC_DEV_REC*>(data);
834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if ((p_dev->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) &&
835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (p_dev->ble.in_controller_list & BTM_WHITE_LIST_BIT))
836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return false;
837cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  return true;
839cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
840cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_enable_resolving_list_for_platform
844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      enable/disable resolving list feature depending on if any
846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  resolving list is empty and whitelist is involoved in the
847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *                  operation.
848ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
849ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          none
850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_enable_resolving_list_for_platform(uint8_t rl_mask) {
853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  /* if controller does not support, skip */
854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (controller_get_interface()->get_ble_resolving_list_max_size() == 0)
855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (btm_cb.ble_ctr_cb.wl_state == BTM_BLE_WL_IDLE) {
858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (controller_get_interface()->get_ble_resolving_list_max_size() >
859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson        btm_cb.ble_ctr_cb.resolving_list_avail_size)
860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_enable_resolving_list(rl_mask);
861cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    else
862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_ble_disable_resolving_list(rl_mask, true);
863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    return;
864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  list_node_t* n = list_foreach(btm_cb.sec_dev_rec, is_on_resolving_list, NULL);
867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (n)
868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_enable_resolving_list(rl_mask);
869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  else
870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    btm_ble_disable_resolving_list(rl_mask, true);
871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
875ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_init
876ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Initialize resolving list in host stack
878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
879ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters       Max resolving list size
880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
884911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_resolving_list_init(uint8_t max_irk_list_sz) {
885911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_RESOLVE_Q* p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q;
886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t irk_mask_size =
887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      (max_irk_list_sz % 8) ? (max_irk_list_sz / 8 + 1) : (max_irk_list_sz / 8);
888911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
889911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (max_irk_list_sz > 0) {
890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_q->resolve_q_random_pseudo =
8919e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski        (RawAddress*)osi_malloc(sizeof(RawAddress) * max_irk_list_sz);
892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    p_q->resolve_q_action = (uint8_t*)osi_malloc(max_irk_list_sz);
893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    /* RPA offloading feature */
895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (btm_cb.ble_ctr_cb.irk_list_mask == NULL)
896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      btm_cb.ble_ctr_cb.irk_list_mask = (uint8_t*)osi_malloc(irk_mask_size);
897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    BTM_TRACE_DEBUG("%s max_irk_list_sz = %d", __func__, max_irk_list_sz);
899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson
901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  controller_get_interface()->set_ble_resolving_list_max_size(max_irk_list_sz);
902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_ble_clear_resolving_list();
903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btm_cb.ble_ctr_cb.resolving_list_avail_size = max_irk_list_sz;
904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function         btm_ble_resolving_list_cleanup
909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description      Cleanup resolving list dynamic memory
911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters
913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns          void
915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *
916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_ble_resolving_list_cleanup(void) {
918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  tBTM_BLE_RESOLVE_Q* p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q;
919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&p_q->resolve_q_random_pseudo);
921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&p_q->resolve_q_action);
922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  controller_get_interface()->set_ble_resolving_list_max_size(0);
924e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  osi_free_and_reset((void**)&btm_cb.ble_ctr_cb.irk_list_mask);
926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
928