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

Commit 1a399acb authored by Jakub Pawlowski's avatar Jakub Pawlowski Committed by Jakub Pawłowski
Browse files

Split bta_dm_discover into bta_dm_discover_services and bta_dm_discover_name

When searching for devices, BT stack had capability to search for
specific service. That meant connecting to every classic address in inquiry
database, performing SDP and returning results that expose particular
service.

This functionality is never used, "services" parameter to search request
was deleted in Change-Id: I85ce622d9e99ec4430032d0233d588b2ec5a9cdf

The code for performing name and service discovery on each inquiry result is
now in bta_dm_discover. Part responsible for service discovery is also
used after bonding, to discover LE and Classic profiles.

This patch splits name and service discovery into separate functions, as
they are never peformed together. Wether name or service discovery is
performed, is decided based on tBTA_DM_SEARCH_CB.services, which is
removed in next patch.

Bug: 330675788
Flag: exempt, trivial
Test: mma -j32
Change-Id: Ib1dd3ce94e95f49f75da946c152773f78711604d
parent 1ac3b366
Loading
Loading
Loading
Loading
+39 −18
Original line number Diff line number Diff line
@@ -100,7 +100,8 @@ static void bta_dm_sdp_callback(const RawAddress& bd_addr,
static void bta_dm_search_timer_cback(void* data);
static bool bta_dm_read_remote_device_name(const RawAddress& bd_addr,
                                           tBT_TRANSPORT transport);
static void bta_dm_discover_device(const RawAddress& remote_bd_addr);
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_disable_search_and_disc(void);

@@ -362,7 +363,7 @@ static void bta_dm_discover(tBTA_DM_API_DISCOVER& discover) {
      "bta_dm_discovery: starting service discovery to {} , transport: {}",
      ADDRESS_TO_LOGGABLE_CSTR(discover.bd_addr),
      bt_transport_text(discover.transport));
  bta_dm_discover_device(discover.bd_addr);
  bta_dm_discover_services(discover.bd_addr);
}

/*******************************************************************************
@@ -459,11 +460,11 @@ static void bta_dm_inq_cmpl() {
  bta_dm_search_cb.p_btm_inq_info =
      get_btm_client_interface().db.BTM_InqDbFirst();
  if (bta_dm_search_cb.p_btm_inq_info != NULL) {
    /* start name and service discovery from the first device on inquiry result
    /* start name discovery from the first device on inquiry result
     */
    bta_dm_search_cb.name_discover_done = false;
    bta_dm_search_cb.peer_name[0] = 0;
    bta_dm_discover_device(
    bta_dm_discover_name(
        bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
  } else {
    bta_dm_search_cb.services = 0;
@@ -511,10 +512,12 @@ static void bta_dm_remote_name_cmpl(

  switch (bta_dm_search_get_state()) {
    case BTA_DM_SEARCH_ACTIVE:
      bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
      bta_dm_discover_name(bta_dm_search_cb.peer_bdaddr);
      break;
    case BTA_DM_DISCOVER_ACTIVE:
      bta_dm_discover_device(remote_name_msg.bd_addr);
      /* TODO: Get rid of this case when Name and Service discovery state
       * machines are separated */
      bta_dm_discover_name(remote_name_msg.bd_addr);
      break;
    case BTA_DM_SEARCH_IDLE:
    case BTA_DM_SEARCH_CANCELLING:
@@ -1235,7 +1238,7 @@ static void bta_dm_discover_next_device(void) {
  if (bta_dm_search_cb.p_btm_inq_info != NULL) {
    bta_dm_search_cb.name_discover_done = false;
    bta_dm_search_cb.peer_name[0] = 0;
    bta_dm_discover_device(
    bta_dm_discover_name(
        bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
  } else {
    /* no devices, search complete */
@@ -1247,7 +1250,7 @@ static void bta_dm_discover_next_device(void) {

/*******************************************************************************
 *
 * Function         bta_dm_discover_device
 * Function         bta_dm_determine_discovery_transport
 *
 * Description      Starts name and service discovery on the device
 *
@@ -1280,7 +1283,7 @@ static tBT_TRANSPORT bta_dm_determine_discovery_transport(
  return transport;
}

static void bta_dm_discover_device(const RawAddress& remote_bd_addr) {
static void bta_dm_discover_name(const RawAddress& remote_bd_addr) {
  const tBT_TRANSPORT transport =
      bta_dm_determine_discovery_transport(remote_bd_addr);

@@ -1344,6 +1347,32 @@ static void bta_dm_discover_device(const RawAddress& remote_bd_addr) {
  /* Reset transport state for next discovery */
  bta_dm_search_cb.transport = BT_TRANSPORT_AUTO;

  /* name discovery is done for this device */
  auto msg = std::make_unique<tBTA_DM_MSG>(tBTA_DM_SVC_RES{});
  auto& svc_result = std::get<tBTA_DM_SVC_RES>(*msg);

  /* initialize the data structure */
  svc_result.result = BTA_SUCCESS;
  svc_result.services = bta_dm_search_cb.services_found;
  svc_result.bd_addr = bta_dm_search_cb.peer_bdaddr;

  /* TODO: name and service discovery should use different event */
  bta_dm_search_sm_execute(BTA_DM_DISCOVERY_RESULT_EVT, std::move(msg));
}

static void bta_dm_discover_services(const RawAddress& remote_bd_addr) {
  const tBT_TRANSPORT transport =
      bta_dm_determine_discovery_transport(remote_bd_addr);

  log::verbose("BDA: {}, transport={}, state = {}",
               ADDRESS_TO_LOGGABLE_STR(remote_bd_addr), transport,
               bta_dm_search_get_state());

  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.",
@@ -1376,14 +1405,6 @@ static void bta_dm_discover_device(const RawAddress& remote_bd_addr) {
        else
          bta_dm_search_cb.wait_disc = true;
      }
      if (bta_dm_search_cb.p_btm_inq_info) {
        log::verbose(
            "p_btm_inq_info 0x{} results.device_type 0x{:x} services_to_search "
            "0x{:x}",
            fmt::ptr(bta_dm_search_cb.p_btm_inq_info),
            bta_dm_search_cb.p_btm_inq_info->results.device_type,
            bta_dm_search_cb.services_to_search);
      }

      if (transport == BT_TRANSPORT_LE) {
        if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK) {
@@ -1405,7 +1426,7 @@ static void bta_dm_discover_device(const RawAddress& remote_bd_addr) {
    }
  }

  /* name discovery and service discovery are done for this device */
  /* service discovery is done for this device */
  auto msg = std::make_unique<tBTA_DM_MSG>(tBTA_DM_SVC_RES{});
  auto& svc_result = std::get<tBTA_DM_SVC_RES>(*msg);