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