diff --git a/system/bta/dm/bta_dm_act.cc b/system/bta/dm/bta_dm_act.cc index 818b2ea9f789002e53ccf0159e01233ed212c5a2..2bb694fba86204d2afeed4d97307fdfc83759c34 100644 --- a/system/bta/dm/bta_dm_act.cc +++ b/system/bta/dm/bta_dm_act.cc @@ -177,6 +177,15 @@ WaitForAllAclConnectionsToDrain::FromAlarmCallbackData(void* data) { static void bta_dm_delay_role_switch_cback(void* data); static void bta_dm_wait_for_acl_to_drain_cback(void* data); +/** Initialises the BT device manager */ +void bta_dm_enable(tBTA_DM_SEC_CBACK* p_sec_cback, + tBTA_DM_ACL_CBACK *p_acl_cback) { + + if (p_acl_cback != NULL) bta_dm_acl_cb.p_acl_cback = p_acl_cback; + + bta_dm_sec_enable(p_sec_cback); +} + /******************************************************************************* * * Function bta_dm_init_cb @@ -189,6 +198,7 @@ static void bta_dm_wait_for_acl_to_drain_cback(void* data); ******************************************************************************/ static void bta_dm_init_cb(void) { bta_dm_cb = {}; + bta_dm_acl_cb = {}; bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer"); bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer"); for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) { @@ -221,6 +231,7 @@ static void bta_dm_deinit_cb(void) { } } bta_dm_cb = {}; + bta_dm_acl_cb = {}; } void BTA_dm_on_hw_off() { @@ -239,16 +250,22 @@ void BTA_dm_on_hw_off() { void BTA_dm_on_hw_on() { DEV_CLASS dev_class; - tBTA_DM_SEC_CBACK* temp_cback; + tBTA_DM_SEC_CBACK* temp_sec_cback; + tBTA_DM_ACL_CBACK* temp_acl_cback; + uint8_t key_mask = 0; tBTA_BLE_LOCAL_ID_KEYS id_key; - /* save security callback */ - temp_cback = bta_dm_cb.p_sec_cback; + /* save callbacks */ + temp_sec_cback = bta_dm_cb.p_sec_cback; + temp_acl_cback = bta_dm_acl_cb.p_acl_cback; + /* make sure the control block is properly initialized */ bta_dm_init_cb(); - /* and retrieve the callback */ - bta_dm_cb.p_sec_cback = temp_cback; + /* and restore the callbacks */ + bta_dm_cb.p_sec_cback = temp_sec_cback; + bta_dm_acl_cb.p_acl_cback = temp_acl_cback; + /* hw is ready, go on with BTA DM initialization */ alarm_free(bta_dm_search_cb.search_timer); @@ -299,8 +316,8 @@ void BTA_dm_on_hw_on() { BTM_BleReadControllerFeatures(bta_dm_ctrl_features_rd_cmpl_cback); } else { /* Set controller features even if vendor support is not included */ - if (bta_dm_cb.p_sec_cback) - bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL); + if (bta_dm_acl_cb.p_acl_cback) + bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL); } btm_ble_scanner_init(); @@ -473,7 +490,7 @@ void bta_dm_process_remove_device(const RawAddress& bd_addr) { if (bta_dm_cb.p_sec_cback) { tBTA_DM_SEC sec_event; - sec_event.link_down.bd_addr = bd_addr; + sec_event.dev_unpair.bd_addr = bd_addr; bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event); } } @@ -743,14 +760,13 @@ void bta_dm_acl_up(const RawAddress& bd_addr, tBT_TRANSPORT transport, device->set_both_device_ssr_capable(); } - if (bta_dm_cb.p_sec_cback) { - tBTA_DM_SEC conn; - memset(&conn, 0, sizeof(tBTA_DM_SEC)); + if (bta_dm_acl_cb.p_acl_cback) { + tBTA_DM_ACL conn{}; conn.link_up.bd_addr = bd_addr; conn.link_up.transport_link_type = transport; conn.link_up.acl_handle = acl_handle; - bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn); + bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_EVT, &conn); LOG_DEBUG("Executed security callback for new connection available"); } bta_dm_adjust_roles(true); @@ -764,12 +780,12 @@ void BTA_dm_acl_up(const RawAddress bd_addr, tBT_TRANSPORT transport, static void bta_dm_acl_up_failed(const RawAddress bd_addr, tBT_TRANSPORT transport, tHCI_STATUS status) { - if (bta_dm_cb.p_sec_cback) { - tBTA_DM_SEC conn = {}; + if (bta_dm_acl_cb.p_acl_cback) { + tBTA_DM_ACL conn = {}; conn.link_up_failed.bd_addr = bd_addr; conn.link_up_failed.transport_link_type = transport; conn.link_up_failed.status = status; - bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_FAILED_EVT, &conn); + bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_UP_FAILED_EVT, &conn); } } @@ -849,14 +865,21 @@ static void bta_dm_acl_down(const RawAddress& bd_addr, bta_dm_process_remove_device_no_callback(bd_addr); } - if (bta_dm_cb.p_sec_cback) { - tBTA_DM_SEC conn; - memset(&conn, 0, sizeof(tBTA_DM_SEC)); + if (bta_dm_acl_cb.p_acl_cback) { + tBTA_DM_ACL conn{}; conn.link_down.bd_addr = bd_addr; conn.link_down.transport_link_type = transport; - bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn); - if (issue_unpair_cb) bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn); + bta_dm_acl_cb.p_acl_cback(BTA_DM_LINK_DOWN_EVT, &conn); + } + + // TODO: reorganize and factor out the following logic + if (issue_unpair_cb && bta_dm_cb.p_sec_cback) { + tBTA_DM_SEC conn{}; + conn.dev_unpair.bd_addr = bd_addr; + conn.dev_unpair.transport_link_type = transport; + + bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn); } bta_dm_adjust_roles(true); @@ -1700,8 +1723,8 @@ void bta_dm_ble_reset_id(void) { static void bta_dm_ctrl_features_rd_cmpl_cback(tHCI_STATUS result) { APPL_TRACE_DEBUG("%s status = %d ", __func__, result); if (result == HCI_SUCCESS) { - if (bta_dm_cb.p_sec_cback) - bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL); + if (bta_dm_acl_cb.p_acl_cback) + bta_dm_acl_cb.p_acl_cback(BTA_DM_LE_FEATURES_READ, NULL); } else { APPL_TRACE_ERROR("%s Ctrl BLE feature read failed: status :%d", __func__, result); diff --git a/system/bta/dm/bta_dm_int.h b/system/bta/dm/bta_dm_int.h index fb439e1435394946390c4e3c4f531fba8a590db6..55283d933e63ffa70022fcb9042a239c30a7baae 100644 --- a/system/bta/dm/bta_dm_int.h +++ b/system/bta/dm/bta_dm_int.h @@ -346,6 +346,10 @@ extern tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; #define BTA_DM_NUM_PM_TIMER 7 +typedef struct { + tBTA_DM_ACL_CBACK* p_acl_cback; +} tBTA_DM_ACL_CB; + /* DM control block */ typedef struct { tBTA_DM_ACTIVE_LINK device_list; @@ -516,12 +520,16 @@ extern const tBTA_DM_EIR_CONF* p_bta_dm_eir_cfg; /* DM control block */ extern tBTA_DM_CB bta_dm_cb; +/* DM control block for ACL management */ +extern tBTA_DM_ACL_CB bta_dm_acl_cb; + /* DM search control block */ extern tBTA_DM_SEARCH_CB bta_dm_search_cb; /* DI control block */ extern tBTA_DM_DI_CB bta_dm_di_cb; +void bta_dm_enable(tBTA_DM_SEC_CBACK*, tBTA_DM_ACL_CBACK*); void bta_dm_disable(); void bta_dm_set_dev_name(const std::vector<uint8_t>&); void bta_dm_remove_device(const RawAddress& bd_addr); diff --git a/system/bta/dm/bta_dm_main.cc b/system/bta/dm/bta_dm_main.cc index a89cc930bf2a96c5b3a68400bbb49b7065fbb990..000b53a123da783e7f5b2f5f480fd3827237247d 100644 --- a/system/bta/dm/bta_dm_main.cc +++ b/system/bta/dm/bta_dm_main.cc @@ -35,6 +35,7 @@ #include "stack/include/bt_hdr.h" #include "stack/include/bt_types.h" +tBTA_DM_ACL_CB bta_dm_acl_cb; tBTA_DM_CB bta_dm_cb; tBTA_DM_DI_CB bta_dm_di_cb; diff --git a/system/bta/dm/bta_dm_sec.cc b/system/bta/dm/bta_dm_sec.cc index 9a4c6bd650f5293dbf6d8fdf20c8eea204f146c9..2ce01765da5141a4072c130b999e81faec4f203a 100644 --- a/system/bta/dm/bta_dm_sec.cc +++ b/system/bta/dm/bta_dm_sec.cc @@ -104,7 +104,7 @@ void btm_dm_sec_init() { } /** Initialises the BT device security manager */ -void bta_dm_enable(tBTA_DM_SEC_CBACK* p_sec_cback) { +void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback) { /* make sure security callback is saved - if no callback, do not erase the previous one, it could be an error recovery mechanism */ diff --git a/system/bta/dm/bta_dm_sec.h b/system/bta/dm/bta_dm_sec.h index 8b81745af58caadabd1818ddce0109336cd8fd35..0b2d72f68e0ca592e83eae505334bc1910ed882f 100644 --- a/system/bta/dm/bta_dm_sec.h +++ b/system/bta/dm/bta_dm_sec.h @@ -22,6 +22,8 @@ #include "bta/include/bta_api.h" #include "osi/include/osi.h" // UNUSED_ATTR +void bta_dm_sec_enable(tBTA_DM_SEC_CBACK* p_sec_cback); + void bta_dm_add_ble_device(const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TYPE dev_type); void bta_dm_add_blekey(const RawAddress& bd_addr, tBTA_LE_KEY_VALUE blekey, diff --git a/system/bta/include/bta_api.h b/system/bta/include/bta_api.h index 9c6dda3d1049142b19fe6c1321754fc3daa669de..46c88835718fc4ca0af5bfa99c5e8be5f0de74ed 100644 --- a/system/bta/include/bta_api.h +++ b/system/bta/include/bta_api.h @@ -217,16 +217,20 @@ typedef struct { typedef uint8_t tBTA_DM_BLE_RSSI_ALERT_TYPE; +typedef enum: uint8_t { + BTA_DM_LINK_UP_EVT = 5, /* Connection UP event */ + BTA_DM_LINK_DOWN_EVT = 6, /* Connection DOWN event */ + BTA_DM_LE_FEATURES_READ = 27, /* Cotroller specific LE features are read */ + BTA_DM_LINK_UP_FAILED_EVT = 34, /* Create connection failed event */ +} tBTA_DM_ACL_EVT; + typedef enum : uint8_t { /* Security Callback Events */ BTA_DM_PIN_REQ_EVT = 2, /* PIN request. */ BTA_DM_AUTH_CMPL_EVT = 3, /* Authentication complete indication. */ BTA_DM_AUTHORIZE_EVT = 4, /* Authorization request. */ - BTA_DM_LINK_UP_EVT = 5, /* Connection UP event */ - BTA_DM_LINK_DOWN_EVT = 6, /* Connection DOWN event */ BTA_DM_BOND_CANCEL_CMPL_EVT = 9, /* Bond cancel complete indication */ - BTA_DM_SP_CFM_REQ_EVT = 10, /* Simple Pairing User Confirmation request. \ - */ + BTA_DM_SP_CFM_REQ_EVT = 10, /* Simple Pairing User Confirmation request */ BTA_DM_SP_KEY_NOTIF_EVT = 11, /* Simple Pairing Passkey Notification */ BTA_DM_BLE_KEY_EVT = 15, /* BLE SMP key event for peer device keys */ BTA_DM_BLE_SEC_REQ_EVT = 16, /* BLE SMP security request */ @@ -240,15 +244,12 @@ typedef enum : uint8_t { 23, /* Simple Pairing Remote OOB Extended Data request. */ BTA_DM_BLE_AUTH_CMPL_EVT = 24, /* BLE Auth complete */ BTA_DM_DEV_UNPAIRED_EVT = 25, - BTA_DM_LE_FEATURES_READ = 27, /* Cotroller specific LE features are read \ - */ BTA_DM_ENER_INFO_READ = 28, /* Energy info read */ BTA_DM_BLE_SC_OOB_REQ_EVT = 29, /* SMP SC OOB request event */ BTA_DM_BLE_CONSENT_REQ_EVT = 30, /* SMP consent request event */ BTA_DM_BLE_SC_CR_LOC_OOB_EVT = 31, /* SMP SC Create Local OOB request event */ BTA_DM_REPORT_BONDING_EVT = 32, /*handle for pin or key missing*/ BTA_DM_LE_ADDR_ASSOC_EVT = 33, /* identity address association event */ - BTA_DM_LINK_UP_FAILED_EVT = 34, /* Create connection failed event */ BTA_DM_SIRK_VERIFICATION_REQ_EVT = 35, } tBTA_DM_SEC_EVT; @@ -354,6 +355,12 @@ typedef struct { tHCI_STATUS status; } tBTA_DM_LINK_DOWN; +/* Structure associated with BTA_DM_DEV_UNPAIRED_EVT */ +typedef struct { + RawAddress bd_addr; /* BD address peer device. */ + tBT_TRANSPORT transport_link_type; +} tBTA_DM_UNPAIR; + #define BTA_AUTH_SP_YES \ BTM_AUTH_SP_YES /* 1 MITM Protection Required - Single Profile/non-bonding \ Use IO Capabilities to determine authentication procedure \ @@ -424,13 +431,19 @@ typedef struct { RawAddress id_addr; } tBTA_DM_PROC_ID_ADDR; -/* Union of all security callback structures */ typedef union { - tBTA_DM_PIN_REQ pin_req; /* PIN request. */ - tBTA_DM_AUTH_CMPL auth_cmpl; /* Authentication complete indication. */ tBTA_DM_LINK_UP link_up; /* ACL connection up event */ tBTA_DM_LINK_UP_FAILED link_up_failed; /* ACL connection up failure event */ tBTA_DM_LINK_DOWN link_down; /* ACL connection down event */ +} tBTA_DM_ACL; + +typedef void(tBTA_DM_ACL_CBACK)(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data); + +/* Union of all security callback structures */ +typedef union { + tBTA_DM_PIN_REQ pin_req; /* PIN request. */ + tBTA_DM_AUTH_CMPL auth_cmpl; /* Authentication complete indication. */ + tBTA_DM_UNPAIR dev_unpair; /* Remove bonding complete indication */ tBTA_DM_SP_CFM_REQ cfm_req; /* user confirm request */ tBTA_DM_SP_KEY_NOTIF key_notif; /* passkey notification */ tBTA_DM_SP_RMT_OOB rmt_oob; /* remote oob */ diff --git a/system/bta/test/bta_sec_test.cc b/system/bta/test/bta_sec_test.cc index 63dedd8c58c4152a78a4368aefd4d87ca6494f3a..d80a7b5451431e6f80e39b90abbc8caf32799d27 100644 --- a/system/bta/test/bta_sec_test.cc +++ b/system/bta/test/bta_sec_test.cc @@ -64,7 +64,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithName) { tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; }; static tBTA_DM_SP_CFM_REQ cfm_req{}; - bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { + bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { callback_sent = true; cfm_req = p_data->cfm_req; }); @@ -115,7 +115,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRSuccess) { tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; }; static tBTA_DM_SP_CFM_REQ cfm_req{}; - bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { + bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { callback_sent = true; cfm_req = p_data->cfm_req; }); @@ -156,7 +156,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_CFM_REQ_EVT_WithoutName_RNRFail) { tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_SUCCESS; }; static tBTA_DM_SP_CFM_REQ cfm_req{}; - bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { + bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { callback_sent = true; cfm_req = p_data->cfm_req; }); @@ -205,7 +205,7 @@ TEST_F(BtaSecTest, bta_dm_sp_cback__BTM_SP_KEY_NOTIF_EVT) { tBT_TRANSPORT transport) -> tBTM_STATUS { return BTM_CMD_STARTED; }; static tBTA_DM_SP_KEY_NOTIF key_notif{}; - bta_dm_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { + bta_dm_sec_enable([](tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { callback_sent = true; key_notif = p_data->key_notif; }); diff --git a/system/btif/include/btif_dm.h b/system/btif/include/btif_dm.h index 9b7f407276501add2f6524eb346cdd64f9afb90a..fa3691cc4778b12c10ab12072a4de46a63b54c71 100644 --- a/system/btif/include/btif_dm.h +++ b/system/btif/include/btif_dm.h @@ -51,9 +51,14 @@ void btif_dm_init(uid_set_t* set); void btif_dm_cleanup(void); /** - * BTIF callback to switch context from bte to btif + * BTIF callback for security events */ -void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data); +void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data); + +/** + * BTIF callback for ACL up/down and address consolidation events + */ +void btif_dm_acl_evt(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data); /** * Notify BT disable being initiated. DM may chose to abort diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc index a4d481d3bb7cd91e6bb7cf4087ab1e32edca2525..41ea8f8a41d00c08051092d616c9636c1dd1fa2b 100644 --- a/system/btif/src/btif_dm.cc +++ b/system/btif/src/btif_dm.cc @@ -2168,15 +2168,14 @@ void BTIF_dm_disable() { /******************************************************************************* * - * Function btif_dm_upstreams_cback + * Function btif_dm_sec_evt * - * Description Executes UPSTREAMS events in btif context + * Description Executes security related events * * Returns void * ******************************************************************************/ -static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { - tBTA_DM_SEC* p_data = (tBTA_DM_SEC*)p_param; +void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { RawAddress bd_addr; BTIF_TRACE_EVENT("%s: ev: %s", __func__, dump_dm_event(event)); @@ -2208,8 +2207,8 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { break; case BTA_DM_DEV_UNPAIRED_EVT: - bd_addr = p_data->link_down.bd_addr; - btm_set_bond_type_dev(p_data->link_down.bd_addr, + bd_addr = p_data->dev_unpair.bd_addr; + btm_set_bond_type_dev(p_data->dev_unpair.bd_addr, tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN); GetInterfaceToProfiles()->removeDeviceFromProfiles(bd_addr); @@ -2217,67 +2216,6 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_NONE); break; - case BTA_DM_LINK_UP_EVT: - bd_addr = p_data->link_up.bd_addr; - BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED"); - - btif_update_remote_version_property(&bd_addr); - - GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( - BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_CONNECTED, - (int)p_data->link_up.transport_link_type, HCI_SUCCESS, - btm_is_acl_locally_initiated() - ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING - : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING, - p_data->link_up.acl_handle); - break; - - case BTA_DM_LINK_UP_FAILED_EVT: - GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( - BT_STATUS_FAIL, p_data->link_up_failed.bd_addr, - BT_ACL_STATE_DISCONNECTED, p_data->link_up_failed.transport_link_type, - p_data->link_up_failed.status, - btm_is_acl_locally_initiated() - ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING - : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING, - INVALID_ACL_HANDLE); - break; - - case BTA_DM_LINK_DOWN_EVT: { - bd_addr = p_data->link_down.bd_addr; - btm_set_bond_type_dev(p_data->link_down.bd_addr, - tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN); - GetInterfaceToProfiles()->onLinkDown(bd_addr); - - bt_conn_direction_t direction; - switch (btm_get_acl_disc_reason_code()) { - case HCI_ERR_PEER_USER: - case HCI_ERR_REMOTE_LOW_RESOURCE: - case HCI_ERR_REMOTE_POWER_OFF: - direction = bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING; - break; - case HCI_ERR_CONN_CAUSE_LOCAL_HOST: - case HCI_ERR_HOST_REJECT_SECURITY: - direction = bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING; - break; - default: - direction = bt_conn_direction_t::BT_CONN_DIRECTION_UNKNOWN; - } - - GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( - BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_DISCONNECTED, - (int)p_data->link_down.transport_link_type, - static_cast<bt_hci_error_code_t>(btm_get_acl_disc_reason_code()), - direction, INVALID_ACL_HANDLE); - LOG_DEBUG( - "Sent BT_ACL_STATE_DISCONNECTED upward as ACL link down event " - "device:%s reason:%s", - ADDRESS_TO_LOGGABLE_CSTR(bd_addr), - hci_reason_code_text( - static_cast<tHCI_REASON>(btm_get_acl_disc_reason_code())) - .c_str()); - } break; - case BTA_DM_BLE_KEY_EVT: BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT key_type=0x%02x ", p_data->ble_key.key_type); @@ -2402,10 +2340,6 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl); break; - case BTA_DM_LE_FEATURES_READ: - btif_get_adapter_property(BT_PROPERTY_LOCAL_LE_FEATURES); - break; - case BTA_DM_LE_ADDR_ASSOC_EVT: GetInterfaceToProfiles()->events->invoke_le_address_associate_cb( p_data->proc_id_addr.pairing_bda, p_data->proc_id_addr.id_addr); @@ -2424,16 +2358,86 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { /******************************************************************************* * - * Function bte_dm_evt + * Function bte_dm_acl_evt * - * Description Switches context from BTE to BTIF for all DM events + * Description BTIF handler for ACL up/down, identity address report events * * Returns void * ******************************************************************************/ +void btif_dm_acl_evt(tBTA_DM_ACL_EVT event, tBTA_DM_ACL* p_data) { + RawAddress bd_addr; -void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { - btif_dm_upstreams_evt(event, (char*)p_data); + switch (event) { + case BTA_DM_LINK_UP_EVT: + bd_addr = p_data->link_up.bd_addr; + BTIF_TRACE_DEBUG("BTA_DM_LINK_UP_EVT. Sending BT_ACL_STATE_CONNECTED"); + + btif_update_remote_version_property(&bd_addr); + + GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( + BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_CONNECTED, + (int)p_data->link_up.transport_link_type, HCI_SUCCESS, + btm_is_acl_locally_initiated() + ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING + : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING, + p_data->link_up.acl_handle); + break; + + case BTA_DM_LINK_UP_FAILED_EVT: + GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( + BT_STATUS_FAIL, p_data->link_up_failed.bd_addr, + BT_ACL_STATE_DISCONNECTED, p_data->link_up_failed.transport_link_type, + p_data->link_up_failed.status, + btm_is_acl_locally_initiated() + ? bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING + : bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING, + INVALID_ACL_HANDLE); + break; + + case BTA_DM_LINK_DOWN_EVT: { + bd_addr = p_data->link_down.bd_addr; + btm_set_bond_type_dev(p_data->link_down.bd_addr, + tBTM_SEC_DEV_REC::BOND_TYPE_UNKNOWN); + GetInterfaceToProfiles()->onLinkDown(bd_addr); + + bt_conn_direction_t direction; + switch (btm_get_acl_disc_reason_code()) { + case HCI_ERR_PEER_USER: + case HCI_ERR_REMOTE_LOW_RESOURCE: + case HCI_ERR_REMOTE_POWER_OFF: + direction = bt_conn_direction_t::BT_CONN_DIRECTION_INCOMING; + break; + case HCI_ERR_CONN_CAUSE_LOCAL_HOST: + case HCI_ERR_HOST_REJECT_SECURITY: + direction = bt_conn_direction_t::BT_CONN_DIRECTION_OUTGOING; + break; + default: + direction = bt_conn_direction_t::BT_CONN_DIRECTION_UNKNOWN; + } + GetInterfaceToProfiles()->events->invoke_acl_state_changed_cb( + BT_STATUS_SUCCESS, bd_addr, BT_ACL_STATE_DISCONNECTED, + (int)p_data->link_down.transport_link_type, + static_cast<bt_hci_error_code_t>(btm_get_acl_disc_reason_code()), + direction, INVALID_ACL_HANDLE); + LOG_DEBUG( + "Sent BT_ACL_STATE_DISCONNECTED upward as ACL link down event " + "device:%s reason:%s", + ADDRESS_TO_LOGGABLE_CSTR(bd_addr), + hci_reason_code_text( + static_cast<tHCI_REASON>(btm_get_acl_disc_reason_code())) + .c_str()); + } break; + case BTA_DM_LE_FEATURES_READ: + btif_get_adapter_property(BT_PROPERTY_LOCAL_LE_FEATURES); + break; + + + default: { + LOG_ERROR("Unexpected tBTA_DM_ACL_EVT: %d", event); + } break; + + } } /******************************************************************************* diff --git a/system/btif/src/stack_manager.cc b/system/btif/src/stack_manager.cc index afaa52d6903461c4162ee2a76d183e25d481d474..d7c3f8d63be2b3cb49f0e4b96a600d3158e91ad8 100644 --- a/system/btif/src/stack_manager.cc +++ b/system/btif/src/stack_manager.cc @@ -332,7 +332,7 @@ static void event_start_up_stack(bluetooth::core::CoreInterface* interface, btif_init_ok(); BTA_dm_init(); - bta_dm_enable(bte_dm_evt); + bta_dm_enable(btif_dm_sec_evt, btif_dm_acl_evt); bta_set_forward_hw_failures(true); btm_acl_device_down(); diff --git a/system/test/mock/mock_btif_dm.cc b/system/test/mock/mock_btif_dm.cc index 424e3ecefea6b9274a9ef9ca496b67ffd2c8da85..1ad58e9ebb820d35980fe2d4ca21302a34a1fb08 100644 --- a/system/test/mock/mock_btif_dm.cc +++ b/system/test/mock/mock_btif_dm.cc @@ -66,7 +66,7 @@ void BTIF_dm_on_hw_error() { inc_func_call_count(__func__); } void BTIF_dm_report_inquiry_status_change(uint8_t status) { inc_func_call_count(__func__); } -void bte_dm_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { +void btif_dm_sec_evt(tBTA_DM_SEC_EVT event, tBTA_DM_SEC* p_data) { inc_func_call_count(__func__); } void btif_ble_receiver_test(uint8_t rx_freq) { inc_func_call_count(__func__); }