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

Commit 6be98b5b authored by Archie Pusaka's avatar Archie Pusaka
Browse files

Add device_type information for remote name lookup

For reading the remote device's name we can do it the BREDR way (with
HCI command remote name request), or the LE way (via GAP/GATT).
However, we don't record which way we do it, so when we need to cancel
the request, we can only infer them via the recorded device type.
Problem arises when the peer device is a DUAL device. If we cancel the
wrong type then we might fail and get stuck.

This CL saves whether we does the reading via BREDR or LE, so we don't
need to infer the device type.

Bug: 336478597
Bug: 337179433
Test: m -j
Test: With a lot of fastpair-enabled peer devices simultaneously
      advertising, repeatedly do normal pairing and forget device to
      each peer device. Verify no failures because we fail to cancel
      the remote name request with the following error log:
      "Attempted to cancel remote name request to xx:xx:xx:xx:xx:xx
      that does not exist"

Change-Id: I4809f8193e7b6a4d1b5a7c68a9fc7e6f413e1f58
parent 34f8602a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1860,6 +1860,7 @@ tBTM_STATUS btm_ble_read_remote_name(const RawAddress& remote_bda,
  btm_cb.btm_inq_vars.p_remname_cmpl_cb = p_cb;
  btm_cb.btm_inq_vars.remname_active = true;
  btm_cb.btm_inq_vars.remname_bda = remote_bda;
  btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_BLE;

  alarm_set_on_mloop(btm_cb.btm_inq_vars.remote_name_timer,
                     BTM_EXT_BLE_RMT_NAME_TIMEOUT_MS,
@@ -1886,6 +1887,7 @@ bool btm_ble_cancel_remote_name(const RawAddress& remote_bda) {

  btm_cb.btm_inq_vars.remname_active = false;
  btm_cb.btm_inq_vars.remname_bda = RawAddress::kEmpty;
  btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;
  alarm_cancel(btm_cb.btm_inq_vars.remote_name_timer);

  return status;
+17 −2
Original line number Diff line number Diff line
@@ -855,10 +855,17 @@ tBTM_STATUS BTM_ReadRemoteDeviceName(const RawAddress& remote_bda,
 ******************************************************************************/
tBTM_STATUS BTM_CancelRemoteDeviceName(void) {
  log::verbose("");
  bool is_le;

  /* Make sure there is not already one in progress */
  if (btm_cb.btm_inq_vars.remname_active) {
    if (BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda)) {
    if (com::android::bluetooth::flags::rnr_store_device_type()) {
      is_le = (btm_cb.btm_inq_vars.remname_dev_type == BT_DEVICE_TYPE_BLE);
    } else {
      is_le = BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda);
    }

    if (is_le) {
      /* Cancel remote name request for LE device, and process remote name
       * callback. */
      btm_inq_rmt_name_failed_cancelled();
@@ -1044,6 +1051,7 @@ void btm_inq_db_reset(void) {
    alarm_cancel(btm_cb.btm_inq_vars.remote_name_timer);
    btm_cb.btm_inq_vars.remname_active = false;
    btm_cb.btm_inq_vars.remname_bda = RawAddress::kEmpty;
    btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;

    if (btm_cb.btm_inq_vars.p_remname_cmpl_cb) {
      rem_name.status = BTM_DEV_RESET;
@@ -1888,6 +1896,7 @@ tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda, uint8_t origin,
       * and start timer */
      btm_cb.btm_inq_vars.p_remname_cmpl_cb = p_cb;
      btm_cb.btm_inq_vars.remname_bda = remote_bda;
      btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_BREDR;

      alarm_set_on_mloop(btm_cb.btm_inq_vars.remote_name_timer, timeout_ms,
                         btm_inq_remote_name_timer_timeout, NULL);
@@ -1946,7 +1955,12 @@ void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
      .hci_status = hci_status,
  };

  const bool on_le_link = BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda);
  bool on_le_link;
  if (com::android::bluetooth::flags::rnr_store_device_type()) {
    on_le_link = (btm_cb.btm_inq_vars.remname_dev_type == BT_DEVICE_TYPE_BLE);
  } else {
    on_le_link = BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda);
  }

  /* If the inquire BDA and remote DBA are the same, then stop the timer and set
   * the active to false */
@@ -1981,6 +1995,7 @@ void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
      /* Reset the remote BDA and call callback if possible */
      btm_cb.btm_inq_vars.remname_active = false;
      btm_cb.btm_inq_vars.remname_bda = RawAddress::kEmpty;
      btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;

      tBTM_NAME_CMPL_CB* p_cb = btm_cb.btm_inq_vars.p_remname_cmpl_cb;
      btm_cb.btm_inq_vars.p_remname_cmpl_cb = nullptr;
+2 −0
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@ struct tBTM_INQUIRY_VAR_ST {
  RawAddress remname_bda; /* Name of bd addr for active remote name request */
#define BTM_RMT_NAME_EXT 0x1 /* Initiated through API */
  bool remname_active; /* State of a remote name request by external API */
  tBT_DEVICE_TYPE remname_dev_type; /* Whether it's LE or BREDR name request */

  tBTM_CMPL_CB* p_inq_cmpl_cb;
  tBTM_INQ_RESULTS_CB* p_inq_results_cb;
@@ -287,6 +288,7 @@ struct tBTM_INQUIRY_VAR_ST {

    remname_bda = {};
    remname_active = false;
    remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;

    p_inq_cmpl_cb = nullptr;
    p_inq_results_cb = nullptr;
+6 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ class BtmInqActiveTest : public BtmInqTest {

    btm_cb.btm_inq_vars.remname_active = true;
    btm_cb.btm_inq_vars.remname_bda = kRawAddress;
    btm_cb.btm_inq_vars.remname_dev_type = BT_DEVICE_TYPE_BREDR;
    btm_cb.btm_inq_vars.p_remname_cmpl_cb =
        [](const tBTM_REMOTE_DEV_NAME* name) {
          gBTM_REMOTE_DEV_NAME = *name;
@@ -75,6 +76,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__typical) {
  ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -89,6 +91,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__no_name) {
  ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -103,6 +106,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__bad_status) {
  ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -117,6 +121,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__no_address) {
  ASSERT_FALSE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -132,6 +137,7 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__different_address) {
  ASSERT_TRUE(btm_cb.btm_inq_vars.p_remname_cmpl_cb);
  ASSERT_TRUE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_NE(btm_cb.btm_inq_vars.remname_bda, RawAddress::kEmpty);
  ASSERT_NE(btm_cb.btm_inq_vars.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(0, get_func_call_count("alarm_cancel"));

  ASSERT_FALSE(gBTM_REMOTE_DEV_NAME_sent);