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

Commit a2122931 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Bluetooth: split setting params and enabling advertising (3/3)

Proper order of commands when starting advertising:
* set parameters
* set data
* enable advertising

This cannot be achieved when setting advertising parameters and enabling
advertising is put together in one function. Enabling before setting
data might cause first advertisements to be empty. If a device with
hardware filter pick up such advertisement, it might fail to properly
recognize our device.

Bug: 30622771
Bug: 19372779
Change-Id: I3a2c1171e301ecfd7cbf1cb8b86cfda0e5fc2382
parent c830a115
Loading
Loading
Loading
Loading
+53 −76
Original line number Diff line number Diff line
@@ -49,21 +49,24 @@ extern const btgatt_callbacks_t *bt_gatt_callbacks;

namespace {

bt_status_t btif_multiadv_disable(int advertiser_id);
bt_status_t btif_multiadv_enable(int advertiser_id, bool enable,
                                        int timeout_s);
void btif_multi_adv_stop_cb(void *data) {
  int advertiser_id = PTR_TO_INT(data);
  btif_multiadv_disable(advertiser_id);  // Does context switch
  btif_multiadv_enable(advertiser_id, false, 0);  // Does context switch
}

void multi_adv_enable_cb_impl(int advertiser_id, int status) {
void multi_adv_enable_cb_impl(int advertiser_id, int status, bool enable) {
  HAL_CBACK(bt_gatt_callbacks, advertiser->multi_adv_enable_cb, advertiser_id,
            status);
            status, enable);
  if (enable == false) {
      btif_multi_adv_timer_ctrl(
          advertiser_id, (status == BTA_GATT_OK) ? btif_multi_adv_stop_cb : NULL);
  }
}

void multi_adv_update_cb_impl(int advertiser_id, int status) {
  HAL_CBACK(bt_gatt_callbacks, advertiser->multi_adv_update_cb, advertiser_id,
void multi_adv_set_params_cb_impl(int advertiser_id, int status) {
  HAL_CBACK(bt_gatt_callbacks, advertiser->multi_adv_set_params_cb, advertiser_id,
            status);
  btif_multi_adv_timer_ctrl(
      advertiser_id, (status == BTA_GATT_OK) ? btif_multi_adv_stop_cb : NULL);
@@ -75,12 +78,6 @@ void multi_adv_data_cb_impl(int advertiser_id, int status) {
            status);
}

void multi_adv_disable_cb_impl(int advertiser_id, int status) {
  btif_gattc_clear_clientif(advertiser_id, true);
  HAL_CBACK(bt_gatt_callbacks, advertiser->multi_adv_disable_cb, advertiser_id,
            status);
}

bt_uuid_t registering_uuid;

void multi_adv_reg_cb_impl(int advertiser_id, int status) {
@@ -93,19 +90,19 @@ void bta_gattc_multi_adv_cback(tBTM_BLE_MULTI_ADV_EVT event, uint8_t advertiser_

  BTIF_TRACE_DEBUG("%s: advertiser_id: %d, Status:%x", __func__, advertiser_id, status);

  if (event == BTM_BLE_MULTI_ADV_ENB_EVT)
  if (event == BTM_BLE_MULTI_ADV_REG_EVT)
    do_in_jni_thread(Bind(multi_adv_reg_cb_impl, advertiser_id, status));
  else if (event == BTM_BLE_MULTI_ADV_PARAM_EVT)
    do_in_jni_thread(Bind(multi_adv_set_params_cb_impl, advertiser_id, status));
  else if (event == BTM_BLE_MULTI_ADV_ENB_EVT)
    do_in_jni_thread(
        Bind(multi_adv_enable_cb_impl, advertiser_id, status));
        Bind(multi_adv_enable_cb_impl, advertiser_id, status, true));
  else if (event == BTM_BLE_MULTI_ADV_DISABLE_EVT)
    do_in_jni_thread(
        Bind(multi_adv_disable_cb_impl, advertiser_id, status));
  else if (event == BTM_BLE_MULTI_ADV_PARAM_EVT)
    do_in_jni_thread(
        Bind(multi_adv_update_cb_impl, advertiser_id, status));
        Bind(multi_adv_enable_cb_impl, advertiser_id, status, false));
  else if (event == BTM_BLE_MULTI_ADV_DATA_EVT)
    do_in_jni_thread(Bind(multi_adv_data_cb_impl, advertiser_id, status));
  else if (event == BTM_BLE_MULTI_ADV_REG_EVT)
    do_in_jni_thread(Bind(multi_adv_reg_cb_impl, advertiser_id, status));
    do_in_jni_thread(
        Bind(multi_adv_data_cb_impl, advertiser_id, status));
}

void bta_adv_set_data_cback(tBTA_STATUS call_status) {
@@ -161,44 +158,7 @@ bt_status_t btif_adv_set_data(int advertiser_id, bool set_scan_rsp,
      Bind(&btif_adv_set_data_impl, base::Owned(adv_data)));
}

void btif_multiadv_enable_impl(int advertiser_id, int min_interval,
                               int max_interval, int adv_type,
                               int chnl_map, int tx_power,
                               int timeout_s) {
  BTIF_TRACE_DEBUG("%s: advertiser_id: %d", __func__, advertiser_id);

  tBTM_BLE_ADV_PARAMS param;
  param.adv_int_min = min_interval;
  param.adv_int_max = max_interval;
  param.adv_type = adv_type;
  param.channel_map = chnl_map;
  param.adv_filter_policy = 0;
  param.tx_power = tx_power;

  btgatt_multi_adv_common_data *p_multi_adv_data_cb =
      btif_obtain_multi_adv_data_cb();
  memcpy(&p_multi_adv_data_cb->inst_cb[advertiser_id].param, &param,
         sizeof(tBTM_BLE_ADV_PARAMS));
  p_multi_adv_data_cb->inst_cb[advertiser_id].timeout_s = timeout_s;

  tBTM_BLE_ADV_PARAMS *params = new tBTM_BLE_ADV_PARAMS;
  memcpy(params, &(p_multi_adv_data_cb->inst_cb[advertiser_id].param), sizeof(tBTM_BLE_ADV_PARAMS));
  do_in_bta_thread(FROM_HERE,
      base::Bind(&BTM_BleEnableAdvInstance, advertiser_id, base::Owned(params)));

}

bt_status_t btif_multiadv_enable(int advertiser_id, int min_interval,
                                        int max_interval, int adv_type,
                                        int chnl_map, int tx_power,
                                        int timeout_s) {
  CHECK_BTGATT_INIT();
  return do_in_jni_thread(Bind(btif_multiadv_enable_impl, advertiser_id,
                               min_interval, max_interval, adv_type, chnl_map,
                               tx_power, timeout_s));
}

void btif_multiadv_update_impl(int advertiser_id, int min_interval,
void btif_multiadv_set_params_impl(int advertiser_id, int min_interval,
                                          int max_interval, int adv_type,
                                          int chnl_map, int tx_power) {
  tBTM_BLE_ADV_PARAMS param;
@@ -217,15 +177,14 @@ void btif_multiadv_update_impl(int advertiser_id, int min_interval,
  tBTM_BLE_ADV_PARAMS *params = new tBTM_BLE_ADV_PARAMS;
  memcpy(params, &(p_multi_adv_data_cb->inst_cb[advertiser_id].param), sizeof(tBTM_BLE_ADV_PARAMS));
  do_in_bta_thread(FROM_HERE,
      base::Bind(&BTM_BleUpdateAdvInstParam, advertiser_id, base::Owned(params)));
      base::Bind(&BTM_BleAdvSetParameters, advertiser_id, base::Owned(params)));
}

bt_status_t btif_multiadv_update(int advertiser_id, int min_interval,
bt_status_t btif_multiadv_set_params(int advertiser_id, int min_interval,
                                            int max_interval, int adv_type,
                                        int chnl_map, int tx_power,
                                        int timeout_s) {
                                            int chnl_map, int tx_power) {
  CHECK_BTGATT_INIT();
  return do_in_jni_thread(Bind(btif_multiadv_update_impl, advertiser_id,
  return do_in_jni_thread(Bind(btif_multiadv_set_params_impl, advertiser_id,
                               min_interval, max_interval, adv_type, chnl_map,
                               tx_power));
}
@@ -242,7 +201,7 @@ void btif_multiadv_set_data_impl(btif_adv_data_t *p_adv_data) {
      btif_obtain_multi_adv_data_cb();

  do_in_bta_thread(FROM_HERE,
    base::Bind(&BTM_BleCfgAdvInstData, advertiser_id, p_adv_data->set_scan_rsp,
    base::Bind(&BTM_BleAdvSetData, advertiser_id, p_adv_data->set_scan_rsp,
              p_multi_adv_data_cb->inst_cb[advertiser_id].mask,
              (tBTM_BLE_ADV_DATA*)&p_multi_adv_data_cb->inst_cb[advertiser_id].data));
}
@@ -269,10 +228,25 @@ bt_status_t btif_multiadv_set_data(int advertiser_id, bool set_scan_rsp,
                               base::Owned(multi_adv_data_inst)));
}

bt_status_t btif_multiadv_disable(int advertiser_id) {
void btif_multiadv_enable_impl(int advertiser_id, bool enable,
                                      int timeout_s) {
  BTIF_TRACE_DEBUG("%s: advertiser_id: %d, enable: %d", __func__,
                   advertiser_id, enable);

  btgatt_multi_adv_common_data *p_multi_adv_data_cb =
      btif_obtain_multi_adv_data_cb();
  if (enable)
    p_multi_adv_data_cb->inst_cb[advertiser_id].timeout_s = timeout_s;

  do_in_bta_thread(FROM_HERE,
      base::Bind(&BTM_BleAdvEnable, advertiser_id, enable));
}

bt_status_t btif_multiadv_enable(int advertiser_id, bool enable,
                                        int timeout_s) {
  CHECK_BTGATT_INIT();
  do_in_bta_thread(FROM_HERE, Bind(BTM_BleDisableAdvInstance, advertiser_id));
  return (bt_status_t)BTA_GATT_OK;
  return do_in_jni_thread(Bind(btif_multiadv_enable_impl, advertiser_id,
                               enable, timeout_s));
}

bt_status_t btif_multiadv_register(bt_uuid_t *uuid) {
@@ -288,6 +262,10 @@ bt_status_t btif_multiadv_register(bt_uuid_t *uuid) {
bt_status_t btif_multiadv_unregister(int advertiser_id) {
  btif_gattc_clear_clientif(advertiser_id, true);
  btif_gattc_decr_app_count();

  do_in_bta_thread(FROM_HERE,
        base::Bind(&BTM_BleAdvUnregister, advertiser_id));

  return (bt_status_t)BTA_GATT_OK;
}

@@ -297,8 +275,7 @@ const ble_advertiser_interface_t btLeAdvertiserInstance = {
  btif_multiadv_register,
  btif_multiadv_unregister,
  btif_adv_set_data,
  btif_multiadv_enable,
  btif_multiadv_update,
  btif_multiadv_set_params,
  btif_multiadv_set_data,
  btif_multiadv_disable
  btif_multiadv_enable
};
+2 −3
Original line number Diff line number Diff line
@@ -464,10 +464,9 @@ const btgatt_client_callbacks_t gatt_client_callbacks = {

const ble_advertiser_callbacks_t bt_le_advertiser_callbacks = {
    nullptr, /* multi_adv_register_cb; */
    nullptr, /* multi_adv_set_params_cb */
    nullptr, /* multi_adv_data_cb*/
    nullptr, /* multi_adv_enable_cb; */
    nullptr, /* multi_adv_update_cb; */
    nullptr, /* multi_adv_data_cb; */
    nullptr, /* multi_adv_disable_cb; */
};

const btgatt_callbacks_t gatt_callbacks = {
+15 −26
Original line number Diff line number Diff line
@@ -213,22 +213,13 @@ void RegisterAdvertiserCallback(int status, int advertiser_id, bt_uuid_t* app_uu
      RegisterAdvertiserCallback(g_interface, status, advertiser_id, *app_uuid));
}

void MultiAdvEnableCallback(int advertiser_id, int status) {
void MultiAdvSetParamsCallback(int advertiser_id, int status) {
  shared_lock<shared_timed_mutex> lock(g_instance_lock);
  VLOG(2) << __func__ << " - status: " << status << " advertiser_id: " << advertiser_id;
  VERIFY_INTERFACE_OR_RETURN();

  FOR_EACH_ADVERTISER_OBSERVER(
      MultiAdvEnableCallback(g_interface, advertiser_id, status));
}

void MultiAdvUpdateCallback(int advertiser_id, int status) {
  shared_lock<shared_timed_mutex> lock(g_instance_lock);
  VLOG(2) << __func__ << " - status: " << status << " advertiser_id: " << advertiser_id;
  VERIFY_INTERFACE_OR_RETURN();

  FOR_EACH_ADVERTISER_OBSERVER(
      MultiAdvUpdateCallback(g_interface, advertiser_id, status));
      MultiAdvSetParamsCallback(g_interface, advertiser_id, status));
}

void MultiAdvDataCallback(int advertiser_id, int status) {
@@ -240,13 +231,16 @@ void MultiAdvDataCallback(int advertiser_id, int status) {
      MultiAdvDataCallback(g_interface, advertiser_id, status));
}

void MultiAdvDisableCallback(int advertiser_id, int status) {
void MultiAdvEnableCallback(int advertiser_id, int status, bool enable) {
  shared_lock<shared_timed_mutex> lock(g_instance_lock);
  VLOG(2) << __func__ << " - status: " << status << " advertiser_id: " << advertiser_id;
  VLOG(2) << __func__
          << " - status: " << status
          << " advertiser_id: " << advertiser_id
          << " enable: " << enable;
  VERIFY_INTERFACE_OR_RETURN();

  FOR_EACH_ADVERTISER_OBSERVER(
      MultiAdvDisableCallback(g_interface, advertiser_id, status));
      MultiAdvEnableCallback(g_interface, advertiser_id, status, enable));
}

void GetGattDbCallback(int conn_id, btgatt_db_element_t *db, int size) {
@@ -470,10 +464,9 @@ const btgatt_client_callbacks_t gatt_client_callbacks = {

const ble_advertiser_callbacks_t le_advertiser_callbacks = {
    RegisterAdvertiserCallback,
    MultiAdvEnableCallback,
    MultiAdvUpdateCallback,
    MultiAdvSetParamsCallback,
    MultiAdvDataCallback,
    MultiAdvDisableCallback,
    MultiAdvEnableCallback
};

const btgatt_server_callbacks_t gatt_server_callbacks = {
@@ -637,13 +630,7 @@ void BluetoothGattInterface::AdvertiserObserver::RegisterAdvertiserCallback(
  // Do nothing.
}

void BluetoothGattInterface::AdvertiserObserver::MultiAdvEnableCallback(
    BluetoothGattInterface* /* gatt_iface */,
    int /* status */,
    int /* advertiser_id */) {
  // Do nothing.
}
void BluetoothGattInterface::AdvertiserObserver::MultiAdvUpdateCallback(
void BluetoothGattInterface::AdvertiserObserver::MultiAdvSetParamsCallback(
    BluetoothGattInterface* /* gatt_iface */,
    int /* status */,
    int /* advertiser_id */) {
@@ -655,10 +642,12 @@ void BluetoothGattInterface::AdvertiserObserver::MultiAdvDataCallback(
    int /* advertiser_id */) {
  // Do nothing.
}
void BluetoothGattInterface::AdvertiserObserver::MultiAdvDisableCallback(

void BluetoothGattInterface::AdvertiserObserver::MultiAdvEnableCallback(
    BluetoothGattInterface* /* gatt_iface */,
    int /* status */,
    int /* advertiser_id */) {
    int /* advertiser_id */,
    bool /* enable */) {
  // Do nothing.
}

+3 −7
Original line number Diff line number Diff line
@@ -51,11 +51,7 @@ class BluetoothGattInterface {
        int status, int advertiser_id,
        const bt_uuid_t& app_uuid);

    virtual void MultiAdvEnableCallback(
        BluetoothGattInterface* gatt_iface,
        int advertiser_id, int status);

    virtual void MultiAdvUpdateCallback(
    virtual void MultiAdvSetParamsCallback(
        BluetoothGattInterface* gatt_iface,
        int advertiser_id, int status);

@@ -63,9 +59,9 @@ class BluetoothGattInterface {
        BluetoothGattInterface* gatt_iface,
        int advertiser_id, int status);

    virtual void MultiAdvDisableCallback(
    virtual void MultiAdvEnableCallback(
        BluetoothGattInterface* gatt_iface,
        int advertiser_id, int status);
        int advertiser_id, int status, bool enable);
  };

  // The standard BT-GATT client callback interface. The HAL interface doesn't
+14 −14
Original line number Diff line number Diff line
@@ -158,12 +158,12 @@ bt_status_t FakeUnregisterAdvertiser(int advertiser_id) {
  return BT_STATUS_FAIL;
}

bt_status_t FakeMultiAdvEnable(
bt_status_t FakeMultiAdvSetParameters(
    int advertiser_id, int min_interval, int max_interval, int adv_type,
    int chnl_map, int tx_power, int timeout_s) {
    int chnl_map, int tx_power) {
  if (g_advertiser_handler)
    return g_advertiser_handler->MultiAdvEnable(advertiser_id, min_interval, max_interval,
                                     adv_type, chnl_map, tx_power, timeout_s);
    return g_advertiser_handler->MultiAdvSetParameters(advertiser_id, min_interval, max_interval,
                                     adv_type, chnl_map, tx_power);

  return BT_STATUS_FAIL;
}
@@ -181,9 +181,10 @@ bt_status_t FakeMultiAdvSetInstData(
  return BT_STATUS_FAIL;
}

bt_status_t FakeMultiAdvDisable(int advertiser_id) {
bt_status_t FakeMultiAdvEnable(
    int advertiser_id, bool enable, int timeout_s) {
  if (g_advertiser_handler)
    return g_advertiser_handler->MultiAdvDisable(advertiser_id);
    return g_advertiser_handler->MultiAdvEnable(advertiser_id, enable, timeout_s);

  return BT_STATUS_FAIL;
}
@@ -192,10 +193,9 @@ ble_advertiser_interface_t fake_bt_advertiser_iface = {
  FakeRegisterAdvertiser,
  FakeUnregisterAdvertiser,
  nullptr,  // set_adv_data
  FakeMultiAdvEnable,
  nullptr,  // multi_adv_update
  FakeMultiAdvSetParameters,
  FakeMultiAdvSetInstData,
  FakeMultiAdvDisable,
  FakeMultiAdvEnable,
};

btgatt_server_interface_t fake_btgatts_iface = {
@@ -278,10 +278,10 @@ void FakeBluetoothGattInterface::NotifyRegisterAdvertiserCallback(
                    RegisterAdvertiserCallback(this, status, advertiser_id, app_uuid));
}

void FakeBluetoothGattInterface::NotifyMultiAdvEnableCallback(
void FakeBluetoothGattInterface::NotifyMultiAdvSetParamsCallback(
    int advertiser_id, int status) {
  FOR_EACH_OBSERVER(AdvertiserObserver, advertiser_observers_,
                    MultiAdvEnableCallback(this, advertiser_id, status));
                    MultiAdvSetParamsCallback(this, advertiser_id, status));
}

void FakeBluetoothGattInterface::NotifyMultiAdvDataCallback(
@@ -290,10 +290,10 @@ void FakeBluetoothGattInterface::NotifyMultiAdvDataCallback(
                    MultiAdvDataCallback(this, advertiser_id, status));
}

void FakeBluetoothGattInterface::NotifyMultiAdvDisableCallback(
    int advertiser_id, int status) {
void FakeBluetoothGattInterface::NotifyMultiAdvEnableCallback(
    int advertiser_id, int status, bool enable) {
  FOR_EACH_OBSERVER(AdvertiserObserver, advertiser_observers_,
                    MultiAdvDisableCallback(this, advertiser_id, status));
                    MultiAdvEnableCallback(this, advertiser_id, status, enable));
}

void FakeBluetoothGattInterface::NotifyRegisterServerCallback(
Loading