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

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

Update BleAdvertiserHciInterface

This patch updates BleAdvertiserHciInterface to be on pair with
Bluetooth 5.0 LE Advertising Extension feature.

Bug: 30622771
Test: net_test_stack_multi_adv native test
Change-Id: Ie0ec8c7f8ed0d7a874e392123b3486c767121140
parent a618d3a4
Loading
Loading
Loading
Loading
+125 −88
Original line number Original line Diff line number Diff line
@@ -93,11 +93,14 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    this->advertising_event_observer = observer;
    this->advertising_event_observer = observer;
  }
  }


  void SetParameters(uint8_t adv_int_min, uint8_t adv_int_max,
  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint8_t advertising_type, uint8_t own_address_type,
                     uint32_t adv_int_max, uint8_t channel_map,
                     BD_ADDR own_address, uint8_t direct_address_type,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR direct_address, uint8_t channel_map,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     uint8_t filter_policy, uint8_t inst_id, uint8_t tx_power,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
                     status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN];
    uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN];
@@ -107,22 +110,37 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_PARAM);
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_PARAM);
    UINT16_TO_STREAM(pp, adv_int_min);
    UINT16_TO_STREAM(pp, adv_int_min);
    UINT16_TO_STREAM(pp, adv_int_max);
    UINT16_TO_STREAM(pp, adv_int_max);
    UINT8_TO_STREAM(pp, advertising_type);

    if (properties == 0x0013) {
      UINT8_TO_STREAM(pp, 0x00);  // ADV_IND
    } else if (properties == 0x0012) {
      UINT8_TO_STREAM(pp, 0x02);  // ADV_SCAN_IND
    } else if (properties == 0x0010) {
      UINT8_TO_STREAM(pp, 0x03);  // ADV_NONCONN_IND
    } else {
      LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                 << properties;
      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
      return;
    }

    UINT8_TO_STREAM(pp, own_address_type);
    UINT8_TO_STREAM(pp, own_address_type);
    BD_ADDR own_address = {0, 0, 0, 0, 0, 0};
    BDADDR_TO_STREAM(pp, own_address);
    BDADDR_TO_STREAM(pp, own_address);
    UINT8_TO_STREAM(pp, direct_address_type);
    UINT8_TO_STREAM(pp, peer_address_type);
    BDADDR_TO_STREAM(pp, direct_address);
    BDADDR_TO_STREAM(pp, peer_address);
    UINT8_TO_STREAM(pp, channel_map);
    UINT8_TO_STREAM(pp, channel_map);
    UINT8_TO_STREAM(pp, filter_policy);
    UINT8_TO_STREAM(pp, filter_policy);
    UINT8_TO_STREAM(pp, inst_id);
    UINT8_TO_STREAM(pp, handle);
    UINT8_TO_STREAM(pp, tx_power);
    INT8_TO_STREAM(pp, tx_power);


    SendVscMultiAdvCmd(BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
    SendVscMultiAdvCmd(BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
                       command_complete);
                       command_complete);
  }
  }


  void SetAdvertisingData(uint8_t data_length, uint8_t* data, uint8_t inst_id,
  void SetAdvertisingData(uint8_t handle, uint8_t operation,
                          status_cb command_complete) override {
                          uint8_t fragment_preference, uint8_t data_length,
                          uint8_t* data, status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN];
    uint8_t param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN];
    memset(param, 0, BTM_BLE_MULTI_ADV_WRITE_DATA_LEN);
    memset(param, 0, BTM_BLE_MULTI_ADV_WRITE_DATA_LEN);
@@ -131,14 +149,16 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_WRITE_ADV_DATA);
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_WRITE_ADV_DATA);
    UINT8_TO_STREAM(pp, data_length);
    UINT8_TO_STREAM(pp, data_length);
    ARRAY_TO_STREAM(pp, data, data_length);
    ARRAY_TO_STREAM(pp, data, data_length);
    param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN - 1] = inst_id;
    param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN - 1] = handle;


    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, param,
    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, param,
                       command_complete);
                       command_complete);
  }
  }


  void SetScanResponseData(uint8_t scan_response_data_length,
  void SetScanResponseData(uint8_t handle, uint8_t operation,
                           uint8_t* scan_response_data, uint8_t inst_id,
                           uint8_t fragment_preference,
                           uint8_t scan_response_data_length,
                           uint8_t* scan_response_data,
                           status_cb command_complete) override {
                           status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN];
    uint8_t param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN];
