From 1febda970642d98aae351d70fa062200a8d4ee8b Mon Sep 17 00:00:00 2001 From: Jakub Pawlowski Date: Fri, 30 Dec 2016 06:38:29 -0800 Subject: [PATCH] Use callbacks for LE filter functions (BTM layer) This patch use callbacks, instead of custom event queue when scheduling LE filter VSC. Bug: 30622771 Test: sl4a FilteringTest Change-Id: I64ac4392883c647d1e500c257c31a8d3e740a0a8 --- bta/dm/bta_dm_api.cc | 68 ++--- bta/include/bta_api.h | 45 +--- btif/src/btif_ble_scanner.cc | 82 +++--- btif/src/btif_dm.cc | 31 +-- stack/btm/btm_ble_adv_filter.cc | 521 +++++++++++++------------------------- stack/include/btm_ble_api.h | 29 +-- stack/include/btm_ble_api_types.h | 40 +-- 7 files changed, 275 insertions(+), 541 deletions(-) diff --git a/bta/dm/bta_dm_api.cc b/bta/dm/bta_dm_api.cc index baa49e562..1ac0975aa 100644 --- a/bta/dm/bta_dm_api.cc +++ b/bta/dm/bta_dm_api.cc @@ -1159,15 +1159,13 @@ 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* p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value) { + 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(base::IgnoreResult(&BTM_BleCfgFilterCondition), action, - cond_type, filt_index, nullptr, p_cmpl_cback, ref_value)); + 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); @@ -1244,19 +1242,18 @@ void BTA_DmBleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action, } do_in_bta_thread( - FROM_HERE, base::Bind(base::IgnoreResult(&BTM_BleCfgFilterCondition), - action, cond_type, filt_index, - base::Owned((tBTM_BLE_PF_COND_PARAM*)p_cond_param), - p_cmpl_cback, ref_value)); + 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_REF_VALUE ref_value, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback) { - do_in_bta_thread(FROM_HERE, - base::Bind(base::IgnoreResult(&BTM_BleCfgFilterCondition), - BTM_BLE_SCAN_COND_CLEAR, BTM_BLE_PF_TYPE_ALL, - filt_index, nullptr, p_cmpl_cback, ref_value)); +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)); } /******************************************************************************* @@ -1268,22 +1265,19 @@ void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value, * * Parameters filt_index - Filter index * p_filt_params -Filter parameters - * ref_value - Reference value * action - Add, delete or clear - * p_cmpl_back - Command completed callback - * - * Returns void + * cb - Command completed callback * ******************************************************************************/ void BTA_DmBleScanFilterSetup( uint8_t action, tBTM_BLE_PF_FILT_INDEX filt_index, std::unique_ptr p_filt_params, - tBTM_BLE_PF_PARAM_CBACK p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value) { + tBTM_BLE_PF_PARAM_CB cb) { APPL_TRACE_API("%s: %d", __func__, action); + do_in_bta_thread(FROM_HERE, - base::Bind(base::IgnoreResult(&BTM_BleAdvFilterParamSetup), - action, filt_index, base::Passed(&p_filt_params), - p_cmpl_cback, ref_value)); + base::Bind(&BTM_BleAdvFilterParamSetup, action, filt_index, + base::Passed(&p_filt_params), cb)); } /******************************************************************************* @@ -1311,30 +1305,6 @@ void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK* p_cmpl_cback) { /******************************************************************************* * - * Function BTA_DmEnableScanFilter - * - * Description This function is called to enable the adv data payload - * filter - * - * Parameters action - enable or disable the APCF feature - * p_cmpl_cback - Command completed callback - * ref_value - Reference value - * - * Returns void - * - ******************************************************************************/ -void BTA_DmEnableScanFilter(uint8_t action, - tBTM_BLE_PF_STATUS_CBACK* p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value) { - APPL_TRACE_API("%s: %d", __func__, action); - do_in_bta_thread( - FROM_HERE, - base::Bind(base::IgnoreResult(&BTM_BleEnableDisableFilterFeature), action, - p_cmpl_cback, ref_value)); -} - -/******************************************************************************* - * * Function BTA_DmBleUpdateConnectionParams * * Description Update connection parameters, can only be used when diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h index da42ebbca..18ba01a83 100644 --- a/bta/include/bta_api.h +++ b/bta/include/bta_api.h @@ -1837,24 +1837,6 @@ extern void BTA_DmBleDisableBatchScan(tBTM_BLE_REF_VALUE ref_value); /******************************************************************************* * - * Function BTA_DmEnableScanFilter - * - * Description This function is called to enable the adv data payload - * filter - * - * Parameters action - enable or disable the APCF feature - * p_cmpl_cback - Command completed callback - * ref_value - Reference value - * - * Returns void - * - ******************************************************************************/ -extern void BTA_DmEnableScanFilter(uint8_t action, - tBTM_BLE_PF_STATUS_CBACK* p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value); - -/******************************************************************************* - * * Function BTA_DmBleScanFilterSetup * * Description This function is called to setup the filter params @@ -1863,15 +1845,13 @@ extern void BTA_DmEnableScanFilter(uint8_t action, * p_filt_params -Filter parameters * ref_value - Reference value * action - Add, delete or clear - * p_cmpl_back - Command completed callback - * - * Returns void + * cb - Command completed callback * ******************************************************************************/ extern void BTA_DmBleScanFilterSetup( uint8_t action, tBTM_BLE_PF_FILT_INDEX filt_index, std::unique_ptr p_filt_params, - tBTM_BLE_PF_PARAM_CBACK p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_PF_PARAM_CB cb); /******************************************************************************* * @@ -1884,22 +1864,19 @@ extern void BTA_DmBleScanFilterSetup( * cond_type: filter condition type * filt_index - Filter index * p_cond: filter condition parameter - * p_cmpl_back - Command completed callback - * ref_value - Reference value + * cb - Command completed callback * * Returns void * ******************************************************************************/ -extern 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* p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value); - -extern void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value, - tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback); +extern 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, + base::Callback cb); + +extern void BTA_DmBleScanFilterClear( + tBTM_BLE_PF_FILT_INDEX filt_index, + base::Callback cb); /******************************************************************************* * diff --git a/btif/src/btif_ble_scanner.cc b/btif/src/btif_ble_scanner.cc index b26fbcc3b..1af772e15 100644 --- a/btif/src/btif_ble_scanner.cc +++ b/btif/src/btif_ble_scanner.cc @@ -185,24 +185,22 @@ void bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status) { btif_gattc_translate_btm_status(status)); } -void bta_scan_filt_cfg_cb(tBTM_BLE_PF_ACTION action, - tBTM_BLE_SCAN_COND_OP cfg_op, - tBTM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status, - tBTM_BLE_REF_VALUE ref_value) { - SCAN_CBACK_IN_JNI(scan_filter_cfg_cb, action, ref_value, status, cfg_op, +void bta_scan_filt_cfg_cb(uint8_t filt_type, uint8_t client_if, + tBTM_BLE_PF_AVBL_SPACE avbl_space, + tBTM_BLE_PF_ACTION action, tBTA_STATUS status) { + SCAN_CBACK_IN_JNI(scan_filter_cfg_cb, action, client_if, status, filt_type, avbl_space); } -void bta_scan_filt_param_setup_cb(uint8_t action_type, +void bta_scan_filt_param_setup_cb(tBTM_BLE_REF_VALUE ref_value, tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_BLE_REF_VALUE ref_value, - tBTA_STATUS status) { + uint8_t action_type, tBTA_STATUS status) { SCAN_CBACK_IN_JNI(scan_filter_param_cb, action_type, ref_value, status, avbl_space); } -void bta_scan_filt_status_cb(uint8_t action, tBTA_STATUS status, - tBTM_BLE_REF_VALUE ref_value) { +void bta_scan_filt_status_cb(tBTM_BLE_REF_VALUE ref_value, uint8_t action, + tBTA_STATUS status) { SCAN_CBACK_IN_JNI(scan_filter_status_cb, action, ref_value, status); } @@ -364,8 +362,9 @@ void btif_gattc_scan_filter_add_srvc_uuid(tBT_UUID uuid, cond.srvc_uuid.uuid = uuid; cond.srvc_uuid.p_uuid_mask = p_uuid_mask; - BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond, - &bta_scan_filt_cfg_cb, client_if); + 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 data, int action, @@ -376,8 +375,9 @@ void btif_gattc_scan_filter_add_local_name(vector data, int action, cond.local_name.data_len = data.size(); cond.local_name.p_data = const_cast(data.data()); - BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond, - &bta_scan_filt_cfg_cb, client_if); + 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, @@ -393,8 +393,9 @@ void btif_gattc_scan_filter_add_manu_data(int company_id, int company_id_mask, cond.manu_data.data_len = pattern.size(); cond.manu_data.p_pattern = const_cast(pattern.data()); cond.manu_data.p_pattern_mask = const_cast(pattern_mask.data()); - BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond, - &bta_scan_filt_cfg_cb, client_if); + 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 pattern, @@ -407,8 +408,9 @@ void btif_gattc_scan_filter_add_data_pattern(vector pattern, cond.srvc_data.data_len = pattern.size(); cond.srvc_data.p_pattern = const_cast(pattern.data()); cond.srvc_data.p_pattern_mask = const_cast(pattern_mask.data()); - BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond, - &bta_scan_filt_cfg_cb, client_if); + BTA_DmBleCfgFilterCondition( + action, filt_type, filt_index, &cond, + Bind(&bta_scan_filt_cfg_cb, filt_type, client_if)); } class BleScannerInterfaceImpl : public BleScannerInterface { @@ -459,10 +461,9 @@ class BleScannerInterfaceImpl : public BleScannerInterface { BTA_DmBleTrackAdvertiser(client_if, bta_track_adv_event_cb); } - BTA_DmBleScanFilterSetup(action, filt_index, - std::move(adv_filt_param), - bta_scan_filt_param_setup_cb, client_if); - + BTA_DmBleScanFilterSetup( + action, filt_index, std::move(adv_filt_param), + base::Bind(&bta_scan_filt_param_setup_cb, client_if)); }, client_if, action, filt_index, base::Passed(&filt_param))); } @@ -487,16 +488,17 @@ class BleScannerInterfaceImpl : public BleScannerInterface { bdcpy(cond->target_addr.bda, bd_addr->address); cond->target_addr.type = addr_type; - do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, - filt_index, base::Owned(cond), - &bta_scan_filt_cfg_cb, client_if)); + do_in_jni_thread( + Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index, + base::Owned(cond), + Bind(&bta_scan_filt_cfg_cb, filt_type, client_if))); return; } case BTM_BLE_PF_SRVC_DATA: - do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, - filt_index, nullptr, &bta_scan_filt_cfg_cb, - client_if)); + do_in_jni_thread( + Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index, + nullptr, Bind(&bta_scan_filt_cfg_cb, filt_type, client_if))); return; case BTM_BLE_PF_SRVC_UUID: { @@ -526,9 +528,10 @@ class BleScannerInterfaceImpl : public BleScannerInterface { cond->solicitate_uuid.cond_logic = BTM_BLE_PF_LOGIC_AND; btif_to_bta_uuid(&cond->solicitate_uuid.uuid, p_uuid); - do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, - filt_index, base::Owned(cond), - &bta_scan_filt_cfg_cb, client_if)); + do_in_jni_thread( + Bind(&BTA_DmBleCfgFilterCondition, action, filt_type, filt_index, + base::Owned(cond), + Bind(&bta_scan_filt_cfg_cb, filt_type, client_if))); return; } @@ -561,16 +564,25 @@ class BleScannerInterfaceImpl : public BleScannerInterface { void ScanFilterClear(int client_if, int filter_index) override { BTIF_TRACE_DEBUG("%s: filter_index: %d", __func__, filter_index); - do_in_jni_thread(Bind(&BTA_DmBleScanFilterClear, client_if, filter_index, - &bta_scan_filt_cfg_cb)); + + do_in_jni_thread( + Bind(&BTA_DmBleScanFilterClear, filter_index, + Bind(&bta_scan_filt_cfg_cb, BTM_BLE_PF_TYPE_ALL, client_if))); } void ScanFilterEnable(int client_if, bool enable) override { BTIF_TRACE_DEBUG("%s: enable: %d", __func__, enable); uint8_t action = enable ? 1 : 0; - do_in_jni_thread(Bind(&BTA_DmEnableScanFilter, action, - &bta_scan_filt_status_cb, client_if)); + do_in_jni_thread(Bind( + [](int client_if, bool action) { + do_in_bta_thread( + FROM_HERE, + base::Bind(&BTM_BleEnableDisableFilterFeature, action, + base::Bind(&bta_scan_filt_status_cb, client_if))); + + }, + client_if, action)); } void SetScanParameters(int client_if, int scan_interval, diff --git a/btif/src/btif_dm.cc b/btif/src/btif_dm.cc index 2a725fd85..6429e9980 100644 --- a/btif/src/btif_dm.cc +++ b/btif/src/btif_dm.cc @@ -29,6 +29,7 @@ #include "btif_dm.h" +#include #include #include #include @@ -228,10 +229,8 @@ static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF* p_notif_req); static void btif_dm_ble_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type); static void btif_dm_ble_sc_oob_req_evt(tBTA_DM_SP_RMT_OOB* req_oob_type); -static void bte_scan_filt_param_cfg_evt(uint8_t action_type, - tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_BLE_REF_VALUE ref_value, - tBTA_STATUS status); +static void bte_scan_filt_param_cfg_evt(uint8_t action_type, uint8_t avbl_space, + uint8_t ref_value, uint8_t status); static char* btif_get_default_local_name(); @@ -1347,7 +1346,7 @@ static void btif_dm_search_devices_evt(uint16_t event, char* p_param) { case BTA_DM_INQ_CMPL_EVT: { BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr, - bte_scan_filt_param_cfg_evt, 0); + base::Bind(&bte_scan_filt_param_cfg_evt, 0)); } break; case BTA_DM_DISC_CMPL_EVT: { HAL_CBACK(bt_hal_cbacks, discovery_state_changed_cb, @@ -1367,7 +1366,7 @@ static void btif_dm_search_devices_evt(uint16_t event, char* p_param) { btgatt_filt_param_setup_t adv_filt_param; memset(&adv_filt_param, 0, sizeof(btgatt_filt_param_setup_t)); BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr, - bte_scan_filt_param_cfg_evt, 0); + base::Bind(&bte_scan_filt_param_cfg_evt, 0)); HAL_CBACK(bt_hal_cbacks, discovery_state_changed_cb, BT_DISCOVERY_STOPPED); } @@ -2118,19 +2117,9 @@ static void bta_energy_info_cb(tBTA_DM_BLE_TX_TIME_MS tx_time, NULL); } -/******************************************************************************* - * - * Function bte_scan_filt_param_cfg_evt - * - * Description Scan filter param config event - * - * Returns void - * - ******************************************************************************/ -static void bte_scan_filt_param_cfg_evt(uint8_t action_type, - tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_BLE_REF_VALUE ref_value, - tBTA_STATUS status) { +/* Scan filter param config event */ +static void bte_scan_filt_param_cfg_evt(uint8_t ref_value, uint8_t avbl_space, + uint8_t action_type, uint8_t status) { /* This event occurs on calling BTA_DmBleCfgFilterCondition internally, ** and that is why there is no HAL callback */ @@ -2164,7 +2153,7 @@ bt_status_t btif_dm_start_discovery(void) { /* Cleanup anything remaining on index 0 */ BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_DELETE, 0, nullptr, - bte_scan_filt_param_cfg_evt, 0); + base::Bind(&bte_scan_filt_param_cfg_evt, 0)); auto adv_filt_param = std::make_unique(); /* Add an allow-all filter on index 0*/ @@ -2175,7 +2164,7 @@ bt_status_t btif_dm_start_discovery(void) { adv_filt_param->rssi_low_thres = LOWEST_RSSI_VALUE; adv_filt_param->rssi_high_thres = LOWEST_RSSI_VALUE; BTA_DmBleScanFilterSetup(BTM_BLE_SCAN_COND_ADD, 0, std::move(adv_filt_param), - bte_scan_filt_param_cfg_evt, 0); + base::Bind(&bte_scan_filt_param_cfg_evt, 0)); /* TODO: Do we need to handle multiple inquiries at the same time? */ diff --git a/stack/btm/btm_ble_adv_filter.cc b/stack/btm/btm_ble_adv_filter.cc index 3b222b4ba..d26a5e0d2 100644 --- a/stack/btm/btm_ble_adv_filter.cc +++ b/stack/btm/btm_ble_adv_filter.cc @@ -18,6 +18,7 @@ #define LOG_TAG "bt_btm_ble" +#include #include #include "bt_target.h" @@ -99,77 +100,6 @@ tBTM_STATUS btm_ble_obtain_vsc_details() { /******************************************************************************* * - * Function btm_ble_advfilt_enq_op_q - * - * Description enqueue an adv filter operation in the q to check command - * complete status - * - * Returns void - * - ******************************************************************************/ -void btm_ble_advfilt_enq_op_q(uint8_t action, uint8_t ocf, - tBTM_BLE_FILT_CB_EVT cb_evt, - tBTM_BLE_REF_VALUE ref, - tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback, - tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback) { - btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx] = - (action | (ocf << 4)); - btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.next_idx] = ref; - btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.next_idx] = cb_evt; - btm_ble_adv_filt_cb.op_q.p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.next_idx] = - p_cmpl_cback; - btm_ble_adv_filt_cb.op_q - .p_filt_param_cback[btm_ble_adv_filt_cb.op_q.next_idx] = - p_filt_param_cback; - BTM_TRACE_DEBUG( - "btm_ble_advfilt_enq_op_q: act_ocf:%d, action:%d, ocf:%d,cb_evt;%d, " - "cback:%x", - btm_ble_adv_filt_cb.op_q.action_ocf[btm_ble_adv_filt_cb.op_q.next_idx], - action, ocf, cb_evt, p_cmpl_cback); - btm_ble_adv_filt_cb.op_q.next_idx = - (btm_ble_adv_filt_cb.op_q.next_idx + 1) % BTM_BLE_PF_TYPE_MAX; -} - -/******************************************************************************* - * - * Function btm_ble_advfilt_deq_op_q - * - * Description dequeue an adv filter operation from q when command complete - * is received - * - * Returns void - * - ******************************************************************************/ -void btm_ble_advfilt_deq_op_q(uint8_t* p_action, uint8_t* p_ocf, - tBTM_BLE_FILT_CB_EVT* p_cb_evt, - tBTM_BLE_REF_VALUE* p_ref, - tBTM_BLE_PF_CFG_CBACK** p_cmpl_cback, - tBTM_BLE_PF_PARAM_CBACK** p_filt_param_cback) { - *p_ocf = (btm_ble_adv_filt_cb.op_q - .action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] >> - 4); - *p_action = (btm_ble_adv_filt_cb.op_q - .action_ocf[btm_ble_adv_filt_cb.op_q.pending_idx] & - BTM_BLE_ADV_FILT_SUBCODE_MASK); - *p_ref = - btm_ble_adv_filt_cb.op_q.ref_value[btm_ble_adv_filt_cb.op_q.pending_idx]; - *p_cb_evt = - btm_ble_adv_filt_cb.op_q.cb_evt[btm_ble_adv_filt_cb.op_q.pending_idx]; - *p_cmpl_cback = btm_ble_adv_filt_cb.op_q - .p_scan_cfg_cback[btm_ble_adv_filt_cb.op_q.pending_idx]; - *p_filt_param_cback = - btm_ble_adv_filt_cb.op_q - .p_filt_param_cback[btm_ble_adv_filt_cb.op_q.pending_idx]; - - btm_ble_adv_filt_cb.op_q.pending_idx = - (btm_ble_adv_filt_cb.op_q.pending_idx + 1) % BTM_BLE_PF_TYPE_MAX; - BTM_TRACE_DEBUG( - "btm_ble_advfilt_deq_op_q: ocf:%d, action:%d, ref_value:%d, cb_evt:%x", - *p_ocf, *p_action, *p_ref, *p_cb_evt); -} - -/******************************************************************************* - * * Function btm_ble_condtype_to_ocf * * Description Convert cond_type to OCF @@ -253,118 +183,46 @@ uint8_t btm_ble_ocf_to_condtype(uint8_t ocf) { return cond_type; } -/******************************************************************************* - * - * Function btm_ble_scan_pf_cmpl_cback - * - * Description the BTM BLE customer feature VSC complete callback for ADV - * PF filtering - * - * Returns pointer to the counter if found; NULL otherwise. - * - ******************************************************************************/ -void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL* p_params) { - uint8_t status = 0; - uint8_t *p = p_params->p_param_buf, op_subcode = 0, action = 0xff; - uint16_t evt_len = p_params->param_len; - uint8_t ocf = BTM_BLE_META_PF_ALL, cond_type = 0; - uint8_t num_avail = 0, cb_evt = 0; - tBTM_BLE_REF_VALUE ref_value = 0; - tBTM_BLE_PF_CFG_CBACK* p_scan_cfg_cback = NULL; - tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback = NULL; - - if (evt_len < 3 || evt_len > 4) { - BTM_TRACE_ERROR( - "%s cannot interpret APCF callback status = %d, length = %d", __func__, - status, evt_len); - btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, - &p_scan_cfg_cback, &p_filt_param_cback); +void btm_flt_update_cb(uint8_t expected_ocf, tBTM_BLE_PF_CFG_CBACK cb, + uint8_t* p, uint16_t evt_len) { + if (evt_len != 4) { + BTM_TRACE_ERROR("%s: bad length: %d", __func__, evt_len); return; } - btm_ble_advfilt_deq_op_q(&action, &ocf, &cb_evt, &ref_value, - &p_scan_cfg_cback, &p_filt_param_cback); - + uint8_t status, op_subcode, action, num_avail; STREAM_TO_UINT8(status, p); STREAM_TO_UINT8(op_subcode, p); STREAM_TO_UINT8(action, p); + STREAM_TO_UINT8(num_avail, p); - /* Ignore the event, if it is not the same one expected */ - if (3 == evt_len) { - if (ocf != op_subcode) { - BTM_TRACE_ERROR( - "btm_ble_scan_pf_cmpl_cback:3-Incorrect opcode :%d, %d, %d, %d, %d, " - "%d", - ocf, op_subcode, action, evt_len, ref_value, status); - return; - } else { - if (NULL != btm_ble_adv_filt_cb.p_filt_stat_cback) - btm_ble_adv_filt_cb.p_filt_stat_cback(action, status, ref_value); - BTM_TRACE_DEBUG( - "btm_ble_scan_pf_cmpl_cback enabled/disabled, %d, %d, %d, %d", ocf, - action, status, ref_value); - return; - } + if (expected_ocf != op_subcode) { + BTM_TRACE_ERROR("%s: Incorrect opcode: 0x%02x, expected: 0x%02x", __func__, + expected_ocf, op_subcode); + return; } - if (4 == evt_len && ocf != op_subcode) { - BTM_TRACE_ERROR( - "btm_ble_scan_pf_cmpl_cback:4-Incorrect opcode: %d, %d, %d, %d, %d", - ocf, op_subcode, action, status, ref_value); + if (op_subcode == BTM_BLE_META_PF_FEAT_SEL) { + cb.Run(num_avail, action, status); return; } - STREAM_TO_UINT8(num_avail, p); - switch (op_subcode) { - case BTM_BLE_META_PF_ADDR: - case BTM_BLE_META_PF_UUID: - case BTM_BLE_META_PF_SOL_UUID: - case BTM_BLE_META_PF_LOCAL_NAME: - case BTM_BLE_META_PF_MANU_DATA: - case BTM_BLE_META_PF_SRVC_DATA: - cond_type = btm_ble_ocf_to_condtype(ocf); - BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback Recd: %d, %d, %d, %d, %d, %d", - op_subcode, ocf, action, status, ref_value, num_avail); - if (HCI_SUCCESS == status) { - if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, - BD_ADDR_LEN) == 0) - btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail); - else - btm_ble_cs_update_pf_counter(action, cond_type, - &btm_ble_adv_filt_cb.cur_filter_target, - num_avail); - } - - /* send ADV PF operation complete */ - btm_ble_adv_filt_cb.op_type = 0; - break; - - case BTM_BLE_META_PF_FEAT_SEL: - BTM_TRACE_DEBUG( - "btm_ble_scan_pf_cmpl_cback-Feat sel event: %d, %d, %d, %d", action, - status, ref_value, num_avail); - break; - - default: - BTM_TRACE_ERROR("btm_ble_scan_pf_cmpl_cback: unknown operation: %d", - op_subcode); - break; + uint8_t cond_type = btm_ble_ocf_to_condtype(expected_ocf); + BTM_TRACE_DEBUG("%s: Recd: %d, %d, %d, %d, %d", __func__, op_subcode, + expected_ocf, action, status, num_avail); + if (HCI_SUCCESS == status) { + if (memcmp(&btm_ble_adv_filt_cb.cur_filter_target.bda, &na_bda, + BD_ADDR_LEN) == 0) + btm_ble_cs_update_pf_counter(action, cond_type, NULL, num_avail); + else + btm_ble_cs_update_pf_counter( + action, cond_type, &btm_ble_adv_filt_cb.cur_filter_target, num_avail); } - switch (cb_evt) { - BTM_TRACE_DEBUG("btm_ble_scan_pf_cmpl_cback: calling the cback: %d", - cb_evt); - case BTM_BLE_FILT_CFG: - if (NULL != p_scan_cfg_cback) - p_scan_cfg_cback(action, cond_type, num_avail, status, ref_value); - break; - case BTM_BLE_FILT_ADV_PARAM: - if (NULL != p_filt_param_cback) - p_filt_param_cback(action, num_avail, ref_value, status); - break; - default: - break; - } + /* send ADV PF operation complete */ + btm_ble_adv_filt_cb.op_type = 0; + + cb.Run(num_avail, action, status); } /******************************************************************************* @@ -465,7 +323,8 @@ bool btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR* p_bd_addr, ******************************************************************************/ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_COND_PARAM* p_cond) { + tBTM_BLE_PF_COND_PARAM* p_cond, + tBTM_BLE_PF_CFG_CBACK cb) { tBTM_BLE_PF_LOCAL_NAME_COND* p_local_name = (p_cond == NULL) ? NULL : &p_cond->local_name; uint8_t param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_ADV_FILT_META_HDR_LENGTH], @@ -491,8 +350,10 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, } /* send local name filter */ - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param, - btm_ble_scan_pf_cmpl_cback); + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len, + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_LOCAL_NAME, cb)); + memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); return BTM_CMD_STARTED; } @@ -507,7 +368,8 @@ tBTM_STATUS btm_ble_update_pf_local_name(tBTM_BLE_SCAN_COND_OP action, * Returns BTM_SUCCESS if sucessful, * BTM_ILLEGAL_VALUE if paramter is not valid. * - ******************************************************************************/ +4 +******************************************************************************/ tBTM_STATUS btm_ble_update_srvc_data_change(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_PARAM* p_cond) { @@ -538,23 +400,20 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_PARAM* p_data, tBTM_BLE_PF_COND_TYPE cond_type, - tBTM_BLE_FILT_CB_EVT cb_evt, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_BLE_PF_MANU_COND* p_manu_data = - (p_data == NULL) ? NULL : &p_data->manu_data; - tBTM_BLE_PF_SRVC_PATTERN_COND* p_srvc_data = - (p_data == NULL) ? NULL : &p_data->srvc_data; - - uint8_t param[BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + - BTM_BLE_ADV_FILT_META_HDR_LENGTH], - *p = param, len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; - tBTM_STATUS st = BTM_ILLEGAL_VALUE; + tBTM_BLE_PF_CFG_CBACK cb) { + if (!p_data) return BTM_ILLEGAL_VALUE; - if (NULL == p_data) return st; + tBTM_BLE_PF_MANU_COND* p_manu_data = &p_data->manu_data; + tBTM_BLE_PF_SRVC_PATTERN_COND* p_srvc_data = &p_data->srvc_data; - memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + - BTM_BLE_ADV_FILT_META_HDR_LENGTH); + int param_len = BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + + BTM_BLE_ADV_FILT_META_HDR_LENGTH; + uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; + uint8_t param[param_len]; + memset(param, 0, param_len); + + uint8_t* p = param; if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) { UINT8_TO_STREAM(p, BTM_BLE_META_PF_SRVC_DATA); } else { @@ -562,13 +421,11 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, } UINT8_TO_STREAM(p, action); - - /* Filter index */ UINT8_TO_STREAM(p, filt_index); if (BTM_BLE_SCAN_COND_ADD == action || BTM_BLE_SCAN_COND_DELETE == action) { if (BTM_BLE_PF_SRVC_DATA_PATTERN == cond_type) { - if (NULL == p_srvc_data) return st; + if (NULL == p_srvc_data) return BTM_ILLEGAL_VALUE; if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2); @@ -582,11 +439,10 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, BTM_TRACE_DEBUG("Service data length: %d", len); } else { if (NULL == p_manu_data) { - BTM_TRACE_ERROR("btm_ble_update_pf_manu_data - No manuf data"); - return st; + BTM_TRACE_ERROR("%s: No manuf data", __func__); + return BTM_ILLEGAL_VALUE; } - BTM_TRACE_EVENT("btm_ble_update_pf_manu_data length: %d", - p_manu_data->data_len); + BTM_TRACE_EVENT("%s: length: %d", __func__, p_manu_data->data_len); if (p_manu_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2)) p_manu_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2); @@ -614,9 +470,10 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action, } } - /* send manufacturer*/ - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param, - btm_ble_scan_pf_cmpl_cback); + uint8_t expected_ocf = btm_ble_condtype_to_ocf(cond_type); + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len, + base::Bind(&btm_flt_update_cb, expected_ocf, cb)); + memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); return BTM_CMD_STARTED; } @@ -698,12 +555,13 @@ uint8_t btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action, ******************************************************************************/ tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, - tBTM_BLE_PF_COND_PARAM* p_cond) { - uint8_t param[BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH], - *p = param; + tBTM_BLE_PF_COND_PARAM* p_cond, + tBTM_BLE_PF_CFG_CBACK cb) { + const uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN; + uint8_t param[len], *p = param; tBLE_BD_ADDR* p_addr = (p_cond == NULL) ? NULL : &p_cond->target_addr; - memset(param, 0, BTM_BLE_META_ADDR_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH); + memset(param, 0, len); UINT8_TO_STREAM(p, BTM_BLE_META_PF_ADDR); UINT8_TO_STREAM(p, action); @@ -717,11 +575,12 @@ tBTM_STATUS btm_ble_update_addr_filter(tBTM_BLE_SCAN_COND_OP action, BDADDR_TO_STREAM(p, p_addr->bda); UINT8_TO_STREAM(p, p_addr->type); } + /* send address filter */ - BTM_VendorSpecificCommand( - HCI_BLE_ADV_FILTER_OCF, - (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), - param, btm_ble_scan_pf_cmpl_cback); + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len, + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_ADDR, cb)); + memset(&btm_ble_adv_filt_cb.cur_filter_target, 0, sizeof(tBLE_BD_ADDR)); return BTM_CMD_STARTED; } @@ -742,8 +601,7 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_TYPE filter_type, tBTM_BLE_PF_COND_PARAM* p_cond, - tBTM_BLE_FILT_CB_EVT cb_evt, - tBTM_BLE_REF_VALUE ref_value) { + tBTM_BLE_PF_CFG_CBACK cb) { uint8_t param[BTM_BLE_META_UUID_LEN + BTM_BLE_ADV_FILT_META_HDR_LENGTH], *p = param, len = BTM_BLE_ADV_FILT_META_HDR_LENGTH; tBTM_BLE_PF_UUID_COND* p_uuid_cond; @@ -778,13 +636,12 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, BDADDR_TO_STREAM(p, p_uuid_cond->p_target_addr->bda); UINT8_TO_STREAM(p, p_uuid_cond->p_target_addr->type); + tBTM_BLE_PF_CFG_CBACK fDoNothing; /* send address filter */ - BTM_VendorSpecificCommand( - HCI_BLE_ADV_FILTER_OCF, + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_META_ADDR_LEN), - param, btm_ble_scan_pf_cmpl_cback); - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_ADDR, cb_evt, ref_value, - NULL, NULL); + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_ADDR, fDoNothing)); BTM_TRACE_DEBUG("Updated Address filter"); } @@ -829,13 +686,14 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, memset(p, 0xff, p_uuid_cond->uuid.len); len += p_uuid_cond->uuid.len; } - BTM_TRACE_DEBUG("btm_ble_update_uuid_filter : %d, %d, %d, %d", filter_type, - evt_type, p_uuid_cond->uuid.len, len); + BTM_TRACE_DEBUG("%s : %d, %d, %d, %d", __func__, filter_type, evt_type, + p_uuid_cond->uuid.len, len); } /* send UUID filter update */ - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, len, param, - btm_ble_scan_pf_cmpl_cback); + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len, + base::Bind(&btm_flt_update_cb, evt_type, cb)); + if (p_uuid_cond && p_uuid_cond->p_target_addr) memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_uuid_cond->p_target_addr, sizeof(tBLE_BD_ADDR)); @@ -860,12 +718,9 @@ tBTM_STATUS btm_ble_update_uuid_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, tBTM_BLE_PF_FILT_INDEX filt_index, tBTM_BLE_PF_COND_PARAM* p_cond, - tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback, - tBTM_BLE_FILT_CB_EVT cb_evt, - tBTM_BLE_REF_VALUE ref_value) { + tBTM_BLE_PF_CFG_CBACK cb) { tBLE_BD_ADDR* p_target = (p_cond == NULL) ? NULL : &p_cond->target_addr; tBTM_BLE_PF_COUNT* p_bda_filter; - tBTM_STATUS st = BTM_WRONG_MODE; uint8_t param[20], *p; if (BTM_BLE_SCAN_COND_CLEAR != action) { @@ -884,51 +739,34 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, (p_target != NULL && p_bda_filter)) { BTM_TRACE_ERROR( "Error: Can not clear filter, No PF filter has been configured!"); - return st; + return BTM_WRONG_MODE; } + tBTM_BLE_PF_CFG_CBACK fDoNothing; + /* clear the general filter entry */ if (NULL == p_target) { /* clear manufactuer data filter */ - st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, - BTM_BLE_PF_MANU_DATA, cb_evt, ref_value); - if (BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_MANU_DATA, cb_evt, - ref_value, NULL, NULL); + btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, + BTM_BLE_PF_MANU_DATA, fDoNothing); /* clear local name filter */ - st = - btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL); - if (BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_LOCAL_NAME, cb_evt, - ref_value, NULL, NULL); + btm_ble_update_pf_local_name(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, + fDoNothing); /* update the counter for service data */ - st = btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, - NULL); + btm_ble_update_srvc_data_change(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL); /* clear UUID filter */ - st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, - BTM_BLE_PF_SRVC_UUID, NULL, cb_evt, - ref_value); - if (BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_UUID, cb_evt, ref_value, - NULL, NULL); - - st = btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, - BTM_BLE_PF_SRVC_SOL_UUID, NULL, cb_evt, - ref_value); - if (BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SOL_UUID, cb_evt, - ref_value, NULL, NULL); + btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, + BTM_BLE_PF_SRVC_UUID, NULL, fDoNothing); + + btm_ble_update_uuid_filter(BTM_BLE_SCAN_COND_CLEAR, filt_index, + BTM_BLE_PF_SRVC_SOL_UUID, NULL, fDoNothing); /* clear service data filter */ - st = btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, - BTM_BLE_PF_SRVC_DATA_PATTERN, cb_evt, - ref_value); - if (BTM_CMD_STARTED == st) - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_SRVC_DATA, cb_evt, - ref_value, NULL, NULL); + btm_ble_update_pf_manu_data(BTM_BLE_SCAN_COND_CLEAR, filt_index, NULL, + BTM_BLE_PF_SRVC_DATA_PATTERN, fDoNothing); } /* select feature based on control block settings */ @@ -943,10 +781,11 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, /* set logic condition as OR as default */ UINT8_TO_STREAM(p, BTM_BLE_PF_LOGIC_OR); - BTM_VendorSpecificCommand( - HCI_BLE_ADV_FILTER_OCF, + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_PF_FEAT_SEL_LEN), - param, btm_ble_scan_pf_cmpl_cback); + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb)); + if (p_target) memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR)); @@ -965,25 +804,21 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action, * Parameters action - Type of action to be performed * filt_index - Filter index * p_filt_params - Filter parameters - * p_cmpl_back - Callback pointer - * ref_value - reference value - * - * Returns void + * cb - Callback * ******************************************************************************/ -tBTM_STATUS BTM_BleAdvFilterParamSetup( +void BTM_BleAdvFilterParamSetup( int action, tBTM_BLE_PF_FILT_INDEX filt_index, std::unique_ptr p_filt_params, - tBTM_BLE_PF_PARAM_CBACK* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value) { + tBTM_BLE_PF_PARAM_CB cb) { tBTM_BLE_PF_COUNT* p_bda_filter = NULL; uint8_t len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN + BTM_BLE_ADV_FILT_TRACK_NUM; uint8_t param[len], *p; if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { - if (p_cmpl_cback) - p_cmpl_cback(BTM_BLE_PF_ENABLE, 0, ref_value, 1 /* BTA_FAILURE */); - return BTM_WRONG_MODE; + cb.Run(0, BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */); + return; } p = param; @@ -994,9 +829,8 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup( p_bda_filter = btm_ble_find_addr_filter_counter(nullptr); if (NULL == p_bda_filter) { BTM_TRACE_ERROR("BD Address not found!"); - if (p_cmpl_cback) - p_cmpl_cback(BTM_BLE_PF_ENABLE, 0, ref_value, 1 /* BTA_FAILURE */); - return BTM_WRONG_MODE; + cb.Run(0, BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */); + return; } BTM_TRACE_DEBUG("%s : Feat mask:%d", __func__, p_filt_params->feat_seln); @@ -1038,11 +872,9 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup( len = BTM_BLE_ADV_FILT_META_HDR_LENGTH + BTM_BLE_ADV_FILT_FEAT_SELN_LEN + BTM_BLE_ADV_FILT_TRACK_NUM; - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, (uint8_t)len, param, - btm_ble_scan_pf_cmpl_cback); - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, - BTM_BLE_FILT_ADV_PARAM, ref_value, NULL, - p_cmpl_cback); + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, len, + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb)); } else if (BTM_BLE_SCAN_COND_DELETE == action) { /* select feature based on control block settings */ UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL); @@ -1050,12 +882,10 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup( /* Filter index */ UINT8_TO_STREAM(p, filt_index); - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, - (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH), - param, btm_ble_scan_pf_cmpl_cback); - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, - BTM_BLE_FILT_ADV_PARAM, ref_value, NULL, - p_cmpl_cback); + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, + (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH), + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb)); } else if (BTM_BLE_SCAN_COND_CLEAR == action) { /* Deallocate all filters here */ btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL); @@ -1064,14 +894,32 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup( UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL); UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_CLEAR); - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, - (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH - 1), - param, btm_ble_scan_pf_cmpl_cback); - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, - BTM_BLE_FILT_ADV_PARAM, ref_value, NULL, - p_cmpl_cback); + btu_hcif_send_cmd_with_cb( + FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, + (uint8_t)(BTM_BLE_ADV_FILT_META_HDR_LENGTH - 1), + base::Bind(&btm_flt_update_cb, BTM_BLE_META_PF_FEAT_SEL, cb)); } - return BTM_CMD_STARTED; +} + +void enable_cmpl_cback(tBTM_BLE_PF_STATUS_CBACK p_stat_cback, uint8_t* p, + uint16_t evt_len) { + uint8_t status, op_subcode, action; + + if (evt_len != 3) { + BTM_TRACE_ERROR("%s: APCF callback length = %d", __func__, evt_len); + return; + } + + STREAM_TO_UINT8(status, p); + STREAM_TO_UINT8(op_subcode, p); + STREAM_TO_UINT8(action, p); + + if (op_subcode != BTM_BLE_META_PF_ENABLE) { + BTM_TRACE_ERROR("%s :bad subcode: 0x%02x", __func__, op_subcode); + return; + } + + p_stat_cback.Run(action, status); } /******************************************************************************* @@ -1080,40 +928,27 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup( * * Description This function is called to enable / disable the APCF feature * - * Parameters enable the generic scan condition. - * enable: enable or disable the filter condition + * Parameters enable: enable or disable the filter condition * p_stat_cback - Status callback pointer - * ref_value - Ref value - * Returns void * ******************************************************************************/ -tBTM_STATUS BTM_BleEnableDisableFilterFeature( - uint8_t enable, tBTM_BLE_PF_STATUS_CBACK* p_stat_cback, - tBTM_BLE_REF_VALUE ref_value) { - uint8_t param[20], *p; - tBTM_STATUS st = BTM_WRONG_MODE; - +void BTM_BleEnableDisableFilterFeature(uint8_t enable, + tBTM_BLE_PF_STATUS_CBACK p_stat_cback) { if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { - if (p_stat_cback) - p_stat_cback(BTM_BLE_PF_ENABLE, ref_value, 1 /* BTA_FAILURE */); - return st; + if (p_stat_cback) p_stat_cback.Run(BTM_BLE_PF_ENABLE, 1 /* BTA_FAILURE */); + return; } - p = param; + uint8_t param[20]; memset(param, 0, 20); - /* enable the content filter in controller */ - p = param; + uint8_t* p = param; UINT8_TO_STREAM(p, BTM_BLE_META_PF_ENABLE); - /* enable adv data payload filtering */ UINT8_TO_STREAM(p, enable); - BTM_VendorSpecificCommand(HCI_BLE_ADV_FILTER_OCF, BTM_BLE_PCF_ENABLE_LEN, - param, btm_ble_scan_pf_cmpl_cback); - btm_ble_adv_filt_cb.p_filt_stat_cback = p_stat_cback; - btm_ble_advfilt_enq_op_q(enable, BTM_BLE_META_PF_ENABLE, - BTM_BLE_FILT_ENABLE_DISABLE, ref_value, NULL, NULL); - return BTM_CMD_STARTED; + btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADV_FILTER_OCF, param, + BTM_BLE_PCF_ENABLE_LEN, + base::Bind(&enable_cmpl_cback, p_stat_cback)); } /******************************************************************************* @@ -1127,89 +962,77 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature( * cond_type: filter condition type. * filt_index - Filter index * p_cond: filter condition parameter - * p_cmpl_cback - Config callback pointer - * ref_value - Reference value - * - * Returns void + * cb - Config callback * ******************************************************************************/ -tBTM_STATUS BTM_BleCfgFilterCondition(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* p_cmpl_cback, - tBTM_BLE_REF_VALUE ref_value) { - tBTM_STATUS st = BTM_ILLEGAL_VALUE; +void BTM_BleCfgFilterCondition(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 cb) { BTM_TRACE_EVENT("%s action:%d, cond_type:%d, index:%d", __func__, action, cond_type, filt_index); if (BTM_SUCCESS != btm_ble_obtain_vsc_details()) { - if (p_cmpl_cback) { - p_cmpl_cback(BTM_BLE_PF_CONFIG, cond_type, 0, 1 /*BTA_FAILURE*/, - ref_value); - } - return st; + cb.Run(0, BTM_BLE_PF_CONFIG, 1 /*BTA_FAILURE*/); + return; } + // uint8_t ocf = btm_ble_condtype_to_ocf(cond_type); + uint8_t st; + switch (cond_type) { /* write service data filter */ case BTM_BLE_PF_SRVC_DATA_PATTERN: /* write manufacturer data filter */ case BTM_BLE_PF_MANU_DATA: - st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, 0, - ref_value); + st = btm_ble_update_pf_manu_data(action, filt_index, p_cond, cond_type, + cb); break; /* write local name filter */ case BTM_BLE_PF_LOCAL_NAME: - st = btm_ble_update_pf_local_name(action, filt_index, p_cond); + st = btm_ble_update_pf_local_name(action, filt_index, p_cond, cb); break; /* filter on advertiser address */ case BTM_BLE_PF_ADDR_FILTER: - st = btm_ble_update_addr_filter(action, filt_index, p_cond); + st = btm_ble_update_addr_filter(action, filt_index, p_cond, cb); break; /* filter on service/solicitated UUID */ case BTM_BLE_PF_SRVC_UUID: case BTM_BLE_PF_SRVC_SOL_UUID: - st = btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, 0, - ref_value); + st = + btm_ble_update_uuid_filter(action, filt_index, cond_type, p_cond, cb); break; case BTM_BLE_PF_SRVC_DATA: st = btm_ble_update_srvc_data_change(action, filt_index, p_cond); + + // TODO(jpawlowski): btm_ble_update_srvc_data_change was not scheduling + // any operation, callback was never called in success case. Must + // investigeate more if this was bug, or just never used. + // cb.Run(0, BTM_BLE_PF_CONFIG, 0 /*BTA_SUCCESS */); + // equivalent of old: + // ocf = btm_ble_condtype_to_ocf(cond_type); + // btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, + // p_cmpl_cback, NULL); break; case BTM_BLE_PF_TYPE_ALL: /* only used to clear filter */ - st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, - p_cmpl_cback, 0, ref_value); + st = btm_ble_clear_scan_pf_filter(action, filt_index, p_cond, cb); break; default: BTM_TRACE_WARNING("condition type [%d] not supported currently.", cond_type); - break; + return; } if (st != BTM_CMD_STARTED) { - if (p_cmpl_cback) { - p_cmpl_cback(BTM_BLE_PF_CONFIG, cond_type, 0, 1 /*BTA_FAILURE*/, - ref_value); - } - return st; + cb.Run(0, BTM_BLE_PF_CONFIG, 1 /*BTA_FAILURE*/); } - - if (cond_type == BTM_BLE_PF_TYPE_ALL) { - btm_ble_advfilt_enq_op_q(action, BTM_BLE_META_PF_FEAT_SEL, BTM_BLE_FILT_CFG, - ref_value, p_cmpl_cback, NULL); - } else { - uint8_t ocf = btm_ble_condtype_to_ocf(cond_type); - btm_ble_advfilt_enq_op_q(action, ocf, BTM_BLE_FILT_CFG, ref_value, - p_cmpl_cback, NULL); - } - - return st; } /******************************************************************************* diff --git a/stack/include/btm_ble_api.h b/stack/include/btm_ble_api.h index 299133756..b117dee42 100644 --- a/stack/include/btm_ble_api.h +++ b/stack/include/btm_ble_api.h @@ -822,17 +822,11 @@ extern uint8_t BTM_BleGetSupportedKeySize(BD_ADDR bd_addr); * Description This function is called to setup the adv data payload filter * condition. * - * Parameters p_target: enabble the filter condition on a target device; - * if NULL enable the generic scan condition. - * enable: enable or disable the filter condition - * - * Returns void - * ******************************************************************************/ -extern tBTM_STATUS BTM_BleAdvFilterParamSetup( +extern void BTM_BleAdvFilterParamSetup( int action, tBTM_BLE_PF_FILT_INDEX filt_index, std::unique_ptr p_filt_params, - tBTM_BLE_PF_PARAM_CBACK* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value); + tBTM_BLE_PF_PARAM_CB cb); /******************************************************************************* * @@ -845,13 +839,12 @@ extern tBTM_STATUS BTM_BleAdvFilterParamSetup( * cond_type: filter condition type. * p_cond: filter condition paramter * - * Returns tBTM_STATUS - * ******************************************************************************/ -extern tBTM_STATUS BTM_BleCfgFilterCondition( - 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* p_cmpl_cback, tBTM_BLE_REF_VALUE ref_value); +extern void BTM_BleCfgFilterCondition(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 cb); /******************************************************************************* * @@ -860,14 +853,10 @@ extern tBTM_STATUS BTM_BleCfgFilterCondition( * Description Enable or disable the APCF feature * * Parameters enable - true - enables APCF, false - disables APCF - * ref_value - Ref value - * - * Returns tBTM_STATUS * ******************************************************************************/ -extern tBTM_STATUS BTM_BleEnableDisableFilterFeature( - uint8_t enable, tBTM_BLE_PF_STATUS_CBACK* p_stat_cback, - tBTM_BLE_REF_VALUE ref_value); +extern void BTM_BleEnableDisableFilterFeature( + uint8_t enable, tBTM_BLE_PF_STATUS_CBACK p_stat_cback); /******************************************************************************* * diff --git a/stack/include/btm_ble_api_types.h b/stack/include/btm_ble_api_types.h index 004b4c4d1..4b3fb77e2 100644 --- a/stack/include/btm_ble_api_types.h +++ b/stack/include/btm_ble_api_types.h @@ -19,6 +19,7 @@ #ifndef BTM_BLE_API_TYPES_H #define BTM_BLE_API_TYPES_H +#include #include #define CHNL_MAP_LEN 5 @@ -471,32 +472,17 @@ enum { }; typedef uint8_t tBTM_BLE_SCAN_COND_OP; -enum { - BTM_BLE_FILT_ENABLE_DISABLE = 1, - BTM_BLE_FILT_CFG = 2, - BTM_BLE_FILT_ADV_PARAM = 3 -}; - -typedef uint8_t tBTM_BLE_FILT_CB_EVT; - /* BLE adv payload filtering config complete callback */ -typedef void(tBTM_BLE_PF_CFG_CBACK)(tBTM_BLE_PF_ACTION action, - tBTM_BLE_SCAN_COND_OP cfg_op, - tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_STATUS status, - tBTM_BLE_REF_VALUE ref_value); - -typedef void(tBTM_BLE_PF_CMPL_CBACK)(tBTM_BLE_PF_CFG_CBACK); +using tBTM_BLE_PF_CFG_CBACK = base::Callback; /* BLE adv payload filtering status setup complete callback */ -typedef void(tBTM_BLE_PF_STATUS_CBACK)(uint8_t action, tBTM_STATUS status, - tBTM_BLE_REF_VALUE ref_value); +using tBTM_BLE_PF_STATUS_CBACK = + base::Callback; /* BLE adv payload filtering param setup complete callback */ -typedef void(tBTM_BLE_PF_PARAM_CBACK)(tBTM_BLE_PF_ACTION action_type, - tBTM_BLE_PF_AVBL_SPACE avbl_space, - tBTM_BLE_REF_VALUE ref_value, - tBTM_STATUS status); +using tBTM_BLE_PF_PARAM_CB = base::Callback; typedef union { uint16_t uuid16_mask; @@ -547,16 +533,6 @@ typedef union { uint8_t additional_data[2000]; } tBTM_BLE_PF_COND_PARAM; -typedef struct { - uint8_t action_ocf[BTM_BLE_PF_TYPE_MAX]; - tBTM_BLE_REF_VALUE ref_value[BTM_BLE_PF_TYPE_MAX]; - tBTM_BLE_PF_PARAM_CBACK* p_filt_param_cback[BTM_BLE_PF_TYPE_MAX]; - tBTM_BLE_PF_CFG_CBACK* p_scan_cfg_cback[BTM_BLE_PF_TYPE_MAX]; - uint8_t cb_evt[BTM_BLE_PF_TYPE_MAX]; - uint8_t pending_idx; - uint8_t next_idx; -} tBTM_BLE_ADV_FILTER_ADV_OPQ; - /* per device filter + one generic filter indexed by 0 */ #define BTM_BLE_MAX_FILTER_COUNTER (BTM_BLE_MAX_ADDR_FILTER + 1) @@ -576,8 +552,6 @@ typedef struct { uint8_t op_type; tBTM_BLE_PF_COUNT* p_addr_filter_count; /* per BDA filter array */ tBLE_BD_ADDR cur_filter_target; - tBTM_BLE_PF_STATUS_CBACK* p_filt_stat_cback; - tBTM_BLE_ADV_FILTER_ADV_OPQ op_q; } tBTM_BLE_ADV_FILTER_CB; /* Sub codes */ -- 2.11.0