| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/connectivity/bluetooth/core/bt-host/public/pw_bluetooth_sapphire/internal/host/hci-spec/util.h" |
| |
| #include <endian.h> |
| |
| #pragma clang diagnostic ignored "-Wswitch-enum" |
| |
| namespace bt::hci_spec { |
| |
| std::string HCIVersionToString( |
| pw::bluetooth::emboss::CoreSpecificationVersion version) { |
| switch (version) { |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V1_0B: |
| return "1.0b"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V1_1: |
| return "1.1"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V1_2: |
| return "1.2"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V2_0_EDR: |
| return "2.0 + EDR"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V2_1_EDR: |
| return "2.1 + EDR"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V3_0_HS: |
| return "3.0 + HS"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V4_0: |
| return "4.0"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V4_1: |
| return "4.1"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V4_2: |
| return "4.2"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V5_0: |
| return "5.0"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V5_1: |
| return "5.1"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V5_2: |
| return "5.2"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V5_3: |
| return "5.3"; |
| case pw::bluetooth::emboss::CoreSpecificationVersion::V5_4: |
| return "5.4"; |
| default: |
| break; |
| } |
| return "(unknown)"; |
| } |
| |
| // clang-format off |
| std::string StatusCodeToString(pw::bluetooth::emboss::StatusCode code) { |
| switch (code) { |
| case pw::bluetooth::emboss::StatusCode::SUCCESS: return "success"; |
| case pw::bluetooth::emboss::StatusCode::UNKNOWN_COMMAND: return "unknown command"; |
| case pw::bluetooth::emboss::StatusCode::UNKNOWN_CONNECTION_ID: return "unknown connection ID"; |
| case pw::bluetooth::emboss::StatusCode::HARDWARE_FAILURE: return "hardware failure"; |
| case pw::bluetooth::emboss::StatusCode::PAGE_TIMEOUT: return "page timeout"; |
| case pw::bluetooth::emboss::StatusCode::AUTHENTICATION_FAILURE: return "authentication failure"; |
| case pw::bluetooth::emboss::StatusCode::PIN_OR_KEY_MISSING: return "pin or key missing"; |
| case pw::bluetooth::emboss::StatusCode::MEMORY_CAPACITY_EXCEEDED: return "memory capacity exceeded"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_TIMEOUT: return "connection timeout"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_LIMIT_EXCEEDED: return "connection limit exceeded"; |
| case pw::bluetooth::emboss::StatusCode::SYNCHRONOUS_CONNECTION_LIMIT_EXCEEDED: return "synchronous connection limit exceeded"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_ALREADY_EXISTS: return "connection already exists"; |
| case pw::bluetooth::emboss::StatusCode::COMMAND_DISALLOWED: return "command disallowed"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_REJECTED_LIMITED_RESOURCES: return "connection rejected: limited resources"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_REJECTED_SECURITY: return "connection rejected: security"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_REJECTED_BAD_BD_ADDR: return "connection rejected: bad BD_ADDR"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_ACCEPT_TIMEOUT_EXCEEDED: return "connection accept timeout exceeded"; |
| case pw::bluetooth::emboss::StatusCode::UNSUPPORTED_FEATURE_OR_PARAMETER: return "unsupported feature or parameter"; |
| case pw::bluetooth::emboss::StatusCode::INVALID_HCI_COMMAND_PARAMETERS: return "invalid HCI command parameters"; |
| case pw::bluetooth::emboss::StatusCode::REMOTE_USER_TERMINATED_CONNECTION: return "remote user terminated connection"; |
| case pw::bluetooth::emboss::StatusCode::REMOTE_DEVICE_TERMINATED_CONNECTION_LOW_RESOURCES: return "remote device terminated connection: low resources"; |
| case pw::bluetooth::emboss::StatusCode::REMOTE_DEVICE_TERMINATED_CONNECTION_POWER_OFF: return "remote device terminated connection: power off"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_TERMINATED_BY_LOCAL_HOST: return "connection terminated by local host"; |
| case pw::bluetooth::emboss::StatusCode::REPEATED_ATTEMPTS: return "repeated attempts"; |
| case pw::bluetooth::emboss::StatusCode::PAIRING_NOT_ALLOWED: return "pairing not allowed"; |
| case pw::bluetooth::emboss::StatusCode::UNKNOWN_LMP_PDU: return "unpw::bluetooth::emboss::StatusCode::nown LMP PDU"; |
| case pw::bluetooth::emboss::StatusCode::UNSUPPORTED_REMOTE_FEATURE: return "unsupported remote feature"; |
| case pw::bluetooth::emboss::StatusCode::SCO_OFFSET_REJECTED: return "SCO offset rejected"; |
| case pw::bluetooth::emboss::StatusCode::SCO_INTERVAL_REJECTED: return "SCO interval rejected"; |
| case pw::bluetooth::emboss::StatusCode::SCO_AIRMODE_REJECTED: return "SCO air mode rejected"; |
| case pw::bluetooth::emboss::StatusCode::INVALID_LMP_OR_LL_PARAMETERS: return "invalid LMP or LL parameters"; |
| case pw::bluetooth::emboss::StatusCode::UNSPECIFIED_ERROR: return "unspecified error"; |
| case pw::bluetooth::emboss::StatusCode::UNSUPPORTED_LMP_OR_LL_PARAMETER_VALUE: return "unsupported LMP or LL parameter value"; |
| case pw::bluetooth::emboss::StatusCode::ROLE_CHANGE_NOT_ALLOWED: return "role change not allowed"; |
| case pw::bluetooth::emboss::StatusCode::LMP_OR_LL_RESPONSE_TIMEOUT: return "LMP or LL response timeout"; |
| case pw::bluetooth::emboss::StatusCode::LMP_ERROR_TRANSACTION_COLLISION: return "LMP error transaction collision"; |
| case pw::bluetooth::emboss::StatusCode::LMP_PDU_NOT_ALLOWED: return "LMP PDU not allowed"; |
| case pw::bluetooth::emboss::StatusCode::ENCRYPTION_MODE_NOT_ACCEPTABLE: return "encryption mode not acceptable"; |
| case pw::bluetooth::emboss::StatusCode::LINK_KEY_CANNOT_BE_CHANGED: return "link key cannot be changed"; |
| case pw::bluetooth::emboss::StatusCode::REQUESTED_QOS_NOT_SUPPORTED: return "requested QoS not supported"; |
| case pw::bluetooth::emboss::StatusCode::INSTANT_PASSED: return "instant passed"; |
| case pw::bluetooth::emboss::StatusCode::PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED: return "pairing with unit key not supported"; |
| case pw::bluetooth::emboss::StatusCode::DIFFERENT_TRANSACTION_COLLISION: return "different transaction collision"; |
| case pw::bluetooth::emboss::StatusCode::QOS_UNACCEPTABLE_PARAMETER: return "QoS unacceptable parameter"; |
| case pw::bluetooth::emboss::StatusCode::QOS_REJECTED: return "QoS rejected"; |
| case pw::bluetooth::emboss::StatusCode::CHANNEL_CLASSIFICATION_NOT_SUPPORTED: return "channel classification not supported"; |
| case pw::bluetooth::emboss::StatusCode::INSUFFICIENT_SECURITY: return "insufficient security"; |
| case pw::bluetooth::emboss::StatusCode::PARAMETER_OUT_OF_MANDATORY_RANGE: return "parameter out of mandatory range"; |
| case pw::bluetooth::emboss::StatusCode::ROLE_SWITCH_PENDING: return "role switch pending"; |
| case pw::bluetooth::emboss::StatusCode::RESERVED_SLOT_VIOLATION: return "reserved slot violation"; |
| case pw::bluetooth::emboss::StatusCode::ROLE_SWITCH_FAILED: return "role switch failed"; |
| case pw::bluetooth::emboss::StatusCode::EXTENDED_INQUIRY_RESPONSE_TOO_LARGE: return "extended inquiry response too large"; |
| case pw::bluetooth::emboss::StatusCode::SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST: return "secure simple pairing not supported by host"; |
| case pw::bluetooth::emboss::StatusCode::HOST_BUSY_PAIRING: return "host busy pairing"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_REJECTED_NO_SUITABLE_CHANNEL_FOUND: return "connection rejected: no suitable channel found"; |
| case pw::bluetooth::emboss::StatusCode::CONTROLLER_BUSY: return "controller busy"; |
| case pw::bluetooth::emboss::StatusCode::UNACCEPTABLE_CONNECTION_PARAMETERS: return "unacceptable connection parameters"; |
| case pw::bluetooth::emboss::StatusCode::DIRECTED_ADVERTISING_TIMEOUT: return "directed advertising timeout"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_TERMINATED_MIC_FAILURE: return "connection terminated: MIC failure"; |
| case pw::bluetooth::emboss::StatusCode::CONNECTION_FAILED_TO_BE_ESTABLISHED: return "connection failed to be established"; |
| case pw::bluetooth::emboss::StatusCode::MAC_CONNECTION_FAILED: return "MAC connection failed"; |
| case pw::bluetooth::emboss::StatusCode::COARSE_CLOCK_ADJUSTMENT_REJECTED: return "coarse clocpw::bluetooth::emboss::StatusCode:: adjustment rejected"; |
| case pw::bluetooth::emboss::StatusCode::TYPE_0_SUBMAP_NOT_DEFINED: return "type 0 submap not defined"; |
| case pw::bluetooth::emboss::StatusCode::UNKNOWN_ADVERTISING_IDENTIFIER: return "unknown advertising identifier"; |
| case pw::bluetooth::emboss::StatusCode::LIMIT_REACHED: return "limit reached"; |
| case pw::bluetooth::emboss::StatusCode::OPERATION_CANCELLED_BY_HOST: return "operation cancelled by host"; |
| default: break; |
| }; |
| return "unknown status"; |
| } |
| // clang-format on |
| |
| const char* LinkTypeToString(pw::bluetooth::emboss::LinkType link_type) { |
| switch (link_type) { |
| case pw::bluetooth::emboss::LinkType::SCO: |
| return "SCO"; |
| case pw::bluetooth::emboss::LinkType::ACL: |
| return "ACL"; |
| case pw::bluetooth::emboss::LinkType::ESCO: |
| return "eSCO"; |
| default: |
| return "<Unknown LinkType>"; |
| }; |
| } |
| |
| const char* LinkKeyTypeToString(hci_spec::LinkKeyType key_type) { |
| switch (key_type) { |
| case hci_spec::LinkKeyType::kCombination: |
| return "kCombination"; |
| case hci_spec::LinkKeyType::kLocalUnit: |
| return "kLocalUnit"; |
| case hci_spec::LinkKeyType::kRemoteUnit: |
| return "kRemoteUnit"; |
| case hci_spec::LinkKeyType::kDebugCombination: |
| return "kDebugCombination"; |
| case hci_spec::LinkKeyType::kUnauthenticatedCombination192: |
| return "kUnauthenticatedCombination192"; |
| case hci_spec::LinkKeyType::kAuthenticatedCombination192: |
| return "kAuthenticatedCombination192"; |
| case hci_spec::LinkKeyType::kChangedCombination: |
| return "kChangedCombination"; |
| case hci_spec::LinkKeyType::kUnauthenticatedCombination256: |
| return "kUnauthenticatedCombination256"; |
| case hci_spec::LinkKeyType::kAuthenticatedCombination256: |
| return "kAuthenticatedCombination256"; |
| default: |
| break; |
| } |
| |
| return "(Unknown)"; |
| } |
| |
| std::string ConnectionRoleToString(pw::bluetooth::emboss::ConnectionRole role) { |
| switch (role) { |
| case pw::bluetooth::emboss::ConnectionRole::CENTRAL: |
| return "central"; |
| case pw::bluetooth::emboss::ConnectionRole::PERIPHERAL: |
| return "peripheral"; |
| default: |
| return "<unknown role>"; |
| } |
| } |
| |
| } // namespace bt::hci_spec |