diff options
-rw-r--r-- | system/common/metrics.cc | 10 | ||||
-rw-r--r-- | system/common/metrics.h | 8 | ||||
-rw-r--r-- | system/hci/src/hci_layer.cc | 4 |
3 files changed, 22 insertions, 0 deletions
diff --git a/system/common/metrics.cc b/system/common/metrics.cc index 976b5cfa5d..40606d32d9 100644 --- a/system/common/metrics.cc +++ b/system/common/metrics.cc @@ -597,6 +597,16 @@ void LogLinkLayerConnectionEvent(const RawAddress* address, } } +void LogHciTimeoutEvent(uint32_t hci_cmd) { + int ret = + android::util::stats_write(android::util::BLUETOOTH_HCI_TIMEOUT_REPORTED, + static_cast<int64_t>(hci_cmd)); + if (ret < 0) { + LOG(WARNING) << __func__ << ": failed for opcode " << loghex(hci_cmd) + << ", error " << ret; + } +} + } // namespace common } // namespace bluetooth diff --git a/system/common/metrics.h b/system/common/metrics.h index e36227669f..5d661580da 100644 --- a/system/common/metrics.h +++ b/system/common/metrics.h @@ -304,6 +304,14 @@ void LogLinkLayerConnectionEvent(const RawAddress* address, uint32_t hci_event, uint32_t hci_ble_event, uint32_t cmd_status, uint32_t reason_code); +/** + * Logs when Bluetooth controller failed to reply with command status within + * a timeout period after receiving an HCI command from the host + * + * @param hci_cmd opcode of HCI command that caused this timeout + */ +void LogHciTimeoutEvent(uint32_t hci_cmd); + } // namespace common } // namespace bluetooth diff --git a/system/hci/src/hci_layer.cc b/system/hci/src/hci_layer.cc index feb5445e7b..2916a79377 100644 --- a/system/hci/src/hci_layer.cc +++ b/system/hci/src/hci_layer.cc @@ -25,6 +25,7 @@ #include <base/run_loop.h> #include <base/sequenced_task_runner.h> #include <base/threading/thread.h> +#include <frameworks/base/core/proto/android/bluetooth/hci/enums.pb.h> #include <signal.h> #include <string.h> @@ -38,6 +39,7 @@ #include "btsnoop.h" #include "buffer_allocator.h" #include "common/message_loop_thread.h" +#include "common/metrics.h" #include "hci_inject.h" #include "hci_internals.h" #include "hcidefs.h" @@ -481,6 +483,7 @@ static void command_timed_out_log_info(void* original_wait_entry) { } LOG_EVENT_INT(BT_HCI_TIMEOUT_TAG_NUM, wait_entry->opcode); + bluetooth::common::LogHciTimeoutEvent(wait_entry->opcode); } } @@ -493,6 +496,7 @@ static void command_timed_out(void* original_wait_entry) { COMMAND_PENDING_MUTEX_ACQUIRE_TIMEOUT_MS))) { LOG_ERROR(LOG_TAG, "%s: Cannot obtain the mutex", __func__); LOG_EVENT_INT(BT_HCI_TIMEOUT_TAG_NUM, HCI_UNKNOWN_COMMAND_TIMED_OUT); + bluetooth::common::LogHciTimeoutEvent(android::bluetooth::hci::CMD_UNKNOWN); } else { command_timed_out_log_info(original_wait_entry); lock.unlock(); |