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