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

Commit e9fced42 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Gerrit Code Review
Browse files

Merge "isomanager: Add callback to create cis command"

parents 6fcb47e8 bb50a0b1
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -172,6 +172,29 @@ struct iso_impl {
                                                 base::Unretained(this)));
  }

  void on_status_establish_cis(
      struct iso_manager::cis_establish_params conn_params, uint8_t* stream,
      uint16_t len) {
    uint8_t status;

    LOG_ASSERT(len == 2) << "Invalid packet length: " << len;

    STREAM_TO_UINT16(status, stream);
    if (status == HCI_SUCCESS) {
      /* Wait for connection established event */
      return;
    }

    for (auto cis : conn_params.conn_pairs) {
      cis_establish_cmpl_evt evt;

      evt.status = status;
      evt.cis_conn_hdl = cis.cis_conn_handle;
      evt.cig_id = 0xFF;
      cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt);
    }
  }

  void establish_cis(struct iso_manager::cis_establish_params conn_params) {
    for (auto& el : conn_params.conn_pairs) {
      auto cis = GetCisIfKnown(el.cis_conn_handle);
@@ -180,7 +203,9 @@ struct iso_impl {
          << "Already connected";
    }
    btsnd_hcic_create_cis(conn_params.conn_pairs.size(),
                          conn_params.conn_pairs.data());
                          conn_params.conn_pairs.data(),
                          base::BindOnce(&iso_impl::on_status_establish_cis,
                                         base::Unretained(this), conn_params));
  }

  void disconnect_cis(uint16_t cis_handle, uint8_t reason) {
+7 −10
Original line number Diff line number Diff line
@@ -865,16 +865,12 @@ void btsnd_hcic_set_cig_params(
                            std::move(cb));
}

void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) {
  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
  uint8_t* pp = (uint8_t*)(p + 1);

  const int param_len = 1 + num_cis * 4;
  p->len = HCIC_PREAMBLE_SIZE + param_len;
  p->offset = 0;
void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                           base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
  const int params_len = 1 + num_cis * 4;
  uint8_t param[params_len];
  uint8_t* pp = param;

  UINT16_TO_STREAM(pp, HCI_LE_CREATE_CIS);
  UINT8_TO_STREAM(pp, param_len);
  UINT8_TO_STREAM(pp, num_cis);

  for (int i = 0; i < num_cis; i++) {
@@ -882,7 +878,8 @@ void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) {
    UINT16_TO_STREAM(pp, cis_cfg[i].acl_conn_handle);
  }

  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_LE_CREATE_CIS, param, params_len,
                            std::move(cb));
}