@@ -148,13 +168,13 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA);
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_WRITE_SCAN_RSP_DATA);
    UINT8_TO_STREAM(pp, scan_response_data_length);
    UINT8_TO_STREAM(pp, scan_response_data_length);
    ARRAY_TO_STREAM(pp, scan_response_data, scan_response_data_length);
    ARRAY_TO_STREAM(pp, scan_response_data, scan_response_data_length);
    param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN - 1] = inst_id;
    param[BTM_BLE_MULTI_ADV_WRITE_DATA_LEN - 1] = handle;


    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, param,
    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, param,
                       command_complete);
                       command_complete);
  }
  }


  void SetRandomAddress(uint8_t random_address[6], uint8_t inst_id,
  void SetRandomAddress(uint8_t handle, uint8_t random_address[6],
                        status_cb command_complete) override {
                        status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN];
    uint8_t param[BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN];
@@ -163,13 +183,14 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR);
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR);
    BDADDR_TO_STREAM(pp, random_address);
    BDADDR_TO_STREAM(pp, random_address);
    UINT8_TO_STREAM(pp, inst_id);
    UINT8_TO_STREAM(pp, handle);


    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN, param,
    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN, param,
                       command_complete);
                       command_complete);
  }
  }


  void Enable(uint8_t advertising_enable, uint8_t inst_id,
  void Enable(uint8_t enable, uint8_t handle, uint16_t duration,
              uint8_t max_extended_advertising_events,
              status_cb command_complete) override {
              status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[BTM_BLE_MULTI_ADV_ENB_LEN];
    uint8_t param[BTM_BLE_MULTI_ADV_ENB_LEN];
@@ -177,8 +198,8 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_ENB);
    UINT8_TO_STREAM(pp, BTM_BLE_MULTI_ADV_ENB);
    UINT8_TO_STREAM(pp, advertising_enable);
    UINT8_TO_STREAM(pp, enable);
    UINT8_TO_STREAM(pp, inst_id);
    UINT8_TO_STREAM(pp, handle);


    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_ENB_LEN, param,
    SendVscMultiAdvCmd((uint8_t)BTM_BLE_MULTI_ADV_ENB_LEN, param,
                       command_complete);
                       command_complete);
@@ -207,7 +228,8 @@ class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
        ((BleAdvertiserVscHciInterfaceImpl*)BleAdvertiserHciInterface::Get())
        ((BleAdvertiserVscHciInterfaceImpl*)BleAdvertiserHciInterface::Get())
            ->advertising_event_observer;
            ->advertising_event_observer;
    if (observer)
    if (observer)
      observer->OnAdvertisingStateChanged(adv_inst, change_reason, conn_handle);
      observer->OnAdvertisingSetTerminated(change_reason, adv_inst, conn_handle,
                                           0x00);
  }
  }


 private:
 private:
