summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andrew Cheng <chengandrew@google.com> 2021-01-14 17:28:13 -0800
committer Andrew Cheng <chengca@google.com> 2021-02-20 02:16:03 +0000
commit261f360fdd71e2b6c87eeb9f52f7fc460a953987 (patch)
tree5d20526f574f4f5b7025c07d37ce07013064f801
parentbec5baf67c3161c5b1366bb5b2dea321e775e367 (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.aidl2
-rw-r--r--system/btif/include/btif_common.h2
-rw-r--r--system/btif/src/bluetooth.cc9
-rw-r--r--system/btif/src/btif_dm.cc5
-rw-r--r--system/include/hardware/bluetooth.h7
-rw-r--r--system/service/adapter.cc3
-rw-r--r--system/service/hal/bluetooth_interface.cc9
-rw-r--r--system/service/hal/bluetooth_interface.h3
-rw-r--r--system/service/hal/fake_bluetooth_interface.cc5
-rw-r--r--system/service/hal/fake_bluetooth_interface.h3
-rw-r--r--system/service/test/adapter_unittest.cc9
-rw-r--r--system/test/headless/headless.cc3
-rw-r--r--system/test/headless/interface.h1
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 {