Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9180985c authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Andre Eisenbach
Browse files

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
parent 6a48101e
Loading
Loading
Loading
Loading
+19 −49
Original line number Diff line number Diff line
@@ -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,
      FROM_HERE,
      base::Bind(&BTM_BleCfgFilterCondition, action, cond_type, filt_index,
                 base::Owned((tBTM_BLE_PF_COND_PARAM*)p_cond_param),
                            p_cmpl_cback, ref_value));
                 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<btgatt_filt_param_setup_t> 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));
}

/*******************************************************************************
@@ -1309,30 +1303,6 @@ void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK* p_cmpl_cback) {
  bta_sys_sendmsg(p_msg);
}

/*******************************************************************************
 *
 * 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
+11 −34
Original line number Diff line number Diff line
@@ -1835,24 +1835,6 @@ extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type,
 ******************************************************************************/
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
@@ -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<btgatt_filt_param_setup_t> 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_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<void(uint8_t, uint8_t, uint8_t)> cb);

extern void BTA_DmBleScanFilterClear(tBTM_BLE_REF_VALUE ref_value,
extern void BTA_DmBleScanFilterClear(
    tBTM_BLE_PF_FILT_INDEX filt_index,
                                     tBTM_BLE_PF_CFG_CBACK* p_cmpl_cback);
    base::Callback<void(uint8_t, uint8_t, uint8_t)> cb);

/*******************************************************************************
 *
+47 −35
Original line number Diff line number Diff line
@@ -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<uint8_t> data, int action,
@@ -376,8 +375,9 @@ void btif_gattc_scan_filter_add_local_name(vector<uint8_t> data, int action,

  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,
                              &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<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,
                              &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<uint8_t> pattern,
@@ -407,8 +408,9 @@ void btif_gattc_scan_filter_add_data_pattern(vector<uint8_t> pattern,
  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,
                              &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,
+10 −21
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@

#include "btif_dm.h"

#include <base/bind.h>
#include <base/logging.h>
#include <signal.h>
#include <stdio.h>
@@ -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<btgatt_filt_param_setup_t>();
  /* 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? */

+172 −349

File changed.

Preview size limit exceeded, changes collapsed.

Loading