@@ -251,11 +273,14 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
  void SetAdvertisingEventObserver(
  void SetAdvertisingEventObserver(
      AdvertisingEventObserver* observer) override {}
      AdvertisingEventObserver* observer) override {}


  void SetParameters(uint8_t adv_int_min, uint8_t adv_int_max,
  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint8_t advertising_type, uint8_t own_address_type,
                     uint32_t adv_int_max, uint8_t channel_map,
                     BD_ADDR own_address, uint8_t direct_address_type,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR direct_address, uint8_t channel_map,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     uint8_t filter_policy, uint8_t inst_id, uint8_t tx_power,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
                     status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


@@ -264,10 +289,23 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT16_TO_STREAM(pp, adv_int_min);
    UINT16_TO_STREAM(pp, adv_int_min);
    UINT16_TO_STREAM(pp, adv_int_max);
    UINT16_TO_STREAM(pp, adv_int_max);
    UINT8_TO_STREAM(pp, advertising_type);

    if (properties == 0x0013) {
      UINT8_TO_STREAM(pp, 0x00);  // ADV_IND
    } else if (properties == 0x0012) {
      UINT8_TO_STREAM(pp, 0x02);  // ADV_SCAN_IND
    } else if (properties == 0x0010) {
      UINT8_TO_STREAM(pp, 0x03);  // ADV_NONCONN_IND
    } else {
      LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                 << properties;
      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
      return;
    }

    UINT8_TO_STREAM(pp, own_address_type);
    UINT8_TO_STREAM(pp, own_address_type);
    UINT8_TO_STREAM(pp, direct_address_type);
    UINT8_TO_STREAM(pp, peer_address_type);
    BDADDR_TO_STREAM(pp, direct_address);
    BDADDR_TO_STREAM(pp, peer_address);
    UINT8_TO_STREAM(pp, channel_map);
    UINT8_TO_STREAM(pp, channel_map);
    UINT8_TO_STREAM(pp, filter_policy);
    UINT8_TO_STREAM(pp, filter_policy);


@@ -275,8 +313,9 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete);
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete);
  }
  }


  void SetAdvertisingData(uint8_t data_length, uint8_t* data, uint8_t inst_id,
  void SetAdvertisingData(uint8_t handle, uint8_t operation,
                          status_cb command_complete) override {
                          uint8_t fragment_preference, uint8_t data_length,
                          uint8_t* data, status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


    uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1];
    uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1];
@@ -290,8 +329,10 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1, command_complete);
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1, command_complete);
  }
  }


  void SetScanResponseData(uint8_t scan_response_data_length,
  void SetScanResponseData(uint8_t handle, uint8_t operation,
                           uint8_t* scan_response_data, uint8_t inst_id,
                           uint8_t fragment_preference,
                           uint8_t scan_response_data_length,
                           uint8_t* scan_response_data,
                           status_cb command_complete) override {
                           status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1];
    uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1];
