blob: b67ee2c711429152a9af7b5d77c1ac2a5397449e [file] [log] [blame]
/*
* 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