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