@@ -305,7 +346,7 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1, command_complete);
               HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1, command_complete);
  }
  }


  void SetRandomAddress(uint8_t random_address[6], uint8_t inst_id,
  void SetRandomAddress(uint8_t handle, uint8_t random_address[6],
                        status_cb command_complete) override {
                        status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


@@ -318,13 +359,14 @@ class BleAdvertiserLegacyHciInterfaceImpl : public BleAdvertiserHciInterface {
               HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD, command_complete);
               HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD, command_complete);
  }
  }


  void Enable(uint8_t advertising_enable, uint8_t inst_id,
  void Enable(uint8_t enable, uint8_t handle, uint16_t duration,
              uint8_t max_extended_advertising_events,
              status_cb command_complete) override {
              status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    uint8_t param[HCIC_PARAM_SIZE_WRITE_ADV_ENABLE];
    uint8_t param[HCIC_PARAM_SIZE_WRITE_ADV_ENABLE];


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, advertising_enable);
    UINT8_TO_STREAM(pp, enable);


    SendAdvCmd(HCI_BLE_WRITE_ADV_ENABLE, param,
    SendAdvCmd(HCI_BLE_WRITE_ADV_ENABLE, param,
               HCIC_PARAM_SIZE_WRITE_ADV_ENABLE, command_complete);
               HCIC_PARAM_SIZE_WRITE_ADV_ENABLE, command_complete);
@@ -351,53 +393,44 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
    this->advertising_event_observer = observer;
    this->advertising_event_observer = observer;
  }
  }


  void SetParameters(uint8_t adv_int_min, uint8_t adv_int_max,
  void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                     uint8_t advertising_type, uint8_t own_address_type,
                     uint32_t adv_int_max, uint8_t channel_map,
                     BD_ADDR own_address, uint8_t direct_address_type,
                     uint8_t own_address_type, uint8_t peer_address_type,
                     BD_ADDR direct_address, uint8_t channel_map,
                     BD_ADDR peer_address, uint8_t filter_policy,
                     uint8_t filter_policy, uint8_t advertising_handle,
                     int8_t tx_power, uint8_t primary_phy,
                     uint8_t tx_power, status_cb command_complete) override {
                     uint8_t secondary_max_skip, uint8_t secondary_phy,
                     uint8_t advertising_sid,
                     uint8_t scan_request_notify_enable,
                     status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25;
    const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25;
    uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN];
    uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN];
    memset(param, 0, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN);
    memset(param, 0, HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN);


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, advertising_handle);
    UINT8_TO_STREAM(pp, handle);

    UINT16_TO_STREAM(pp, properties);
    if (advertising_type == 0x00) {  // ADV_IND
    UINT24_TO_STREAM(pp, adv_int_min);
      UINT16_TO_STREAM(pp, 0x13);
    UINT24_TO_STREAM(pp, adv_int_max);
    } else if (advertising_type == 0x02) {  // ADV_SCAN_IND
      UINT16_TO_STREAM(pp, 0x12);
    } else if (advertising_type == 0x03) {  // ADV_NONCONN_IND
      UINT16_TO_STREAM(pp, 0x10);
    } else {
      LOG_ASSERT("Unsupported advertisement type selected!");
    }

    UINT24_TO_STREAM(pp, (uint32_t)adv_int_min);
    UINT24_TO_STREAM(pp, (uint32_t)adv_int_max);
    UINT8_TO_STREAM(pp, channel_map);
    UINT8_TO_STREAM(pp, channel_map);

    UINT8_TO_STREAM(pp, own_address_type);
    UINT8_TO_STREAM(pp, own_address_type);
    UINT8_TO_STREAM(pp, direct_address_type);
    UINT8_TO_STREAM(pp, peer_address_type);
    BDADDR_TO_STREAM(pp, direct_address);
    BDADDR_TO_STREAM(pp, peer_address);
    UINT8_TO_STREAM(pp, filter_policy);
    UINT8_TO_STREAM(pp, filter_policy);

    INT8_TO_STREAM(pp, tx_power);
    INT8_TO_STREAM(pp, tx_power);

    UINT8_TO_STREAM(pp, primary_phy);
    UINT8_TO_STREAM(pp, 0x01);  // primary advertising phy
    UINT8_TO_STREAM(pp, secondary_max_skip);
    UINT8_TO_STREAM(pp, 0x01);  // secondary advertising max skip
    UINT8_TO_STREAM(pp, secondary_phy);
    UINT8_TO_STREAM(pp, 0x01);  // secondary advertising phy
    UINT8_TO_STREAM(pp, advertising_sid);
    UINT8_TO_STREAM(pp, 0x00);  // advertising SID
    UINT8_TO_STREAM(pp, scan_request_notify_enable);
    UINT8_TO_STREAM(pp, 0x00);  // scan req notification


    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
               HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete);
               HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete);
  }
  }


  void SetAdvertisingData(uint8_t data_length, uint8_t* data, uint8_t inst_id,
  void SetAdvertisingData(uint8_t handle, uint8_t operation,
                          status_cb command_complete) override {
                          uint8_t fragment_preference, uint8_t data_length,
                          uint8_t* data, status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


    const uint16_t cmd_length = 4 + data_length;
    const uint16_t cmd_length = 4 + data_length;
@@ -405,9 +438,9 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
    memset(param, 0, cmd_length);
    memset(param, 0, cmd_length);


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, inst_id);
    UINT8_TO_STREAM(pp, handle);
    UINT8_TO_STREAM(pp, 0x03);  // complete advertising data
    UINT8_TO_STREAM(pp, operation);
    UINT8_TO_STREAM(pp, 0x01);  // don't fragment
    UINT8_TO_STREAM(pp, fragment_preference);
    UINT8_TO_STREAM(pp, data_length);
    UINT8_TO_STREAM(pp, data_length);
    ARRAY_TO_STREAM(pp, data, data_length);
    ARRAY_TO_STREAM(pp, data, data_length);


@@ -415,8 +448,10 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
               command_complete);
               command_complete);
  }
  }


  void SetScanResponseData(uint8_t scan_response_data_length,
  void SetScanResponseData(uint8_t handle, uint8_t operation,
                           uint8_t* scan_response_data, uint8_t inst_id,
                           uint8_t fragment_preference,
                           uint8_t scan_response_data_length,
                           uint8_t* scan_response_data,
                           status_cb command_complete) override {
                           status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


@@ -425,9 +460,9 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
    memset(param, 0, cmd_length);
    memset(param, 0, cmd_length);


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, inst_id);
    UINT8_TO_STREAM(pp, handle);
    UINT8_TO_STREAM(pp, 0x03);  // complete advertising data
    UINT8_TO_STREAM(pp, operation);
    UINT8_TO_STREAM(pp, 0x01);  // don't fragment
    UINT8_TO_STREAM(pp, fragment_preference);
    UINT8_TO_STREAM(pp, scan_response_data_length);
    UINT8_TO_STREAM(pp, scan_response_data_length);
    ARRAY_TO_STREAM(pp, scan_response_data, scan_response_data_length);
    ARRAY_TO_STREAM(pp, scan_response_data, scan_response_data_length);


@@ -435,7 +470,7 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
               command_complete);
               command_complete);
  }
  }


  void SetRandomAddress(uint8_t random_address[6], uint8_t advertising_handle,
  void SetRandomAddress(uint8_t handle, uint8_t random_address[6],
                        status_cb command_complete) override {
                        status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    const int LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN = 7;
    const int LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN = 7;
@@ -444,14 +479,15 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
    memset(param, 0, LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN);
    memset(param, 0, LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN);


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, advertising_handle);
    UINT8_TO_STREAM(pp, handle);
    BDADDR_TO_STREAM(pp, random_address);
    BDADDR_TO_STREAM(pp, random_address);


    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_RANDOM_ADDRESS, param,
    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_RANDOM_ADDRESS, param,
               LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN, command_complete);
               LE_SET_ADVERTISING_SET_RANDOM_ADDRESS_LEN, command_complete);
  }
  }


  void Enable(uint8_t advertising_enable, uint8_t inst_id,
  void Enable(uint8_t enable, uint8_t handle, uint16_t duration,
              uint8_t max_extended_advertising_events,
              status_cb command_complete) override {
              status_cb command_complete) override {
    VLOG(1) << __func__;
    VLOG(1) << __func__;


@@ -461,12 +497,12 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
    memset(param, 0, cmd_length);
    memset(param, 0, cmd_length);


    uint8_t* pp = param;
    uint8_t* pp = param;
    UINT8_TO_STREAM(pp, 0x01);  // enable
    UINT8_TO_STREAM(pp, enable);
    UINT8_TO_STREAM(pp, 0x01);  // just one set
    UINT8_TO_STREAM(pp, 0x01);  // just one set


    UINT8_TO_STREAM(pp, inst_id);  // set_id
    UINT8_TO_STREAM(pp, handle);
    UINT16_TO_STREAM(pp, 0x0000);  // duration
    UINT16_TO_STREAM(pp, duration);
    UINT8_TO_STREAM(pp, 0x00);     // max extended advertising events
    UINT8_TO_STREAM(pp, max_extended_advertising_events);


    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_ENABLE, param, cmd_length,
    SendAdvCmd(HCI_LE_SET_EXT_ADVERTISING_ENABLE, param, cmd_length,
               command_complete);
               command_complete);
@@ -476,20 +512,21 @@ class BleAdvertiserHciExtendedImpl : public BleAdvertiserHciInterface {
  void OnAdvertisingSetTerminated(uint8_t length, uint8_t* p) {
  void OnAdvertisingSetTerminated(uint8_t length, uint8_t* p) {
    VLOG(1) << __func__;
    VLOG(1) << __func__;
    LOG_ASSERT(p);
    LOG_ASSERT(p);
    uint8_t status, advertising_handle, num_completed_adv_evt;
    uint8_t status, advertising_handle, num_completed_extended_adv_events;
    uint16_t conn_handle;
    uint16_t conn_handle;


    STREAM_TO_UINT8(status, p);
    STREAM_TO_UINT8(status, p);
    STREAM_TO_UINT8(advertising_handle, p);
    STREAM_TO_UINT8(advertising_handle, p);
    STREAM_TO_UINT16(conn_handle, p);
    STREAM_TO_UINT16(conn_handle, p);
    STREAM_TO_UINT8(num_completed_adv_evt, p);
    STREAM_TO_UINT8(num_completed_extended_adv_events, p);


    conn_handle = conn_handle & 0x0FFF;  // only 12 bits meaningful
    conn_handle = conn_handle & 0x0FFF;  // only 12 bits meaningful


    AdvertisingEventObserver* observer = this->advertising_event_observer;
    AdvertisingEventObserver* observer = this->advertising_event_observer;
    if (observer)
    if (observer)
      observer->OnAdvertisingStateChanged(advertising_handle, 0x00,
      observer->OnAdvertisingSetTerminated(status, advertising_handle,
                                          conn_handle);
                                           conn_handle,
                                           num_completed_extended_adv_events);
  }
  }


 private:
 private:
+23 −16
Original line number Original line Diff line number Diff line
@@ -25,7 +25,7 @@
/* This class is an abstraction of HCI commands used for managing
/* This class is an abstraction of HCI commands used for managing
 * advertisements. Please see VSC HCI SPEC at
 * advertisements. Please see VSC HCI SPEC at
 * https://static.googleusercontent.com/media/source.android.com/en//devices/Android-6.0-Bluetooth-HCI-Reqs.pdf
 * https://static.googleusercontent.com/media/source.android.com/en//devices/Android-6.0-Bluetooth-HCI-Reqs.pdf
 * for more details  */
 * and Bluetooth 5.0 "Advertising Extension" feature for more details  */
class BleAdvertiserHciInterface {
class BleAdvertiserHciInterface {
 public:
 public:
  using status_cb = base::Callback<void(uint8_t /* status */)>;
  using status_cb = base::Callback<void(uint8_t /* status */)>;
@@ -39,30 +39,37 @@ class BleAdvertiserHciInterface {
  class AdvertisingEventObserver {
  class AdvertisingEventObserver {
   public:
   public:
    virtual ~AdvertisingEventObserver() = default;
    virtual ~AdvertisingEventObserver() = default;
    virtual void OnAdvertisingStateChanged(uint8_t inst_id,
    virtual void OnAdvertisingSetTerminated(
                                           uint8_t state_change_reason,
        uint8_t status, uint8_t advertising_handle, uint16_t connection_handle,
                                           uint16_t connection_handle) = 0;
        uint8_t num_completed_extended_adv_events) = 0;
  };
  };


  virtual void SetAdvertisingEventObserver(
  virtual void SetAdvertisingEventObserver(
      AdvertisingEventObserver* observer) = 0;
      AdvertisingEventObserver* observer) = 0;
  virtual void ReadInstanceCount(
  virtual void ReadInstanceCount(
      base::Callback<void(uint8_t /* inst_cnt*/)> cb) = 0;
      base::Callback<void(uint8_t /* inst_cnt*/)> cb) = 0;
  virtual void SetParameters(uint8_t adv_int_min, uint8_t adv_int_max,
  virtual void SetParameters(uint8_t handle, uint16_t properties,
                             uint8_t advertising_type, uint8_t own_address_type,
                             uint32_t adv_int_min, uint32_t adv_int_max,
                             BD_ADDR own_address, uint8_t direct_address_type,
                             uint8_t channel_map, uint8_t own_address_type,
                             BD_ADDR direct_address, uint8_t channel_map,
                             uint8_t peer_address_type, BD_ADDR peer_address,
                             uint8_t filter_policy, uint8_t inst_id,
                             uint8_t filter_policy, int8_t tx_power,
                             uint8_t tx_power, status_cb command_complete) = 0;
                             uint8_t primary_phy, uint8_t secondary_max_skip,
  virtual void SetAdvertisingData(uint8_t data_length, uint8_t* data,
                             uint8_t secondary_phy, uint8_t advertising_sid,
                                  uint8_t inst_id,
                             uint8_t scan_request_notify_enable,
                             status_cb command_complete) = 0;
                             status_cb command_complete) = 0;
  virtual void SetScanResponseData(uint8_t scan_response_data_length,
  virtual void SetAdvertisingData(uint8_t handle, uint8_t operation,
                                   uint8_t* scan_response_data, uint8_t inst_id,
                                  uint8_t fragment_preference,
                                  uint8_t data_length, uint8_t* data,
                                  status_cb command_complete) = 0;
                                  status_cb command_complete) = 0;
  virtual void SetRandomAddress(BD_ADDR random_address, uint8_t inst_id,
  virtual void SetScanResponseData(uint8_t handle, uint8_t operation,
                                   uint8_t fragment_preference,
                                   uint8_t scan_response_data_length,
                                   uint8_t* scan_response_data,
                                   status_cb command_complete) = 0;
                                   status_cb command_complete) = 0;
  virtual void Enable(uint8_t advertising_enable, uint8_t inst_id,
  virtual void SetRandomAddress(uint8_t handle, BD_ADDR random_address,
                                status_cb command_complete) = 0;
  virtual void Enable(uint8_t enable, uint8_t handle, uint16_t duration,
                      uint8_t max_extended_advertising_events,
                      status_cb command_complete) = 0;
                      status_cb command_complete) = 0;
};
};


+25 −22
Original line number Original line Diff line number Diff line
@@ -130,7 +130,7 @@ class BleAdvertisingManagerImpl
    p_inst->rpa[3] = output.param_buf[2];
    p_inst->rpa[3] = output.param_buf[2];


    /* set it to controller */
    /* set it to controller */
    GetHciInterface()->SetRandomAddress(p_inst->rpa, p_inst->inst_id,
    GetHciInterface()->SetRandomAddress(p_inst->inst_id, p_inst->rpa,
                                        Bind(DoNothing));
                                        Bind(DoNothing));
  }
  }


@@ -268,7 +268,7 @@ class BleAdvertisingManagerImpl


    if (enable && timeout_s) {
    if (enable && timeout_s) {
      GetHciInterface()->Enable(
      GetHciInterface()->Enable(
          enable, p_inst->inst_id,
          enable, p_inst->inst_id, 0x0000, 0x00,
          Bind(&BleAdvertisingManagerImpl::EnableWithTimerCb,
          Bind(&BleAdvertisingManagerImpl::EnableWithTimerCb,
               base::Unretained(this), inst_id, timeout_s, timeout_cb));
               base::Unretained(this), inst_id, timeout_s, timeout_cb));
    } else {
    } else {
@@ -278,7 +278,7 @@ class BleAdvertisingManagerImpl
        p_inst->timeout_timer = nullptr;
        p_inst->timeout_timer = nullptr;
      }
      }


      GetHciInterface()->Enable(enable, p_inst->inst_id, cb);
      GetHciInterface()->Enable(enable, p_inst->inst_id, 0x0000, 0x00, cb);
    }
    }
  }
  }


