diff options
author | 2021-01-14 17:28:13 -0800 | |
---|---|---|
committer | 2021-02-20 02:16:03 +0000 | |
commit | 261f360fdd71e2b6c87eeb9f52f7fc460a953987 (patch) | |
tree | 5d20526f574f4f5b7025c07d37ce07013064f801 | |
parent | bec5baf67c3161c5b1366bb5b2dea321e775e367 (diff) |
Surface ACL disconnect reasons from native to Java
HCI disconnect commands and events have an accompanying "reason"
parameter comprising of a HCI error code. This can be useful in both
debugging and re-connection logic at the Java level.
This CL grabs the HCI codes from native and passes it up to Java via an
extra parameter to existing ACL connection callbacks.
Tag: #feature
Bug: 177668957
Test: atest net_test_bluetooth # verify no regressions
Test: atest bluetoothtbd_test # verify no regressions
Test: atest bt_headless # verify test still builds
Test: manually disconnect local and remote devices and check logcats
from Java layer for disconnect reasons
Change-Id: Idcb1711345b515c5f60e55430352f5f4ff252d69
-rw-r--r-- | system/binder/android/bluetooth/IBluetoothConnectionCallback.aidl | 2 | ||||
-rw-r--r-- | system/btif/include/btif_common.h | 2 | ||||
-rw-r--r-- | system/btif/src/bluetooth.cc | 9 | ||||
-rw-r--r-- | system/btif/src/btif_dm.cc | 5 | ||||
-rw-r--r-- | system/include/hardware/bluetooth.h | 7 | ||||
-rw-r--r-- | system/service/adapter.cc | 3 | ||||
-rw-r--r-- | system/service/hal/bluetooth_interface.cc | 9 | ||||
-rw-r--r-- | system/service/hal/bluetooth_interface.h | 3 | ||||
-rw-r--r-- | system/service/hal/fake_bluetooth_interface.cc | 5 | ||||
-rw-r--r-- | system/service/hal/fake_bluetooth_interface.h | 3 | ||||
-rw-r--r-- | system/service/test/adapter_unittest.cc | 9 | ||||
-rw-r--r-- | system/test/headless/headless.cc | 3 | ||||
-rw-r--r-- | system/test/headless/interface.h | 1 |
13 files changed, 39 insertions, 22 deletions
diff --git a/system/binder/android/bluetooth/IBluetoothConnectionCallback.aidl b/system/binder/android/bluetooth/IBluetoothConnectionCallback.aidl index 8242c61b03..56de49c519 100644 --- a/system/binder/android/bluetooth/IBluetoothConnectionCallback.aidl +++ b/system/binder/android/bluetooth/IBluetoothConnectionCallback.aidl @@ -23,5 +23,5 @@ import android.bluetooth.BluetoothDevice; */ oneway interface IBluetoothConnectionCallback { void onDeviceConnected(in BluetoothDevice device); - void onDeviceDisconnected(in BluetoothDevice device); + void onDeviceDisconnected(in BluetoothDevice device, in int hciReason); } diff --git a/system/btif/include/btif_common.h b/system/btif/include/btif_common.h index 4b749c5198..ea3ead6edf 100644 --- a/system/btif/include/btif_common.h +++ b/system/btif/include/btif_common.h @@ -210,7 +210,7 @@ void invoke_ssp_request_cb(RawAddress bd_addr, bt_bdname_t bd_name, void invoke_bond_state_changed_cb(bt_status_t status, RawAddress bd_addr, bt_bond_state_t state); void invoke_acl_state_changed_cb(bt_status_t status, RawAddress bd_addr, - bt_acl_state_t state); + bt_acl_state_t state, bt_hci_error_code_t hci_reason); void invoke_thread_evt_cb(bt_cb_thread_evt event); void invoke_le_test_mode_cb(bt_status_t status, uint16_t count); void invoke_energy_info_cb(bt_activity_energy_info energy_info, diff --git a/system/btif/src/bluetooth.cc b/system/btif/src/bluetooth.cc index 33c708fbec..1cbfb260b7 100644 --- a/system/btif/src/bluetooth.cc +++ b/system/btif/src/bluetooth.cc @@ -724,15 +724,16 @@ void invoke_bond_state_changed_cb(bt_status_t status, RawAddress bd_addr, } void invoke_acl_state_changed_cb(bt_status_t status, RawAddress bd_addr, - bt_acl_state_t state) { + bt_acl_state_t state, bt_hci_error_code_t hci_reason) { do_in_jni_thread( FROM_HERE, base::BindOnce( - [](bt_status_t status, RawAddress bd_addr, bt_acl_state_t state) { + [](bt_status_t status, RawAddress bd_addr, bt_acl_state_t state, + bt_hci_error_code_t hci_reason) { HAL_CBACK(bt_hal_cbacks, acl_state_changed_cb, status, &bd_addr, - state); + state, hci_reason); }, - status, bd_addr, state)); + status, bd_addr, state, hci_reason)); } void invoke_thread_evt_cb(bt_cb_thread_evt event) { diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc index 1f9549215d..0b8d3199f4 100644 --- a/system/btif/src/btif_dm.cc +++ b/system/btif/src/btif_dm.cc @@ -1532,7 +1532,7 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { btif_update_remote_version_property(&bd_addr); invoke_acl_state_changed_cb(BT_STATUS_SUCCESS, bd_addr, - BT_ACL_STATE_CONNECTED); + BT_ACL_STATE_CONNECTED, HCI_SUCCESS); break; case BTA_DM_LINK_DOWN_EVT: @@ -1543,7 +1543,8 @@ static void btif_dm_upstreams_evt(uint16_t event, char* p_param) { BTIF_TRACE_DEBUG( "BTA_DM_LINK_DOWN_EVT. Sending BT_ACL_STATE_DISCONNECTED"); invoke_acl_state_changed_cb(BT_STATUS_SUCCESS, bd_addr, - BT_ACL_STATE_DISCONNECTED); + BT_ACL_STATE_DISCONNECTED, + static_cast<bt_hci_error_code_t>(btm_get_acl_disc_reason_code())); break; case BTA_DM_BLE_KEY_EVT: diff --git a/system/include/hardware/bluetooth.h b/system/include/hardware/bluetooth.h index e45340e37a..6d081f141a 100644 --- a/system/include/hardware/bluetooth.h +++ b/system/include/hardware/bluetooth.h @@ -135,6 +135,10 @@ inline std::string bt_status_text(const bt_status_t& status) { } } +/** Bluetooth HCI Error Codes */ +/** Corresponding to [Vol 2] Part D, "Error Codes" of Core_v5.1 specs */ +typedef uint8_t bt_hci_error_code_t; + /** Bluetooth PinKey Code */ typedef struct { uint8_t pin[16]; } __attribute__((packed)) bt_pin_code_t; @@ -423,7 +427,8 @@ typedef void (*bond_state_changed_callback)(bt_status_t status, /** Bluetooth ACL connection state changed callback */ typedef void (*acl_state_changed_callback)(bt_status_t status, RawAddress* remote_bd_addr, - bt_acl_state_t state); + bt_acl_state_t state, + bt_hci_error_code_t hci_reason); /** Bluetooth link quality report callback */ typedef void (*link_quality_report_callback)( diff --git a/system/service/adapter.cc b/system/service/adapter.cc index 1724fcdfed..d7964d2d92 100644 --- a/system/service/adapter.cc +++ b/system/service/adapter.cc @@ -683,7 +683,8 @@ class AdapterImpl : public Adapter, public hal::BluetoothInterface::Observer { void AclStateChangedCallback(bt_status_t status, const RawAddress& remote_bdaddr, - bt_acl_state_t state) override { + bt_acl_state_t state, + bt_hci_error_code_t hci_reason) override { std::string device_address = BtAddrString(&remote_bdaddr); bool connected = (state == BT_ACL_STATE_CONNECTED); LOG(INFO) << "ACL state changed: " << device_address diff --git a/system/service/hal/bluetooth_interface.cc b/system/service/hal/bluetooth_interface.cc index 6a2118e509..3afe635c53 100644 --- a/system/service/hal/bluetooth_interface.cc +++ b/system/service/hal/bluetooth_interface.cc @@ -147,16 +147,17 @@ void BondStateChangedCallback(bt_status_t status, RawAddress* remote_bd_addr, } void AclStateChangedCallback(bt_status_t status, RawAddress* remote_bd_addr, - bt_acl_state_t state) { + bt_acl_state_t state, bt_hci_error_code_t hci_reason) { shared_lock<shared_mutex_impl> lock(g_instance_lock); VERIFY_INTERFACE_OR_RETURN(); CHECK(remote_bd_addr); VLOG(1) << "Remote device ACL state changed - status: " << BtStatusText(status) << " - BD_ADDR: " << BtAddrString(remote_bd_addr) << " - state: " - << ((state == BT_ACL_STATE_CONNECTED) ? "CONNECTED" : "DISCONNECTED"); + << ((state == BT_ACL_STATE_CONNECTED) ? "CONNECTED" : "DISCONNECTED") + << " - HCI_REASON: " << std::to_string(hci_reason); FOR_EACH_BLUETOOTH_OBSERVER( - AclStateChangedCallback(status, *remote_bd_addr, state)); + AclStateChangedCallback(status, *remote_bd_addr, state, hci_reason)); } void ThreadEventCallback(bt_cb_thread_evt evt) { @@ -364,7 +365,7 @@ void BluetoothInterface::Observer::BondStateChangedCallback( void BluetoothInterface::Observer::AclStateChangedCallback( bt_status_t /* status */, const RawAddress& /* remote_bdaddr */, - bt_acl_state_t /* state */) { + bt_acl_state_t /* state */, bt_hci_error_code_t /* hci_reason */) { // Do nothing. } diff --git a/system/service/hal/bluetooth_interface.h b/system/service/hal/bluetooth_interface.h index bdd8005b74..aa4125cc90 100644 --- a/system/service/hal/bluetooth_interface.h +++ b/system/service/hal/bluetooth_interface.h @@ -72,7 +72,8 @@ class BluetoothInterface { bt_bond_state_t state); virtual void AclStateChangedCallback(bt_status_t status, const RawAddress& remote_bdaddr, - bt_acl_state_t state); + bt_acl_state_t state, + bt_hci_error_code_t hci_reason); virtual void LinkQualityReportCallback( uint64_t timestamp, int report_id, int rssi, int snr, int retransmission_count, int packets_not_receive_count, diff --git a/system/service/hal/fake_bluetooth_interface.cc b/system/service/hal/fake_bluetooth_interface.cc index 5427d9131a..cf6123d9f4 100644 --- a/system/service/hal/fake_bluetooth_interface.cc +++ b/system/service/hal/fake_bluetooth_interface.cc @@ -141,9 +141,10 @@ void FakeBluetoothInterface::NotifyAdapterLocalLeFeaturesPropertyChanged( } void FakeBluetoothInterface::NotifyAclStateChangedCallback( - bt_status_t status, const RawAddress& remote_bdaddr, bt_acl_state_t state) { + bt_status_t status, const RawAddress& remote_bdaddr, bt_acl_state_t state, + bt_hci_error_code_t hci_reason) { for (auto& observer : observers_) { - observer.AclStateChangedCallback(status, remote_bdaddr, state); + observer.AclStateChangedCallback(status, remote_bdaddr, state, hci_reason); } } diff --git a/system/service/hal/fake_bluetooth_interface.h b/system/service/hal/fake_bluetooth_interface.h index 93ec076652..0fc0aa1976 100644 --- a/system/service/hal/fake_bluetooth_interface.h +++ b/system/service/hal/fake_bluetooth_interface.h @@ -57,7 +57,8 @@ class FakeBluetoothInterface : public BluetoothInterface { const bt_local_le_features_t* features); void NotifyAclStateChangedCallback(bt_status_t status, const RawAddress& remote_bdaddr, - bt_acl_state_t state); + bt_acl_state_t state, + bt_hci_error_code_t hci_reason); // hal::BluetoothInterface overrides: void AddObserver(Observer* observer) override; diff --git a/system/service/test/adapter_unittest.cc b/system/service/test/adapter_unittest.cc index b1cedc19c9..5abd08eee5 100644 --- a/system/service/test/adapter_unittest.cc +++ b/system/service/test/adapter_unittest.cc @@ -259,21 +259,24 @@ TEST_F(AdapterTest, IsDeviceConnected) { // status != BT_STATUS_SUCCESS should be ignored fake_hal_iface_->NotifyAclStateChangedCallback(BT_STATUS_FAIL, hal_addr, - BT_ACL_STATE_CONNECTED); + BT_ACL_STATE_CONNECTED, + 0xff); // HCI_ERR_UNDEFINED EXPECT_FALSE(adapter_->IsDeviceConnected(kDeviceAddr)); EXPECT_TRUE(observer.last_connection_state_address().empty()); EXPECT_FALSE(observer.last_device_connected_state()); // Connected fake_hal_iface_->NotifyAclStateChangedCallback(BT_STATUS_SUCCESS, hal_addr, - BT_ACL_STATE_CONNECTED); + BT_ACL_STATE_CONNECTED, + 0x00); // HCI_SUCCESS EXPECT_TRUE(adapter_->IsDeviceConnected(kDeviceAddr)); EXPECT_EQ(kDeviceAddr, observer.last_connection_state_address()); EXPECT_TRUE(observer.last_device_connected_state()); // Disconnected fake_hal_iface_->NotifyAclStateChangedCallback(BT_STATUS_SUCCESS, hal_addr, - BT_ACL_STATE_DISCONNECTED); + BT_ACL_STATE_DISCONNECTED, + 0x16); // HCI_ERR_CONN_CAUSE_LOCAL_HOST EXPECT_FALSE(adapter_->IsDeviceConnected(kDeviceAddr)); EXPECT_EQ(kDeviceAddr, observer.last_connection_state_address()); EXPECT_FALSE(observer.last_device_connected_state()); diff --git a/system/test/headless/headless.cc b/system/test/headless/headless.cc index 11b05a43f1..31a9687ff1 100644 --- a/system/test/headless/headless.cc +++ b/system/test/headless/headless.cc @@ -103,7 +103,7 @@ void bond_state_changed(bt_status_t status, RawAddress* remote_bd_addr, /** Bluetooth ACL connection state changed callback */ void acl_state_changed(bt_status_t status, RawAddress* remote_bd_addr, - bt_acl_state_t state) { + bt_acl_state_t state, bt_hci_error_code_t hci_reason) { auto callback_list = interface_api_callback_map_.at(__func__); for (auto callback : callback_list) { interface_data_t params{ @@ -111,6 +111,7 @@ void acl_state_changed(bt_status_t status, RawAddress* remote_bd_addr, .params.acl_state_changed.status = status, .params.acl_state_changed.remote_bd_addr = remote_bd_addr, .params.acl_state_changed.state = state, + .params.acl_state_changed.hci_reason = hci_reason, }; (callback)(params); } diff --git a/system/test/headless/interface.h b/system/test/headless/interface.h index d2dd58c07e..d79016a7fc 100644 --- a/system/test/headless/interface.h +++ b/system/test/headless/interface.h @@ -12,6 +12,7 @@ using acl_state_changed_params_t = struct { bt_status_t status; RawAddress* remote_bd_addr; bt_acl_state_t state; + bt_hci_error_code_t hci_reason; }; using callback_params_t = union { |