void btsnd_hcic_remove_cig(uint8_t cig_id,
+3 −2
Original line number Diff line number Diff line
@@ -925,8 +925,9 @@ struct EXT_CIS_CREATE_CFG {
  uint16_t acl_conn_handle;
};

extern void btsnd_hcic_create_cis(uint8_t num_cis,
                                  const EXT_CIS_CREATE_CFG* cis_create_cfg);
extern void btsnd_hcic_create_cis(
    uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg,
    base::OnceCallback<void(uint8_t*, uint16_t)> cb);

extern void btsnd_hcic_remove_cig(
    uint8_t cig_id, base::OnceCallback<void(uint8_t*, uint16_t)> cb);
+51 −9
Original line number Diff line number Diff line
@@ -143,7 +143,8 @@ class IsoManagerTest : public Test {

    // Default mock CreateCis action
    ON_CALL(hcic_interface_, CreateCis)
        .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) {
        .WillByDefault([](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                          base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
          for (const EXT_CIS_CREATE_CFG* cis = cis_cfg; num_cis != 0;
               num_cis--, cis++) {
            std::vector<uint8_t> buf(28);
@@ -755,10 +756,12 @@ TEST_F(IsoManagerTest, EstablishCisHciCall) {
  }

  EXPECT_CALL(hcic_interface_,
              CreateCis(2, iso_matchers::EqPointedArray(
              CreateCis(2,
                        iso_matchers::EqPointedArray(
                            params.conn_pairs.data(),
                            params.conn_pairs.size() *
                                   sizeof(params.conn_pairs.data()[0]))))
                                sizeof(params.conn_pairs.data()[0])),
                        _))
      .Times(1);
  IsoManager::GetInstance()->EstablishCis(params);
}
@@ -796,8 +799,8 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) {
      volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams);

  ON_CALL(hcic_interface_, CreateCis)
      .WillByDefault([this](uint8_t num_cis,
                            const EXT_CIS_CREATE_CFG* cis_cfg) {
      .WillByDefault([this](uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                            base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
        for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) {
          std::vector<uint8_t> buf(27);
          uint8_t* p = buf.data();
@@ -833,14 +836,53 @@ TEST_F(IsoManagerDeathTest, EstablishCisInvalidResponsePacket) {
      ::testing::KilledBySignal(SIGABRT), "Invalid packet length");
}

TEST_F(IsoManagerTest, EstablishCisInvalidCommandStatus) {
  IsoManager::GetInstance()->CreateCig(
      volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams);
  uint16_t invalid_status = 0x0001;

  ON_CALL(hcic_interface_, CreateCis)
      .WillByDefault([invalid_status](
                         uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                         base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
        std::move(cb).Run((uint8_t*)&invalid_status, sizeof(invalid_status));
        return 0;
      });

  EXPECT_CALL(
      *cig_callbacks_,
      OnCisEvent(bluetooth::hci::iso_manager::kIsoEventCisEstablishCmpl, _))
      .Times(kDefaultCigParams.cis_cfgs.size())
      .WillRepeatedly([this, invalid_status](uint8_t type, void* data) {
        bluetooth::hci::iso_manager::cis_establish_cmpl_evt* evt =
            static_cast<bluetooth::hci::iso_manager::cis_establish_cmpl_evt*>(
                data);

        ASSERT_EQ(evt->status, invalid_status);
        ASSERT_TRUE(
            std::find(volatile_test_cig_create_cmpl_evt_.conn_handles.begin(),
                      volatile_test_cig_create_cmpl_evt_.conn_handles.end(),
                      evt->cis_conn_hdl) !=
            volatile_test_cig_create_cmpl_evt_.conn_handles.end());
      });

  // Establish all CISes
  bluetooth::hci::iso_manager::cis_establish_params params;
  for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) {
    params.conn_pairs.push_back({handle, 1});
  }
  IsoManager::GetInstance()->EstablishCis(params);
}

TEST_F(IsoManagerTest, EstablishCisInvalidStatus) {
  IsoManager::GetInstance()->CreateCig(
      volatile_test_cig_create_cmpl_evt_.cig_id, kDefaultCigParams);
  uint8_t invalid_status = 0x01;

  ON_CALL(hcic_interface_, CreateCis)
      .WillByDefault([this, invalid_status](uint8_t num_cis,
                                            const EXT_CIS_CREATE_CFG* cis_cfg) {
      .WillByDefault([this, invalid_status](
                         uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                         base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
        for (auto& handle : volatile_test_cig_create_cmpl_evt_.conn_handles) {
          std::vector<uint8_t> buf(28);
          uint8_t* p = buf.data();
+3 −2
Original line number Diff line number Diff line
@@ -46,8 +46,9 @@ void btsnd_hcic_remove_cig(uint8_t cig_id,
  hcic_interface->RemoveCig(cig_id, std::move(cb));
}

void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg) {
  hcic_interface->CreateCis(num_cis, cis_cfg);
void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_cfg,
                           base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
  hcic_interface->CreateCis(num_cis, cis_cfg, std::move(cb));
}

void btsnd_hcic_disconnect(uint16_t handle, uint8_t reason) {
Loading