blob: 424e645cf455c0f1c283e2b988ab42f160f6fcdb [file] [log] [blame]
//
// Copyright 2015 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 <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "base/json/json_value_converter.h"
#include "base/time/time.h"
#include "vendor_libs/test_vendor_lib/include/command_packet.h"
#include "vendor_libs/test_vendor_lib/include/hci_transport.h"
#include "vendor_libs/test_vendor_lib/include/test_channel_transport.h"
namespace test_vendor_lib {
// Emulates a dual mode BR/EDR + LE controller by maintaining the link layer
// state machine detailed in the Bluetooth Core Specification Version 4.2,
// Volume 6, Part B, Section 1.1 (page 30). Provides methods corresponding to
// commands sent by the HCI. These methods will be registered as callbacks from
// a controller instance with the HciHandler. To implement a new Bluetooth
// command, simply add the method declaration below, with return type void and a
// single const std::vector<uint8_t>& argument. After implementing the
// method, simply register it with the HciHandler using the SET_HANDLER macro in
// the controller's default constructor. Be sure to name your method after the
// corresponding Bluetooth command in the Core Specification with the prefix
// "Hci" to distinguish it as a controller command.
class DualModeController {
public:
class Properties {
public:
// TODO(dennischeng): Add default initialization and use that to instantiate
// a default configured controller if the config file is invalid or not
// provided.
Properties(const std::string& file_name);
// Aggregates and returns the result for the Read Local Extended Features
// command. This result contains the |maximum_page_number_| property (among
// other things not in the Properties object). See the Bluetooth Core
// Specification Version 4.2, Volume 2, Part E, Section 7.4.4 (page 792).
const std::vector<uint8_t> GetBdAddress();
// Aggregates and returns the result for the Read Buffer Size command. This
// result consists of the |acl_data_packet_size_|, |sco_data_packet_size_|,
// |num_acl_data_packets_|, and |num_sco_data_packets_| properties. See the
// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.5
// (page 794).
const std::vector<uint8_t> GetBufferSize();
// Returns the result for the Read BD_ADDR command. This result is the
// |bd_address_| property. See the Bluetooth Core Specification Version
// 4.2, Volume 2, Part E, Section 7.4.6 (page 796).
const std::vector<uint8_t> GetLocalExtendedFeatures(uint8_t page_number);
// Returns the result for the Read Local Name command. See the Bluetooth
// Core Specification Version 4.2, Volume 2, Part E, Section 7.3.12
// (page 664).
const std::vector<uint8_t> GetLocalName();
// Returns the result for the Read Local Supported Commands command. See the
// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.2
// (page 790).
const std::vector<uint8_t> GetLocalSupportedCommands();
// Aggregates and returns the Read Local Version Information result. This
// consists of the |version_|, |revision_|, |lmp_pal_version_|,
// |manufacturer_name_|, and |lmp_pal_subversion_|. See the Bluetooth Core
// Specification Version 4.2, Volume 2, Part E, Section 7.4.1 (page 788).
const std::vector<uint8_t> GetLocalVersionInformation();
// Specification Version 4.2, Volume 2, Part E, Section 7.8.2
const std::vector<uint8_t> GetLeBufferSize();
// Specification Version 4.2, Volume 2, Part E, Section 7.8.3
const std::vector<uint8_t> GetLeLocalSupportedFeatures();
// Specification Version 4.2, Volume 2, Part E, Section 7.8.14
const std::vector<uint8_t> GetLeWhiteListSize();
// Specification Version 4.2, Volume 2, Part E, Section 7.8.23
const std::vector<uint8_t> GetLeRand();
// Specification Version 4.2, Volume 2, Part E, Section 7.8.27
const std::vector<uint8_t> GetLeSupportedStates();
// Vendor-specific commands (see hcidefs.h)
const std::vector<uint8_t> GetLeVendorCap();
static void RegisterJSONConverter(
base::JSONValueConverter<Properties>* converter);
private:
uint16_t acl_data_packet_size_;
uint8_t sco_data_packet_size_;
uint16_t num_acl_data_packets_;
uint16_t num_sco_data_packets_;
uint8_t version_;
uint16_t revision_;
uint8_t lmp_pal_version_;
uint16_t manufacturer_name_;
uint16_t lmp_pal_subversion_;
uint8_t local_supported_commands_size_;
uint8_t local_name_size_;
uint16_t le_acl_data_packet_length_;
uint8_t num_le_acl_data_packets_;
uint8_t le_white_list_size_;
std::vector<uint8_t> bd_address_;
};
// Sets all of the methods to be used as callbacks in the HciHandler.
DualModeController();
~DualModeController() = default;
// Preprocesses the command, primarily checking testh channel hooks. If
// possible, dispatches the corresponding controller method corresponding to
// carry out the command.
void HandleCommand(std::unique_ptr<CommandPacket> command_packet);
// Dispatches the test channel action corresponding to the command specified
// by |name|.
void HandleTestChannelCommand(const std::string& name,
const std::vector<std::string>& args);
// Sets the controller Handle* methods as callbacks for the transport to call
// when data is received.
void RegisterHandlersWithHciTransport(HciTransport& transport);
// Sets the test channel handler with the transport dedicated to test channel
// communications.
void RegisterHandlersWithTestChannelTransport(
TestChannelTransport& transport);
// Sets the callback to be used for sending events back to the HCI.
// TODO(dennischeng): Once PostDelayedTask works, get rid of this and only use
// |RegisterDelayedEventChannel|.
void RegisterEventChannel(
std::function<void(std::unique_ptr<EventPacket>)> send_event);
void RegisterDelayedEventChannel(
std::function<void(std::unique_ptr<EventPacket>, base::TimeDelta)>
send_event);
// Controller commands. For error codes, see the Bluetooth Core Specification,
// Version 4.2, Volume 2, Part D (page 370).
// OGF: 0x0003
// OCF: 0x0003
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.2
void HciReset(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OGF: 0x0005
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.5
void HciReadBufferSize(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0033
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.39
void HciHostBufferSize(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OCF: 0x0001
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.1
void HciReadLocalVersionInformation(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OCF: 0x0009
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.6
void HciReadBdAddr(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OCF: 0x0002
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.2
void HciReadLocalSupportedCommands(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OCF: 0x0004
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.4
void HciReadLocalExtendedFeatures(const std::vector<uint8_t>& args);
// OGF: 0x0004
// OCF: 0x000B
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.8
void HciReadLocalSupportedCodecs(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0056
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.59
void HciWriteSimplePairingMode(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x006D
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.79
void HciWriteLeHostSupport(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0001
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.1
void HciSetEventMask(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0045
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.50
void HciWriteInquiryMode(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0047
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.52
void HciWritePageScanType(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0043
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.48
void HciWriteInquiryScanType(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0024
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.26
void HciWriteClassOfDevice(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0018
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.16
void HciWritePageTimeout(const std::vector<uint8_t>& args);
// OGF: 0x0002
// OCF: 0x000F
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.2.12
void HciWriteDefaultLinkPolicySettings(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0014
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.12
void HciReadLocalName(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0013
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.11
void HciWriteLocalName(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0052
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.56
void HciWriteExtendedInquiryResponse(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0026
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.28
void HciWriteVoiceSetting(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x003A
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.45
void HciWriteCurrentIacLap(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x001E
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.22
void HciWriteInquiryScanActivity(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x001A
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.18
void HciWriteScanEnable(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0005
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.3
void HciSetEventFilter(const std::vector<uint8_t>& args);
// OGF: 0x0001
// OCF: 0x0001
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.1
void HciInquiry(const std::vector<uint8_t>& args);
// OGF: 0x0001
// OCF: 0x0002
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.2
void HciInquiryCancel(const std::vector<uint8_t>& args);
// OGF: 0x0003
// OCF: 0x0012
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.10
void HciDeleteStoredLinkKey(const std::vector<uint8_t>& args);
// OGF: 0x0001
// OCF: 0x0019
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.19
void HciRemoteNameRequest(const std::vector<uint8_t>& args);
// LE Controller Commands
// OGF: 0x0008
// OCF: 0x0001
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.1
void HciLeSetEventMask(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x0002
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.2
void HciLeReadBufferSize(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x0003
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.3
void HciLeReadLocalSupportedFeatures(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x0005
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.4
void HciLeSetRandomAddress(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x000B
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.10
void HciLeSetScanParameters(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x000C
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.11
void HciLeSetScanEnable(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x000F
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.14
void HciLeReadWhiteListSize(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x0018
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.23
void HciLeRand(const std::vector<uint8_t>& args);
// OGF: 0x0008
// OCF: 0x001C
// Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.27
void HciLeReadSupportedStates(const std::vector<uint8_t>& args);
// Vendor-specific commands (see hcidefs.h)
// OGF: 0x00FC
// OCF: 0x0027
void HciBleVendorSleepMode(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x0153
void HciBleVendorCap(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x0154
void HciBleVendorMultiAdv(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x0155
void HciBleVendor155(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x0157
void HciBleVendor157(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x0159
void HciBleEnergyInfo(const std::vector<uint8_t>& args);
// OGF: 0x00FC
// OCF: 0x015A
void HciBleExtendedScanParams(const std::vector<uint8_t>& args);
// Test Channel commands:
// Clears all test channel modifications.
void TestChannelClear(const std::vector<std::string>& args);
// Sets the response delay for events to 0.
void TestChannelClearEventDelay(const std::vector<std::string>& args);
// Discovers a fake device.
void TestChannelDiscover(const std::vector<std::string>& args);
// Causes events to be sent after a delay.
void TestChannelSetEventDelay(const std::vector<std::string>& args);
// Causes all future HCI commands to timeout.
void TestChannelTimeoutAll(const std::vector<std::string>& args);
private:
// Current link layer state of the controller.
enum State {
kStandby, // Not receiving/transmitting any packets from/to other devices.
kInquiry, // The controller is discovering other nearby devices.
};
enum TestChannelState {
kNone, // The controller is running normally.
kTimeoutAll, // All commands should time out, i.e. send no response.
kDelayedResponse, // Event responses are sent after a delay.
};
// Creates a command complete event and sends it back to the HCI.
void SendCommandComplete(uint16_t command_opcode,
const std::vector<uint8_t>& return_parameters) const;
// Sends a command complete event with no return parameters. This event is
// typically sent for commands that can be completed immediately.
void SendCommandCompleteSuccess(uint16_t command_opcode) const;
// Creates a command status event and sends it back to the HCI.
void SendCommandStatus(uint8_t status, uint16_t command_opcode) const;
// Sends a command status event with default event parameters.
void SendCommandStatusSuccess(uint16_t command_opcode) const;
// Sends an inquiry response for a fake device.
void SendInquiryResult() const;
// Sends an extended inquiry response for a fake device.
void SendExtendedInquiryResult(const std::string& name,
const std::string& address) const;
void SetEventDelay(int64_t delay);
// Callback provided to send events from the controller back to the HCI.
std::function<void(std::unique_ptr<EventPacket>)> send_event_;
std::function<void(std::unique_ptr<EventPacket>, base::TimeDelta)>
send_delayed_event_;
// Maintains the commands to be registered and used in the HciHandler object.
// Keys are command opcodes and values are the callbacks to handle each
// command.
std::unordered_map<uint16_t, std::function<void(const std::vector<uint8_t>&)>>
active_hci_commands_;
std::unordered_map<std::string,
std::function<void(const std::vector<std::string>&)>>
active_test_channel_commands_;
// Specifies the format of Inquiry Result events to be returned during the
// Inquiry command.
// 0x00: Standard Inquiry Result event format (default).
// 0x01: Inquiry Result format with RSSI.
// 0x02 Inquiry Result with RSSI format or Extended Inquiry Result format.
// 0x03-0xFF: Reserved.
uint8_t inquiry_mode_;
std::vector<uint8_t> le_event_mask_;
std::vector<uint8_t> le_random_address_;
uint8_t le_scan_type_;
uint16_t le_scan_interval_;
uint16_t le_scan_window_;
uint8_t own_address_type_;
uint8_t scanning_filter_policy_;
uint8_t le_scan_enable_;
uint8_t filter_duplicates_;
State state_;
Properties properties_;
TestChannelState test_channel_state_;
DISALLOW_COPY_AND_ASSIGN(DualModeController);
};
} // namespace test_vendor_lib