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

Commit ae2c3463 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Streamline bta/dm/bta_dm_act::bta_dm_encrypt_cback" am: 29bf2a02 am: 18fb370a

parents 6e98a721 18fb370a
Loading
Loading
Loading
Loading
+26 −17
Original line number Diff line number Diff line
@@ -3230,41 +3230,50 @@ static tBTA_DM_PEER_DEVICE* find_connected_device(
 ******************************************************************************/
void bta_dm_encrypt_cback(const RawAddress* bd_addr, tBT_TRANSPORT transport,
                          UNUSED_ATTR void* p_ref_data, tBTM_STATUS result) {
  tBTA_STATUS bta_status = BTA_SUCCESS;
  tBTA_DM_ENCRYPT_CBACK* p_callback = NULL;
  uint8_t i;

  for (i = 0; i < bta_dm_cb.device_list.count; i++) {
    if (bta_dm_cb.device_list.peer_device[i].peer_bdaddr == *bd_addr &&
        bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
      break;
  }

  if (i < bta_dm_cb.device_list.count) {
    p_callback = bta_dm_cb.device_list.peer_device[i].p_encrypt_cback;
    bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = NULL;
  tBTA_DM_ENCRYPT_CBACK* p_callback = nullptr;
  tBTA_DM_PEER_DEVICE* device = find_connected_device(*bd_addr, transport);
  if (device != nullptr) {
    p_callback = device->p_encrypt_cback;
    device->p_encrypt_cback = nullptr;
  }

  tBTA_STATUS bta_status = BTA_SUCCESS;
  switch (result) {
    case BTM_SUCCESS:
      LOG_WARN("Encrypted link peer:%s transport:%s status:%s callback:%c",
               PRIVATE_ADDRESS((*bd_addr)),
               bt_transport_text(transport).c_str(),
               btm_status_text(result).c_str(), (p_callback) ? 'T' : 'F');
      break;
    case BTM_WRONG_MODE:
      LOG_WARN(
          "Unable to encrypt link peer:%s transport:%s status:%s callback:%c",
          PRIVATE_ADDRESS((*bd_addr)), bt_transport_text(transport).c_str(),
          btm_status_text(result).c_str(), (p_callback) ? 'T' : 'F');
      bta_status = BTA_WRONG_MODE;
      break;
    case BTM_NO_RESOURCES:
      LOG_WARN(
          "Unable to encrypt link peer:%s transport:%s status:%s callback:%c",
          PRIVATE_ADDRESS((*bd_addr)), bt_transport_text(transport).c_str(),
          btm_status_text(result).c_str(), (p_callback) ? 'T' : 'F');
      bta_status = BTA_NO_RESOURCES;
      break;
    case BTM_BUSY:
      LOG_WARN(
          "Unable to encrypt link peer:%s transport:%s status:%s callback:%c",
          PRIVATE_ADDRESS((*bd_addr)), bt_transport_text(transport).c_str(),
          btm_status_text(result).c_str(), (p_callback) ? 'T' : 'F');
      bta_status = BTA_BUSY;
      break;
    default:
      LOG_ERROR(
          "Failed to encrypt link peer:%s transport:%s status:%s callback:%c",
          PRIVATE_ADDRESS((*bd_addr)), bt_transport_text(transport).c_str(),
          btm_status_text(result).c_str(), (p_callback) ? 'T' : 'F');
      bta_status = BTA_FAILURE;
      break;
  }

  APPL_TRACE_DEBUG("bta_dm_encrypt_cback status =%d p_callback=0x%x",
                   bta_status, p_callback);

  if (p_callback) {
    (*p_callback)(*bd_addr, transport, bta_status);
  }
+51 −0
Original line number Diff line number Diff line
@@ -272,3 +272,54 @@ TEST_F(BtaDmTest, bta_dm_set_encryption) {
  test::mock::stack_btm_sec::BTM_SetEncryption = {};
  BTA_DM_ENCRYPT_CBACK_queue = {};
}

extern void bta_dm_encrypt_cback(const RawAddress* bd_addr,
                                 tBT_TRANSPORT transport,
                                 UNUSED_ATTR void* p_ref_data,
                                 tBTM_STATUS result);

TEST_F(BtaDmTest, bta_dm_encrypt_cback) {
  const RawAddress bd_addr{{0x11, 0x22, 0x33, 0x44, 0x55, 0x66}};
  const tBT_TRANSPORT transport{BT_TRANSPORT_LE};

  // Setup a connected device
  tBTA_DM_PEER_DEVICE* device =
      bluetooth::legacy::testing::allocate_device_for(bd_addr, transport);
  ASSERT_TRUE(device != nullptr);
  device->conn_state = BTA_DM_CONNECTED;

  // Encryption with no callback set
  device->p_encrypt_cback = nullptr;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_SUCCESS);
  ASSERT_EQ(0UL, BTA_DM_ENCRYPT_CBACK_queue.size());

  // Encryption with callback
  device->p_encrypt_cback = BTA_DM_ENCRYPT_CBACK;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_SUCCESS);
  device->p_encrypt_cback = BTA_DM_ENCRYPT_CBACK;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_WRONG_MODE);
  device->p_encrypt_cback = BTA_DM_ENCRYPT_CBACK;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_NO_RESOURCES);
  device->p_encrypt_cback = BTA_DM_ENCRYPT_CBACK;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_BUSY);
  device->p_encrypt_cback = BTA_DM_ENCRYPT_CBACK;
  bta_dm_encrypt_cback(&bd_addr, transport, nullptr, BTM_ILLEGAL_VALUE);

  ASSERT_EQ(5UL, BTA_DM_ENCRYPT_CBACK_queue.size());

  auto params_BTM_SUCCESS = BTA_DM_ENCRYPT_CBACK_queue.front();
  BTA_DM_ENCRYPT_CBACK_queue.pop();
  ASSERT_EQ(BTA_SUCCESS, params_BTM_SUCCESS.result);
  auto params_BTM_WRONG_MODE = BTA_DM_ENCRYPT_CBACK_queue.front();
  BTA_DM_ENCRYPT_CBACK_queue.pop();
  ASSERT_EQ(BTA_WRONG_MODE, params_BTM_WRONG_MODE.result);
  auto params_BTM_NO_RESOURCES = BTA_DM_ENCRYPT_CBACK_queue.front();
  BTA_DM_ENCRYPT_CBACK_queue.pop();
  ASSERT_EQ(BTA_NO_RESOURCES, params_BTM_NO_RESOURCES.result);
  auto params_BTM_BUSY = BTA_DM_ENCRYPT_CBACK_queue.front();
  BTA_DM_ENCRYPT_CBACK_queue.pop();
  ASSERT_EQ(BTA_BUSY, params_BTM_BUSY.result);
  auto params_BTM_ILLEGAL_VALUE = BTA_DM_ENCRYPT_CBACK_queue.front();
  BTA_DM_ENCRYPT_CBACK_queue.pop();
  ASSERT_EQ(BTA_FAILURE, params_BTM_ILLEGAL_VALUE.result);
}