diff options
-rw-r--r-- | system/bta/dm/bta_dm_act.cc | 43 | ||||
-rw-r--r-- | system/bta/test/bta_dm_test.cc | 51 |
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); +} |