summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/bta/dm/bta_dm_act.cc43
-rw-r--r--system/bta/test/bta_dm_test.cc51
2 files changed, 77 insertions, 17 deletions
diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc
index 7e165333d2..52bb6448f0 100644
--- a/system/bta/dm/bta_dm_act.cc
+++ b/system/bta/dm/bta_dm_act.cc
@@ -3232,41 +3232,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);
}
diff --git a/system/bta/test/bta_dm_test.cc b/system/bta/test/bta_dm_test.cc
index 2cf3b36876..cddece7466 100644
--- a/system/bta/test/bta_dm_test.cc
+++ b/system/bta/test/bta_dm_test.cc
@@ -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);
+}