vendor_ble.c revision b203d478f4835f5e35217874a1787e1914328f7c
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
29b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == 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#define BTM_BLE_INVALID_COUNTER     0xff
38b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
39b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
40b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachstatic UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
41b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  UINT8 cond_type,
42b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  tBLE_BD_ADDR   *p_bd_addr,
43b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  UINT8           num_available);
44b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
45b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#define BTM_BLE_SET_SCAN_PF_OPCODE(x, y) (((x)<<4)|y)
46b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#define BTM_BLE_GET_SCAN_PF_SUBCODE(x)    ((x) >> 4)
47b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#define BTM_BLE_GET_SCAN_PF_ACTION(x)    ((x) & 0x0f)
48b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
49b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/* max number of filter available for different filter type, controller dependent number */
50b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachconst static UINT8 btm_ble_cs_filter_max[BTM_BLE_PF_TYPE_MAX] =
51b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
52b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_MAX_ADDR_FILTER,        /* address filter */
53b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    1,                              /* no limit for service data change, always enable or disable */
54b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_MAX_UUID_FILTER,        /* service UUID filter */
55b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_MAX_UUID_FILTER,        /* solicitated UUID filter */
56b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_STR_COND_MAX,        /* local name filter */
57b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_STR_COND_MAX         /* manufacturer data filter */
58b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach};
59b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
60b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*** This needs to be moved to a VSC control block eventually per coding conventions ***/
61b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#if VENDOR_DYNAMIC_MEMORY == FALSE
62b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_BLE_VENDOR_CB  btm_ble_vendor_cb;
63b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#endif
64b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
65b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachstatic const UINT8 op_code_to_cond_type[] =
66b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
67b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_TYPE_ALL,
68b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_ADDR_FILTER,
69b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_SRVC_UUID,
70b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_SRVC_SOL_UUID,
71b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_LOCAL_NAME,
72b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_MANU_DATA,
73b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BTM_BLE_PF_SRVC_DATA_PATTERN
74b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach};
75b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
76b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachstatic const BD_ADDR     na_bda= {0};
77b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
78b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
79b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
80b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_vendor_scan_pf_cmpl_cback
81b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
82b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      the BTM BLE customer feature VSC complete callback for ADV PF
83b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  filtering
84b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
85b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          pointer to the counter if found; NULL otherwise.
86b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
87b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
88b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachvoid btm_ble_vendor_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
89b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
90b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8  status;
91b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8  *p = p_params->p_param_buf, op_subcode, action = 0xff;
92b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT16  evt_len = p_params->param_len;
93b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8   num_avail = 0, cond_type = BTM_BLE_PF_TYPE_MAX;
94b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_CMPL_CBACK  *p_cmpl_cback =   btm_ble_vendor_cb.p_scan_pf_cback;
95b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8   op = BTM_BLE_GET_SCAN_PF_ACTION(btm_ble_vendor_cb.op_type);
96b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8   subcode = BTM_BLE_GET_SCAN_PF_SUBCODE(btm_ble_vendor_cb.op_type);
97b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
98b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    STREAM_TO_UINT8(status, p);
99b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
100b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    evt_len--;
101b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
102b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (evt_len < 1 )
103b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
104b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR1("can not interpret ADV PF filter setting callback. status = %d", status);
105b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return;
106b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
107b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    op_subcode   = *p ++;
108b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
109b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        switch (op_subcode)
110b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
111b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_LOCAL_NAME:
112b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_MANU_DATA:
113b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_ADDR:
114b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_UUID:
115b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_SOL_UUID:
116b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_FEAT_SEL:
117b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_SRVC_DATA:
118b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            cond_type = op_code_to_cond_type[op_subcode - BTM_BLE_META_PF_FEAT_SEL];
119b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (status == HCI_SUCCESS)
120b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
121b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                action       = *p ++;
122b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                if (op_subcode != BTM_BLE_META_PF_FEAT_SEL)
123b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                {
124b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                STREAM_TO_UINT8(num_avail, p);
125b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                }
126b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
127b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                if (memcmp(&btm_ble_vendor_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0)
128b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                    btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
129b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                else
130b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                    btm_ble_cs_update_pf_counter(action, cond_type, &btm_ble_vendor_cb.cur_filter_target, num_avail);
131b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
132b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            break;
133b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
134b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        case BTM_BLE_META_PF_ENABLE:
135b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            cond_type = BTM_BLE_META_PF_ENABLE;
136b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BTM_TRACE_DEBUG0("CS feature Enabled");
137b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            break;
138b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
139b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        default:
140b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BTM_TRACE_ERROR1("unknow operation: %d", op_subcode);
141b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            break;
142b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
143b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
144b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* send ADV PF opeartion complete */
145b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_cmpl_cback && subcode == cond_type)
146b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
147b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.p_scan_pf_cback = NULL;
148b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.op_type = 0;
149b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        (* p_cmpl_cback)(op, subcode, status);
150b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
151b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
152b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
153b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**         adv payload filtering functions
154b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
155b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
156b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
157b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_find_addr_filter_counter
158b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
159b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      find the per bd address ADV payload filter counter by BD_ADDR.
160b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
161b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          pointer to the counter if found; NULL otherwise.
162b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
163b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
164b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_BLE_PF_COUNT   * btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
165b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
166b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8               i;
167b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_vendor_cb.addr_filter_count[1];
168b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
169b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_le_bda == NULL)
170b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return &btm_ble_vendor_cb.addr_filter_count[0];
171b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
172b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    for (i = 0; i < BTM_BLE_MAX_FILTER_COUNTER; i ++, p_addr_filter ++)
173b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
174b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_addr_filter->in_use &&
175b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
176b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
177b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return p_addr_filter;
178b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
179b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
180b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return NULL;
181b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
182b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
183b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
184b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
185b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_alloc_addr_filter_counter
186b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
187b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      allocate the per device adv payload filter counter.
188b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
189b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          pointer to the counter if allocation succeed; NULL otherwise.
190b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
191b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
192b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
193b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
194b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8               i;
195b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_vendor_cb.addr_filter_count[1];
196b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
197b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    for (i = 0; i < BTM_BLE_MAX_FILTER_COUNTER; i ++, p_addr_filter ++)
198b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
199b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
200b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
201b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memcpy(p_addr_filter->bd_addr, bd_addr, BD_ADDR_LEN);
202b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            p_addr_filter->in_use = TRUE;
203b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return p_addr_filter;
204b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
205b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
206b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return NULL;
207b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
208b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
209b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
210b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_dealloc_addr_filter_counter
211b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
212b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      de-allocate the per device adv payload filter counter.
213b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
214b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          TRUE if deallocation succeed; FALSE otherwise.
215b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
216b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
217b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachBOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
218b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
219b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8               i;
220b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_vendor_cb.addr_filter_count[1];
221b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    BOOLEAN             found = FALSE;
222b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
223b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (filter_type == BTM_BLE_PF_TYPE_ALL && p_bd_addr == NULL)
224b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        memset(&btm_ble_vendor_cb.addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
225b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
226b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    for (i = 0; i < BTM_BLE_MAX_FILTER_COUNTER; i ++, p_addr_filter ++)
227b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
228b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if ((p_addr_filter->in_use) &&
229b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            (p_bd_addr == NULL ||
230b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach             (p_bd_addr != NULL && memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)))
231b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
232b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            found = TRUE;
233b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memset(p_addr_filter, 0, sizeof(tBTM_BLE_PF_COUNT));
234b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
235b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_bd_addr != NULL) break;
236b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
237b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
238b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return found;
239b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
240b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
241b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
242b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_cs_update_pf_counter
243b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
244b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function is to update the adv data payload filter counter
245b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
246b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          current number of the counter; BTM_BLE_INVALID_COUNTER if
247b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  counter update failed.
248b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
249b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
250b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachUINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
251b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  UINT8 cond_type,
252b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  tBLE_BD_ADDR   *p_bd_addr,
253b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  UINT8           num_available)
254b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
255b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT   *p_addr_filter = NULL;
256b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8               *p_counter = NULL;
257b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT32              *p_feat_mask = NULL;
258b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
259b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
260b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (cond_type > BTM_BLE_PF_TYPE_ALL)
261b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
262b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR1("unknown PF filter condition type %d", cond_type);
263b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return BTM_BLE_INVALID_COUNTER;
264b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
265b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* for these three types of filter, always generic */
266b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (cond_type == BTM_BLE_PF_ADDR_FILTER ||
267b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        cond_type == BTM_BLE_PF_MANU_DATA ||
268b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        cond_type == BTM_BLE_PF_LOCAL_NAME ||
269b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        cond_type == BTM_BLE_PF_SRVC_DATA_PATTERN)
270b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_bd_addr = NULL;
271b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
272b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((p_addr_filter = btm_ble_find_addr_filter_counter(p_bd_addr)) == NULL &&
273b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        action == BTM_BLE_SCAN_COND_ADD)
274b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
275b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_addr_filter = btm_ble_alloc_addr_filter_counter(p_bd_addr->bda);
276b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
277b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
278b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_addr_filter != NULL)
279b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
280b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* all filter just cleared */
281b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if ((cond_type == BTM_BLE_PF_TYPE_ALL && action == BTM_BLE_SCAN_COND_CLEAR) ||
282b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            /* or bd address filter been deleted */
283b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            (cond_type == BTM_BLE_PF_ADDR_FILTER &&
284b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach             (action == BTM_BLE_SCAN_COND_DELETE || action == BTM_BLE_SCAN_COND_CLEAR)))
285b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
286b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            btm_ble_dealloc_addr_filter_counter(p_bd_addr, cond_type);
287b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
288b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* if not feature selection, update new addition/reduction of the filter counter */
289b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else if (cond_type != BTM_BLE_PF_TYPE_ALL)
290b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
291b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_counter = p_addr_filter->pf_counter;
292b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_feat_mask = &p_addr_filter->feat_mask;
293b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
294b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_counter[cond_type] = btm_ble_cs_filter_max[cond_type] - num_available;
295b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
296b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_DEBUG1("current filter counter number = %d", p_counter[cond_type]);
297b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
298b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* update corresponding feature mask */
299b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_counter[cond_type] > 0)
300b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            *p_feat_mask |= (BTM_BLE_PF_BIT_TO_MASK(cond_type));
301b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
302b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            *p_feat_mask &= ~(BTM_BLE_PF_BIT_TO_MASK(cond_type));
303b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
304b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return p_counter[cond_type];
305b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
306b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
307b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
308b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
309b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("no matching filter counter found");
310b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
311b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* no matching filter located and updated */
312b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return BTM_BLE_INVALID_COUNTER;
313b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
314b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
315b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
316b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_update_pf_manu_data
317b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
318b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function update(add,delete or clear) the adv manufacturer
319b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  data filtering condition.
320b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
321b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
322b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
323b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
324b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
325b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
326b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
327b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                        tBTM_BLE_PF_COND_PARAM *p_data,
328b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                        tBTM_BLE_PF_COND_TYPE cond_type)
329b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
330b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_MANU_COND *p_manu_data = (p_data == NULL) ? NULL : &p_data->manu_data;
331b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_SRVC_PATTERN_COND *p_srvc_data = (p_data == NULL) ? NULL : &p_data->srvc_data;
332b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8       param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_META_HDR_LENGTH],
333b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                *p = param,
334b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len = BTM_BLE_META_HDR_LENGTH;
335b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
336b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
337b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_META_HDR_LENGTH);
338b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
339b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (cond_type == BTM_BLE_PF_SRVC_DATA_PATTERN)
340b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
341b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA);
342b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
343b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
344b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
345b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_MANU_DATA);
346b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
347b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, action);
348b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
349b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action == BTM_BLE_SCAN_COND_ADD ||
350b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        action == BTM_BLE_SCAN_COND_DELETE)
351b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
352b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_manu_data == NULL)
353b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
354b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (cond_type == BTM_BLE_PF_SRVC_DATA_PATTERN)
355b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
356b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
357b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
358b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
359b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT16_TO_STREAM(p, p_srvc_data->uuid);
360b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
361b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += (p_srvc_data->data_len + 2);
362b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
363b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
364b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
365b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
366b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
367b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
368b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT16_TO_STREAM(p, p_manu_data->company_id);
369b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
370b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += (p_manu_data->data_len + 2);
371b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
372b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_manu_data->company_id_mask != 0)
373b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
374b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                UINT16_TO_STREAM (p, p_manu_data->company_id_mask);
375b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
376b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            else
377b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
378b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                memset(p, 0xff, 2);
379b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                p += 2;
380b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
381b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_manu_data->p_pattern_mask != NULL)
382b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
383b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
384b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
385b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            else
386b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                memset(p, 0xff, p_manu_data->data_len);
387b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += (p_manu_data->data_len + 2);
388b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
389b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
390b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
391b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* send manufacturer*/
392b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
393b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              len,
394b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              param,
395b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              btm_ble_vendor_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
396b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
397b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        memset(&btm_ble_vendor_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
398b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
399b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
400b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
401b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("manufacturer data PF filter update failed");
402b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
403b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
404b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
405b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
406b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
407b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
408b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_update_pf_local_name
409b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
410b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function update(add,delete or clear) the adv lcoal name
411b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  filtering condition.
412b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
413b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
414b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
415b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
416b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
417b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
418b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
419b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                         tBTM_BLE_PF_COND_PARAM *p_cond)
420b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
421b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_LOCAL_NAME_COND *p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name;
422b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8       param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_META_HDR_LENGTH],
423b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                *p = param,
424b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len = BTM_BLE_META_HDR_LENGTH;
425b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
426b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
427b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_META_HDR_LENGTH);
428b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
429b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, BTM_BLE_META_PF_LOCAL_NAME);
430b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, action);
431b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
432b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action == BTM_BLE_SCAN_COND_ADD ||
433b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        action == BTM_BLE_SCAN_COND_DELETE)
434b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
435b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_local_name == NULL)
436b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
437b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
438b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX)
439b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            p_local_name->data_len = BTM_BLE_PF_STR_LEN_MAX;
440b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
441b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        ARRAY_TO_STREAM(p, p_local_name->p_data, p_local_name->data_len);
442b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        len += p_local_name->data_len;
443b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
444b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* send local name filter */
445b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
446b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              len,
447b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              param,
448b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              btm_ble_vendor_scan_pf_cmpl_cback))
449b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            != BTM_NO_RESOURCES)
450b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
451b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        memset(&btm_ble_vendor_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
452b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
453b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
454b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
455b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("Local Name PF filter update failed");
456b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
457b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
458b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
459b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
460b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
461b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
462b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_update_addr_filter
463b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
464b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function update(add,delete or clear) the address filter of adv.
465b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
466b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
467b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
468b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
469b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
470b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
471b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
472b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                       tBTM_BLE_PF_COND_PARAM *p_cond)
473b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
474b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8       param[BTM_BLE_META_ADDR_LEN + BTM_BLE_META_HDR_LENGTH],
475b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                * p= param;
476b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
477b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBLE_BD_ADDR *p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr;
478b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
479b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_META_HDR_LENGTH);
480b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
481b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
482b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, action);
483b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
484b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action == BTM_BLE_SCAN_COND_ADD ||
485b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        action == BTM_BLE_SCAN_COND_DELETE)
486b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
487b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_addr == NULL)
488b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
489b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
490b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, p_addr->bda);
491b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, p_addr->type);
492b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
493b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* send address filter */
494b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
495b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              (UINT8)(BTM_BLE_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
496b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              param,
497b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              btm_ble_vendor_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
498b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
499b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        memset(&btm_ble_vendor_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
500b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
501b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
502b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
503b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("Broadcaster Address Filter Update failed");
504b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
505b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
506b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
507b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
508b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
509b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_update_uuid_filter
510b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
511b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function update(add,delete or clear) service UUID filter.
512b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
513b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
514b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
515b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
516b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
517b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
518b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
519b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                       tBTM_BLE_PF_COND_TYPE filter_type,
520b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                       tBTM_BLE_PF_COND_PARAM *p_cond)
521b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
522b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8       param[BTM_BLE_META_UUID_LEN + BTM_BLE_META_HDR_LENGTH],
523b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                * p= param,
524b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len = BTM_BLE_META_HDR_LENGTH + 7;
525b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
526b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_UUID_COND *p_uuid_cond;
527b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8           evt_type;
528b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
529b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, BTM_BLE_META_UUID_LEN + BTM_BLE_META_HDR_LENGTH);
530b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
531b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (filter_type == BTM_BLE_PF_SRVC_UUID)
532b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
533b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        evt_type = BTM_BLE_META_PF_UUID;
534b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_uuid_cond = p_cond ? &p_cond->srvc_uuid : NULL;
535b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
536b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
537b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
538b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        evt_type = BTM_BLE_META_PF_SOL_UUID;
539b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_uuid_cond = p_cond ? &p_cond->solicitate_uuid : NULL;
540b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
541b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
542b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_uuid_cond == NULL && action != BTM_BLE_SCAN_COND_CLEAR)
543b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
544b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("Illegal param for add/delete UUID filter");
545b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return st;
546b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
547b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
548b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* need to add address fitler first, if adding per bda UUID filter without address filter */
549b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action == BTM_BLE_SCAN_COND_ADD &&
550b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_uuid_cond->p_target_addr &&
551b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL)
552b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
553b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
554b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, action);
555b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
556b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
557b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
558b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
559b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* send address filter */
560b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
561b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  (UINT8)(BTM_BLE_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
562b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  param,
563b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                  btm_ble_vendor_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES)
564b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
565b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BTM_TRACE_ERROR0("Update Address filter into controller failed.");
566b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
567b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
568b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
569b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
570b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    p= param;
571b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, evt_type);
572b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, action);
573b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
574b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* per BD ADDR UUID filter */
575b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_uuid_cond && p_uuid_cond->p_target_addr)
576b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
577b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
578b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
579b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
580b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else /* generic UUID filter */
581b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
582b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, na_bda);
583b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, 0x02);
584b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
585b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
586b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action == BTM_BLE_SCAN_COND_ADD ||
587b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        action == BTM_BLE_SCAN_COND_DELETE)
588b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
589b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, p_uuid_cond->cond_logic);
590b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        len ++;
591b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
592b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_uuid_cond->uuid.len == LEN_UUID_16)
593b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
594b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT16_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid16);
595b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += LEN_UUID_16;
596b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
597b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
598b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
599b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT32_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid32);
600b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += LEN_UUID_32;
601b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
602b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else if (p_uuid_cond->uuid.len == LEN_UUID_128)
603b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
604b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            ARRAY_TO_STREAM (p, p_uuid_cond->uuid.uu.uuid128, LEN_UUID_128);
605b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += LEN_UUID_128;
606b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
607b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
608b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
609b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BTM_TRACE_ERROR1("illegal UUID length: %d", p_uuid_cond->uuid.len);
610b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return BTM_ILLEGAL_VALUE;
611b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
612b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#if !(defined VENDOR_ADV_PCF_LEGACY && VENDOR_ADV_PCF_LEGACY == TRUE)
613b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_uuid_cond->p_uuid_mask != NULL)
614b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
615b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            if (p_uuid_cond->uuid.len == LEN_UUID_16)
616b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
617b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                UINT16_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid16_mask);
618b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len += LEN_UUID_16;
619b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
620b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
621b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
622b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                UINT32_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid32_mask);
623b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len += LEN_UUID_32;
624b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
625b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            else if (p_uuid_cond->uuid.len == LEN_UUID_128)
626b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            {
627b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                ARRAY_TO_STREAM (p, p_uuid_cond->p_uuid_mask->uuid128_mask, LEN_UUID_128);
628b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                len += LEN_UUID_128;
629b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            }
630b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
631b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
632b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
633b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memset(p, 0xff, p_uuid_cond->uuid.len);
634b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            len += p_uuid_cond->uuid.len;
635b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
636b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#endif
637b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
638b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
639b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* send UUID filter update */
640b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
641b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              len,
642b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              param,
643b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                              btm_ble_vendor_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
644b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
645b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_uuid_cond && p_uuid_cond->p_target_addr)
646b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memcpy(&btm_ble_vendor_cb.cur_filter_target, p_uuid_cond->p_target_addr, sizeof(tBLE_BD_ADDR));
647b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
648b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memset(&btm_ble_vendor_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
649b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
650b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
651b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
652b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("UUID filter udpating failed");
653b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
654b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
655b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
656b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
657b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
658b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
659b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_update_srvc_data_change
660b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
661b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      this function update(add/remove) service data change filter.
662b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
663b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
664b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
665b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
666b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
667b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
668b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action,
669b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                       tBTM_BLE_PF_COND_PARAM *p_cond)
670b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
671b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
672b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBLE_BD_ADDR   *p_bd_addr = p_cond ? &p_cond->target_addr : NULL;
673b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8           num_avail = (action == BTM_BLE_SCAN_COND_ADD) ? 0 : 1;
674b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
675b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (btm_ble_cs_update_pf_counter (action, BTM_BLE_PF_SRVC_DATA, p_bd_addr, num_avail)
676b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                    != BTM_BLE_INVALID_COUNTER)
677b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = BTM_SUCCESS;
678b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
679b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
680b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
681b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
682b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
683b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
684b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_clear_scan_pf_filter
685b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
686b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      clear all adv payload filter by de-select all the adv pf feature bits
687b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
688b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
689b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          BTM_SUCCESS if sucessful,
690b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  BTM_ILLEGAL_VALUE if paramter is not valid.
691b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
692b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
693b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
694b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                       tBTM_BLE_PF_COND_PARAM *p_cond)
695b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
696b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBLE_BD_ADDR *p_target = (p_cond == NULL)? NULL : &p_cond->target_addr;
697b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT *p_bda_filter;
698b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS     st = BTM_WRONG_MODE;
699b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8           param[20], *p;
700b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
701b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (action != BTM_BLE_SCAN_COND_CLEAR)
702b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
703b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR1("unable to perform action:%d for generic adv filter type", action);
704b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
705b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
706b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
707b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    p = param;
708b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, 20);
709b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
710b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
711b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
712b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_bda_filter == NULL ||
713b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* not a generic filter, and feature selection is empty */
714b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        (p_target != NULL && p_bda_filter && p_bda_filter->feat_mask == 0))
715b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
716b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("Error: Can not clear filter, No PF filter has been configured!");
717b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return st;
718b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
719b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
720b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* clear the general filter entry */
721b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_target == NULL)
722b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
723b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* clear manufactuer data filter */
724b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, NULL, BTM_BLE_PF_MANU_DATA);
725b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* clear local name filter */
726b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, NULL);
727b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* update the counter  for service data */
728b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, NULL);
729b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* clear UUID filter */
730b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, BTM_BLE_PF_SRVC_UUID, NULL);
731b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, BTM_BLE_META_PF_SOL_UUID, NULL);
732b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* clear service data filter */
733b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, NULL, BTM_BLE_PF_MANU_DATA);
734b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
735b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
736b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* select feature based on control block settings */
737b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
738b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
739b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
740b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (p_target != NULL)
741b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
742b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, p_target->bda);
743b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, p_target->type);
744b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
745b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
746b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
747b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BDADDR_TO_STREAM(p, na_bda);
748b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, 0x02);
749b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
750b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
751b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* set PCF selection */
752b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT32_TO_STREAM(p, BTM_BLE_PF_SELECT_NONE);
753b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* set logic condition as OR as default */
754b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
755b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
756b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
757b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                               (UINT8)(BTM_BLE_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
758b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                param,
759b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                btm_ble_vendor_scan_pf_cmpl_cback))
760b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            != BTM_NO_RESOURCES)
761b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
762b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_bda_filter)
763b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            p_bda_filter->feat_mask = BTM_BLE_PF_SELECT_NONE;
764b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
765b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_target)
766b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memcpy(&btm_ble_vendor_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
767b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
768b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            memset(&btm_ble_vendor_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
769b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
770b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
771b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
772b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
773b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
774b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
775b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         BTM_BleEnableFilterCondition
776b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
777b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      This function is called to enable the adv data payload filter
778b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  condition.
779b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
780b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Parameters       p_target: enabble the filter condition on a target device; if NULL
781b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                            enable the generic scan condition.
782b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  enable: enable or disable the filter condition
783b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
784b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          void
785b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
786b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
787b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS BTM_BleEnableFilterCondition(BOOLEAN enable, tBLE_BD_ADDR *p_target,
788b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                         tBTM_BLE_PF_CMPL_CBACK *p_cmpl_cback)
789b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
790b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    UINT8           param[20], *p;
791b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS     st = BTM_WRONG_MODE;
792b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_BLE_PF_COUNT *p_bda_filter;
793b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
794b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    p = param;
795b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(param, 0, 20);
796b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
797b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (btm_ble_vendor_cb.p_scan_pf_cback)
798b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
799b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_ERROR0("ADV PF Filter activity busy");
800b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return BTM_BUSY;
801b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
802b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
803b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (enable)
804b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
805b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
806b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
807b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_bda_filter == NULL ||
808b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            (p_bda_filter && p_bda_filter->feat_mask == BTM_BLE_PF_SELECT_NONE))
809b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
810b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BTM_TRACE_ERROR0("No PF filter has been configured!");
811b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
812b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
813b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
814b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* select feature based on control block settings */
815b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
816b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
817b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
818b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if (p_target != NULL)
819b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
820b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BDADDR_TO_STREAM(p, p_target->bda);
821b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT8_TO_STREAM(p, p_target->type);
822b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
823b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        else
824b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
825b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            BDADDR_TO_STREAM(p, na_bda);
826b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            UINT8_TO_STREAM(p, 0x02);
827b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
828b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
829b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* set PCF selection */
830b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT32_TO_STREAM(p, p_bda_filter->feat_mask);
831b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* set logic condition as OR as default */
832b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
833b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
834b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
835b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                   (UINT8)(BTM_BLE_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
836b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                    param,
837b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                    btm_ble_vendor_scan_pf_cmpl_cback))
838b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach               == BTM_NO_RESOURCES)
839b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        {
840b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach            return st;
841b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        }
842b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
843b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* enable the content filter in controller */
844b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        p = param;
845b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
846b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* enable adv data payload filtering */
847b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, enable);
848b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
849b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    else
850b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
851b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
852b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* disable adv data payload filtering */
853b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        UINT8_TO_STREAM(p, enable);
854b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
855b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
856b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if ((st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_PCF_VSC,
857b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                               BTM_BLE_PCF_ENABLE_LEN,
858b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                               param,
859b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                               btm_ble_vendor_scan_pf_cmpl_cback))
860b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach         == BTM_CMD_STARTED)
861b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
862b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.op_type =  BTM_BLE_SET_SCAN_PF_OPCODE(BTM_BLE_META_PF_ENABLE, BTM_BLE_PF_ENABLE);
863b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.p_scan_pf_cback = p_cmpl_cback;
864b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
865b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
866b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
867b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
868b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
869b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
870b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         BTM_BleCfgFilterCondition
871b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
872b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      This function is called to configure the adv data payload filter
873b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  condition.
874b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
875b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Parameters       action: to read/write/clear
876b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  cond_type: filter condition type.
877b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**                  p_cond: filter condition paramter
878b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
879b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          void
880b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
881b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
882b203d478f4835f5e35217874a1787e1914328f7cAndre EisenbachtBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
883b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                      tBTM_BLE_PF_COND_TYPE cond_type,
884b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                      tBTM_BLE_PF_COND_PARAM *p_cond,
885b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach                                      tBTM_BLE_PF_CMPL_CBACK *p_cmpl_cback)
886b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
887b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    tBTM_STATUS     st = BTM_ILLEGAL_VALUE;
888b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
889b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (btm_ble_vendor_cb.p_scan_pf_cback != NULL)
890b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return BTM_BUSY;
891b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
892b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    switch (cond_type)
893b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
894b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_SRVC_DATA_PATTERN:
895b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* write manufacture data filter */
896b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_MANU_DATA:
897b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_update_pf_manu_data(action, p_cond, cond_type);
898b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
899b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
900b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* write local name filter */
901b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_LOCAL_NAME:
902b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_update_pf_local_name(action, p_cond);
903b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
904b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
905b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* filter on advertiser address */
906b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_ADDR_FILTER:
907b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_update_addr_filter(action, p_cond);
908b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
909b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
910b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    /* filter on service/solicitated UUID */
911b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_SRVC_UUID:
912b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_SRVC_SOL_UUID:
913b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_update_uuid_filter(action, cond_type, p_cond);
914b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
915b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
916b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_SRVC_DATA:
917b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_update_srvc_data_change(action, p_cond);
918b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
919b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
920b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */
921b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        st = btm_ble_clear_scan_pf_filter(action, p_cond);
922b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
923b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
924b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    default:
925b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        BTM_TRACE_WARNING1("condition type [%d] not supported currently.", cond_type);
926b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        break;
927b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
928b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (st == BTM_CMD_STARTED
929b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        /* no vsc needed for service data change */
930b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        && cond_type != BTM_BLE_PF_SRVC_DATA)
931b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    {
932b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.op_type        = BTM_BLE_SET_SCAN_PF_OPCODE(cond_type, BTM_BLE_PF_CONFIG);
933b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        btm_ble_vendor_cb.p_scan_pf_cback = p_cmpl_cback;
934b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    }
935b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
936b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    return st;
937b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
938b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
939b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
940b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach/*******************************************************************************
941b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
942b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Function         btm_ble_vendor_init
943b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
944b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Description      Initialize customer specific feature information in host stack
945b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
946b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Parameters
947b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
948b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach** Returns          status
949b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach**
950b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach*******************************************************************************/
951b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachvoid btm_ble_vendor_init(void)
952b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{
953b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
954b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
955b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
956b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach        return;
957b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
958b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
959b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#endif
960b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
961b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
962