247 lines
8.8 KiB
C
247 lines
8.8 KiB
C
|
|
/*
|
||
|
|
* 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,
|
||
|
|
};
|
||
|
|
|
||
|
|
// 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 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
|