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