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

Commit 52a2eed3 authored by Chris Manton's avatar Chris Manton Committed by Automerger Merge Worker
Browse files

stack::btm::tBTM_CB Extract rnr data fields into structure am: 407d1ae9

parents 1efd053b 407d1ae9
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -1696,21 +1696,21 @@ tBTM_STATUS btm_ble_read_remote_name(const RawAddress& remote_bda,
  }

  /* read remote device name using GATT procedure */
  if (btm_cb.btm_inq_vars.remname_active) {
  if (btm_cb.btm_inq_vars.rnr.remname_active) {
    log::warn(
        "Unable to start GATT RNR procedure for peer:{} busy with peer:{}",
        remote_bda, btm_cb.btm_inq_vars.remname_bda);
        remote_bda, btm_cb.btm_inq_vars.rnr.remname_bda);
    return BTM_BUSY;
  }
  if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl))
    return BTM_BUSY;

  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;
  btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb = p_cb;
  btm_cb.btm_inq_vars.rnr.remname_active = true;
  btm_cb.btm_inq_vars.rnr.remname_bda = remote_bda;
  btm_cb.btm_inq_vars.rnr.remname_dev_type = BT_DEVICE_TYPE_BLE;

  alarm_set_on_mloop(btm_cb.btm_inq_vars.remote_name_timer,
  alarm_set_on_mloop(btm_cb.btm_inq_vars.rnr.remote_name_timer,
                     BTM_EXT_BLE_RMT_NAME_TIMEOUT_MS,
                     btm_inq_remote_name_timer_timeout, NULL);

@@ -1733,10 +1733,10 @@ bool btm_ble_cancel_remote_name(const RawAddress& remote_bda) {

  status = GAP_BleCancelReadPeerDevName(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);
  btm_cb.btm_inq_vars.rnr.remname_active = false;
  btm_cb.btm_inq_vars.rnr.remname_bda = RawAddress::kEmpty;
  btm_cb.btm_inq_vars.rnr.remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;
  alarm_cancel(btm_cb.btm_inq_vars.rnr.remote_name_timer);

  return status;
}
+37 −35
Original line number Diff line number Diff line
@@ -859,14 +859,14 @@ tBTM_STATUS BTM_CancelRemoteDeviceName(void) {
  bool is_le;

  /* Make sure there is not already one in progress */
  if (!btm_cb.btm_inq_vars.remname_active) {
  if (!btm_cb.btm_inq_vars.rnr.remname_active) {
    return (BTM_WRONG_MODE);
  }

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

  if (is_le) {
@@ -875,9 +875,9 @@ tBTM_STATUS BTM_CancelRemoteDeviceName(void) {
    btm_inq_rmt_name_failed_cancelled();
  } else {
    bluetooth::shim::ACL_CancelRemoteNameRequest(
        btm_cb.btm_inq_vars.remname_bda);
        btm_cb.btm_inq_vars.rnr.remname_bda);
    if (com::android::bluetooth::flags::rnr_reset_state_at_cancel()) {
      btm_process_remote_name(&btm_cb.btm_inq_vars.remname_bda, nullptr, 0,
      btm_process_remote_name(&btm_cb.btm_inq_vars.rnr.remname_bda, nullptr, 0,
                              HCI_ERR_UNSPECIFIED);
    }
  }
@@ -1049,18 +1049,18 @@ void btm_inq_db_reset(void) {

  /* Cancel a remote name request if active, and notify the caller (if waiting)
   */
  if (btm_cb.btm_inq_vars.remname_active) {
    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.rnr.remname_active) {
    alarm_cancel(btm_cb.btm_inq_vars.rnr.remote_name_timer);
    btm_cb.btm_inq_vars.rnr.remname_active = false;
    btm_cb.btm_inq_vars.rnr.remname_bda = RawAddress::kEmpty;
    btm_cb.btm_inq_vars.rnr.remname_dev_type = BT_DEVICE_TYPE_UNKNOWN;

    if (btm_cb.btm_inq_vars.p_remname_cmpl_cb) {
    if (btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb) {
      rem_name.status = BTM_DEV_RESET;
      rem_name.hci_status = HCI_SUCCESS;

      (*btm_cb.btm_inq_vars.p_remname_cmpl_cb)(&rem_name);
      btm_cb.btm_inq_vars.p_remname_cmpl_cb = NULL;
      (*btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb)(&rem_name);
      btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb = NULL;
    }
  }

@@ -1876,7 +1876,7 @@ tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda,
                                  tBTM_NAME_CMPL_CB* p_cb) {
  /*** Make sure the device is ready ***/
  if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE);
  if (btm_cb.btm_inq_vars.remname_active) {
  if (btm_cb.btm_inq_vars.rnr.remname_active) {
    return (BTM_BUSY);
  } else {
    /* If the database entry exists for the device, use its clock offset */
@@ -1915,14 +1915,15 @@ tBTM_STATUS btm_initiate_rem_name(const RawAddress& remote_bda,
          clock_offset);
    }

    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;
    btm_cb.btm_inq_vars.remname_active = true;
    btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb = p_cb;
    btm_cb.btm_inq_vars.rnr.remname_bda = remote_bda;
    btm_cb.btm_inq_vars.rnr.remname_dev_type = BT_DEVICE_TYPE_BREDR;
    btm_cb.btm_inq_vars.rnr.remname_active = true;

    alarm_set_on_mloop(btm_cb.btm_inq_vars.remote_name_timer, timeout_ms,
    alarm_set_on_mloop(btm_cb.btm_inq_vars.rnr.remote_name_timer, timeout_ms,
                       btm_inq_remote_name_timer_timeout, NULL);

    btm_cb.btm_inq_vars.rnr.remname_active = true;
    return BTM_CMD_STARTED;
  }
}
@@ -1949,25 +1950,26 @@ void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,

  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);
    on_le_link =
        (btm_cb.btm_inq_vars.rnr.remname_dev_type == BT_DEVICE_TYPE_BLE);
  } else {
    on_le_link = BTM_UseLeLink(btm_cb.btm_inq_vars.remname_bda);
    on_le_link = BTM_UseLeLink(btm_cb.btm_inq_vars.rnr.remname_bda);
  }

  /* If the inquire BDA and remote DBA are the same, then stop the timer and set
   * the active to false */
  if (btm_cb.btm_inq_vars.remname_active) {
  if (btm_cb.btm_inq_vars.rnr.remname_active) {
    if (rem_name.bd_addr == RawAddress::kEmpty ||
        rem_name.bd_addr == btm_cb.btm_inq_vars.remname_bda) {
        rem_name.bd_addr == btm_cb.btm_inq_vars.rnr.remname_bda) {
      log::info(
          "RNR received expected name bd_addr:{} hci_status:{} le_link:{}",
          rem_name.bd_addr.ToRedactedStringForLogging(),
          hci_status_code_text(hci_status), on_le_link);

      if (on_le_link && hci_status == HCI_ERR_UNSPECIFIED) {
        btm_ble_cancel_remote_name(btm_cb.btm_inq_vars.remname_bda);
        btm_ble_cancel_remote_name(btm_cb.btm_inq_vars.rnr.remname_bda);
      }
      alarm_cancel(btm_cb.btm_inq_vars.remote_name_timer);
      alarm_cancel(btm_cb.btm_inq_vars.rnr.remote_name_timer);
      /* Clean up and return the status if the command was not successful */
      /* Note: If part of the inquiry, the name is not stored, and the    */
      /*       inquiry complete callback is called.                       */
@@ -1985,12 +1987,12 @@ 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;
      btm_cb.btm_inq_vars.rnr.remname_active = false;
      btm_cb.btm_inq_vars.rnr.remname_bda = RawAddress::kEmpty;
      btm_cb.btm_inq_vars.rnr.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;
      tBTM_NAME_CMPL_CB* p_cb = btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb;
      btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb = nullptr;
      if (p_cb) (p_cb)(&rem_name);
    } else {
      log::warn("RNR received UNKNOWN name bd_addr:{} hci_status:{} le_link:{}",
@@ -2002,9 +2004,9 @@ void btm_process_remote_name(const RawAddress* bda, const BD_NAME bdn,
        "RNR received UNEXPECTED name bd_addr:{} inq_addr:{} hci_status:{} "
        "le_link:{} rnr_active:{}",
        rem_name.bd_addr.ToRedactedStringForLogging(),
        btm_cb.btm_inq_vars.remname_bda.ToRedactedStringForLogging(),
        btm_cb.btm_inq_vars.rnr.remname_bda.ToRedactedStringForLogging(),
        hci_status_code_text(hci_status), on_le_link,
        btm_cb.btm_inq_vars.remname_active);
        btm_cb.btm_inq_vars.rnr.remname_active);
  }
}

@@ -2024,10 +2026,10 @@ void btm_inq_remote_name_timer_timeout(void* /* data */) {
 *
 ******************************************************************************/
void btm_inq_rmt_name_failed_cancelled(void) {
  log::error("remname_active={}", btm_cb.btm_inq_vars.remname_active);
  log::error("remname_active={}", btm_cb.btm_inq_vars.rnr.remname_active);

  if (btm_cb.btm_inq_vars.remname_active) {
    btm_process_remote_name(&btm_cb.btm_inq_vars.remname_bda, NULL, 0,
  if (btm_cb.btm_inq_vars.rnr.remname_active) {
    btm_process_remote_name(&btm_cb.btm_inq_vars.rnr.remname_bda, NULL, 0,
                            HCI_ERR_UNSPECIFIED);
  }

+16 −16
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@

#include <cstdint>

#include "internal_include/bt_target.h"
#include "macros.h"
#include "osi/include/alarm.h"
#include "stack/btm/btm_eir.h"
@@ -210,9 +209,6 @@ typedef struct {
typedef void(tBTM_NAME_CMPL_CB)(const tBTM_REMOTE_DEV_NAME*);

struct tBTM_INQUIRY_VAR_ST {
  tBTM_NAME_CMPL_CB* p_remname_cmpl_cb;

  alarm_t* remote_name_timer;
  alarm_t* classic_inquiry_timer;

  uint16_t discoverable_mode;
@@ -224,9 +220,16 @@ struct tBTM_INQUIRY_VAR_ST {
  uint16_t inq_scan_type;
  uint16_t page_scan_type; /* current page scan type */

  RawAddress remname_bda; /* Name of bd addr for active remote name request */
  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 */
  struct {
    tBTM_NAME_CMPL_CB* p_remname_cmpl_cb{nullptr};
    alarm_t* remote_name_timer{nullptr};
    RawAddress
        remname_bda{}; /* Name of bd addr for active remote name request */
    bool remname_active{
        false}; /* State of a remote name request by external API */
    tBT_DEVICE_TYPE remname_dev_type{
        BT_DEVICE_TYPE_UNKNOWN}; /* Whether it's LE or BREDR name request */
  } rnr;

  tBTM_CMPL_CB* p_inq_cmpl_cb;
  tBTM_INQ_RESULTS_CB* p_inq_results_cb;
@@ -253,11 +256,12 @@ struct tBTM_INQUIRY_VAR_ST {
  bool registered_for_hci_events;

  void Init() {
    p_remname_cmpl_cb = nullptr;

    alarm_free(remote_name_timer);
    alarm_free(rnr.remote_name_timer);
    alarm_free(classic_inquiry_timer);
    remote_name_timer = alarm_new("btm_inq.remote_name_timer");

    rnr = {};

    rnr.remote_name_timer = alarm_new("rnr.remote_name_timer");
    classic_inquiry_timer = alarm_new("btm_inq.classic_inquiry_timer");

    discoverable_mode = BTM_NON_DISCOVERABLE;
@@ -270,10 +274,6 @@ struct tBTM_INQUIRY_VAR_ST {
    inq_scan_type = BTM_SCAN_TYPE_STANDARD;
    page_scan_type = HCI_DEF_SCAN_TYPE;

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

    p_inq_cmpl_cb = nullptr;
    p_inq_results_cb = nullptr;

@@ -288,7 +288,7 @@ struct tBTM_INQUIRY_VAR_ST {
    registered_for_hci_events = false;
  }
  void Free() {
    alarm_free(remote_name_timer);
    alarm_free(rnr.remote_name_timer);
    alarm_free(classic_inquiry_timer);
  }
};
+25 −25
Original line number Diff line number Diff line
@@ -99,10 +99,10 @@ class BtmInqActiveTest : public BtmInqTest {
    gBTM_REMOTE_DEV_NAME = {};
    gBTM_REMOTE_DEV_NAME_sent = false;

    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 =
    btm_cb.btm_inq_vars.rnr.remname_active = true;
    btm_cb.btm_inq_vars.rnr.remname_bda = kRawAddress;
    btm_cb.btm_inq_vars.rnr.remname_dev_type = BT_DEVICE_TYPE_BREDR;
    btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb =
        [](const tBTM_REMOTE_DEV_NAME* name) {
          gBTM_REMOTE_DEV_NAME = *name;
          gBTM_REMOTE_DEV_NAME_sent = true;
@@ -114,10 +114,10 @@ class BtmInqActiveTest : public BtmInqTest {

TEST_F(BtmInqActiveTest, btm_process_remote_name__typical) {
  btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
  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_FALSE(btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.rnr.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -129,10 +129,10 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__typical) {

TEST_F(BtmInqActiveTest, btm_process_remote_name__no_name) {
  btm_process_remote_name(&kRawAddress, nullptr, 0, HCI_SUCCESS);
  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_FALSE(btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.rnr.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -144,10 +144,10 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__no_name) {

TEST_F(BtmInqActiveTest, btm_process_remote_name__bad_status) {
  btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_ERR_PAGE_TIMEOUT);
  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_FALSE(btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.rnr.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -159,10 +159,10 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__bad_status) {

TEST_F(BtmInqActiveTest, btm_process_remote_name__no_address) {
  btm_process_remote_name(nullptr, kBdName, 0, HCI_SUCCESS);
  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_FALSE(btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb);
  ASSERT_FALSE(btm_cb.btm_inq_vars.rnr.remname_active);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_bda, RawAddress::kEmpty);
  ASSERT_EQ(btm_cb.btm_inq_vars.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(1, get_func_call_count("alarm_cancel"));

  ASSERT_TRUE(gBTM_REMOTE_DEV_NAME_sent);
@@ -173,12 +173,12 @@ TEST_F(BtmInqActiveTest, btm_process_remote_name__no_address) {
}

TEST_F(BtmInqActiveTest, btm_process_remote_name__different_address) {
  btm_cb.btm_inq_vars.remname_bda = kRawAddress2;
  btm_cb.btm_inq_vars.rnr.remname_bda = kRawAddress2;
  btm_process_remote_name(&kRawAddress, kBdName, 0, HCI_SUCCESS);
  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_TRUE(btm_cb.btm_inq_vars.rnr.p_remname_cmpl_cb);
  ASSERT_TRUE(btm_cb.btm_inq_vars.rnr.remname_active);
  ASSERT_NE(btm_cb.btm_inq_vars.rnr.remname_bda, RawAddress::kEmpty);
  ASSERT_NE(btm_cb.btm_inq_vars.rnr.remname_dev_type, BT_DEVICE_TYPE_UNKNOWN);
  ASSERT_EQ(0, get_func_call_count("alarm_cancel"));

  ASSERT_FALSE(gBTM_REMOTE_DEV_NAME_sent);
+1 −1
Original line number Diff line number Diff line
@@ -305,5 +305,5 @@ TEST_F(StackBtmWithInitFreeTest, is_disconnect_reason_valid) {
}

TEST_F(StackBtmWithInitFreeTest, Init) {
  ASSERT_FALSE(btm_cb.btm_inq_vars.remname_active);
  ASSERT_FALSE(btm_cb.btm_inq_vars.rnr.remname_active);
}