| // 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. |
| |
| #ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_ADAPTER_STATE_H_ |
| #define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_ADAPTER_STATE_H_ |
| |
| #include <zircon/assert.h> |
| |
| #include <cstdint> |
| |
| #include "src/connectivity/bluetooth/core/bt-host/common/device_address.h" |
| #include "src/connectivity/bluetooth/core/bt-host/gap/gap.h" |
| #include "src/connectivity/bluetooth/core/bt-host/gap/low_energy_state.h" |
| #include "src/connectivity/bluetooth/core/bt-host/hci/acl_data_channel.h" |
| #include "src/connectivity/bluetooth/core/bt-host/hci/hci_constants.h" |
| #include "src/connectivity/bluetooth/core/bt-host/hci/lmp_feature_set.h" |
| |
| namespace bt { |
| namespace gap { |
| |
| // Stores controller settings and state information. |
| class AdapterState final { |
| public: |
| AdapterState(); |
| |
| // The HCI version supported by the controller. |
| hci::HCIVersion hci_version() const { return hci_version_; } |
| |
| // This returns Bluetooth Controller address. This address has the following |
| // meaning based on the controller capabilities: |
| // - On BR/EDR this is the Bluetooth Controller Address, or BD_ADDR. |
| // - On LE this is the Public Device Address. This value can be used as the |
| // device's identity address. This value can be zero if a Public Device |
| // Address is not used. |
| // - On BR/EDR/LE this is the LE Public Device Address AND the BD_ADDR. |
| const DeviceAddressBytes& controller_address() const { return controller_address_; } |
| |
| TechnologyType type() const { |
| // Note: we don't support BR/EDR only controllers. |
| if (IsBREDRSupported()) { |
| return TechnologyType::kDualMode; |
| } |
| return TechnologyType::kLowEnergy; |
| } |
| |
| // The features that are supported by this controller. |
| const hci::LMPFeatureSet& features() const { return features_; } |
| |
| // Helpers for querying LMP capabilities. |
| inline bool IsBREDRSupported() const { |
| return !features().HasBit(0u, hci::LMPFeature::kBREDRNotSupported); |
| } |
| |
| inline bool IsLowEnergySupported() const { |
| return features().HasBit(0u, hci::LMPFeature::kLESupported); |
| } |
| |
| // Returns true if |command_bit| in the given |octet| is set in the supported |
| // command list. |
| inline bool IsCommandSupported(size_t octet, hci::SupportedCommand command_bit) const { |
| ZX_DEBUG_ASSERT(octet < sizeof(supported_commands_)); |
| return supported_commands_[octet] & static_cast<uint8_t>(command_bit); |
| } |
| |
| // Returns Bluetooth Low Energy specific state information. |
| const LowEnergyState& low_energy_state() const { return le_state_; } |
| |
| // Returns the BR/EDR ACL data buffer capacity. |
| const hci::DataBufferInfo& bredr_data_buffer_info() const { return bredr_data_buffer_info_; } |
| |
| // Returns the BR/EDR local name |
| const std::string local_name() const { return local_name_; } |
| |
| private: |
| // Let Adapter directly write to the private members. |
| friend class Adapter; |
| |
| // The member variables in this class consist of controller settings that are |
| // shared between LE and BR/EDR controllers. LE and BR/EDR specific state is |
| // stored in corresponding data structures. |
| // TODO(armansito): Actually do this and update the comment to refer to the |
| // variables. |
| |
| // HCI version supported by the controller. |
| hci::HCIVersion hci_version_; |
| |
| // The Features that are supported by this adapter. |
| hci::LMPFeatureSet features_; |
| |
| // Bitmask list of HCI commands that the controller supports. |
| uint8_t supported_commands_[64]; |
| |
| // BD_ADDR (for classic) and Public Device Address (for LE). |
| DeviceAddressBytes controller_address_; |
| |
| // The BR/EDR ACL data buffer size. We store this here as it is needed on |
| // dual-mode controllers even if the host stack is compiled for LE-only. |
| hci::DataBufferInfo bredr_data_buffer_info_; |
| |
| // BLE-specific state. |
| LowEnergyState le_state_; |
| |
| // Local name |
| std::string local_name_; |
| |
| // TODO(armansito): Add BREDRState class. |
| }; |
| |
| } // namespace gap |
| } // namespace bt |
| |
| #endif // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_GAP_ADAPTER_STATE_H_ |