/* * Copyright 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <cstdint> #include <string> namespace bluetooth { namespace metrics { // ENUM definition for adapter state that in sync with ChromeOS structured metrics // BluetoothAdapterStateChanged/AdapterState. enum class AdapterState : int64_t { OFF = 0, ON = 1 }; // ENUM definition for device/connection type that in sync with ChromeOS structured metrics // BluetoothPairingStateChanged/DeviceType and BlueZ metrics_conn_type. Note this is a non-optimal ENUM design that // mixed the connection transport type with the device type. The connection can only be LE or Classic, but the device // type can also be Dual. enum class ConnectionType : int64_t { CONN_TYPE_UNKNOWN = 0, CONN_TYPE_BREDR = 1, CONN_TYPE_LE = 2, CONN_TYPE_END = 3, }; // ENUM definition for pairing state that in sync with ChromeOS structured metrics // BluetoothPairingStateChanged/PairingState and BlueZ metrics_pair_result. enum class PairingState : int64_t { PAIR_STARTING = 0, PAIR_SUCCEED = 1, // The controller is not powered. PAIR_FAIL_NONPOWERED = 2, // The remote device has been paired with the local host. PAIR_FAIL_ALREADY_PAIRED = 3, // This can be invalid address type, invalid IO capability. PAIR_FAIL_INVALID_PARAMS = 4, // The pairing is in progress or being canceled. PAIR_FAIL_BUSY = 5, // Simple pairing or pairing is not supported on the remote device. PAIR_FAIL_NOT_SUPPORTED = 6, // Fail to set up connection with the remote device. PAIR_FAIL_ESTABLISH_CONN = 7, // The authentication failure can be caused by incorrect PIN/link key or // missing PIN/link key during pairing or authentication procedure. // This can also be a failure during message integrity check. PAIR_FAIL_AUTH_FAILED = 8, // The pairing request is rejected by the remote device. PAIR_FAIL_REJECTED = 9, // The pairing was cancelled. PAIR_FAIL_CANCELLED = 10, // The connection was timeout. PAIR_FAIL_TIMEOUT = 11, PAIR_FAIL_UNKNOWN = 12, // BT IO connection error PAIR_FAIL_BT_IO_CONNECT_ERROR = 13, // Unknown command. PAIR_FAIL_UNKNOWN_COMMAND = 14, // The peer was not connected. PAIR_FAIL_NOT_CONNECTED = 15, // Exceeded the limit of resource such as memory, connections. PAIR_FAIL_NO_RESOURCES = 16, // Disconnected due to power, user termination or other reasons. PAIR_FAIL_DISCONNECTED = 17, // Failed due to all the other reasons such as hardware, invalid LMP // PDU, transaction collision, role change, slot violation etc. PAIR_FAIL_FAILED = 18, PAIR_FAIL_END = 19, }; // ENUM definition for pairing state that in sync with ChromeOS structured metrics // BluetoothProfileConnectionStateChanged/Profile and BlueZ metrics_bluetooth_profile. enum class Profile : int64_t { UNKNOWN = 0, HSP = 1, HFP = 2, A2DP = 3, AVRCP = 4, HID = 5, HOG = 6, GATT = 7, GAP = 8, DEVICE_INFO = 9, BATTERY = 10, NEARBY = 11, PHONEHUB = 12, }; // ENUM definition for profile connection status that in sync with ChromeOS structured metrics // MetricProfileConnectionStatus and BlueZ's metrics_profile_conn_state. enum class MetricProfileConnectionStatus : int64_t { PROFILE_CONN_STATE_STARTING = 0, PROFILE_CONN_STATE_SUCCEED = 1, PROFILE_CONN_STATE_ALREADY_CONNECTED = 2, PROFILE_CONN_STATE_BUSY_CONNECTING = 3, PROFILE_CONN_STATE_CONNECTION_REFUSED = 4, PROFILE_CONN_STATE_CONNECTION_CANCELED = 5, PROFILE_CONN_STATE_REMOTE_UNAVAILABLE = 6, PROFILE_CONN_STATE_PROFILE_NOT_SUPPORTED = 7, PROFILE_CONN_STATE_UNKNOWN_ERROR = 8, }; // ENUM definition for profile disconnection status that in sync with ChromeOS structured metrics // MetricProfileDisconnectionStatus and BlueZ's metrics_profile_disconn_state. enum class MetricProfileDisconnectionStatus : int64_t { PROFILE_DISCONN_STATE_STARTING = 0, PROFILE_DISCONN_STATE_SUCCEED = 1, PROFILE_DISCONN_STATE_ALREADY_DISCONNECTED = 2, PROFILE_DISCONN_STATE_BUSY_DISCONNECTING = 3, PROFILE_DISCONN_STATE_DISCONNECTION_REFUSED = 4, PROFILE_DISCONN_STATE_DISCONNECTION_CANCELED = 5, PROFILE_DISCONN_STATE_BT_IO_CONNECT_ERROR = 6, PROFILE_DISCONN_STATE_INVALID_PARAMS = 7, PROFILE_DISCONN_STATE_UNKNOWN_ERROR = 8, }; // ENUM definition for ACL connection status that in sync with ChromeOS structured metrics // MetricAclConnectionStatus and BlueZ's metrics_conn_state. enum class MetricAclConnectionStatus : int64_t { ACL_CONN_STATE_STARTING = 0, ACL_CONN_STATE_SUCCEED = 1, ACL_CONN_STATE_ALREADY = 2, ACL_CONN_STATE_BUSY = 3, ACL_CONN_STATE_NONPOWERED = 4, ACL_CONN_STATE_TIMEOUT = 5, ACL_CONN_STATE_PROFILE_UNAVAILABLE = 6, ACL_CONN_STATE_NOT_CONNECTED = 7, ACL_CONN_STATE_NOT_PERMITTED = 8, ACL_CONN_STATE_INVALID_PARAMS = 9, ACL_CONN_STATE_CONNECTION_REFUSED = 10, ACL_CONN_STATE_CANCELED = 11, ACL_CONN_STATE_EVENT_INVALID = 12, ACL_CONN_STATE_DEVICE_NOT_FOUND = 13, ACL_CONN_STATE_BT_IO_CONNECT_ERROR = 14, ACL_CONN_STATE_UNKNOWN_COMMAND = 15, ACL_CONN_STATE_DISCONNECTED = 16, ACL_CONN_STATE_CONNECT_FAILED = 17, ACL_CONN_STATE_NOT_SUPPORTED = 18, ACL_CONN_STATE_NO_RESOURCES = 19, ACL_CONN_STATE_AUTH_FAILED = 20, ACL_CONN_STATE_FAILED = 21, ACL_CONN_STATE_UNKNOWN = 22, }; // ENUM definition for ACL disconnection status that in sync with ChromeOS structured metrics // MetricAclDisconnectionStatus and BlueZ's metrics_disconn_state. enum class MetricAclDisconnectionStatus : int64_t { ACL_DISCONN_STATE_STARTING = 0, ACL_DISCONN_STATE_TIMEOUT = 1, ACL_DISCONN_STATE_LOCAL_HOST = 2, ACL_DISCONN_STATE_REMOTE = 3, ACL_DISCONN_STATE_AUTH_FAILURE = 4, ACL_DISCONN_STATE_LOCAL_HOST_SUSPEND = 5, ACL_DISCONN_STATE_UNKNOWN = 6, }; // A binary ENUM defines the metrics event is logged for: either for an attempt to connect or to disconnect. enum class StateChangeType : int64_t { STATE_CHANGE_TYPE_DISCONNECT = 0, STATE_CHANGE_TYPE_CONNECT = 1 }; // ENUM definition for ACL disconnection status that in sync with ChromeOS structured metrics // MetricAclConnectionDirection and BlueZ's metrics_acl_connection_direction. enum class MetricAclConnectionDirection : int64_t { ACL_CONNECTION_DIRECTION_UNKNOWN = 0, ACL_CONNECTION_OUTGOING = 1, ACL_CONNECTION_INCOMING = 2, }; // ENUM definition for ACL disconnection status that in sync with ChromeOS structured metrics // MetricAclConnectionInitiator and BlueZ's metrics_acl_connection_initiator. enum class MetricAclConnectionInitiator : int64_t { ACL_CONNECTION_INITIATOR_UNKNOWN = 0, ACL_CONNECTION_INITIATOR_CLIENT = 1, ACL_CONNECTION_INITIATOR_SYSTEM = 2, }; // ENUM definition for ACL disconnection status that in sync with ChromeOS structured metrics // MetricTransportType and BlueZ's metrics_transport_type. enum class MetricTransportType { TRANSPORT_TYPE_UNKNOWN = 0, TRANSPORT_TYPE_USB = 1, TRANSPORT_TYPE_UART = 2, TRANSPORT_TYPE_SDIO = 3, }; // ENUM definition for suspend id state that in sync with ChromeOS structured metrics // BluetoothSuspendIdStateChanged/SuspendIdState. enum class SuspendIdState : int64_t { NoRecord = 0, Recorded = 1 }; // A struct holds the parsed profile connection event. struct ProfileConnectionEvent { int64_t type; int64_t profile; int64_t state; }; // Convert topshim::btif::BtState to AdapterState. AdapterState ToAdapterState(uint32_t state); // Convert to SuspendIdState. SuspendIdState ToSuspendIdState(uint32_t state); // Convert topshim::btif::BtDeviceType to ConnectionType ConnectionType ToPairingDeviceType(std::string addr, uint32_t device_type); // Convert topshim::btif::bond_state info (status, addr, bond_state, and fail_reason) to PairingState PairingState ToPairingState(uint32_t status, uint32_t bond_state, int32_t fail_reason); // Convert Floss profile connection info to ProfileConnectionEvent ProfileConnectionEvent ToProfileConnectionEvent(std::string addr, uint32_t profile, uint32_t status, uint32_t state); // A struct holds the parsed ACL connection event. struct AclConnectionEvent { int64_t start_time; int64_t state; int64_t initiator; int64_t direction; int64_t start_status; int64_t status; }; // Initialize a (dis)connection attempt event. void PendingAclConnectAttemptEvent(std::string addr, int64_t time, uint32_t acl_state); // Convert Floss ACL connection info to AclConnectionEvent. AclConnectionEvent ToAclConnectionEvent( std::string addr, int64_t time, uint32_t acl_status, uint32_t acl_state, uint32_t direction, uint32_t hci_reason); // A struct to hold the chipset info. struct MetricsChipsetInfo { int64_t vid; int64_t pid; int64_t transport; std::string chipset_string; }; // Get the info of the chipset. MetricsChipsetInfo GetMetricsChipsetInfo(); } // namespace metrics } // namespace bluetooth