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

Commit 0b40dd01 authored by Łukasz Rymanowski's avatar Łukasz Rymanowski
Browse files

btm/iso: Add cis connecting state

Track connecting state of the CIS, since LeAudio can call DisconnectCis
when CIS is pending. This can happen, when controller does not send HCI
CIS Established event for a long time.

Bug: 150670922
Tag: #feature
Sponsor: jpawlowski@
test: atest --host  net_test_btm_iso

Change-Id: I6973b0835a7ccd736a1166b62941cfce6b1df4f1
parent 6c1ac64c
Loading
Loading
Loading
Loading
+20 −13
Original line number Diff line number Diff line
@@ -43,9 +43,10 @@ static constexpr uint8_t kIsoHeaderWithTsLen = 12;
static constexpr uint8_t kIsoHeaderWithoutTsLen = 8;

static constexpr uint8_t kStateFlagsNone = 0x00;
static constexpr uint8_t kStateFlagIsConnected = 0x01;
static constexpr uint8_t kStateFlagHasDataPathSet = 0x02;
static constexpr uint8_t kStateFlagIsBroadcast = 0x04;
static constexpr uint8_t kStateFlagIsConnecting = 0x01;
static constexpr uint8_t kStateFlagIsConnected = 0x02;
static constexpr uint8_t kStateFlagHasDataPathSet = 0x04;
static constexpr uint8_t kStateFlagIsBroadcast = 0x10;

struct iso_sync_info {
  uint32_t first_sync_ts;
@@ -194,20 +195,22 @@ struct iso_impl {
    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) {
    for (auto cis_param : conn_params.conn_pairs) {
      cis_establish_cmpl_evt evt;

      if (status == HCI_SUCCESS) {
        /* Set connecting flag and wait for connection established event */
        auto cis = GetCisIfKnown(cis_param.cis_conn_handle);
        cis->state_flags |= kStateFlagIsConnecting;
      } else {
        evt.status = status;
      evt.cis_conn_hdl = cis.cis_conn_handle;
        evt.cis_conn_hdl = cis_param.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) {
@@ -225,7 +228,9 @@ struct iso_impl {
  void disconnect_cis(uint16_t cis_handle, uint8_t reason) {
    auto cis = GetCisIfKnown(cis_handle);
    LOG_ASSERT(cis) << "No such cis";
    LOG_ASSERT(cis->state_flags & kStateFlagIsConnected) << "Not connected";
    LOG_ASSERT(cis->state_flags & kStateFlagIsConnected ||
               cis->state_flags & kStateFlagIsConnecting)
        << "Not connected";
    bluetooth::legacy::hci::GetInterface().Disconnect(
        cis_handle, static_cast<tHCI_STATUS>(reason));
  }
@@ -465,6 +470,8 @@ struct iso_impl {

    if (evt.status == HCI_SUCCESS) cis->state_flags |= kStateFlagIsConnected;

    cis->state_flags &= ~kStateFlagIsConnecting;

    evt.cig_id = cis->cig_id;
    cig_callbacks_->OnCisEvent(kIsoEventCisEstablishCmpl, &evt);
  }