@@ -316,15 +316,15 @@ class BleAdvertisingManagerImpl
             BD_ADDR_LEN);
             BD_ADDR_LEN);
    }
    }


    BD_ADDR dummy = {0, 0, 0, 0, 0, 0};

    p_inst->adv_evt = p_params->adv_type;
    p_inst->adv_evt = p_params->adv_type;
    p_inst->tx_power = p_params->tx_power;
    p_inst->tx_power = p_params->tx_power;
    BD_ADDR peer_address = {0, 0, 0, 0, 0, 0};


    GetHciInterface()->SetParameters(
    GetHciInterface()->SetParameters(
        p_params->adv_int_min, p_params->adv_int_max, p_params->adv_type,
        p_inst->inst_id, p_params->adv_type, p_params->adv_int_min,
        own_address_type, own_address, 0, dummy, p_params->channel_map,
        p_params->adv_int_max, p_params->channel_map, own_address_type, 0x00,
        p_params->adv_filter_policy, p_inst->inst_id, p_inst->tx_power, cb);
        peer_address, p_params->adv_filter_policy, p_inst->tx_power, 0x01, 0x01,
        0x01, 0x00, 0x00, cb);


    // TODO: re-enable only if it was enabled, properly call
    // TODO: re-enable only if it was enabled, properly call
    // SetParamsCallback
    // SetParamsCallback
