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

Commit a7674aff authored by Łukasz Rymanowski's avatar Łukasz Rymanowski Committed by Automerger Merge Worker
Browse files

eatt: Fix for the crash on incoming channel creation am: a73433ee

Original change: https://googleplex-android-review.googlesource.com/c/platform/system/bt/+/15028040

Change-Id: Iace1ce7c658fc4f1eaa663d1d2608e25df3eaadc
parents 44308e85 a73433ee
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -131,6 +131,12 @@ struct eatt_impl {
                                    &local_coc_cfg))
      return;

    if (!eatt_dev->eatt_tcb_) {
      eatt_dev->eatt_tcb_ =
          gatt_find_tcb_by_addr(eatt_dev->bda_, BT_TRANSPORT_LE);
      CHECK(eatt_dev->eatt_tcb_);
    }

    for (uint16_t cid : lcids) {
      EattChannel* channel = find_eatt_channel_by_cid(bda, cid);
      CHECK(!channel);
@@ -140,8 +146,6 @@ struct eatt_impl {
      eatt_dev->eatt_channels.insert({cid, chan});

      chan->EattChannelSetState(EattChannelState::EATT_CHANNEL_OPENED);

      CHECK(eatt_dev->eatt_tcb_);
      eatt_dev->eatt_tcb_->eatt++;

      LOG(INFO) << __func__ << " Channel connected CID " << loghex(cid);
+27 −12
Original line number Diff line number Diff line
@@ -110,9 +110,8 @@ class EattTest : public testing::Test {
    ASSERT_TRUE(test_tcb.eatt == 0);
  }

  void DisconnectEattDevice(void) {
    EXPECT_CALL(l2cap_interface_, DisconnectRequest(_))
        .Times(connected_cids_.size());
  void DisconnectEattDevice(std::vector<uint16_t> cids) {
    EXPECT_CALL(l2cap_interface_, DisconnectRequest(_)).Times(cids.size());
    eatt_instance_->Disconnect(test_address);

    ASSERT_TRUE(test_tcb.eatt == 0);
@@ -177,12 +176,28 @@ class EattTest : public testing::Test {

TEST_F(EattTest, ConnectSucceed) {
  ConnectDeviceEattSupported(1);
  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconnectInitiatedByRemoteSucceed) {
  ConnectDeviceEattSupported(1);
  DisconnectEattDevice(connected_cids_);
  std::vector<uint16_t> incoming_cids{71, 72, 73, 74, 75};

  EXPECT_CALL(
      l2cap_interface_,
      ConnectCreditBasedRsp(test_address, 1, incoming_cids, L2CAP_CONN_OK, _))
      .WillOnce(Return(true));

  l2cap_app_info_.pL2CA_CreditBasedConnectInd_Cb(
      test_address, incoming_cids, BT_PSM_EATT, EATT_MIN_MTU_MPS, 1);

  DisconnectEattDevice(incoming_cids);
}

TEST_F(EattTest, ConnectSucceedMultipleChannels) {
  ConnectDeviceEattSupported(5);
  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ConnectFailedEattNotSupported) {
@@ -253,7 +268,7 @@ TEST_F(EattTest, ReconfigAllSucceed) {
    ASSERT_TRUE(channel->rx_mtu_ == new_mtu);
  }

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconfigAllFailed) {
@@ -281,7 +296,7 @@ TEST_F(EattTest, ReconfigAllFailed) {
    ASSERT_TRUE(channel->rx_mtu_ != new_mtu);
  }

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconfigSingleSucceed) {
@@ -308,7 +323,7 @@ TEST_F(EattTest, ReconfigSingleSucceed) {
  ASSERT_TRUE(channel->state_ == EattChannelState::EATT_CHANNEL_OPENED);
  ASSERT_TRUE(channel->rx_mtu_ == new_mtu);

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconfigSingleFailed) {
@@ -336,7 +351,7 @@ TEST_F(EattTest, ReconfigSingleFailed) {
  ASSERT_TRUE(channel->state_ == EattChannelState::EATT_CHANNEL_OPENED);
  ASSERT_TRUE(channel->rx_mtu_ != new_mtu);

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconfigPeerSucceed) {
@@ -355,7 +370,7 @@ TEST_F(EattTest, ReconfigPeerSucceed) {
    ASSERT_TRUE(channel->tx_mtu_ == new_mtu);
  }

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, ReconfigPeerFailed) {
@@ -375,12 +390,12 @@ TEST_F(EattTest, ReconfigPeerFailed) {
    ASSERT_TRUE(channel->tx_mtu_ != new_mtu);
  }

  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);
}

TEST_F(EattTest, DoubleDisconnect) {
  ConnectDeviceEattSupported(1);
  DisconnectEattDevice();
  DisconnectEattDevice(connected_cids_);

  /* Force second disconnect */
  eatt_instance_->Disconnect(test_address);