11a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/******************************************************************************
21a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *
31a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  Copyright (C) 2014  Broadcom Corporation
41a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *
51a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  Licensed under the Apache License, Version 2.0 (the "License");
61a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  you may not use this file except in compliance with the License.
71a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  You may obtain a copy of the License at:
81a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *
91a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  http://www.apache.org/licenses/LICENSE-2.0
101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *
111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  Unless required by applicable law or agreed to in writing, software
121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  distributed under the License is distributed on an "AS IS" BASIS,
131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  See the License for the specific language governing permissions and
151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *  limitations under the License.
161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji *
171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji ******************************************************************************/
181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
19f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#define LOG_TAG "bt_btm_ble"
20f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton
211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#include <string.h>
2249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#include "bt_target.h"
241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#if (BLE_INCLUDED == TRUE)
2649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#include "bt_types.h"
281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#include "bt_utils.h"
291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#include "btm_ble_api.h"
3049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h"
3149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h"
3279ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h"
3349a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hcidefs.h"
3449a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "hcimsgs.h"
351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILT_META_HDR_LENGTH 3
37f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji#define BTM_BLE_ADV_FILT_FEAT_SELN_LEN  13
38f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji#define BTM_BLE_ADV_FILT_TRACK_NUM       2
391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
40444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_PF_SELECT_NONE              0
41444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
42444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/* BLE meta vsc header: 1 bytes of sub_code, 1 byte of PCF action */
43444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_HDR_LENGTH     3
44444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_PF_FEAT_SEL_LEN     18
45444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_PCF_ENABLE_LEN      2
46444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
47444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_ADDR_LEN       7
48444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define BTM_BLE_META_UUID_LEN       40
49444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_PF_BIT_TO_MASK(x)          (UINT16)(1 << (x))
511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
521a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_BLE_ADV_FILTER_CB btm_ble_adv_filt_cb;
531a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_BLE_VSC_CB cmn_ble_vsc_cb;
541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Callojistatic const BD_ADDR     na_bda= {0};
551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Callojistatic UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr, UINT8 num_available);
581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_SET_SCAN_PF_OPCODE(x, y) (((x)<<4)|y)
601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_GET_SCAN_PF_SUBCODE(x)    ((x) >> 4)
611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_GET_SCAN_PF_ACTION(x)    ((x) & 0x0f)
621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_INVALID_COUNTER     0xff
631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/* length of each multi adv sub command */
651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILTER_ENB_LEN                       3
661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/* length of each batch scan command */
681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILTER_CLEAR_LEN            3
691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILTER_LEN     2
701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILT_CB_EVT_MASK       0xF0
721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#define BTM_BLE_ADV_FILT_SUBCODE_MASK      0x0F
731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/*******************************************************************************
7516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
7616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function         btm_ble_obtain_vsc_details
7716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
7816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Description      This function obtains the VSC details
7916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
8016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Parameters
8116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
8216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Returns          status
8316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
8416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham*******************************************************************************/
8516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa ViswanadhamtBTM_STATUS btm_ble_obtain_vsc_details()
8616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham{
8716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    tBTM_STATUS st = BTM_SUCCESS;
8816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
8916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#if BLE_VND_INCLUDED == TRUE
9016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
9116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (0 == cmn_ble_vsc_cb.max_filter)
9216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    {
9316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        st = BTM_MODE_UNSUPPORTED;
9416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        return st;
9516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    }
9616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#else
9716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    cmn_ble_vsc_cb.max_filter = BTM_BLE_MAX_FILTER_COUNTER;
9816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham#endif
9916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    return st;
10016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham}
1011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
1021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
1031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_advfilt_enq_op_q
1051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      enqueue an adv filter operation in q to check command complete
1071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  status
1081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          void
1101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
1126e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Callojivoid btm_ble_advfilt_enq_op_q(UINT8 action, UINT8 ocf, tBTM_BLE_FILT_CB_EVT cb_evt,
1136e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                              tBTM_BLE_REF_VALUE ref, tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
1146e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                              tBTM_BLE_PF_PARAM_CBACK  *p_filt_param_cback)
1151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
1166e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = (action |(ocf << 4));
1171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref;
1186e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt;
1196e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] = p_cmpl_cback;
1206e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx]
1216e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        = p_filt_param_cback;
1226e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    BTM_TRACE_DEBUG("btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, cback:%x",
1236e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], action,
1246e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        ocf, cb_evt, p_cmpl_cback);
1251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btm_ble_adv_filt_cb.op_q.next_idx = (btm_ble_adv_filt_cb.op_q.next_idx + 1)
1261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                    % BTM_BLE_PF_TYPE_MAX;
1271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
1281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
1291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
1301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_advfilt_deq_op_q
1321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      dequeue an adv filter operation from q when command complete
1341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  is received
1351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          void
1371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
1381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
1396e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Callojivoid btm_ble_advfilt_deq_op_q(UINT8 *p_action,UINT8 *p_ocf, tBTM_BLE_FILT_CB_EVT *p_cb_evt,
1406e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                              tBTM_BLE_REF_VALUE *p_ref, tBTM_BLE_PF_CFG_CBACK ** p_cmpl_cback,
1416e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                              tBTM_BLE_PF_PARAM_CBACK  **p_filt_param_cback)
1421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
1436e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    *p_ocf = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >> 4);
1446e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    *p_action = (btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx]
1451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                & BTM_BLE_ADV_FILT_SUBCODE_MASK);
1461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    *p_ref = btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx];
1476e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    *p_cb_evt = btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx];
1486e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    *p_cmpl_cback = btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
1496e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    *p_filt_param_cback =
1506e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_adv_filt_cb.op_q.p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx];
1516e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
1521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btm_ble_adv_filt_cb.op_q.pending_idx = (btm_ble_adv_filt_cb.op_q.pending_idx + 1)
1531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        % BTM_BLE_PF_TYPE_MAX;
1546e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    BTM_TRACE_DEBUG("btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x",
1556e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        *p_ocf,*p_action, *p_ref, *p_cb_evt);
1566e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji}
1576e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
1586e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji/*******************************************************************************
1596e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji**
1606e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji** Function         btm_ble_condtype_to_ocf
1616e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji**
1626e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji** Description      Convert cond_type to OCF
1636e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji**
1646e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji** Returns          Returns ocf value
1656e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji**
1666e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji*******************************************************************************/
1676e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya CallojiUINT8 btm_ble_condtype_to_ocf(UINT8 cond_type)
1686e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji{
1696e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    UINT8 ocf = 0;
1706e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
1716e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    switch(cond_type)
1726e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    {
1736e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_ADDR_FILTER:
1746e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji          ocf = BTM_BLE_META_PF_ADDR;
1756e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji          break;
1766e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_SRVC_UUID:
1776e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji          ocf = BTM_BLE_META_PF_UUID;
1786e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji          break;
1796e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_SRVC_SOL_UUID:
1806e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_META_PF_SOL_UUID;
1816e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1826e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_LOCAL_NAME:
1836e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_META_PF_LOCAL_NAME;
1846e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1856e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_MANU_DATA:
1866e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_META_PF_MANU_DATA;
1876e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1886e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_SRVC_DATA_PATTERN:
1896e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_META_PF_SRVC_DATA;
1906e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1916e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_PF_TYPE_ALL:
1926e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_META_PF_ALL;
1936e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1946e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        default:
1956e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           ocf = BTM_BLE_PF_TYPE_MAX;
1966e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           break;
1976e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    }
1986e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    return ocf;
1991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
2001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
2021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_ocf_to_condtype
2041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      Convert OCF to cond type
2061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2076e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji** Returns          Returns condtype value
2081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
2101a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojiUINT8 btm_ble_ocf_to_condtype(UINT8 ocf)
2111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
2121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8 cond_type = 0;
2131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    switch(ocf)
2151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
2161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_FEAT_SEL:
2171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_META_PF_FEAT_SEL;
2181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_ADDR:
2201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          cond_type = BTM_BLE_PF_ADDR_FILTER;
2211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          break;
2221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_UUID:
2231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          cond_type = BTM_BLE_PF_SRVC_UUID;
2241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          break;
2251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_SOL_UUID:
2261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_SRVC_SOL_UUID;
2271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_LOCAL_NAME:
2291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_LOCAL_NAME;
2301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_MANU_DATA:
2321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_MANU_DATA;
2331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_SRVC_DATA:
2351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_SRVC_DATA_PATTERN;
2361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_ALL:
2381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_TYPE_ALL;
2391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        default:
2411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           cond_type = BTM_BLE_PF_TYPE_MAX;
2421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
2431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
2441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return cond_type;
2451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
2461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
2481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_scan_pf_cmpl_cback
2501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      the BTM BLE customer feature VSC complete callback for ADV PF filtering
2521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          pointer to the counter if found; NULL otherwise.
2541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
2551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
2561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Callojivoid btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
2571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
2581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8  status = 0;
2591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8  *p = p_params->p_param_buf, op_subcode = 0, action = 0xff;
2601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT16  evt_len = p_params->param_len;
2616e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    UINT8   ocf = BTM_BLE_META_PF_ALL, cond_type = 0;
2626e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    UINT8   num_avail = 0, cb_evt = 0;
2631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_REF_VALUE ref_value = 0;
2646e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    tBTM_BLE_PF_CFG_CBACK *p_scan_cfg_cback = NULL;
2656e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    tBTM_BLE_PF_PARAM_CBACK *p_filt_param_cback = NULL;
2661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (evt_len < 3 || evt_len > 4)
2681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
269f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      BTM_TRACE_ERROR("%s cannot interpret APCF callback status = %d, length = %d",
270f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton          __func__, status, evt_len);
2716e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
2726e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                 &p_filt_param_cback);
2731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return;
2741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
2751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2766e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, &p_scan_cfg_cback,
2776e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                             &p_filt_param_cback);
2781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2796e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    STREAM_TO_UINT8(status, p);
2801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    STREAM_TO_UINT8(op_subcode, p);
2811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    STREAM_TO_UINT8(action, p);
2821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
2831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Ignore the event, if it is not the same one expected */
28416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (3 == evt_len)
2851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
2866e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(ocf != op_subcode)
2871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
2886e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji             BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, %d",
2896e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                        ocf, op_subcode, action, evt_len, ref_value, status);
2901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji             return;
2911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
2921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
2931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
2946e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            if(NULL != btm_ble_adv_filt_cb.p_filt_stat_cback)
2956e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji               btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value);
2961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d",
2976e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                         ocf, action, status, ref_value);
2981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return;
2991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
3001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
3011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3026e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    if (4 == evt_len && ocf != op_subcode)
3031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
3046e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d",
3056e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                ocf, op_subcode, action, status, ref_value);
3061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return;
3071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
3081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    STREAM_TO_UINT8(num_avail, p);
3101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    switch (op_subcode)
3111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
3121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_ADDR:
3131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_UUID:
3141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_SOL_UUID:
3151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_LOCAL_NAME:
3161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_MANU_DATA:
3171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_SRVC_DATA:
3186e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           cond_type = btm_ble_ocf_to_condtype(ocf);
3196e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", op_subcode,
3206e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                        ocf, action, status, ref_value, num_avail);
3211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           if (HCI_SUCCESS == status)
3221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           {
3231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji               if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, BD_ADDR_LEN) == 0)
3241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                   btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail);
3251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji               else
3261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                   btm_ble_cs_update_pf_counter(action, cond_type,
3271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                            &btm_ble_adv_filt_cb.cur_filter_target, num_avail);
3281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           }
3291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           /* send ADV PF operation complete */
3311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           btm_ble_adv_filt_cb.op_type = 0;
3321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           break;
3331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_META_PF_FEAT_SEL:
3356e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d",
3366e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                action, status, ref_value, num_avail);
3371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
3381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        default:
3401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", op_subcode);
3411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
3421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
3436e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
3446e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    switch(cb_evt)
3456e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    {
3466e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d", cb_evt);
3476e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_FILT_CFG:
3486e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            if(NULL != p_scan_cfg_cback)
3496e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji               p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value);
3506e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            break;
3516e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        case BTM_BLE_FILT_ADV_PARAM:
3526e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            if(NULL != p_filt_param_cback)
3536e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji               p_filt_param_cback(action, num_avail, ref_value, status);
3546e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            break;
3556e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        default:
3566e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            break;
3576e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    }
3581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
3591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
3611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_find_addr_filter_counter
3631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      find the per bd address ADV payload filter counter by BD_ADDR.
3651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          pointer to the counter if found; NULL otherwise.
3671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
3691a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
3701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
3711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8               i;
37216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
3731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (p_le_bda == NULL)
37516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        return &btm_ble_adv_filt_cb.p_addr_filter_count[0];
3761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
3781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
3791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (p_addr_filter->in_use &&
3801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memcmp(p_le_bda->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
3811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
3821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return p_addr_filter;
3831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
3841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
3851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return NULL;
3861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
3871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
3881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
3891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_alloc_addr_filter_counter
3911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      allocate the per device adv payload filter counter.
3931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          pointer to the counter if allocation succeed; NULL otherwise.
3951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
3961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
3971a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
3981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
3991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8               i;
40016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
4011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
4031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
4041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (memcmp(na_bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)
4051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
4061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memcpy(p_addr_filter->bd_addr, bd_addr, BD_ADDR_LEN);
4071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            p_addr_filter->in_use = TRUE;
4081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return p_addr_filter;
4091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
4101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
4111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return NULL;
4121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
4131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
4141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_dealloc_addr_filter_counter
4161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      de-allocate the per device adv payload filter counter.
4181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          TRUE if deallocation succeed; FALSE otherwise.
4201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
4221a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojiBOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
4231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
4241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8               i;
42516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
4261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    BOOLEAN             found = FALSE;
4271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr)
42916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
4301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
4321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
4331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((p_addr_filter->in_use) && (NULL == p_bd_addr ||
4341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            (NULL != p_bd_addr &&
4351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memcmp(p_bd_addr->bda, p_addr_filter->bd_addr, BD_ADDR_LEN) == 0)))
4361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
4371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            found = TRUE;
4381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memset(p_addr_filter, 0, sizeof(tBTM_BLE_PF_COUNT));
4391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (NULL != p_bd_addr) break;
4411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
4421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
4431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return found;
4441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
4451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
4471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_update_pf_local_name
4491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function update(add,delete or clear) the adv lcoal name filtering condition.
4511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
4541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
4551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
4561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
4571a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action,
4581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                         tBTM_BLE_PF_FILT_INDEX filt_index,
4591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                         tBTM_BLE_PF_COND_PARAM *p_cond)
4601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
4611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_LOCAL_NAME_COND *p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name;
4621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8       param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
4631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                *p = param,
4641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
4651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
4661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
4681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_META_PF_LOCAL_NAME);
4701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, action);
4711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Filter index */
4731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, filt_index);
4741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_SCAN_COND_ADD == action ||
4761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_SCAN_COND_DELETE == action)
4771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
4781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (NULL == p_local_name)
4791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
4801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (p_local_name->data_len > BTM_BLE_PF_STR_LEN_MAX)
4821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            p_local_name->data_len = BTM_BLE_PF_STR_LEN_MAX;
4831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        ARRAY_TO_STREAM(p, p_local_name->p_data, p_local_name->data_len);
4851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        len += p_local_name->data_len;
4861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
4871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
4881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* send local name filter */
4891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
4901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              len,
4911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              param,
4921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              btm_ble_scan_pf_cmpl_cback))
4931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            != BTM_NO_RESOURCES)
4941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
4951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
4961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
4971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
4981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
4991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("Local Name PF filter update failed");
5001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
5011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
5031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
5041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
5061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_update_srvc_data_change
5081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function update(add/remove) service data change filter.
5101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
5131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
5141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
5161a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action,
5171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_FILT_INDEX filt_index,
5181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_COND_PARAM *p_cond)
5191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
5201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
5211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBLE_BD_ADDR   *p_bd_addr = p_cond ? &p_cond->target_addr : NULL;
5221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8           num_avail = (action == BTM_BLE_SCAN_COND_ADD) ? 0 : 1;
5231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (btm_ble_cs_update_pf_counter (action, BTM_BLE_PF_SRVC_DATA, p_bd_addr, num_avail)
5251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                    != BTM_BLE_INVALID_COUNTER)
5261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        st = BTM_SUCCESS;
5271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
5291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
5301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
5321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_update_pf_manu_data
5341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function update(add,delete or clear) the adv manufacturer
5361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  data filtering condition.
5371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
5401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
5411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
5421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
5431a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
5441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                        tBTM_BLE_PF_FILT_INDEX filt_index,
5451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                        tBTM_BLE_PF_COND_PARAM *p_data,
5466e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                        tBTM_BLE_PF_COND_TYPE cond_type,
5476e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                        tBTM_BLE_FILT_CB_EVT cb_evt,
5486e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                        tBTM_BLE_REF_VALUE ref_value)
5491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
5501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_MANU_COND *p_manu_data = (p_data == NULL) ? NULL : &p_data->manu_data;
5511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_SRVC_PATTERN_COND *p_srvc_data = (p_data == NULL) ? NULL : &p_data->srvc_data;
5521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8 param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
5541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          *p = param,
5551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji          len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
5561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
5571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5586cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji    if (NULL == p_data)
5591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return st;
5601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX
5621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                    + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
5631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
5651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
5661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA);
5671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
5681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
5691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
5701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_MANU_DATA);
5711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
5721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, action);
5741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Filter index */
5761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, filt_index);
5771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5786cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji    if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action)
5791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
5801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
5811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
5821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (NULL == p_srvc_data)
5831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                return st;
5841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
5851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
5861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
58716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            if (p_srvc_data->data_len > 0)
5881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            {
5891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
5901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len += (p_srvc_data->data_len);
5911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                ARRAY_TO_STREAM(p, p_srvc_data->p_pattern_mask, p_srvc_data->data_len);
5921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            }
5931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
5941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            len += (p_srvc_data->data_len);
5951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_DEBUG("Service data length: %d", len);
5961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
5971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
5981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
5991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (NULL == p_manu_data)
6006cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            {
6016cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data");
6021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                return st;
6036cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            }
6046cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d",
6056cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                                    p_manu_data->data_len);
6066cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
6076cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
6081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6096cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            UINT16_TO_STREAM(p, p_manu_data->company_id);
6106cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
6116cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            {
6121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
6136cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                len += (p_manu_data->data_len + 2);
6146cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            }
6156cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            else
6166cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                len += 2;
6171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6186cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            if (p_manu_data->company_id_mask != 0)
6196cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            {
6206cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                UINT16_TO_STREAM (p, p_manu_data->company_id_mask);
6216cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            }
6226cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            else
6236cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            {
6246cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                memset(p, 0xff, 2);
6256cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                p += 2;
6266cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            }
6276cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            len += 2;
6281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6296cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            if (p_manu_data->data_len > 0 && p_manu_data->p_pattern_mask != NULL)
6306cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            {
6316cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
6326cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji                len += (p_manu_data->data_len);
6336cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            }
6341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6356cbb113e7863888f62c49b4b7a89f12a04fe07f4Satya Calloji            BTM_TRACE_DEBUG("Manuf data length: %d", len);
6361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
6371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
6381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* send manufacturer*/
6401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
6411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              len,
6421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              param,
6431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
6441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
6451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
6461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
6471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
6481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
6491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("manufacturer data PF filter update failed");
6501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
6511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
6531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
6541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
6561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
6571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_cs_update_pf_counter
6581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
6591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function is to update the adv data payload filter counter
6601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
6611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          current number of the counter; BTM_BLE_INVALID_COUNTER if
6621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  counter update failed.
6631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
6641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
6651a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojiUINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
6661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  UINT8 cond_type, tBLE_BD_ADDR *p_bd_addr,
6671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  UINT8 num_available)
6681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
6691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_COUNT   *p_addr_filter = NULL;
6701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8               *p_counter = NULL;
6711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
67216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    btm_ble_obtain_vsc_details();
6731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (cond_type > BTM_BLE_PF_TYPE_ALL)
6751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
6761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("unknown PF filter condition type %d", cond_type);
6771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return BTM_BLE_INVALID_COUNTER;
6781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
6791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* for these three types of filter, always generic */
6811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_PF_ADDR_FILTER == cond_type ||
6821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_PF_MANU_DATA == cond_type ||
6831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_PF_LOCAL_NAME == cond_type ||
6841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type)
6851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_bd_addr = NULL;
6861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((p_addr_filter = btm_ble_find_addr_filter_counter(p_bd_addr)) == NULL &&
6881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_SCAN_COND_ADD == action)
6891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
6901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_addr_filter = btm_ble_alloc_addr_filter_counter(p_bd_addr->bda);
6911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
6921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
6931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (NULL != p_addr_filter)
6941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
6951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* all filter just cleared */
6961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((BTM_BLE_PF_TYPE_ALL == cond_type && BTM_BLE_SCAN_COND_CLEAR == action) ||
6971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            /* or bd address filter been deleted */
6981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            (BTM_BLE_PF_ADDR_FILTER == cond_type &&
6991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji             (BTM_BLE_SCAN_COND_DELETE == action || BTM_BLE_SCAN_COND_CLEAR == action)))
7001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
7011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            btm_ble_dealloc_addr_filter_counter(p_bd_addr, cond_type);
7021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
7031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* if not feature selection, update new addition/reduction of the filter counter */
7041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else if (cond_type != BTM_BLE_PF_TYPE_ALL)
7051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
7061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            p_counter = p_addr_filter->pf_counter;
7071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (num_available > 0)
70816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                p_counter[cond_type] += 1;
7091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
71016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d",
71116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available);
7121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return p_counter[cond_type];
7131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
7141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
7151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
7161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
7171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("no matching filter counter found");
7181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
7191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* no matching filter located and updated */
7201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return BTM_BLE_INVALID_COUNTER;
7211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
7221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
7241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_update_addr_filter
7261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function update(add,delete or clear) the address filter of adv.
7281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
7311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
7321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
7341a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action,
7351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_FILT_INDEX filt_index,
7361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_COND_PARAM *p_cond)
7371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
7381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8       param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
7391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                * p= param;
7401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
7411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBLE_BD_ADDR *p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr;
7421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
7441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
7461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, action);
7471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Filter index */
7491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, filt_index);
7501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_SCAN_COND_ADD == action ||
7521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_BLE_SCAN_COND_DELETE == action)
7531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
7541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (NULL == p_addr)
7551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
7561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BDADDR_TO_STREAM(p, p_addr->bda);
7581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, p_addr->type);
7591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
7601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* send address filter */
7611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
7621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
7631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              param,
7641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
7651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
7661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
7671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
7681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
7691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
7701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("Broadcaster Address Filter Update failed");
7711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
7721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
7731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
7741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
7751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
7761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_update_uuid_filter
7781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      this function update(add,delete or clear) service UUID filter.
7801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
7831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
7841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
7851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
7861a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action,
7871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_FILT_INDEX filt_index,
7881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_COND_TYPE filter_type,
7896e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                       tBTM_BLE_PF_COND_PARAM *p_cond,
7906e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                       tBTM_BLE_FILT_CB_EVT cb_evt,
7916e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                       tBTM_BLE_REF_VALUE ref_value)
7921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
7931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8       param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH],
7941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                * p= param,
7951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
7961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS st = BTM_ILLEGAL_VALUE;
7971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_UUID_COND *p_uuid_cond;
7981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8           evt_type;
7991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH);
8011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_PF_SRVC_UUID == filter_type)
8031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
8041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        evt_type = BTM_BLE_META_PF_UUID;
8051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_uuid_cond = p_cond ? &p_cond->srvc_uuid : NULL;
8061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
8071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
8081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
8091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        evt_type = BTM_BLE_META_PF_SOL_UUID;
8101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_uuid_cond = p_cond ? &p_cond->solicitate_uuid : NULL;
8111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
8121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (NULL == p_uuid_cond && action != BTM_BLE_SCAN_COND_CLEAR)
8141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
8151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("Illegal param for add/delete UUID filter");
8161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return st;
8171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
8181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8196e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    /* need to add address filter first, if adding per bda UUID filter without address filter */
8206e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    if (BTM_BLE_SCAN_COND_ADD == action && NULL != p_uuid_cond &&
8211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_uuid_cond->p_target_addr &&
8221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        btm_ble_find_addr_filter_counter(p_uuid_cond->p_target_addr) == NULL)
8231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
8241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR);
8251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, action);
8261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* Filter index */
8281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, filt_index);
8291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda);
8311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type);
8321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* send address filter */
8341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
8351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN),
8361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  param,
8371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                  btm_ble_scan_pf_cmpl_cback)) == BTM_NO_RESOURCES)
8381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_ERROR("Update Address filter into controller failed.");
8401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
8411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8426e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
8436e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_ADDR, cb_evt, ref_value, NULL, NULL);
8441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_DEBUG("Updated Address filter");
8451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
8461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p = param;
8481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, evt_type);
8491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, action);
8501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Filter index */
8521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, filt_index);
8531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8546e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    if ((BTM_BLE_SCAN_COND_ADD == action ||
8556e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        BTM_BLE_SCAN_COND_DELETE == action) &&
8566e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        NULL != p_uuid_cond)
8571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
8581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (p_uuid_cond->uuid.len == LEN_UUID_16)
8591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT16_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid16);
8611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            len += LEN_UUID_16;
8621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
8641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT32_TO_STREAM(p, p_uuid_cond->uuid.uu.uuid32);
8661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            len += LEN_UUID_32;
8671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else if (p_uuid_cond->uuid.len == LEN_UUID_128)
8691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            ARRAY_TO_STREAM (p, p_uuid_cond->uuid.uu.uuid128, LEN_UUID_128);
8711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            len += LEN_UUID_128;
8721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
8741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_ERROR("illegal UUID length: %d", p_uuid_cond->uuid.len);
8761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return BTM_ILLEGAL_VALUE;
8771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
8791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (NULL != p_uuid_cond->p_uuid_mask)
8801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            if (p_uuid_cond->uuid.len == LEN_UUID_16)
8821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            {
8831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                UINT16_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid16_mask);
8841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len += LEN_UUID_16;
8851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            }
8861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            else if (p_uuid_cond->uuid.len == LEN_UUID_32)/*4 bytes */
8871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            {
8881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                UINT32_TO_STREAM(p, p_uuid_cond->p_uuid_mask->uuid32_mask);
8891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len += LEN_UUID_32;
8901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            }
8911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            else if (p_uuid_cond->uuid.len == LEN_UUID_128)
8921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            {
8931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                ARRAY_TO_STREAM (p, p_uuid_cond->p_uuid_mask->uuid128_mask, LEN_UUID_128);
8941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                len += LEN_UUID_128;
8951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            }
8961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
8971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
8981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
8991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memset(p, 0xff, p_uuid_cond->uuid.len);
9001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            len += p_uuid_cond->uuid.len;
9011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
9026e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        BTM_TRACE_DEBUG("btm_ble_update_uuid_filter : %d, %d, %d, %d", filter_type, evt_type,
9036e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                        p_uuid_cond->uuid.len, len);
9041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
9051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* send UUID filter update */
9071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
9081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              len,
9091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              param,
9101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              btm_ble_scan_pf_cmpl_cback)) != BTM_NO_RESOURCES)
9111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (p_uuid_cond && p_uuid_cond->p_target_addr)
9131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr,
9141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                    sizeof(tBLE_BD_ADDR));
9151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
9161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
9171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
9181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
9191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("UUID filter udpating failed");
9211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
9221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
9241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
9251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
9271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
9281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_clear_scan_pf_filter
9291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
9301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      clear all adv payload filter by de-select all the adv pf feature bits
9311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
9321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
9331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          BTM_SUCCESS if sucessful,
9341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  BTM_ILLEGAL_VALUE if paramter is not valid.
9351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
9361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
9371a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
9381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_FILT_INDEX filt_index,
9391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_PF_COND_PARAM *p_cond,
9406e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                       tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
9416e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                       tBTM_BLE_FILT_CB_EVT cb_evt,
9421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                       tBTM_BLE_REF_VALUE ref_value)
9431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
9441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBLE_BD_ADDR *p_target = (p_cond == NULL)? NULL : &p_cond->target_addr;
9451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_COUNT *p_bda_filter;
9461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS     st = BTM_WRONG_MODE;
9471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8           param[20], *p;
9481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_SCAN_COND_CLEAR != action)
9501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("unable to perform action:%d for generic adv filter type", action);
9521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return BTM_ILLEGAL_VALUE;
9531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
9541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p = param;
9561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, 20);
9571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
9591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (NULL == p_bda_filter ||
96116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        /* not a generic filter */
96216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        (p_target != NULL && p_bda_filter))
9631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!");
9651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return st;
9661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
9671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
9681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* clear the general filter entry */
9691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (NULL == p_target)
9701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* clear manufactuer data filter */
9726e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
9736e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    BTM_BLE_PF_MANU_DATA, cb_evt, ref_value);
9746e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(BTM_CMD_STARTED == st)
9756e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt,
9766e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    ref_value, NULL, NULL);
9776e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
9781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* clear local name filter */
9796e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
9806e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(BTM_CMD_STARTED == st)
9816e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt,
9826e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    ref_value, NULL, NULL);
9836e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
9841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* update the counter for service data */
9856e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL);
9866e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
9871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* clear UUID filter */
9886e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
9896e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                   BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, ref_value);
9906e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(BTM_CMD_STARTED == st)
9916e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, NULL, NULL);
9926e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
9936e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index,
9946e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                   BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, ref_value);
9956e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(BTM_CMD_STARTED == st)
9966e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt,
9976e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    ref_value, NULL, NULL);
9986e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji
9991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* clear service data filter */
10006e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL,
10016e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, ref_value);
10026e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        if(BTM_CMD_STARTED == st)
10036e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji           btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt,
10046e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                    ref_value, NULL, NULL);
10051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
10061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* select feature based on control block settings */
10081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
10091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
10101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* Filter index */
10121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, filt_index);
10131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* set PCF selection */
10151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT32_TO_STREAM(p, BTM_BLE_PF_SELECT_NONE);
10161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* set logic condition as OR as default */
10171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR);
10181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
10201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                               (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN),
10211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                param,
10221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                btm_ble_scan_pf_cmpl_cback))
10231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            != BTM_NO_RESOURCES)
10241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
10251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (p_target)
10261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
10271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        else
10281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR));
10291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
10301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
10311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
10321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
10341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
10351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         BTM_BleAdvFilterParamSetup
10361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
10371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      This function is called to setup the adv data payload filter
10381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  condition.
10391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
10401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Parameters       action - Type of action to be performed
10411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                       filt_index - Filter index
10421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                       p_filt_params - Filter parameters
10431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                       p_target - Target device
10441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                       p_cmpl_back - Callback pointer
10451a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                       ref_value - reference value
10461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
10471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          void
10481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
10491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
10501a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_index,
10511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                tBTM_BLE_PF_FILT_PARAMS *p_filt_params,
10521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                tBLE_BD_ADDR *p_target, tBTM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
10531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                tBTM_BLE_REF_VALUE ref_value)
10541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
1055f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji    tBTM_STATUS st = BTM_WRONG_MODE;
10561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_BLE_PF_COUNT *p_bda_filter = NULL;
1057f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji    UINT8 len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN +
1058f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji                BTM_BLE_ADV_FILT_TRACK_NUM;
1059f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji    UINT8 param[len], *p;
10601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
106116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
106216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        return st;
106316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
10641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p = param;
1065f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji    memset(param, 0, len);
10661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup");
10671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if (BTM_BLE_SCAN_COND_ADD == action)
10691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
10701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
10711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if (NULL == p_bda_filter)
10721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
10731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           BTM_TRACE_ERROR("BD Address not found!");
10741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji           return st;
10751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
10761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
107716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln);
10781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* select feature based on control block settings */
10791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
10801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
10811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* Filter index */
10831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, filt_index);
10841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* set PCF selection */
10861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT16_TO_STREAM(p, p_filt_params->feat_seln);
10871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* set logic type */
10881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT16_TO_STREAM(p, p_filt_params->logic_type);
10891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* set logic condition */
10901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, p_filt_params->filt_logic_type);
10911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* set RSSI high threshold */
10921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, p_filt_params->rssi_high_thres);
10931a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* set delivery mode */
10941a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, p_filt_params->dely_mode);
10951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
109616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        if (0x01 == p_filt_params->dely_mode)
10971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
10981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            /* set onfound timeout */
10991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT16_TO_STREAM(p, p_filt_params->found_timeout);
11001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            /* set onfound timeout count*/
11011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT8_TO_STREAM(p, p_filt_params->found_timeout_cnt);
11021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            /* set RSSI low threshold */
11031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT8_TO_STREAM(p, p_filt_params->rssi_low_thres);
11041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            /* set onlost timeout */
11051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            UINT16_TO_STREAM(p, p_filt_params->lost_timeout);
1106935324abbe8706307297f09cf79bbcd4efb73367Satya Calloji            /* set num_of_track_entries for firmware greater than L-release version */
1107935324abbe8706307297f09cf79bbcd4efb73367Satya Calloji            if (cmn_ble_vsc_cb.version_supported > BTM_VSC_CHIP_CAPABILITY_L_VERSION)
1108f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji                UINT16_TO_STREAM(p, p_filt_params->num_of_tracking_entries);
11091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
11101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
1111935324abbe8706307297f09cf79bbcd4efb73367Satya Calloji        if (cmn_ble_vsc_cb.version_supported == BTM_VSC_CHIP_CAPABILITY_L_VERSION)
1112f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji            len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN;
1113f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji        else
1114f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji            len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN +
1115f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji                  BTM_BLE_ADV_FILT_TRACK_NUM;
11161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
11181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                (UINT8)len,
11191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 param,
11201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 btm_ble_scan_pf_cmpl_cback))
11211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji               == BTM_NO_RESOURCES)
11221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
11231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
11241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
11256e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_ADV_PARAM,
11266e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                 ref_value, NULL, p_cmpl_cback);
11271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
11281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
112916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_BLE_SCAN_COND_DELETE == action)
11301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
11311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* select feature based on control block settings */
11321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
11331a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_DELETE);
11341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* Filter index */
11351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, filt_index);
11361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
11381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH),
11391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 param,
11401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 btm_ble_scan_pf_cmpl_cback))
11411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji               == BTM_NO_RESOURCES)
11421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
11431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
11441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
11456e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,  BTM_BLE_FILT_ADV_PARAM,
11466e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                 ref_value, NULL, p_cmpl_cback);
11471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
11481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    else
114916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_BLE_SCAN_COND_CLEAR == action)
11501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
11511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* Deallocate all filters here */
11521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
11531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11541a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* select feature based on control block settings */
11551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
11561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR);
11571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
11591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                (UINT8)(BTM_BLE_ADV_FILT_META_HDR_LENGTH-1),
11601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 param,
11611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                 btm_ble_scan_pf_cmpl_cback))
11621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji               == BTM_NO_RESOURCES)
11631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        {
11641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            return st;
11651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        }
11666e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji        btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL,  BTM_BLE_FILT_ADV_PARAM,
11676e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                 ref_value, NULL, p_cmpl_cback);
11681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
11691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11701a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
11711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
11721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
11741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
11751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         BTM_BleEnableDisableFilterFeature
11761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
11771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      This function is called to enable / disable the APCF feature
11781a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
11791a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Parameters  enable the generic scan condition.
11801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  enable: enable or disable the filter condition
11811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  p_stat_cback - Status callback pointer
11821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  ref_value   - Ref value
11831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          void
11841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
11851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
11861a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
11871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                     tBTM_BLE_PF_STATUS_CBACK *p_stat_cback,
11881a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                     tBTM_BLE_REF_VALUE ref_value)
11891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
11901a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8           param[20], *p;
11911a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS     st = BTM_WRONG_MODE;
11921a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
119316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
119416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       return st;
11951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11961a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p = param;
11971a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(param, 0, 20);
11981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
11991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* enable the content filter in controller */
12001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    p = param;
12011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE);
12021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    /* enable adv data payload filtering */
12031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    UINT8_TO_STREAM(p, enable);
12041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if ((st = BTM_VendorSpecificCommand (HCI_BLE_ADV_FILTER_OCF,
12061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              BTM_BLE_PCF_ENABLE_LEN, param,
12071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                              btm_ble_scan_pf_cmpl_cback)) == BTM_CMD_STARTED)
12081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
12091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji         btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback;
12106e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji         btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, BTM_BLE_FILT_ENABLE_DISABLE,
12116e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                  ref_value, NULL, NULL);
12121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
12131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
12141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
12151a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12161a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
12171a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
12181a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         BTM_BleCfgFilterCondition
12191a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
12201a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      This function is called to configure the adv data payload filter
12211a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  condition.
12221a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
12231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Parameters       action: to read/write/clear
12241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  cond_type: filter condition type.
12251a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  filt_index - Filter index
12261a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  p_cond: filter condition parameter
12271a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  p_cmpl_cback  - Config callback pointer
12281a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**                  ref_value - Reference value
12291a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
12301a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          void
12311a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
12321a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
12331a9247a1229aa65b3d1dce16426177bc5828e54dSatya CallojitBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
12341a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                      tBTM_BLE_PF_COND_TYPE cond_type,
12351a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                      tBTM_BLE_PF_FILT_INDEX filt_index,
12361a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                      tBTM_BLE_PF_COND_PARAM *p_cond,
12371a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                      tBTM_BLE_PF_CFG_CBACK *p_cmpl_cback,
12381a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                                      tBTM_BLE_REF_VALUE ref_value)
12391a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
12401a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    tBTM_STATUS     st = BTM_ILLEGAL_VALUE;
12416e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    UINT8 ocf = 0;
12421a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action,
12431a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji                        cond_type, filt_index);
12441a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
124516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
12461a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        return st;
12471a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12481a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    switch (cond_type)
12491a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
12501a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* write service data filter */
12511a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_SRVC_DATA_PATTERN:
12521a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* write manufacturer data filter */
12531a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_MANU_DATA:
12546e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, ref_value);
12551a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12561a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12571a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* write local name filter */
12581a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_LOCAL_NAME:
12591a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            st = btm_ble_update_pf_local_name(action, filt_index, p_cond);
12601a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12611a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12621a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* filter on advertiser address */
12631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_ADDR_FILTER:
12641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            st = btm_ble_update_addr_filter(action, filt_index, p_cond);
12651a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12661a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12671a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        /* filter on service/solicitated UUID */
12681a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_SRVC_UUID:
12691a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_SRVC_SOL_UUID:
12706e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, ref_value);
12711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12731a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_SRVC_DATA:
12741a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            st = btm_ble_update_srvc_data_change(action, filt_index, p_cond);
12751a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12761a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */
12786e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji            st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, p_cmpl_cback,
12796e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                              0, ref_value);
12801a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12811a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12821a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji        default:
12831a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type);
12841a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji            break;
12851a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
12861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
12871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    if(BTM_CMD_STARTED == st && cond_type != BTM_BLE_PF_TYPE_ALL)
12886e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    {
12896e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji       ocf = btm_ble_condtype_to_ocf(cond_type);
12906e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji       btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, p_cmpl_cback, NULL);
12916e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    }
12926e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    else
12936e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    if(BTM_CMD_STARTED == st && BTM_BLE_PF_TYPE_ALL == cond_type)
12946e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    {
12956e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji       btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG,
12966e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji                                ref_value, p_cmpl_cback, NULL);
12976e2d9db5148176d88d7f48c3b2ad5b27c57ca14dSatya Calloji    }
12981a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    return st;
12991a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
13001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
13011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji/*******************************************************************************
13021a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
13031a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Function         btm_ble_adv_filter_init
13041a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
13051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Description      This function initializes the adv filter control block
13061a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
13071a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Parameters
13081a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
13091a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji** Returns          status
13101a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji**
13111a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji*******************************************************************************/
13121a9247a1229aa65b3d1dce16426177bc5828e54dSatya Callojivoid btm_ble_adv_filter_init(void)
13131a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji{
13141a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
131516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
131616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       return;
131716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
131816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (cmn_ble_vsc_cb.max_filter > 0)
131916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    {
132016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        btm_ble_adv_filt_cb.p_addr_filter_count =
13215fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            (tBTM_BLE_PF_COUNT*)osi_malloc(sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter);
132216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    }
13231a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
13241a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
132516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham/*******************************************************************************
132616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
132716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Function         btm_ble_adv_filter_cleanup
132816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
132916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Description      This function de-initializes the adv filter control block
133016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
133116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Parameters
133216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
133316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham** Returns          status
133416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham**
133516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham*******************************************************************************/
133616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadhamvoid btm_ble_adv_filter_cleanup(void)
133716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham{
1338abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free_and_reset((void **)&btm_ble_adv_filt_cb.p_addr_filter_count);
133916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham}
134016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
13411a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji#endif
1342