1b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/****************************************************************************** 2b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * 3b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * Copyright (C) 2003-2014 Broadcom Corporation 4b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * 5b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 6b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * you may not use this file except in compliance with the License. 7b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * You may obtain a copy of the License at: 8b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * 9b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 10b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * 11b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 12b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 13b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * See the License for the specific language governing permissions and 15b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * limitations under the License. 16b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach * 17b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach ******************************************************************************/ 18b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 19b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/***************************************************************************** 20b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** 21b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Name: vendor_ble.c 22b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** 23b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description: This file contains vendor specific feature for BLE 24b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** 25b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach******************************************************************************/ 26b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include <string.h> 27b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "bt_target.h" 28b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 2916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if (BLE_INCLUDED == TRUE) 30b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "bt_types.h" 31b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "hcimsgs.h" 32b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "btu.h" 33b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "vendor_ble.h" 34b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "vendor_hcidefs.h" 35b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "gatt_int.h" 36b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 37b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*** This needs to be moved to a VSC control block eventually per coding conventions ***/ 38b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#if VENDOR_DYNAMIC_MEMORY == FALSE 39b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_BLE_VENDOR_CB btm_ble_vendor_cb; 40b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#endif 41b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 42b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachstatic const BD_ADDR na_bda= {0}; 43b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 44ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 45ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Resolve Address Using IRK List functions 46ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 47ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 48ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 49ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 50ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 51ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_enq_irk_pending 52ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 53ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description add target address into IRK pending operation queue 54ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 55ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters target_bda: target device address 56ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** add_entry: TRUE for add entry, FALSE for remove entry 57ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 58ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns void 59ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 60ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 61ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add) 62ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 6316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 64ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q; 65ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 66ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN); 67ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(p_q->irk_q_random_pseudo[p_q->q_next], psuedo_bda, BD_ADDR_LEN); 68ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_q->irk_q_action[p_q->q_next] = to_add; 69ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 70ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_q->q_next ++; 71d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; 7216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 73ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return ; 74ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 75ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 76ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 77ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_find_irk_pending_entry 78ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 79ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description check to see if the action is in pending list 80ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 81ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters TRUE: action pending; 82ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** FALSE: new action 83ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 84ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns void 85ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 86ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 87ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangBOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action) 88ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 8916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 90ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q; 91ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 92ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 93ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang for (i = p_q->q_pending; i != p_q->q_next; ) 94ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 95ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (memcmp(p_q->irk_q_random_pseudo[i], psuedo_addr, BD_ADDR_LEN) == 0 && 96ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang action == p_q->irk_q_action[i]) 97ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return TRUE; 98ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 99ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang i ++; 10016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; 101ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 10216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 103ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return FALSE; 104ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 105ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 106ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 107ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_deq_irk_pending 108ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 109ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description add target address into IRK pending operation queue 110ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 111ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters target_bda: target device address 112ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** add_entry: TRUE for add entry, FALSE for remove entry 113ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 114ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns void 115ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 116ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 117ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangBOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr) 118ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 11916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 120ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_Q *p_q = &btm_ble_vendor_cb.irk_pend_q; 121ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 122ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_q->q_next != p_q->q_pending) 123ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 124ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(target_bda, p_q->irk_q[p_q->q_pending], BD_ADDR_LEN); 125ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN); 126ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 127ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_q->q_pending ++; 12816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; 129ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 130ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return TRUE; 131ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 13216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 133ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return FALSE; 134ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 135ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 136ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 137ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 138ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_find_irk_entry 139ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 140ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description find IRK entry in local host IRK list by static address 141ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 142ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns IRK list entry pointer 143ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 144ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 145ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangtBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda) 146ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 14716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 148ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0]; 149ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 150ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 15116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++) 152ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 153ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0) 154ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 155ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return p_irk_entry ; 156ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 157ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 15816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 159ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return NULL; 160ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 161ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 162ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 163ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_find_irk_entry_by_psuedo_addr 164ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 165ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description find IRK entry in local host IRK list by psuedo address 166ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 167ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns IRK list entry pointer 168ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 169ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 170ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangtBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda) 171ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 17216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 173ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0]; 174ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 175ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 1761cd92393c162afe68b01aafcf7a1d41ab1d21e7bPriti Aghera if(p_irk_entry == NULL) 1771cd92393c162afe68b01aafcf7a1d41ab1d21e7bPriti Aghera return NULL; 1781cd92393c162afe68b01aafcf7a1d41ab1d21e7bPriti Aghera 17916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++) 180ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 181ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0) 182ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 183ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return p_irk_entry ; 184ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 185ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 18616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 187ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return NULL; 188ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 189ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 190ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 191ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_alloc_irk_entry 192ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 193ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description allocate IRK entry in local host IRK list 194ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 195ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns IRK list index 196ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 197ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 198ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangUINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda) 199ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 20016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 201ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry = &btm_ble_vendor_cb.irk_list[0]; 202ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 203ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 20416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++) 205ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 206ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (!p_irk_entry->in_use) 207ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 208ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN); 209ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memcpy(p_irk_entry->psuedo_bda, pseudo_bda, BD_ADDR_LEN); 210ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 211ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_irk_entry->index = i; 212ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_irk_entry->in_use = TRUE; 213ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 214ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return i; 215ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 216ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 21716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 218ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return BTM_CS_IRK_LIST_INVALID; 219ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 220ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 221ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 222ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 223ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_update_irk_list 224ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 225ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description update IRK entry in local host IRK list 226ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 227ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns void 228ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 229ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 230ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add) 231ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 23216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 233ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda); 234ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 235ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 236ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (add) 237ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 238ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_irk_entry == NULL) 239ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 240ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if ((i = btm_ble_vendor_alloc_irk_entry(target_bda, pseudo_bda)) == BTM_CS_IRK_LIST_INVALID) 241ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 2425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("max IRK capacity reached"); 243ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 244ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 245ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 246ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 2475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING(" IRK already in queue"); 248ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 249ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 250ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 251ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 252ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_irk_entry != NULL) 253ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 254ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(p_irk_entry, 0, sizeof(tBTM_BLE_IRK_ENTRY)); 255ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 256ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 257ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 2585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("No IRK exist in list, can not remove"); 259ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 260ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 26116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 262ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return ; 263ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 264ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 265ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 266ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_irk_vsc_op_cmpl 267ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 268ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description IRK operation VSC complete handler 269ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 270ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters 271ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 272ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns void 273ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 274ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 275ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params) 276ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 277ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 status; 278ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 *p = p_params->p_param_buf, op_subcode; 279ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT16 evt_len = p_params->param_len; 280ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 281ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb; 282ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BD_ADDR target_bda, pseudo_bda, rra; 283ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 284ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 285ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_UINT8(status, p); 286ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 287ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang evt_len--; 288ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 28966988a022d219f5385b3f76e3ae26566ad80fb86Nitin Arora op_subcode = *p ++; 2905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode); 29116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (evt_len < 1) 292ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 29316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback"); 294ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return; 295ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 296ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 29716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (BTM_BLE_META_IRK_ENABLE == op_subcode) 29816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham { 29916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode); 30016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return; 30116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham } 30216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham else 303ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST) 304ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 305ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (status == HCI_SUCCESS) 306ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 307ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_UINT8(p_cb->irk_avail_size, p); 308ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_list_size = 0; 309ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 3105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size); 311ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 31216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++) 313ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY)); 314ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 315ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 316ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else if (op_subcode == BTM_BLE_META_ADD_IRK_ENTRY) 317ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 318ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda)) 319ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 3205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("no pending IRK operation"); 321ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return; 322ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 323ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 324ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (status == HCI_SUCCESS) 325ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 326ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_UINT8(p_cb->irk_avail_size, p); 327ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, TRUE); 328ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 329ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else if (status == 0x07) /* BT_ERROR_CODE_MEMORY_CAPACITY_EXCEEDED */ 330ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 331ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_avail_size = 0; 3325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("IRK Full "); 333ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 334ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 335ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 336ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang /* give the credit back if invalid parameter failed the operation */ 337ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_list_size ++; 338ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 339ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 340ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else if (op_subcode == BTM_BLE_META_REMOVE_IRK_ENTRY) 341ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 342ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (!btm_ble_vendor_deq_irk_pending(target_bda, pseudo_bda)) 343ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 3445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("no pending IRK operation"); 345ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return; 346ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 347ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (status == HCI_SUCCESS) 348ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 349ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_UINT8(p_cb->irk_avail_size, p); 350ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_update_irk_list(target_bda, pseudo_bda, FALSE); 351ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 352ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 353ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 354ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang /* give the credit back if invalid parameter failed the operation */ 355ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_cb->irk_avail_size > 0) 356ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_list_size --; 357ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 358ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 359ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 360ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else if (op_subcode == BTM_BLE_META_READ_IRK_ENTRY) 361ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 362ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (status == HCI_SUCCESS) 363ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 364ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang //STREAM_TO_UINT8(index, p); 365ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p += (1 + 16 + 1); /* skip index, IRK value, address type */ 366ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_BDADDR(target_bda, p); 367ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang STREAM_TO_BDADDR(rra, p); 368ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_refresh_rra(target_bda, rra); 369ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 370ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 371ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 372ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 373ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 374ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 375ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_remove_irk_entry 376ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 377ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function to remove an IRK entry from the list 378ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 379ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters ble_addr_type: address type 380ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** ble_addr: LE adddress 381ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 382ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 383ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 384ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 385ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangtBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec) 386ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 38716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 388ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 param[20], *p; 389ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_STATUS st; 390ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb; 391ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 392d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 393d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return BTM_MODE_UNSUPPORTED; 394d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 395ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p = param; 396ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(param, 0, 20); 397ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 398ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, BTM_BLE_META_REMOVE_IRK_ENTRY); 399ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); 400ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr); 401ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 402ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 403ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BTM_BLE_META_REMOVE_IRK_LEN, 404ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang param, 405ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_irk_vsc_op_cmpl)) 406ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang != BTM_NO_RESOURCES) 407ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 408ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, FALSE); 409ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_list_size --; 410ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 411ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 412ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return st; 41316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 41416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return BTM_MODE_UNSUPPORTED; 415ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 416ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 417ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 418ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_clear_irk_list 419ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 420ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function clears the IRK entry list 421ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 422ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters None. 423ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 424ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 425ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 426ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 427ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangtBTM_STATUS btm_ble_vendor_clear_irk_list(void) 428ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 42916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 430ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 param[20], *p; 431ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_STATUS st; 432ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 433d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 434d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return BTM_MODE_UNSUPPORTED; 435d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 436ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p = param; 437ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(param, 0, 20); 438ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 439ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, BTM_BLE_META_CLEAR_IRK_LIST); 440ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 441ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 442ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BTM_BLE_META_CLEAR_IRK_LEN, 443ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang param, 444ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_irk_vsc_op_cmpl); 445ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 446ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return st; 44716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 44816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return BTM_MODE_UNSUPPORTED; 449ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 450ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 451ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 452ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_read_irk_entry 453ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 454ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function read an IRK entry by index 455ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 456ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters entry index. 457ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 458ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 459ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 460ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 461ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangtBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda) 462ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 46316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 464ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 param[20], *p; 465ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_STATUS st = BTM_UNKNOWN_ADDR; 466d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji tBTM_BLE_IRK_ENTRY *p_entry; 467ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 468d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 469d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return BTM_MODE_UNSUPPORTED; 470d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 471d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if ((p_entry = btm_ble_vendor_find_irk_entry(target_bda)) == NULL) 472ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return st; 473ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 474ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p = param; 475ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(param, 0, 20); 476ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 477ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, BTM_BLE_META_READ_IRK_ENTRY); 478ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, p_entry->index); 479ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 480ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 481ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BTM_BLE_META_READ_IRK_LEN, 482ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang param, 483ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_irk_vsc_op_cmpl); 484ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 485ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return st; 48616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 48716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return BTM_MODE_UNSUPPORTED; 488ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 489ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 490ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 491ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 492ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 493ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_enable_irk_list_known_dev 494ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 495ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function add all known device with random address into 496ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** IRK list. 497ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 498ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters enable: enable IRK list with known device, or disable it 499ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 500ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 501ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 502ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 503ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_irk_list_known_dev(BOOLEAN enable) 504ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 50516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 506ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 i; 507ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 count = 0; 508ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 509ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 510d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 511d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return; 512d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 513ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang /* add all known device with random address into IRK list */ 514ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++) 515ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 516ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_dev_rec->sec_flags & BTM_SEC_IN_USE) 517ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 518ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (btm_ble_vendor_irk_list_load_dev(p_dev_rec)) 519ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang count ++; 520ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 521ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 522ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 523ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if ((count > 0 && enable) || !enable) 52416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_enable_irk_feature(enable); 52516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 526ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return ; 527ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 528ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 529ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 530ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_irk_list_load_dev 531ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 532ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function add a device which is using RPA into white list 533ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 534ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters 535ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 536ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 537ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 538ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 539ed534e330bf63c72e778fc8daae09ddd63c395b2Wei WangBOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec) 540ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 54116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 542ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 param[40], *p; 543ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb; 544ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BOOLEAN rt = FALSE; 545ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry = NULL; 5465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_ble_vendor_irk_list_load_dev:max_irk_size=%d", p_cb->irk_avail_size); 547ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang memset(param, 0, 40); 548ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 549d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 550d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return FALSE; 551d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 552ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_dev_rec != NULL && /* RPA is being used and PID is known */ 553ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang (p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0) 554ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 555ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 556ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) == NULL && 557ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, TRUE) == FALSE) 558ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 559ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 560ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_cb->irk_avail_size > 0) 561ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 562ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p = param; 563ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 564ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY); 565ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN); 566ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); 567ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BDADDR_TO_STREAM(p,p_dev_rec->ble.static_addr); 568ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 569ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, 570ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang BTM_BLE_META_ADD_IRK_LEN, 571ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang param, 572ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_irk_vsc_op_cmpl) 573ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang != BTM_NO_RESOURCES) 574ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 575ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, TRUE); 576ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang p_cb->irk_list_size ++; 577ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang rt = TRUE; 578d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 579d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji btm_ble_vendor_enable_irk_feature(TRUE); 580ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 581ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 582ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 583ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 584ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 5855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("Device already in IRK list"); 586ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang rt = TRUE; 587ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 588ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 589ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 590ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 5915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("Device not a RPA enabled device"); 592ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 593ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return rt; 59416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 59516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return FALSE; 596ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 597ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 598ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 599ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_irk_list_remove_dev 600ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 601ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function remove the device from IRK list 602ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 603ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters 604ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 605ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 606ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 607ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 608ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec) 609ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 61016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 611ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_VENDOR_CB *p_cs_cb = &btm_ble_vendor_cb; 612ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_IRK_ENTRY *p_irk_entry; 613ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 614d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 615d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return; 616d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 617ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) != NULL && 618ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, FALSE) == FALSE) 619ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 620ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang btm_ble_remove_irk_entry(p_dev_rec); 621ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 622ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang else 623ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang { 6245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR("Device not in IRK list"); 625ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang } 626ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 627ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang if (p_cs_cb->irk_list_size == 0) 62816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_enable_irk_feature(FALSE); 62916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 630ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 631ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 632ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 633ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Function btm_ble_vendor_disable_irk_list 634ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 635ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description disable LE resolve address feature 636ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 637ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters 638ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 639ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns status 640ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 641ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 642ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wangvoid btm_ble_vendor_disable_irk_list(void) 643ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 64416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 64516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_enable_irk_feature(FALSE); 64616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 647ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 648ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 649ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang/******************************************************************************* 650ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 65116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function btm_ble_vendor_enable_irk_feature 652ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 653ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Description This function is called to enable or disable the RRA 654ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** offloading feature. 655ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 656ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Parameters enable: enable or disable the RRA offloading feature 657ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 658ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** Returns BTM_SUCCESS if successful 659ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang** 660ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang*******************************************************************************/ 66116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa ViswanadhamtBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable) 662ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang{ 66316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 664ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang UINT8 param[20], *p; 665ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_STATUS st = BTM_WRONG_MODE; 666ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang tBTM_BLE_PF_COUNT *p_bda_filter; 667ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 668d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0) 669d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji return BTM_MODE_UNSUPPORTED; 670ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 671d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_ble_vendor_cb.enable != enable) 672d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji { 673d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji p = param; 674d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji memset(param, 0, 20); 675ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 676d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji /* select feature based on control block settings */ 677d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE); 678d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji UINT8_TO_STREAM(p, enable ? 0x01 : 0x00); 679d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 680d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN, 681d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji param, btm_ble_vendor_irk_vsc_op_cmpl); 682d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji 683d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji btm_ble_vendor_cb.enable = enable; 684d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji } 685ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 686ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang return st; 68716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 68816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return BTM_MODE_UNSUPPORTED; 689ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang} 690ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang 69116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 69216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/******************************************************************************* 69316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 69416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function btm_ble_vendor_init 69516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 69616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Description Initialize customer specific feature information in host stack 69716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 69816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Parameters Max IRK list size 69916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Max filter supported 70016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 70116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Returns void 70216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 70316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham*******************************************************************************/ 70416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadhamvoid btm_ble_vendor_init(UINT8 max_irk_list_sz) 70516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham{ 70616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB)); 70716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 70816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 70916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (max_irk_list_sz > 0) 71016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham { 71116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_cb.irk_list = (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY) 71216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham * max_irk_list_sz); 71316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_cb.irk_pend_q.irk_q = (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) * 71416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham max_irk_list_sz); 71516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) * 71616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham max_irk_list_sz); 71716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz); 71816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham } 71916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 72016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz; 72116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 72216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1])) 72316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham return; 72416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif 72516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham} 72616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 72716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/******************************************************************************* 72816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 72916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function btm_ble_vendor_cleanup 73016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 73116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Description Cleanup VSC specific dynamic memory 73216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 73316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Parameters 73416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 73516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Returns void 73616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** 73716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham*******************************************************************************/ 73816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadhamvoid btm_ble_vendor_cleanup(void) 73916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham{ 74016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_PRIVACY_SPT == TRUE 74116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (btm_ble_vendor_cb.irk_list) 74216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham GKI_freebuf(btm_ble_vendor_cb.irk_list); 74316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 74416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (btm_ble_vendor_cb.irk_pend_q.irk_q) 74516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q); 74616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 74716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo) 74816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo); 74916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 75016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham if (btm_ble_vendor_cb.irk_pend_q.irk_q_action) 75116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action); 752b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#endif 75316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB)); 75416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham} 75516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 756b9447036ff1bc11de4a0f38c1e6337f532e6e622Prerepa Viswanadham#endif 757b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 758