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