@@ -371,11 +371,11 @@ class BleAdvertisingManagerImpl
    VLOG(1) << "data is: " << base::HexEncode(data.data(), data.size());
    VLOG(1) << "data is: " << base::HexEncode(data.data(), data.size());


    if (is_scan_rsp) {
    if (is_scan_rsp) {
      GetHciInterface()->SetScanResponseData(data.size(), data.data(), inst_id,
      GetHciInterface()->SetScanResponseData(inst_id, 0x03, 0x01, data.size(),
                                             cb);
                                             data.data(), cb);
    } else {
    } else {
      GetHciInterface()->SetAdvertisingData(data.size(), data.data(), inst_id,
      GetHciInterface()->SetAdvertisingData(inst_id, 0x03, 0x01, data.size(),
                                            cb);
                                            data.data(), cb);
    }
    }
  }
  }


@@ -389,22 +389,24 @@ class BleAdvertisingManagerImpl
    }
    }


    // TODO(jpawlowski): only disable when enabled or enabling
    // TODO(jpawlowski): only disable when enabled or enabling
    GetHciInterface()->Enable(false, inst_id, Bind(DoNothing));
    GetHciInterface()->Enable(false, inst_id, 0x00, 0x00, Bind(DoNothing));


    alarm_cancel(p_inst->adv_raddr_timer);
    alarm_cancel(p_inst->adv_raddr_timer);
    p_inst->in_use = false;
    p_inst->in_use = false;
  }
  }


  void OnAdvertisingStateChanged(uint8_t inst_id, uint8_t reason,
  void OnAdvertisingSetTerminated(
                                 uint16_t conn_handle) override {
      uint8_t status, uint8_t advertising_handle, uint16_t connection_handle,
    AdvertisingInstance* p_inst = &adv_inst[inst_id];
      uint8_t num_completed_extended_adv_events) override {
    VLOG(1) << __func__ << " inst_id: 0x" << std::hex << +inst_id
    AdvertisingInstance* p_inst = &adv_inst[advertising_handle];
            << ", reason: 0x" << std::hex << +reason << ", conn_handle: 0x"
    VLOG(1) << __func__ << "status: 0x" << std::hex << +status
            << std::hex << +conn_handle;
            << ", advertising_handle: 0x" << std::hex << +advertising_handle
            << ", connection_handle: 0x" << std::hex << +connection_handle;


#if (BLE_PRIVACY_SPT == TRUE)
#if (BLE_PRIVACY_SPT == TRUE)
    if (BTM_BleLocalPrivacyEnabled() && inst_id <= BTM_BLE_MULTI_ADV_MAX) {
    if (BTM_BleLocalPrivacyEnabled() &&
      btm_acl_update_conn_addr(conn_handle, p_inst->rpa);
        advertising_handle <= BTM_BLE_MULTI_ADV_MAX) {
      btm_acl_update_conn_addr(connection_handle, p_inst->rpa);
    }
    }
#endif
#endif


@@ -414,7 +416,8 @@ class BleAdvertisingManagerImpl
      // TODO(jpawlowski): we don't really allow to do directed advertising
      // TODO(jpawlowski): we don't really allow to do directed advertising
      // right now. This should probably be removed, check with Andre.
      // right now. This should probably be removed, check with Andre.
      if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT) {
      if (p_inst->adv_evt != BTM_BLE_CONNECT_DIR_EVT) {
        GetHciInterface()->Enable(true, inst_id, Bind(DoNothing));
        GetHciInterface()->Enable(true, advertising_handle, 0x00, 0x00,
                                  Bind(DoNothing));
      } else {
      } else {
        /* mark directed adv as disabled if adv has been stopped */
        /* mark directed adv as disabled if adv has been stopped */
        p_inst->in_use = false;
        p_inst->in_use = false;
+3 −2

File changed.

Preview size limit exceeded, changes collapsed.

+76 −63

File changed.

Preview size limit exceeded, changes collapsed.