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

Commit 2deeb7b5 authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Jakub Pawłowski
Browse files

BTA discovery/search: clean up logic for picking transport.

For device search , we should never check the control block content, and
rely on information we found about device.

For service discovery, it's enough to just pass transport, no need to
store it in control block.

Bug: 330675788
Bug: 335732980
Flag: com.android.bluetooth.flags.separate_service_and_device_discovery
Test: mma -j32
Change-Id: I1442857de0c0cfdd0edeb9f34fe7efe064001bd8
parent fc57e5f8
Loading
Loading
Loading
Loading
+25 −37
Original line number Diff line number Diff line
@@ -113,7 +113,8 @@ static void bta_dm_sdp_callback(const RawAddress& bd_addr,
static bool bta_dm_read_remote_device_name(const RawAddress& bd_addr,
                                           tBT_TRANSPORT transport);
static void bta_dm_discover_name(const RawAddress& remote_bd_addr);
static void bta_dm_discover_services(const RawAddress& remote_bd_addr);
static void bta_dm_discover_services(const RawAddress& remote_bd_addr,
                                     tBT_TRANSPORT transport);

static void bta_dm_disable_search_and_disc(void);

@@ -401,14 +402,13 @@ static void bta_dm_discover(tBTA_DM_API_DISCOVER& discover) {
  bta_dm_search_cb.peer_name[0] = 0;
  bta_dm_search_cb.p_btm_inq_info =
      get_btm_client_interface().db.BTM_InqDbRead(discover.bd_addr);
  bta_dm_search_cb.transport = discover.transport;

  bta_dm_search_cb.name_discover_done = false;

  log::info(
      "bta_dm_discovery: starting service discovery to {} , transport: {}",
      discover.bd_addr, bt_transport_text(discover.transport));
  bta_dm_discover_services(discover.bd_addr);
  bta_dm_discover_services(discover.bd_addr, discover.transport);
}

/*******************************************************************************
@@ -973,6 +973,8 @@ static void bta_dm_disc_result(tBTA_DM_SVC_RES& disc_result) {
    auto& r = disc_result;
    bta_dm_search_cb.service_search_cbacks.on_service_discovery_results(
        r.bd_addr, r.services, r.device_type, r.uuids, r.result, r.hci_status);
  } else {
    GAP_BleReadPeerPrefConnParams(bta_dm_search_cb.peer_bdaddr);
  }

  /* Services were discovered while device search is in progress.
@@ -1226,28 +1228,23 @@ static void bta_dm_discover_next_device(void) {
 ******************************************************************************/
static tBT_TRANSPORT bta_dm_determine_discovery_transport(
    const RawAddress& remote_bd_addr) {
  tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR;
  if (bta_dm_search_cb.transport == BT_TRANSPORT_AUTO) {
  tBT_DEVICE_TYPE dev_type;
  tBLE_ADDR_TYPE addr_type;

  get_btm_client_interface().peer.BTM_ReadDevInfo(remote_bd_addr, &dev_type,
                                                  &addr_type);
  if (dev_type == BT_DEVICE_TYPE_BLE || addr_type == BLE_ADDR_RANDOM) {
      transport = BT_TRANSPORT_LE;
    return BT_TRANSPORT_LE;
  } else if (dev_type == BT_DEVICE_TYPE_DUMO) {
    if (get_btm_client_interface().peer.BTM_IsAclConnectionUp(
            remote_bd_addr, BT_TRANSPORT_BR_EDR)) {
        transport = BT_TRANSPORT_BR_EDR;
      return BT_TRANSPORT_BR_EDR;
    } else if (get_btm_client_interface().peer.BTM_IsAclConnectionUp(
                   remote_bd_addr, BT_TRANSPORT_LE)) {
        transport = BT_TRANSPORT_LE;
      return BT_TRANSPORT_LE;
    }
  }
  } else {
    transport = bta_dm_search_cb.transport;
  }
  return transport;
  return BT_TRANSPORT_BR_EDR;
}

static void bta_dm_discover_name(const RawAddress& remote_bd_addr) {
@@ -1307,9 +1304,6 @@ static void bta_dm_discover_name(const RawAddress& remote_bd_addr) {
    bta_dm_search_cb.name_discover_done = true;
  }

  /* Reset transport state for next discovery */
  bta_dm_search_cb.transport = BT_TRANSPORT_AUTO;

  /* name discovery is done for this device */
  if (bta_dm_search_get_state() == BTA_DM_SEARCH_ACTIVE) {
    // if p_btm_inq_info is nullptr, there is no more inquiry results to
@@ -1325,9 +1319,11 @@ static void bta_dm_discover_name(const RawAddress& remote_bd_addr) {
  }
}

static void bta_dm_discover_services(const RawAddress& remote_bd_addr) {
  const tBT_TRANSPORT transport =
      bta_dm_determine_discovery_transport(remote_bd_addr);
static void bta_dm_discover_services(const RawAddress& remote_bd_addr,
                                     tBT_TRANSPORT transport) {
  if (transport == BT_TRANSPORT_AUTO) {
    transport = bta_dm_determine_discovery_transport(remote_bd_addr);
  }

  log::verbose("BDA: {}, transport={}, state = {}",
               ADDRESS_TO_LOGGABLE_STR(remote_bd_addr), transport,
@@ -1335,9 +1331,6 @@ static void bta_dm_discover_services(const RawAddress& remote_bd_addr) {

  bta_dm_search_cb.peer_bdaddr = remote_bd_addr;

  /* Reset transport state for next discovery */
  bta_dm_search_cb.transport = BT_TRANSPORT_AUTO;

  bool sdp_disable = HID_HostSDPDisable(remote_bd_addr);
  if (sdp_disable)
    log::debug("peer:{} with HIDSDPDisable attribute.", remote_bd_addr);
@@ -1585,10 +1578,6 @@ static void bta_dm_remname_cback(const tBTM_REMOTE_DEV_NAME* p_remote_name) {
  bta_dm_search_cb.name_discover_done = true;
  bd_name_copy(bta_dm_search_cb.peer_name, p_remote_name->remote_bd_name);

  if (bta_dm_search_cb.transport == BT_TRANSPORT_LE) {
    GAP_BleReadPeerPrefConnParams(bta_dm_search_cb.peer_bdaddr);
  }

  auto msg = std::make_unique<tBTA_DM_MSG>(tBTA_DM_REMOTE_NAME{});
  auto& rmt_name_msg = std::get<tBTA_DM_REMOTE_NAME>(*msg);
  rmt_name_msg.bd_addr = bta_dm_search_cb.peer_bdaddr;
@@ -2271,7 +2260,6 @@ static void bta_dm_disc_init_search_cb(tBTA_DM_SEARCH_CB& bta_dm_search_cb) {
  bta_dm_search_cb.search_state = BTA_DM_SEARCH_IDLE;
  bta_dm_search_cb.service_discovery_state = BTA_DM_DISCOVER_IDLE;
  bta_dm_search_cb.conn_id = GATT_INVALID_CONN_ID;
  bta_dm_search_cb.transport = BT_TRANSPORT_AUTO;
}

static void bta_dm_disc_reset() {
+0 −1
Original line number Diff line number Diff line
@@ -180,7 +180,6 @@ typedef struct {
  bool sdp_results;
  bluetooth::Uuid uuid;
  uint8_t peer_scn;
  tBT_TRANSPORT transport;
  tBTA_DM_SEARCH_CBACK* p_csis_scan_cback;
  tGATT_IF client_if;
  uint8_t uuid_to_search;
+3 −29
Original line number Diff line number Diff line
@@ -399,31 +399,9 @@ TEST_F(BtaDmTest, bta_dm_remname_cback__HCI_ERR_CONNECTION_EXISTS) {
      bluetooth::legacy::testing::bta_dm_disc_search_cb().name_discover_done);
}

TEST_F(BtaDmTest, bta_dm_determine_discovery_transport__BT_TRANSPORT_BR_EDR) {
TEST_F(BtaDmTest, bta_dm_determine_discovery_transport__BR_EDR) {
  tBTA_DM_SEARCH_CB& search_cb =
      bluetooth::legacy::testing::bta_dm_disc_search_cb();
  search_cb.transport = BT_TRANSPORT_BR_EDR;

  ASSERT_EQ(BT_TRANSPORT_BR_EDR,
            bluetooth::legacy::testing::bta_dm_determine_discovery_transport(
                kRawAddress));
}

TEST_F(BtaDmTest, bta_dm_determine_discovery_transport__BT_TRANSPORT_LE) {
  tBTA_DM_SEARCH_CB& search_cb =
      bluetooth::legacy::testing::bta_dm_disc_search_cb();
  search_cb.transport = BT_TRANSPORT_LE;

  ASSERT_EQ(BT_TRANSPORT_LE,
            bluetooth::legacy::testing::bta_dm_determine_discovery_transport(
                kRawAddress));
}

TEST_F(BtaDmTest,
       bta_dm_determine_discovery_transport__BT_TRANSPORT_AUTO__BR_EDR) {
  tBTA_DM_SEARCH_CB& search_cb =
      bluetooth::legacy::testing::bta_dm_disc_search_cb();
  search_cb.transport = BT_TRANSPORT_AUTO;

  mock_btm_client_interface.peer.BTM_ReadDevInfo =
      [](const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type,
@@ -437,11 +415,9 @@ TEST_F(BtaDmTest,
                kRawAddress));
}

TEST_F(BtaDmTest,
       bta_dm_determine_discovery_transport__BT_TRANSPORT_AUTO__BLE__PUBLIC) {
TEST_F(BtaDmTest, bta_dm_determine_discovery_transport__BLE__PUBLIC) {
  tBTA_DM_SEARCH_CB& search_cb =
      bluetooth::legacy::testing::bta_dm_disc_search_cb();
  search_cb.transport = BT_TRANSPORT_AUTO;

  mock_btm_client_interface.peer.BTM_ReadDevInfo =
      [](const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type,
@@ -455,11 +431,9 @@ TEST_F(BtaDmTest,
                kRawAddress));
}

TEST_F(BtaDmTest,
       bta_dm_determine_discovery_transport__BT_TRANSPORT_AUTO__DUMO) {
TEST_F(BtaDmTest, bta_dm_determine_discovery_transport__DUMO) {
  tBTA_DM_SEARCH_CB& search_cb =
      bluetooth::legacy::testing::bta_dm_disc_search_cb();
  search_cb.transport = BT_TRANSPORT_AUTO;

  mock_btm_client_interface.peer.BTM_ReadDevInfo =
      [](const RawAddress& remote_bda, tBT_DEVICE_TYPE* p_dev_type,