/*******************************************************************************
*
- * Function BTA_DmBleCfgFilterCondition
- *
- * Description This function is called to configure the adv data payload
- * filter condition.
- *
- * Parameters action: to read/write/clear
- * cond_type: filter condition type
- * filt_index - Filter index
- * p_cond: filter condition parameter
- * p_cmpl_back - Command completed callback
- * ref_value - Reference value
- *
- * Returns void
- *
- ******************************************************************************/
-void BTA_DmBleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
- tBTM_BLE_PF_COND_TYPE cond_type,
- tBTM_BLE_PF_FILT_INDEX filt_index,
- tBTM_BLE_PF_COND_PARAM* p_cond,
- tBTM_BLE_PF_CFG_CBACK update_cb) {
- APPL_TRACE_API("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type);
-
- if (!p_cond) {
- do_in_bta_thread(FROM_HERE,
- base::Bind(&BTM_BleCfgFilterCondition, action, cond_type,
- filt_index, nullptr, update_cb));
- }
-
- uint16_t len = sizeof(tBTM_BLE_PF_COND_PARAM);
- uint8_t* p;
-
- switch (cond_type) {
- case BTM_BLE_PF_SRVC_DATA_PATTERN:
- case BTM_BLE_PF_MANU_DATA:
- /* Length of pattern and pattern mask and other elements in */
- /* tBTM_BLE_PF_MANU_COND */
- len += ((p_cond->manu_data.data_len) * 2) + sizeof(uint16_t) +
- sizeof(uint16_t) + sizeof(uint8_t);
- break;
-
- case BTM_BLE_PF_LOCAL_NAME:
- len += ((p_cond->local_name.data_len) + sizeof(uint8_t));
- break;
-
- case BTM_BLE_PF_SRVC_UUID:
- case BTM_BLE_PF_SRVC_SOL_UUID:
- len += sizeof(tBLE_BD_ADDR) + sizeof(tBTM_BLE_PF_COND_MASK);
- break;
-
- default:
- break;
- }
-
- // base::Owned will free it
- tBTM_BLE_PF_COND_PARAM* p_cond_param = new tBTM_BLE_PF_COND_PARAM;
- memcpy(p_cond_param, p_cond, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- p = p_cond_param->additional_data;
-
- if (cond_type == BTM_BLE_PF_SRVC_DATA_PATTERN ||
- cond_type == BTM_BLE_PF_MANU_DATA) {
- p += sizeof(tBTM_BLE_PF_MANU_COND);
- p_cond_param->manu_data.p_pattern = p;
- p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
- memcpy(p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern,
- p_cond->manu_data.data_len);
- p += p_cond->manu_data.data_len;
-
- if (cond_type == BTM_BLE_PF_MANU_DATA) {
- p_cond_param->manu_data.company_id_mask =
- p_cond->manu_data.company_id_mask;
- if (p_cond->manu_data.p_pattern_mask != NULL) {
- p_cond_param->manu_data.p_pattern_mask = p;
- memcpy(p_cond_param->manu_data.p_pattern_mask,
- p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
- }
- }
- } else if (cond_type == BTM_BLE_PF_LOCAL_NAME) {
- p += sizeof(tBTM_BLE_PF_LOCAL_NAME_COND);
- p_cond_param->local_name.p_data = p;
- p_cond_param->local_name.data_len = p_cond->local_name.data_len;
- memcpy(p_cond_param->local_name.p_data, p_cond->local_name.p_data,
- p_cond->local_name.data_len);
- } else if (cond_type == BTM_BLE_PF_SRVC_UUID ||
- cond_type == BTM_BLE_PF_SRVC_SOL_UUID) {
- p += sizeof(tBTM_BLE_PF_UUID_COND);
- if (p_cond->srvc_uuid.p_target_addr != NULL) {
- p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR*)(p);
- p_cond_param->srvc_uuid.p_target_addr->type =
- p_cond->srvc_uuid.p_target_addr->type;
- memcpy(p_cond_param->srvc_uuid.p_target_addr->bda,
- p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
- p = (uint8_t*)(p_cond_param->srvc_uuid.p_target_addr + 1);
- }
- if (p_cond->srvc_uuid.p_uuid_mask) {
- p_cond_param->srvc_uuid.p_uuid_mask = (tBTM_BLE_PF_COND_MASK*)p;
- memcpy(p_cond_param->srvc_uuid.p_uuid_mask, p_cond->srvc_uuid.p_uuid_mask,
- sizeof(tBTM_BLE_PF_COND_MASK));
- }
- }
-
- do_in_bta_thread(
- FROM_HERE,
- base::Bind(&BTM_BleCfgFilterCondition, action, cond_type, filt_index,
- base::Owned((tBTM_BLE_PF_COND_PARAM*)p_cond_param),
- update_cb));
-}
-
-void BTA_DmBleScanFilterClear(tBTM_BLE_PF_FILT_INDEX filt_index,
- tBTM_BLE_PF_CFG_CBACK update_cb) {
- do_in_bta_thread(
- FROM_HERE,
- base::Bind(&BTM_BleCfgFilterCondition, BTM_BLE_SCAN_COND_CLEAR,
- BTM_BLE_PF_TYPE_ALL, filt_index, nullptr, update_cb));
-}
-
-/*******************************************************************************
- *
* Function BTA_DmBleScanFilterSetup
*
* Description This function is called to setup the adv data payload filter
SCAN_CBACK_IN_JNI(track_adv_event_cb, Owned(btif_scan_track_cb));
}
-void btif_gattc_scan_filter_add_srvc_uuid(tBT_UUID uuid,
- tBTM_BLE_PF_COND_MASK* p_uuid_mask,
- int action, int filt_type,
- int filt_index, int client_if) {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- cond.srvc_uuid.p_target_addr = NULL;
- cond.srvc_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND;
- cond.srvc_uuid.uuid = uuid;
- cond.srvc_uuid.p_uuid_mask = p_uuid_mask;
-
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
-}
-
-void btif_gattc_scan_filter_add_local_name(vector<uint8_t> data, int action,
- int filt_type, int filt_index,
- int client_if) {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- cond.local_name.data_len = data.size();
- cond.local_name.p_data = const_cast<uint8_t*>(data.data());
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
-}
-
-void btif_gattc_scan_filter_add_manu_data(int company_id, int company_id_mask,
- vector<uint8_t> pattern,
- vector<uint8_t> pattern_mask,
- int action, int filt_type,
- int filt_index, int client_if) {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- cond.manu_data.company_id = company_id;
- cond.manu_data.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
- cond.manu_data.data_len = pattern.size();
- cond.manu_data.p_pattern = const_cast<uint8_t*>(pattern.data());
- cond.manu_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
-}
-
-void btif_gattc_scan_filter_add_data_pattern(vector<uint8_t> pattern,
- vector<uint8_t> pattern_mask,
- int action, int filt_type,
- int filt_index, int client_if) {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- cond.srvc_data.data_len = pattern.size();
- cond.srvc_data.p_pattern = const_cast<uint8_t*>(pattern.data());
- cond.srvc_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
-}
-
class BleScannerInterfaceImpl : public BleScannerInterface {
~BleScannerInterfaceImpl(){};
if (data.size() != mask.size() && data.size() != 0 && mask.size() != 0)
return;
+ tBTM_BLE_PF_COND_PARAM* p_cond;
switch (filt_type) {
case BTM_BLE_PF_ADDR_FILTER: {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- bdcpy(cond.target_addr.bda, bd_addr->address);
- cond.target_addr.type = addr_type;
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
- return;
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
+
+ bdcpy(p_cond->target_addr.bda, bd_addr->address);
+ p_cond->target_addr.type = addr_type;
+ break;
}
case BTM_BLE_PF_SRVC_DATA:
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, nullptr,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
- return;
+ p_cond = nullptr;
+ break;
case BTM_BLE_PF_SRVC_UUID: {
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
+
tBT_UUID bt_uuid;
btif_to_bta_uuid(&bt_uuid, p_uuid);
+ p_cond->srvc_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND;
+ p_cond->srvc_uuid.uuid = bt_uuid;
+
if (p_uuid_mask != NULL) {
- tBTM_BLE_PF_COND_MASK uuid_mask;
- btif_to_bta_uuid_mask(&uuid_mask, p_uuid_mask, p_uuid);
- btif_gattc_scan_filter_add_srvc_uuid(
- bt_uuid, &uuid_mask, action, filt_type, filt_index, client_if);
- return;
+ uint8_t* p = (uint8_t*)p_cond + sizeof(tBTM_BLE_PF_UUID_COND);
+ p_cond->srvc_uuid.p_uuid_mask = (tBTM_BLE_PF_COND_MASK*)p;
+ btif_to_bta_uuid_mask(p_cond->srvc_uuid.p_uuid_mask, p_uuid_mask,
+ p_uuid);
}
- btif_gattc_scan_filter_add_srvc_uuid(bt_uuid, nullptr, action,
- filt_type, filt_index, client_if);
- return;
+ break;
}
case BTM_BLE_PF_SRVC_SOL_UUID: {
- tBTM_BLE_PF_COND_PARAM cond;
- memset(&cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
-
- cond.solicitate_uuid.p_target_addr = NULL;
- cond.solicitate_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND;
- btif_to_bta_uuid(&cond.solicitate_uuid.uuid, p_uuid);
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
- BTA_DmBleCfgFilterCondition(
- action, filt_type, filt_index, &cond,
- Bind(&bta_scan_filt_cfg_cb, filt_type, client_if));
- return;
+ p_cond->solicitate_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND;
+ btif_to_bta_uuid(&p_cond->solicitate_uuid.uuid, p_uuid);
+ break;
}
case BTM_BLE_PF_LOCAL_NAME: {
- btif_gattc_scan_filter_add_local_name(std::move(data), action,
- filt_type, filt_index, client_if);
- return;
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
+
+ uint8_t* p = (uint8_t*)p_cond + sizeof(tBTM_BLE_PF_LOCAL_NAME_COND);
+ p_cond->local_name.data_len = data.size();
+ p_cond->local_name.p_data = p;
+ memcpy(p_cond->local_name.p_data, data.data(), data.size());
+ break;
}
case BTM_BLE_PF_MANU_DATA: {
- btif_gattc_scan_filter_add_manu_data(
- company_id, company_id_mask, std::move(data), std::move(mask),
- action, filt_type, filt_index, client_if);
- return;
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
+
+ uint8_t data_len = data.size();
+
+ p_cond->manu_data.company_id = company_id;
+ p_cond->manu_data.company_id_mask =
+ company_id_mask ? company_id_mask : 0xFFFF;
+ p_cond->manu_data.data_len = data_len;
+
+ uint8_t* p = (uint8_t*)p_cond + sizeof(tBTM_BLE_PF_MANU_COND);
+ p_cond->manu_data.p_pattern = p;
+ memcpy(p_cond->manu_data.p_pattern, data.data(), data_len);
+ p += data_len;
+
+ if (mask.size()) {
+ p_cond->manu_data.p_pattern_mask = p;
+ memcpy(p_cond->manu_data.p_pattern_mask, mask.data(), mask.size());
+ }
+ break;
}
case BTM_BLE_PF_SRVC_DATA_PATTERN: {
- btif_gattc_scan_filter_add_data_pattern(
- std::move(data), std::move(mask), action, filt_type, filt_index,
- client_if);
- return;
+ p_cond = new tBTM_BLE_PF_COND_PARAM;
+ memset(p_cond, 0, sizeof(tBTM_BLE_PF_COND_PARAM));
+
+ p_cond->srvc_data.data_len = data.size();
+
+ uint8_t* p = (uint8_t*)p_cond + sizeof(tBTM_BLE_PF_UUID_COND);
+ p_cond->srvc_data.p_pattern = p;
+ memcpy(p_cond->srvc_data.p_pattern, data.data(), data.size());
+ p += data.size();
+ if (mask.size()) {
+ p_cond->srvc_data.p_pattern_mask = p;
+ memcpy(p_cond->srvc_data.p_pattern_mask, mask.data(), mask.size());
+ }
+ break;
}
default:
LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __func__, action);
return;
}
+
+ if (p_cond != nullptr) {
+ do_in_bta_thread(
+ FROM_HERE,
+ base::Bind(&BTM_BleCfgFilterCondition, action, filt_type, filt_index,
+ base::Owned(p_cond),
+ Bind(&bta_scan_filt_cfg_cb, filt_type, client_if)));
+ } else {
+ do_in_bta_thread(FROM_HERE, base::Bind(&BTM_BleCfgFilterCondition, action,
+ filt_type, filt_index, nullptr,
+ Bind(&bta_scan_filt_cfg_cb,
+ filt_type, client_if)));
+ }
}
void ScanFilterClear(int client_if, int filter_index) override {
BTIF_TRACE_DEBUG("%s: filter_index: %d", __func__, filter_index);
- BTA_DmBleScanFilterClear(
- filter_index,
- Bind(&bta_scan_filt_cfg_cb, BTM_BLE_PF_TYPE_ALL, client_if));
+ do_in_bta_thread(
+ FROM_HERE,
+ base::Bind(
+ &BTM_BleCfgFilterCondition, BTM_BLE_SCAN_COND_CLEAR,
+ BTM_BLE_PF_TYPE_ALL, filter_index, nullptr,
+ Bind(&bta_scan_filt_cfg_cb, BTM_BLE_PF_TYPE_ALL, client_if)));
}
void ScanFilterEnable(int client_if, bool enable) override {