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 27444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE) 28444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "bt_types.h" 29444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "hcimsgs.h" 30444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btu.h" 31444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "vendor_hcidefs.h" 32444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btm_int.h" 33444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "device/include/controller.h" 34444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 35444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/* RPA offload VSC specifics */ 36444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_IRK_ENABLE 0x01 37444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_ADD_IRK_ENTRY 0x02 38444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_REMOVE_IRK_ENTRY 0x03 39444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_CLEAR_IRK_LIST 0x04 40444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_READ_IRK_ENTRY 0x05 41444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_CS_RESOLVE_ADDR 0x00000001 42444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_IRK_ENABLE_LEN 2 43444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 44444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_ADD_IRK_LEN 24 45444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_REMOVE_IRK_LEN 8 46444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_CLEAR_IRK_LEN 1 47444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_READ_IRK_LEN 2 48444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_ADD_WL_ATTR_LEN 9 49444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 50444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 51444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Functions implemented controller based privacy using Resolving List 52444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 53444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 54444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 55444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_enq_resolving_list_pending 56444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 57444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description add target address into resolving pending operation queue 58444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 59444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters target_bda: target device address 60444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** add_entry: TRUE for add entry, FALSE for remove entry 61444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 62444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 63444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 64444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 65e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sunvoid btm_ble_enq_resolving_list_pending(BD_ADDR pseudo_bda, UINT8 op_code) 66444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 67e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; 68444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 69e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun memcpy(p_q->resolve_q_random_pseudo[p_q->q_next], pseudo_bda, BD_ADDR_LEN); 70444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_q->resolve_q_action[p_q->q_next] = op_code; 71444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_q->q_next ++; 72444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_q->q_next %= controller_get_interface()->get_ble_resolving_list_max_size(); 73444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 74444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 75444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 76444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 77444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_brcm_find_resolving_pending_entry 78444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 79444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description check to see if the action is in pending list 80444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 81444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters TRUE: action pending; 82444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** FALSE: new action 83444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 84444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 85444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 86444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 87e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing SunBOOLEAN btm_ble_brcm_find_resolving_pending_entry(BD_ADDR pseudo_addr, UINT8 action) 88444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 89444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; 90444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 91e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun for (UINT8 i = p_q->q_pending; i != p_q->q_next;) 92444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 93e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (memcmp(p_q->resolve_q_random_pseudo[i], pseudo_addr, BD_ADDR_LEN) == 0 && 94444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji action == p_q->resolve_q_action[i]) 95444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 96444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 97444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji i ++; 98444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji i %= controller_get_interface()->get_ble_resolving_list_max_size(); 99444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_deq_resolving_pending 106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description dequeue target address from resolving pending operation queue 108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 109e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Parameters pseudo_addr: pseudo_addr device address 110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 114e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing SunBOOLEAN btm_ble_deq_resolving_pending(BD_ADDR pseudo_addr) 115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; 117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_q->q_next != p_q->q_pending) 119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 120e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun memcpy(pseudo_addr, p_q->resolve_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN); 121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p_q->resolve_q_random_pseudo[p_q->q_pending], 0, BD_ADDR_LEN); 122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_q->q_pending ++; 123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_q->q_pending %= controller_get_interface()->get_ble_resolving_list_max_size(); 124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 126e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 132e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Function btm_ble_clear_irk_index 133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 134e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Description clear IRK list index mask for availability 135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 136e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Returns none 137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 139e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sunvoid btm_ble_clear_irk_index(UINT8 index) 140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 141e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 byte; 142e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 bit; 143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1440baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji if (index < controller_get_interface()->get_ble_resolving_list_max_size()) 145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1460baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji byte = index / 8; 1470baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji bit = index % 8; 1480baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji btm_cb.ble_ctr_cb.irk_list_mask[byte] &= (~(1 << bit)); 149e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 150e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun} 151e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 152e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun/******************************************************************************* 153e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 154e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Function btm_ble_find_irk_index 155e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 156e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Description find the first available IRK list index 157e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 158e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** Returns index from 0 ~ max (127 default) 159e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun** 160e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun*******************************************************************************/ 161e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing SunUINT8 btm_ble_find_irk_index(void) 162e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun{ 163e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 i = 0; 164e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 byte; 165e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 bit; 166e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 167e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun while (i < controller_get_interface()->get_ble_resolving_list_max_size()) 168e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 169e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun byte = i / 8; 170e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun bit = i % 8; 171e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 172e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if ((btm_cb.ble_ctr_cb.irk_list_mask[byte] & (1 << bit)) == 0) 173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 174e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_cb.ble_ctr_cb.irk_list_mask[byte] |= (1 << bit); 175e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return i; 176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 177e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun i++; 178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 179e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 180e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_ERROR ("%s failed, list full", __func__); 181e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return i; 182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_update_resolving_list 187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description update resolving list entry in host maintained record 189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 192444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_update_resolving_list(BD_ADDR pseudo_bda, BOOLEAN add) 194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 195e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev(pseudo_bda); 196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec == NULL) 197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (add) 200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.in_controller_list |= BTM_RESOLVING_LIST_BIT; 202e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!controller_get_interface()->supports_ble_privacy()) 203e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->ble.resolving_list_index = btm_ble_find_irk_index(); 204e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 205e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 206e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT; 208e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!controller_get_interface()->supports_ble_privacy()) 209e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 210e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* clear IRK list index mask */ 211e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_clear_irk_index(p_dev_rec->ble.resolving_list_index); 212e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->ble.resolving_list_index = 0; 213e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 217cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool clear_resolving_list_bit(void *data, void *context) 218cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 219cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 220cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_dev_rec->ble.in_controller_list &= ~BTM_RESOLVING_LIST_BIT; 221cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 222cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 223cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_clear_resolving_list_complete 227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called when command complete for 229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** clear resolving list 230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_clear_resolving_list_complete(UINT8 *p, UINT16 evt_len) 235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 236e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 status = 0; 237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT8(status, p); 238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 239e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG("%s status=%d", __func__, status); 240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (status == HCI_SUCCESS) 242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 243e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (evt_len >= 3) 244e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 245e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* VSC complete has one extra byte for op code and list size, skip it here */ 246e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p ++; 247e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 248e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* updated the available list size, and current list size */ 249e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun uint8_t irk_list_sz_max = 0; 250e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun STREAM_TO_UINT8(irk_list_sz_max, p); 251e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 252e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) 253e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_resolving_list_init(irk_list_sz_max); 254e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 255e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun uint8_t irk_mask_size = (irk_list_sz_max % 8) ? 256e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (irk_list_sz_max / 8 + 1) : (irk_list_sz_max / 8); 257e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun memset(btm_cb.ble_ctr_cb.irk_list_mask, 0, irk_mask_size); 258e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 259e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 260e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_cb.ble_ctr_cb.resolving_list_avail_size = 261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller_get_interface()->get_ble_resolving_list_max_size(); 262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 263e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG("%s resolving_list_avail_size=%d", 264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, btm_cb.ble_ctr_cb.resolving_list_avail_size); 265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 266cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_foreach(btm_cb.sec_dev_rec, clear_resolving_list_bit, NULL); 267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_add_resolving_list_entry_complete 273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called when command complete for 275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** add resolving list entry 276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_add_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) 281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 282e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 status; 283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT8(status, p); 284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s status = %d", __func__, status); 286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BD_ADDR pseudo_bda; 288e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!btm_ble_deq_resolving_pending(pseudo_bda)) 289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("no pending resolving list operation"); 291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (status == HCI_SUCCESS) 295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* privacy 1.2 command complete does not have these extra byte */ 297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (evt_len > 2) 298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* VSC complete has one extra byte for op code, skip it here */ 300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p ++; 301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p); 302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_cb.ble_ctr_cb.resolving_list_avail_size --; 305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (status == HCI_ERR_MEMORY_FULL) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED */ 307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_cb.ble_ctr_cb.resolving_list_avail_size = 0; 309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s Resolving list Full ", __func__); 310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_remove_resolving_list_entry_complete 316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called when command complete for 318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** remove resolving list entry 319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_remove_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) 324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 325e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BD_ADDR pseudo_bda; 326e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 status; 327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 328e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun STREAM_TO_UINT8(status, p); 329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s status = %d", __func__, status); 331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btm_ble_deq_resolving_pending(pseudo_bda)) 333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR("%s no pending resolving list operation", __func__); 335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (status == HCI_SUCCESS) 339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* proprietary: spec does not have these extra bytes */ 341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (evt_len > 2) 342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 343e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p ++; /* skip opcode */ 344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT8(btm_cb.ble_ctr_cb.resolving_list_avail_size, p); 345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 347e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_cb.ble_ctr_cb.resolving_list_avail_size++; 348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 350e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_read_resolving_list_entry_complete 354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 355444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called when command complete for 356444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** remove resolving list entry 357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_read_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len) 362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 status, rra_type = BTM_BLE_ADDR_PSEUDO; 364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BD_ADDR rra, pseudo_bda; 365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT8 (status, p); 367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s status = %d", __func__, status); 369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btm_ble_deq_resolving_pending(pseudo_bda)) 371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR("no pending resolving list operation"); 373444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (status == HCI_SUCCESS) 377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* proprietary spec has extra bytes */ 379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (evt_len > 8) 380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 381444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p += (2 + 16 + 1 + 6); /* skip subcode, index, IRK value, address type, identity addr type */ 382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_BDADDR(rra, p); 383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR("%s peer_addr: %02x:%02x:%02x:%02x:%02x:%02x", 385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, rra[0], rra[1], rra[2], rra[3], rra[4], rra[5]); 386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_BDADDR(rra, p); 390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_refresh_peer_resolvable_private_addr(pseudo_bda, rra, rra_type); 392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji VSC that implement controller based privacy 396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji********************************************************************************/ 397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_vsc_op_cmpl 400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description IRK operation VSC complete handler 402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters 404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_resolving_list_vsc_op_cmpl (tBTM_VSC_CMPL *p_params) 409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = p_params->p_param_buf, op_subcode; 411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 evt_len = p_params->param_len; 412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji op_subcode = *(p + 1); 414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s op_subcode = %d", __func__, op_subcode); 416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST) 418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_clear_resolving_list_complete(p, evt_len); 420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY) 422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_add_resolving_list_entry_complete(p, evt_len); 424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY) 426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 427444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_remove_resolving_list_entry_complete(p, evt_len); 428444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY) 430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 431444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_read_resolving_list_entry_complete(p, evt_len); 432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (op_subcode == BTM_BLE_META_IRK_ENABLE) 434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* RPA offloading enable/disabled */ 436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_remove_resolving_list_entry 442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function to remove an IRK entry from the list 444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters ble_addr_type: address type 446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** ble_addr: LE adddress 447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns status 449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 451444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_STATUS btm_ble_remove_resolving_list_entry(tBTM_SEC_DEV_REC *p_dev_rec) 452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 453e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* if controller does not support RPA offloading or privacy 1.2, skip */ 45404b5e9294be52782500f0be01fd10d43bb330ce0Nitin Arora if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) 455e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return BTM_WRONG_MODE; 456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 457e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_STATUS st = BTM_NO_RESOURCES; 458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->supports_ble_privacy()) 459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 460e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (btsnd_hcic_ble_rm_device_resolving_list(p_dev_rec->ble.static_addr_type, 461e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->ble.static_addr)) 462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji st = BTM_CMD_STARTED; 463e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 464e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 465e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 param[20]= {0}; 467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = param; 468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY); 470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); 471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr); 472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 473e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun st = BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC, 474e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_BLE_META_REMOVE_IRK_LEN, 475e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun param, 476e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_resolving_list_vsc_op_cmpl); 477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (st == BTM_CMD_STARTED) 480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_enq_resolving_list_pending( p_dev_rec->bd_addr, BTM_BLE_META_REMOVE_IRK_ENTRY); 481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return st; 483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_clear_resolving_list 488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function clears the resolving list 490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters None. 492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns status 494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 496444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_STATUS btm_ble_clear_resolving_list(void) 497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS st = BTM_NO_RESOURCES; 499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->supports_ble_privacy()) 501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btsnd_hcic_ble_clear_resolving_list()) 503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji st = BTM_SUCCESS; 504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 param[20] = {0}; 508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = param; 509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_CLEAR_IRK_LIST); 511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_BLE_META_CLEAR_IRK_LEN, 513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji param, 514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_vsc_op_cmpl); 515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return st; 518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 521444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 522444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_read_resolving_list_entry 523444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 524444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function read an IRK entry by index 525444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 526444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters entry index. 527444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 528444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns status 529444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 530444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 531444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_STATUS btm_ble_read_resolving_list_entry(tBTM_SEC_DEV_REC *p_dev_rec) 532444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 533444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS st = BTM_NO_RESOURCES; 534444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 535444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT)) 536444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_WRONG_MODE; 537444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 538444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->supports_ble_privacy()) 539444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 540444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btsnd_hcic_ble_read_resolvable_addr_peer(p_dev_rec->ble.static_addr_type, 541e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->ble.static_addr)) 542e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun st = BTM_CMD_STARTED; 543444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 544444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 545444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 546444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 param[20] = {0}; 547444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = param; 548444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 549444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_READ_IRK_ENTRY); 550444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_dev_rec->ble.resolving_list_index); 551444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 552444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 553444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_BLE_META_READ_IRK_LEN, 554444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji param, 555444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_vsc_op_cmpl); 556444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 557444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 558444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (st == BTM_CMD_STARTED) 559e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, 560e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_BLE_META_READ_IRK_ENTRY); 561444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 562444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return st; 563444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 564444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 565877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 566877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 567877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 568877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_suspend_resolving_list_activity 569877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 570877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description This function suspends all resolving list activity, including 571877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** scan, initiating, and advertising, if resolving list is being 572877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** enabled. 573877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 574877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Parameters 575877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 576877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns TRUE if suspended; FALSE otherwise 577877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 578877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 579877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN btm_ble_suspend_resolving_list_activity(void) 580877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 581877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb; 582877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 583877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if resolving list is not enabled, do not need to terminate any activity */ 584877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if asking for stop all activity */ 585877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if already suspended */ 586877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (p_ble_cb->suspended_rl_state != BTM_BLE_RL_IDLE) 587877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 588877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 589877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* direct connection active, wait until it completed */ 590877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (btm_ble_get_conn_st() == BLE_DIR_CONN) 591877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 592877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji BTM_TRACE_ERROR("resolving list can not be edited, EnQ now"); 593877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return FALSE; 594877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 595877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 596877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE; 597877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 598877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (p_ble_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE) 599877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 600877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_stop_adv(); 601877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p_ble_cb->suspended_rl_state |= BTM_BLE_RL_ADV; 602877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 603877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 604877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) 605877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 606877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_stop_scan(); 607877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p_ble_cb->suspended_rl_state |= BTM_BLE_RL_SCAN; 608877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 609877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 610877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (btm_ble_suspend_bg_conn()) 611877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p_ble_cb->suspended_rl_state |= BTM_BLE_RL_INIT; 612877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 613877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 614877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 615877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 616877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 617877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 618877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_resume_resolving_list_activity 619877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 620877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description This function resumes the resolving list activity, including 621877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** scanning, initiating, and advertising, if any of these 622877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** activities has been suspended earlier. 623877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 624877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns none 625877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 626877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 627877123f5b9df90e7a71ea7b15997c521229decc1Satya Callojivoid btm_ble_resume_resolving_list_activity(void) 628877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 629877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb; 630877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 631877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_ADV) 632877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_start_adv(); 633877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 634877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_SCAN) 635877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_start_scan(); 636877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 637877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (p_ble_cb->suspended_rl_state & BTM_BLE_RL_INIT) 638877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_resume_bg_conn(); 639877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 640877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p_ble_cb->suspended_rl_state = BTM_BLE_RL_IDLE; 641877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 642877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 643877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 644877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 645877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_vendor_enable_irk_feature 646877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 647877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description This function is called to enable or disable the RRA 648877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** offloading feature. 649877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 650877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Parameters enable: enable or disable the RRA offloading feature 651877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 652877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns BTM_SUCCESS if successful 653877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 654877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 655877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojitBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable) 656877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 657877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8 param[20], *p; 658877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji tBTM_STATUS st = BTM_MODE_UNSUPPORTED; 659877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 660877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji p = param; 661877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji memset(param, 0, 20); 662877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 663877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* select feature based on control block settings */ 664877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE); 665877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8_TO_STREAM(p, enable ? 0x01 : 0x00); 666877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 667877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN, 668877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji param, btm_ble_resolving_list_vsc_op_cmpl); 669877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 670877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return st; 671877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 672877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 673877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 674877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 675877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_exe_disable_resolving_list 676877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 677877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description execute resolving list disable 678877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 679877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns none 680877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 681877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 682877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN btm_ble_exe_disable_resolving_list(void) 683877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 684877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!btm_ble_suspend_resolving_list_activity()) 685877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return FALSE; 686877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 687877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!controller_get_interface()->supports_ble_privacy()) 688877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_vendor_enable_irk_feature(FALSE); 689877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji else 690877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btsnd_hcic_ble_set_addr_resolution_enable(FALSE); 691877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 692877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 693877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 694877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 695877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 696877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 697877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_exe_enable_resolving_list 698877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 699877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description enable LE resolve address list 700877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 701877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns none 702877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 703877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 704877123f5b9df90e7a71ea7b15997c521229decc1Satya Callojivoid btm_ble_exe_enable_resolving_list(void) 705877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 706877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!btm_ble_suspend_resolving_list_activity()) 707877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return; 708877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 709877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!controller_get_interface()->supports_ble_privacy()) 710877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_vendor_enable_irk_feature(TRUE); 711877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji else 712877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btsnd_hcic_ble_set_addr_resolution_enable(TRUE); 713877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 714877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 715877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 716877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 717877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function btm_ble_disable_resolving_list 718877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 719877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description Disable LE Address resolution 720877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 721877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns none 722877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 723877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 724877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN btm_ble_disable_resolving_list(UINT8 rl_mask, BOOLEAN to_resume ) 725877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 726877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8 rl_state = btm_cb.ble_ctr_cb.rl_state; 727877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 728877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if controller does not support RPA offloading or privacy 1.2, skip */ 729877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (controller_get_interface()->get_ble_resolving_list_max_size()== 0) 730877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return FALSE; 731877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 732877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.ble_ctr_cb.rl_state &= ~rl_mask; 733877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 734877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_state != BTM_BLE_RL_IDLE && btm_cb.ble_ctr_cb.rl_state == BTM_BLE_RL_IDLE) 735877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 736877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (btm_ble_exe_disable_resolving_list()) 737877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 738877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (to_resume) 739877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_resume_resolving_list_activity(); 740877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 741877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 742877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 743877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji else 744877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return FALSE; 745877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 746877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 747877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 748877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 749877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 750444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 751444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 752444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_load_dev 753444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 754444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function add a device which is using RPA into white list 755444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 756444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters pointer to device security record 757444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 758444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE if device added, otherwise falase. 759444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 760444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 761444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN btm_ble_resolving_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec) 762444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 763e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BOOLEAN rt = FALSE; 764877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8 rl_mask = btm_cb.ble_ctr_cb.rl_state; 765877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 766444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", __func__, 767e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_cb.ble_ctr_cb.privacy_mode); 768e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 769e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* if controller does not support RPA offloading or privacy 1.2, skip */ 770e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) 771e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return FALSE; 772444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 773e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", 774e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, btm_cb.ble_ctr_cb.privacy_mode); 775e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 776e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* only add RPA enabled device into resolving list */ 777444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL && /* RPA is being used and PID is known */ 7780baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji ((p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0 || 7790baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji (p_dev_rec->ble.key_type & BTM_LE_KEY_LID) != 0)) 780444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 781444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && 782444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, 783444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_BLE_META_ADD_IRK_ENTRY) == FALSE) 784444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 785e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (btm_cb.ble_ctr_cb.resolving_list_avail_size > 0) 786444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 787877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_mask) 788877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 789877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) 790877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return FALSE; 791877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 792877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 793e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_update_resolving_list(p_dev_rec->bd_addr, TRUE); 794444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->supports_ble_privacy()) 795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 796444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BD_ADDR dummy_bda = {0}; 7970baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji UINT8 *peer_irk = p_dev_rec->ble.keys.irk; 7980baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji UINT8 *local_irk = btm_cb.devcb.id_keys.irk; 7990baef63c70dba86c4cdb2744a2ab6c3f713ba353Satya Calloji 800444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (memcmp(p_dev_rec->ble.static_addr, dummy_bda, BD_ADDR_LEN) == 0) 801444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.static_addr_type = p_dev_rec->ble.ble_addr_type; 804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 805444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 806e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG("%s:adding device to controller resolving list", __func__); 807e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // use identical IRK for now 808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rt = btsnd_hcic_ble_add_device_resolving_list(p_dev_rec->ble.static_addr_type, 809e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->ble.static_addr, peer_irk, local_irk); 810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 811e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 812e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 param[40] = {0}; 814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = param; 815444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY); 817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN); 818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); 819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BDADDR_TO_STREAM(p,p_dev_rec->ble.static_addr); 820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 822e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_BLE_META_ADD_IRK_LEN, 823e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun param, 824e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_resolving_list_vsc_op_cmpl) 825e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun == BTM_CMD_STARTED) 826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rt = TRUE; 827e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 829444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (rt) 830e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, 831e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_BLE_META_ADD_IRK_ENTRY); 832877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 833877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if resolving list has been turned on, re-enable it */ 834877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_mask) 835877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_enable_resolving_list(rl_mask); 836483847a3d46e5a1f3c15c69b8344fb1f20b9972fSatya Calloji else 837483847a3d46e5a1f3c15c69b8344fb1f20b9972fSatya Calloji btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); 838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR("Device already in Resolving list"); 843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rt = TRUE; 844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("Device not a RPA enabled device"); 849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return rt; 851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_remove_dev 856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function removes the device from resolving list 858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters 860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns status 862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_resolving_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec) 865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 866877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8 rl_mask = btm_cb.ble_ctr_cb.rl_state; 867877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 868877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji BTM_TRACE_EVENT ("%s", __func__); 869877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_mask) 870877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji { 871877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (!btm_ble_disable_resolving_list (rl_mask, FALSE)) 872877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return; 873877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji } 874444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && 876444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, 877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_BLE_META_REMOVE_IRK_ENTRY) == FALSE) 878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 879e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_update_resolving_list( p_dev_rec->bd_addr, FALSE); 880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_remove_resolving_list_entry(p_dev_rec); 881e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 882e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 883e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("Device not in resolving list"); 885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 887877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji /* if resolving list has been turned on, re-enable it */ 888877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_mask) 889877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_enable_resolving_list(rl_mask); 890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 893444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_enable_resolving_list 895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description enable LE resolve address list 897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns none 899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 901877123f5b9df90e7a71ea7b15997c521229decc1Satya Callojivoid btm_ble_enable_resolving_list(UINT8 rl_mask) 902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 903877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji UINT8 rl_state = btm_cb.ble_ctr_cb.rl_state; 904877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 905877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.ble_ctr_cb.rl_state |= rl_mask; 906877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji if (rl_state == BTM_BLE_RL_IDLE && 907877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE && 908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller_get_interface()->get_ble_resolving_list_max_size() != 0) 909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 910877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_exe_enable_resolving_list(); 911877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_resume_resolving_list_activity(); 912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_empty 918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description check to see if resoving list is empty or not 920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 921444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE: empty; FALSE non-empty 922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 924444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN btm_ble_resolving_list_empty(void) 925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (controller_get_interface()->get_ble_resolving_list_max_size() == 927e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_cb.ble_ctr_cb.resolving_list_avail_size); 928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 930cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 931cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_on_resolving_list(void *data, void *context) 932cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 933cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev = data; 934cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if ((p_dev->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && 935cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski (p_dev->ble.in_controller_list & BTM_WHITE_LIST_BIT)) 936cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 937cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 938cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 939cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 940cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 941cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_enable_resolving_list_for_platform 945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description enable/disable resolving list feature depending on if any 947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** resolving list is empty and whitelist is involoved in the 948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** operation. 949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns none 951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 953877123f5b9df90e7a71ea7b15997c521229decc1Satya Callojivoid btm_ble_enable_resolving_list_for_platform (UINT8 rl_mask) 954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* if controller does not support, skip */ 956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) 957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.ble_ctr_cb.wl_state == BTM_BLE_WL_IDLE) 960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (controller_get_interface()->get_ble_resolving_list_max_size() > 962877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.ble_ctr_cb.resolving_list_avail_size) 963877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_enable_resolving_list(rl_mask); 964444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 965877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_ble_disable_resolving_list(rl_mask, TRUE); 966444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 967444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 969cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_on_resolving_list, NULL); 970cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (n) 971cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski btm_ble_enable_resolving_list(rl_mask); 972cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski else 973cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski btm_ble_disable_resolving_list(rl_mask, TRUE); 974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_init 979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description Initialize resolving list in host stack 981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters Max resolving list size 983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_resolving_list_init(UINT8 max_irk_list_sz) 988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 989e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; 990e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun UINT8 irk_mask_size = (max_irk_list_sz % 8) ? 991e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (max_irk_list_sz/8 + 1) : (max_irk_list_sz/8); 992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (max_irk_list_sz > 0) 994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 995abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_q->resolve_q_random_pseudo = (BD_ADDR *)osi_malloc(sizeof(BD_ADDR) * max_irk_list_sz); 996abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_q->resolve_q_action = (UINT8 *)osi_malloc(max_irk_list_sz); 997e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 998e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* RPA offloading feature */ 999e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (btm_cb.ble_ctr_cb.irk_list_mask == NULL) 1000abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov btm_cb.ble_ctr_cb.irk_list_mask = (UINT8 *)osi_malloc(irk_mask_size); 1001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s max_irk_list_sz = %d", __func__, max_irk_list_sz); 1003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller_get_interface()->set_ble_resolving_list_max_size(max_irk_list_sz); 1006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_clear_resolving_list(); 1007877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.ble_ctr_cb.resolving_list_avail_size = max_irk_list_sz; 1008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_ble_resolving_list_cleanup 1013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description Cleanup resolving list dynamic memory 1015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Parameters 1017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_ble_resolving_list_cleanup(void) 1022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1023e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBTM_BLE_RESOLVE_Q *p_q = &btm_cb.ble_ctr_cb.resolving_list_pend_q; 1024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1025abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_q->resolve_q_random_pseudo); 1026abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_q->resolve_q_action); 1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji controller_get_interface()->set_ble_resolving_list_max_size(0); 1029e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 1030abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&btm_cb.ble_ctr_cb.irk_list_mask); 1031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1033