system/bt
Revision | 225144cb6435f564009e88056fbf8bf06df5da9c (tree) |
---|---|
Zeit | 2017-08-10 03:32:24 |
Autor | Jaap Jan Meijer <jjmeijer88@gmai...> |
Commiter | Jaap Jan Meijer |
vendor_lib: remove test, it's broken and should be reworked
@@ -1,77 +0,0 @@ | ||
1 | -LOCAL_PATH := $(call my-dir) | |
2 | - | |
3 | -# test-vendor shared library for target | |
4 | -# ======================================================== | |
5 | -include $(CLEAR_VARS) | |
6 | - | |
7 | -BT_DIR := $(TOP_DIR)system/bt | |
8 | - | |
9 | -LOCAL_SRC_FILES := \ | |
10 | - src/bt_vendor.cc \ | |
11 | - src/command_packet.cc \ | |
12 | - src/dual_mode_controller.cc \ | |
13 | - src/event_packet.cc \ | |
14 | - src/hci_transport.cc \ | |
15 | - src/packet.cc \ | |
16 | - src/packet_stream.cc \ | |
17 | - src/test_channel_transport.cc \ | |
18 | - src/vendor_manager.cc | |
19 | - | |
20 | -# We pull in gtest because base/files/file_util.h, which is used to read the | |
21 | -# controller properties file, needs gtest/gtest_prod.h. | |
22 | -LOCAL_C_INCLUDES := \ | |
23 | - $(LOCAL_PATH)/include \ | |
24 | - $(BT_DIR) \ | |
25 | - $(BT_DIR)/hci/include \ | |
26 | - $(BT_DIR)/stack/include \ | |
27 | - $(BT_DIR)/third_party/gtest/include | |
28 | - | |
29 | -LOCAL_SHARED_LIBRARIES := \ | |
30 | - liblog \ | |
31 | - libchrome | |
32 | - | |
33 | -LOCAL_CPP_EXTENSION := .cc | |
34 | -LOCAL_MODULE := test-vendor | |
35 | -LOCAL_MODULE_TAGS := optional | |
36 | -LOCAL_MODULE_CLASS := SHARED_LIBRARIES | |
37 | - | |
38 | -LOCAL_CFLAGS += $(bluetooth_CFLAGS) | |
39 | -LOCAL_CONLYFLAGS += $(bluetooth_CONLYFLAGS) | |
40 | -LOCAL_CPPFLAGS += $(bluetooth_CPPFLAGS) | |
41 | - | |
42 | -include $(BUILD_SHARED_LIBRARY) | |
43 | - | |
44 | -# test-vendor unit tests for host | |
45 | -# ======================================================== | |
46 | -ifeq ($(HOST_OS), linux) | |
47 | -include $(CLEAR_VARS) | |
48 | - | |
49 | -LOCAL_SRC_FILES := \ | |
50 | - src/command_packet.cc \ | |
51 | - src/event_packet.cc \ | |
52 | - src/hci_transport.cc \ | |
53 | - src/packet.cc \ | |
54 | - src/packet_stream.cc \ | |
55 | - test/hci_transport_unittest.cc \ | |
56 | - test/packet_stream_unittest.cc | |
57 | - | |
58 | -LOCAL_C_INCLUDES := \ | |
59 | - $(LOCAL_PATH)/include \ | |
60 | - $(BT_DIR) \ | |
61 | - $(BT_DIR)/hci/include \ | |
62 | - $(BT_DIR)/stack/include | |
63 | - | |
64 | -LOCAL_SHARED_LIBRARIES := \ | |
65 | - liblog \ | |
66 | - libchrome | |
67 | - | |
68 | -LOCAL_CPP_EXTENSION := .cc | |
69 | -LOCAL_MODULE := test-vendor_test_host | |
70 | -LOCAL_MODULE_TAGS := tests | |
71 | - | |
72 | -LOCAL_CFLAGS += $(bluetooth_CFLAGS) | |
73 | -LOCAL_CONLYFLAGS += $(bluetooth_CONLYFLAGS) | |
74 | -LOCAL_CPPFLAGS += $(bluetooth_CPPFLAGS) | |
75 | - | |
76 | -include $(BUILD_HOST_NATIVE_TEST) | |
77 | -endif |
@@ -1,55 +0,0 @@ | ||
1 | -shared_library("test_vendor_lib") { | |
2 | - sources = [ | |
3 | - "src/bt_vendor.cc", | |
4 | - "src/command_packet.cc", | |
5 | - "src/dual_mode_controller.cc", | |
6 | - "src/event_packet.cc", | |
7 | - "src/hci_transport.cc", | |
8 | - "src/packet.cc", | |
9 | - "src/packet_stream.cc", | |
10 | - "src/test_channel_transport.cc", | |
11 | - "src/vendor_manager.cc", | |
12 | - ] | |
13 | - | |
14 | - include_dirs = [ | |
15 | - "include", | |
16 | - "//", | |
17 | - | |
18 | - # TODO(dennischeng): Ideally we should need to have the lines below for | |
19 | - # indirect includes. | |
20 | - "//stack/include", | |
21 | - "//third_party/libchrome:base", | |
22 | - ] | |
23 | -} | |
24 | - | |
25 | -executable("test_vendor_lib_test") { | |
26 | - testonly = true | |
27 | - sources = [ | |
28 | - "src/command_packet.cc", | |
29 | - "src/event_packet.cc", | |
30 | - "src/packet.cc", | |
31 | - "src/packet_stream.cc", | |
32 | - "test/hci_transport_unittest.cc", | |
33 | - "test/packet_stream_unittest.cc", | |
34 | - ] | |
35 | - | |
36 | - include_dirs = [ | |
37 | - "include", | |
38 | - "//", | |
39 | - "//btcore/include", | |
40 | - "//hci/include", | |
41 | - "//stack/include", | |
42 | - ] | |
43 | - | |
44 | - deps = [ | |
45 | - "//third_party/googletest:gtest_main", | |
46 | - "//third_party/libchrome:base", | |
47 | - "//vendor_libs/test_vendor_lib", | |
48 | - ] | |
49 | - | |
50 | - libs = [ | |
51 | - "-lpthread", | |
52 | - "-lrt", | |
53 | - "-ldl", | |
54 | - ] | |
55 | -} |
@@ -1,13 +0,0 @@ | ||
1 | -{ | |
2 | - "AclDataPacketSize": "1024", | |
3 | - "ScoDataPacketSize": "255", | |
4 | - "NumAclDataPackets": "10", | |
5 | - "NumScoDataPackets": "10", | |
6 | - "Version": "4", | |
7 | - "Revision": "0", | |
8 | - "LmpPalVersion": "0", | |
9 | - "ManufacturerName": "0", | |
10 | - "LmpPalSubversion": "0", | |
11 | - "MaximumPageNumber": "0", | |
12 | - "BdAddress": "123456" | |
13 | -} |
@@ -1,80 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <cstdint> | |
20 | -#include <vector> | |
21 | - | |
22 | -#include "base/macros.h" | |
23 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
24 | - | |
25 | -namespace test_vendor_lib { | |
26 | - | |
27 | -// The following is specified in the Bluetooth Core Specification Version 4.2, | |
28 | -// Volume 2, Part E, Section 5.4.1 (page 470). Command Packets begin with a 3 | |
29 | -// octet header formatted as follows: | |
30 | -// - Opcode: 2 octets | |
31 | -// - Opcode Group Field (OGF): Upper bits 10-15 | |
32 | -// - Opcode Command Field (OCF): Lower bits 0-9 | |
33 | -// - Payload size (in octets): 1 octet | |
34 | -// The header is followed by the payload, which contains command specific | |
35 | -// parameters and has a maximum size of 255 octets. Valid command opcodes are | |
36 | -// defined in stack/include/hcidefs.h. The OGF ranges from 0x00 to 0x3F, with | |
37 | -// 0x3F reserved for vendor-specific debug functions. The OCF ranges from | |
38 | -// 0x0000 to 0x03FF. Note that the payload size is the size in octets of the | |
39 | -// command parameters and not the number of parameters. Finally, although the | |
40 | -// parameters contained in the payload are command specific (including the size | |
41 | -// and number of parameters), each parameter will be an integer number of octets | |
42 | -// in size. | |
43 | -class CommandPacket : public Packet { | |
44 | - public: | |
45 | - CommandPacket(); | |
46 | - | |
47 | - virtual ~CommandPacket() override = default; | |
48 | - | |
49 | - // Returns the command opcode as defined in stack/include/hcidefs.h. | |
50 | - // See the Bluetooth Core Specification Version 4.2, Volume 2, Part E, | |
51 | - // Section 7 for more information about each HCI commands and for a listing | |
52 | - // of their specific opcodes/OGF and OCF values. | |
53 | - uint16_t GetOpcode() const; | |
54 | - | |
55 | - // Returns the 6 bit opcode group field that specifies the general category of | |
56 | - // the command. The OGF can be one of seven values: | |
57 | - // - 0x01: Link control commands | |
58 | - // - 0x02: Link policy commands | |
59 | - // - 0x03: Controller and baseband commands | |
60 | - // - 0x04: Informational parameters commands | |
61 | - // - 0x05: Status parameters commands | |
62 | - // - 0x06: Testing commands | |
63 | - // - 0x08: Low energy controller commands | |
64 | - // The upper 2 bits will be zero filled. | |
65 | - uint8_t GetOGF() const; | |
66 | - | |
67 | - // Returns the 10 bit opcode command field that specifies an exact command | |
68 | - // within an opcode group field. The upper 6 bits will be zero filled. | |
69 | - uint16_t GetOCF() const; | |
70 | - | |
71 | - // Size in octets of a command packet header, which consists of a 2 octet | |
72 | - // opcode and a 1 octet payload size. | |
73 | - static const size_t kCommandHeaderSize = 3; | |
74 | - | |
75 | - private: | |
76 | - // Disallow any copies of the singleton to be made. | |
77 | - DISALLOW_COPY_AND_ASSIGN(CommandPacket); | |
78 | -}; | |
79 | - | |
80 | -} // namespace test_vendor_lib |
@@ -1,369 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <cstdint> | |
20 | -#include <memory> | |
21 | -#include <string> | |
22 | -#include <vector> | |
23 | -#include <unordered_map> | |
24 | - | |
25 | -#include "base/json/json_value_converter.h" | |
26 | -#include "base/time/time.h" | |
27 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
28 | -#include "vendor_libs/test_vendor_lib/include/hci_transport.h" | |
29 | -#include "vendor_libs/test_vendor_lib/include/test_channel_transport.h" | |
30 | - | |
31 | -namespace test_vendor_lib { | |
32 | - | |
33 | -// Emulates a dual mode BR/EDR + LE controller by maintaining the link layer | |
34 | -// state machine detailed in the Bluetooth Core Specification Version 4.2, | |
35 | -// Volume 6, Part B, Section 1.1 (page 30). Provides methods corresponding to | |
36 | -// commands sent by the HCI. These methods will be registered as callbacks from | |
37 | -// a controller instance with the HciHandler. To implement a new Bluetooth | |
38 | -// command, simply add the method declaration below, with return type void and a | |
39 | -// single const std::vector<uint8_t>& argument. After implementing the | |
40 | -// method, simply register it with the HciHandler using the SET_HANDLER macro in | |
41 | -// the controller's default constructor. Be sure to name your method after the | |
42 | -// corresponding Bluetooth command in the Core Specification with the prefix | |
43 | -// "Hci" to distinguish it as a controller command. | |
44 | -class DualModeController { | |
45 | - public: | |
46 | - class Properties { | |
47 | - public: | |
48 | - // TODO(dennischeng): Add default initialization and use that to instantiate | |
49 | - // a default configured controller if the config file is invalid or not | |
50 | - // provided. | |
51 | - Properties(const std::string& file_name); | |
52 | - | |
53 | - // Aggregates and returns the result for the Read Local Extended Features | |
54 | - // command. This result contains the |maximum_page_number_| property (among | |
55 | - // other things not in the Properties object). See the Bluetooth Core | |
56 | - // Specification Version 4.2, Volume 2, Part E, Section 7.4.4 (page 792). | |
57 | - const std::vector<uint8_t> GetBdAddress(); | |
58 | - | |
59 | - // Aggregates and returns the result for the Read Buffer Size command. This | |
60 | - // result consists of the |acl_data_packet_size_|, |sco_data_packet_size_|, | |
61 | - // |num_acl_data_packets_|, and |num_sco_data_packets_| properties. See the | |
62 | - // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.5 | |
63 | - // (page 794). | |
64 | - const std::vector<uint8_t> GetBufferSize(); | |
65 | - | |
66 | - // Returns the result for the Read BD_ADDR command. This result is the | |
67 | - // |bd_address_| property. See the Bluetooth Core Specification Version | |
68 | - // 4.2, Volume 2, Part E, Section 7.4.6 (page 796). | |
69 | - const std::vector<uint8_t> GetLocalExtendedFeatures(uint8_t page_number); | |
70 | - | |
71 | - // Returns the result for the Read Local Name command. See the Bluetooth | |
72 | - // Core Specification Version 4.2, Volume 2, Part E, Section 7.3.12 | |
73 | - // (page 664). | |
74 | - const std::vector<uint8_t> GetLocalName(); | |
75 | - | |
76 | - // Returns the result for the Read Local Supported Commands command. See the | |
77 | - // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.2 | |
78 | - // (page 790). | |
79 | - const std::vector<uint8_t> GetLocalSupportedCommands(); | |
80 | - | |
81 | - // Aggregates and returns the Read Local Version Information result. This | |
82 | - // consists of the |version_|, |revision_|, |lmp_pal_version_|, | |
83 | - // |manufacturer_name_|, and |lmp_pal_subversion_|. See the Bluetooth Core | |
84 | - // Specification Version 4.2, Volume 2, Part E, Section 7.4.1 (page 788). | |
85 | - const std::vector<uint8_t> GetLocalVersionInformation(); | |
86 | - | |
87 | - static void RegisterJSONConverter( | |
88 | - base::JSONValueConverter<Properties>* converter); | |
89 | - | |
90 | - private: | |
91 | - uint16_t acl_data_packet_size_; | |
92 | - uint8_t sco_data_packet_size_; | |
93 | - uint16_t num_acl_data_packets_; | |
94 | - uint16_t num_sco_data_packets_; | |
95 | - uint8_t version_; | |
96 | - uint16_t revision_; | |
97 | - uint8_t lmp_pal_version_; | |
98 | - uint16_t manufacturer_name_; | |
99 | - uint16_t lmp_pal_subversion_; | |
100 | - uint8_t maximum_page_number_; | |
101 | - uint8_t local_supported_commands_size_; | |
102 | - uint8_t local_name_size_; | |
103 | - std::vector<uint8_t> bd_address_; | |
104 | - }; | |
105 | - | |
106 | - // Sets all of the methods to be used as callbacks in the HciHandler. | |
107 | - DualModeController(); | |
108 | - | |
109 | - ~DualModeController() = default; | |
110 | - | |
111 | - // Preprocesses the command, primarily checking testh channel hooks. If | |
112 | - // possible, dispatches the corresponding controller method corresponding to | |
113 | - // carry out the command. | |
114 | - void HandleCommand(std::unique_ptr<CommandPacket> command_packet); | |
115 | - | |
116 | - // Dispatches the test channel action corresponding to the command specified | |
117 | - // by |name|. | |
118 | - void HandleTestChannelCommand(const std::string& name, | |
119 | - const std::vector<std::string>& args); | |
120 | - | |
121 | - // Sets the controller Handle* methods as callbacks for the transport to call | |
122 | - // when data is received. | |
123 | - void RegisterHandlersWithHciTransport(HciTransport& transport); | |
124 | - | |
125 | - // Sets the test channel handler with the transport dedicated to test channel | |
126 | - // communications. | |
127 | - void RegisterHandlersWithTestChannelTransport( | |
128 | - TestChannelTransport& transport); | |
129 | - | |
130 | - // Sets the callback to be used for sending events back to the HCI. | |
131 | - // TODO(dennischeng): Once PostDelayedTask works, get rid of this and only use | |
132 | - // |RegisterDelayedEventChannel|. | |
133 | - void RegisterEventChannel( | |
134 | - std::function<void(std::unique_ptr<EventPacket>)> send_event); | |
135 | - | |
136 | - void RegisterDelayedEventChannel( | |
137 | - std::function<void(std::unique_ptr<EventPacket>, base::TimeDelta)> | |
138 | - send_event); | |
139 | - | |
140 | - // Controller commands. For error codes, see the Bluetooth Core Specification, | |
141 | - // Version 4.2, Volume 2, Part D (page 370). | |
142 | - | |
143 | - // OGF: 0x0003 | |
144 | - // OCF: 0x0003 | |
145 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.2 | |
146 | - void HciReset(const std::vector<uint8_t>& args); | |
147 | - | |
148 | - // OGF: 0x0004 | |
149 | - // OGF: 0x0005 | |
150 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.5 | |
151 | - void HciReadBufferSize(const std::vector<uint8_t>& args); | |
152 | - | |
153 | - // OGF: 0x0003 | |
154 | - // OCF: 0x0033 | |
155 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.39 | |
156 | - void HciHostBufferSize(const std::vector<uint8_t>& args); | |
157 | - | |
158 | - // OGF: 0x0004 | |
159 | - // OCF: 0x0001 | |
160 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.1 | |
161 | - void HciReadLocalVersionInformation(const std::vector<uint8_t>& args); | |
162 | - | |
163 | - // OGF: 0x0004 | |
164 | - // OCF: 0x0009 | |
165 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.6 | |
166 | - void HciReadBdAddr(const std::vector<uint8_t>& args); | |
167 | - | |
168 | - // OGF: 0x0004 | |
169 | - // OCF: 0x0002 | |
170 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.2 | |
171 | - void HciReadLocalSupportedCommands(const std::vector<uint8_t>& args); | |
172 | - | |
173 | - // OGF: 0x0004 | |
174 | - // OCF: 0x0004 | |
175 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.4 | |
176 | - void HciReadLocalExtendedFeatures(const std::vector<uint8_t>& args); | |
177 | - | |
178 | - // OGF: 0x0003 | |
179 | - // OCF: 0x0056 | |
180 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.59 | |
181 | - void HciWriteSimplePairingMode(const std::vector<uint8_t>& args); | |
182 | - | |
183 | - // OGF: 0x0003 | |
184 | - // OCF: 0x006D | |
185 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.79 | |
186 | - void HciWriteLeHostSupport(const std::vector<uint8_t>& args); | |
187 | - | |
188 | - // OGF: 0x0003 | |
189 | - // OCF: 0x0001 | |
190 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.1 | |
191 | - void HciSetEventMask(const std::vector<uint8_t>& args); | |
192 | - | |
193 | - // OGF: 0x0003 | |
194 | - // OCF: 0x0045 | |
195 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.50 | |
196 | - void HciWriteInquiryMode(const std::vector<uint8_t>& args); | |
197 | - | |
198 | - // OGF: 0x0003 | |
199 | - // OCF: 0x0047 | |
200 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.52 | |
201 | - void HciWritePageScanType(const std::vector<uint8_t>& args); | |
202 | - | |
203 | - // OGF: 0x0003 | |
204 | - // OCF: 0x0043 | |
205 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.48 | |
206 | - void HciWriteInquiryScanType(const std::vector<uint8_t>& args); | |
207 | - | |
208 | - // OGF: 0x0003 | |
209 | - // OCF: 0x0024 | |
210 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.26 | |
211 | - void HciWriteClassOfDevice(const std::vector<uint8_t>& args); | |
212 | - | |
213 | - // OGF: 0x0003 | |
214 | - // OCF: 0x0018 | |
215 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.16 | |
216 | - void HciWritePageTimeout(const std::vector<uint8_t>& args); | |
217 | - | |
218 | - // OGF: 0x0002 | |
219 | - // OCF: 0x000F | |
220 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.2.12 | |
221 | - void HciWriteDefaultLinkPolicySettings(const std::vector<uint8_t>& args); | |
222 | - | |
223 | - // OGF: 0x0003 | |
224 | - // OCF: 0x0014 | |
225 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.12 | |
226 | - void HciReadLocalName(const std::vector<uint8_t>& args); | |
227 | - | |
228 | - // OGF: 0x0003 | |
229 | - // OCF: 0x0013 | |
230 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.11 | |
231 | - void HciWriteLocalName(const std::vector<uint8_t>& args); | |
232 | - | |
233 | - // OGF: 0x0003 | |
234 | - // OCF: 0x0052 | |
235 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.56 | |
236 | - void HciWriteExtendedInquiryResponse(const std::vector<uint8_t>& args); | |
237 | - | |
238 | - // OGF: 0x0003 | |
239 | - // OCF: 0x0026 | |
240 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.28 | |
241 | - void HciWriteVoiceSetting(const std::vector<uint8_t>& args); | |
242 | - | |
243 | - // OGF: 0x0003 | |
244 | - // OCF: 0x003A | |
245 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.45 | |
246 | - void HciWriteCurrentIacLap(const std::vector<uint8_t>& args); | |
247 | - | |
248 | - // OGF: 0x0003 | |
249 | - // OCF: 0x001E | |
250 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.22 | |
251 | - void HciWriteInquiryScanActivity(const std::vector<uint8_t>& args); | |
252 | - | |
253 | - // OGF: 0x0003 | |
254 | - // OCF: 0x001A | |
255 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.18 | |
256 | - void HciWriteScanEnable(const std::vector<uint8_t>& args); | |
257 | - | |
258 | - // OGF: 0x0003 | |
259 | - // OCF: 0x0005 | |
260 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.3 | |
261 | - void HciSetEventFilter(const std::vector<uint8_t>& args); | |
262 | - | |
263 | - // OGF: 0x0001 | |
264 | - // OCF: 0x0001 | |
265 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.1 | |
266 | - void HciInquiry(const std::vector<uint8_t>& args); | |
267 | - | |
268 | - // OGF: 0x0001 | |
269 | - // OCF: 0x0002 | |
270 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.2 | |
271 | - void HciInquiryCancel(const std::vector<uint8_t>& args); | |
272 | - | |
273 | - // OGF: 0x0003 | |
274 | - // OCF: 0x0012 | |
275 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.10 | |
276 | - void HciDeleteStoredLinkKey(const std::vector<uint8_t>& args); | |
277 | - | |
278 | - // OGF: 0x0001 | |
279 | - // OCF: 0x0019 | |
280 | - // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.19 | |
281 | - void HciRemoteNameRequest(const std::vector<uint8_t>& args); | |
282 | - | |
283 | - // Test Channel commands: | |
284 | - | |
285 | - // Clears all test channel modifications. | |
286 | - void TestChannelClear(const std::vector<std::string>& args); | |
287 | - | |
288 | - // Sets the response delay for events to 0. | |
289 | - void TestChannelClearEventDelay(const std::vector<std::string>& args); | |
290 | - | |
291 | - // Discovers a fake device. | |
292 | - void TestChannelDiscover(const std::vector<std::string>& args); | |
293 | - | |
294 | - // Causes events to be sent after a delay. | |
295 | - void TestChannelSetEventDelay(const std::vector<std::string>& args); | |
296 | - | |
297 | - // Causes all future HCI commands to timeout. | |
298 | - void TestChannelTimeoutAll(const std::vector<std::string>& args); | |
299 | - | |
300 | - private: | |
301 | - // Current link layer state of the controller. | |
302 | - enum State { | |
303 | - kStandby, // Not receiving/transmitting any packets from/to other devices. | |
304 | - kInquiry, // The controller is discovering other nearby devices. | |
305 | - }; | |
306 | - | |
307 | - enum TestChannelState { | |
308 | - kNone, // The controller is running normally. | |
309 | - kTimeoutAll, // All commands should time out, i.e. send no response. | |
310 | - kDelayedResponse, // Event responses are sent after a delay. | |
311 | - }; | |
312 | - | |
313 | - // Creates a command complete event and sends it back to the HCI. | |
314 | - void SendCommandComplete(uint16_t command_opcode, | |
315 | - const std::vector<uint8_t>& return_parameters) const; | |
316 | - | |
317 | - // Sends a command complete event with no return parameters. This event is | |
318 | - // typically sent for commands that can be completed immediately. | |
319 | - void SendCommandCompleteSuccess(uint16_t command_opcode) const; | |
320 | - | |
321 | - // Creates a command status event and sends it back to the HCI. | |
322 | - void SendCommandStatus(uint8_t status, uint16_t command_opcode) const; | |
323 | - | |
324 | - // Sends a command status event with default event parameters. | |
325 | - void SendCommandStatusSuccess(uint16_t command_opcode) const; | |
326 | - | |
327 | - // Sends an inquiry response for a fake device. | |
328 | - void SendInquiryResult() const; | |
329 | - | |
330 | - // Sends an extended inquiry response for a fake device. | |
331 | - void SendExtendedInquiryResult(const std::string& name, | |
332 | - const std::string& address) const; | |
333 | - | |
334 | - void SetEventDelay(int64_t delay); | |
335 | - | |
336 | - // Callback provided to send events from the controller back to the HCI. | |
337 | - std::function<void(std::unique_ptr<EventPacket>)> send_event_; | |
338 | - | |
339 | - std::function<void(std::unique_ptr<EventPacket>, base::TimeDelta)> | |
340 | - send_delayed_event_; | |
341 | - | |
342 | - // Maintains the commands to be registered and used in the HciHandler object. | |
343 | - // Keys are command opcodes and values are the callbacks to handle each | |
344 | - // command. | |
345 | - std::unordered_map<uint16_t, std::function<void(const std::vector<uint8_t>&)>> | |
346 | - active_hci_commands_; | |
347 | - | |
348 | - std::unordered_map<std::string, | |
349 | - std::function<void(const std::vector<std::string>&)>> | |
350 | - active_test_channel_commands_; | |
351 | - | |
352 | - // Specifies the format of Inquiry Result events to be returned during the | |
353 | - // Inquiry command. | |
354 | - // 0x00: Standard Inquiry Result event format (default). | |
355 | - // 0x01: Inquiry Result format with RSSI. | |
356 | - // 0x02 Inquiry Result with RSSI format or Extended Inquiry Result format. | |
357 | - // 0x03-0xFF: Reserved. | |
358 | - uint8_t inquiry_mode_; | |
359 | - | |
360 | - State state_; | |
361 | - | |
362 | - Properties properties_; | |
363 | - | |
364 | - TestChannelState test_channel_state_; | |
365 | - | |
366 | - DISALLOW_COPY_AND_ASSIGN(DualModeController); | |
367 | -}; | |
368 | - | |
369 | -} // namespace test_vendor_lib |
@@ -1,161 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <cstdint> | |
20 | -#include <memory> | |
21 | -#include <vector> | |
22 | - | |
23 | -#include "base/logging.h" | |
24 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
25 | - | |
26 | -namespace test_vendor_lib { | |
27 | - | |
28 | -// The following is specified in the Bluetooth Core Specification Version 4.2, | |
29 | -// Volume 2, Part E, Section 5.4.4 (page 477). Event Packets begin with a 2 | |
30 | -// octet header formatted as follows: | |
31 | -// - Event code: 1 octet | |
32 | -// - Payload size (in octets): 1 octet | |
33 | -// The header is followed by the payload, which contains event specific | |
34 | -// parameters and has a maximum size of 255 octets. Valid event codes are | |
35 | -// listed in stack/include/hcidefs.h. They can range from 0x00 to 0xFF, with | |
36 | -// 0xFF reserved for vendor specific debug events. Note the payload size | |
37 | -// describes the total size of the event parameters and not the number of | |
38 | -// parameters. The event parameters contained in the payload will be an integer | |
39 | -// number of octets in size. Each flavor of event packet is created via a static | |
40 | -// factory function that takes the event type-specific parameters and returns an | |
41 | -// initialized event packet from that data. | |
42 | -class EventPacket : public Packet { | |
43 | - public: | |
44 | - virtual ~EventPacket() override = default; | |
45 | - | |
46 | - uint8_t GetEventCode() const; | |
47 | - | |
48 | - // Static functions for creating event packets: | |
49 | - | |
50 | - // Creates and returns a command complete event packet. See the Bluetooth | |
51 | - // Core Specification Version 4.2, Volume 2, Part E, Section 7.7.14 (page 861) | |
52 | - // for more information about the command complete event. | |
53 | - // Event Parameters: | |
54 | - // |num_hci_command_packets| | |
55 | - // Indicates the number of HCI command packets the host can send to the | |
56 | - // controller. If |num_hci_command_packets| is 0, the controller would | |
57 | - // like to stop receiving commands from the host (to indicate | |
58 | - // readiness again, the controller sends a command complete event with | |
59 | - // |command_opcode| to 0x0000 (no op) and |num_hci_command_packets| > 1). | |
60 | - // |command_opcode| | |
61 | - // The opcode of the command that caused this event. | |
62 | - // |return_parameters| | |
63 | - // Contains any event specific parameters that should | |
64 | - // be sent to the host. | |
65 | - static std::unique_ptr<EventPacket> CreateCommandCompleteEvent( | |
66 | - uint8_t num_hci_command_packets, uint16_t command_opcode, | |
67 | - const std::vector<uint8_t>& event_return_parameters); | |
68 | - | |
69 | - // Creates and returns a command complete event packet. See the Bluetooth | |
70 | - // Core Specification Version 4.2, Volume 2, Part E, Section 7.7.15 (page 862) | |
71 | - // for more information about the command complete event. | |
72 | - // Event Parameters: | |
73 | - // Status | |
74 | - // 0x00: Command currently in pending. | |
75 | - // 0x01-0xFF: Command failed. | |
76 | - // |num_hci_command_packets| | |
77 | - // Indicates the number of HCI command packets the host can send to the | |
78 | - // controller. If |num_hci_command_packets| is 0, the controller would | |
79 | - // like to stop receiving commands from the host (to indicate | |
80 | - // readiness again, the controller sends a command complete event with | |
81 | - // |command_opcode| to 0x0000 (no op) and |num_hci_command_packets| > 1). | |
82 | - // |command_opcode| | |
83 | - // The opcode of the command that caused this event. | |
84 | - static std::unique_ptr<EventPacket> CreateCommandStatusEvent( | |
85 | - uint8_t status, uint8_t num_hci_command_packets, uint16_t command_opcode); | |
86 | - | |
87 | - // Creates and returns an inquiry result event packet. See the Bluetooth | |
88 | - // Core Specification Version 4.2, Volume 2, Part E, Section 7.7.2 (page 844) | |
89 | - // for more information about the command complete event. | |
90 | - // Event Parameters: | |
91 | - // Num Responses (1 octet) | |
92 | - // 0xXX: Number of responses from the inquiry. | |
93 | - // Bd Addresses (6 octets * Num Responses) | |
94 | - // 0xXXXXXXXXXXX: Bd Address for each device which responded. | |
95 | - // Page Scan Repetition Mode (1 octet * Num Responses) | |
96 | - // 0x00: R0 | |
97 | - // 0x01: R1 | |
98 | - // 0x02: R2 | |
99 | - // 0x03-0xFF: Reserved. | |
100 | - // Reserved 1 (1 octet * Num Responses) | |
101 | - // Originally Page Scan Period Mode parameter. No longer in use. | |
102 | - // Reserved 2 (1 octet * Num Responses) | |
103 | - // Originally Page Scan Mode parameter. No longer in use. | |
104 | - // Class of Device (3 octet * Num Responses) | |
105 | - // 0xXXXXXX: Class of device. | |
106 | - // Clock Offset (2 octet * Num Responses) | |
107 | - // Bits 14-0: Bits 16-2 of CLKNslave-CLK. | |
108 | - // Bits 15: Reserved. | |
109 | - static std::unique_ptr<EventPacket> CreateInquiryResultEvent( | |
110 | - uint8_t num_responses, const std::vector<uint8_t>& bd_addresses, | |
111 | - const std::vector<uint8_t>& page_scan_repetition_mode, | |
112 | - const std::vector<uint8_t>& page_scan_period_mode, | |
113 | - const std::vector<uint8_t>& page_scan_mode, | |
114 | - const std::vector<uint8_t>& class_of_device, | |
115 | - const std::vector<uint8_t>& clock_offset); | |
116 | - | |
117 | - // Creates and returns an inquiry result event packet. See the Bluetooth | |
118 | - // Core Specification Version 4.2, Volume 2, Part E, Section 7.7.38 (page 896) | |
119 | - // for more information about the command complete event. | |
120 | - // Event Parameters: | |
121 | - // Num Responses (1 octet) | |
122 | - // 0x01: Always contains a single response. | |
123 | - // Bd Addresses (6 octets * Num Responses) | |
124 | - // 0xXXXXXXXXXXX: Bd Address for each device which responded. | |
125 | - // Page Scan Repetition Mode (1 octet * Num Responses) | |
126 | - // 0x00: R0 | |
127 | - // 0x01: R1 | |
128 | - // 0x02: R2 | |
129 | - // 0x03-0xFF: Reserved. | |
130 | - // Reserved 1 (1 octet * Num Responses) | |
131 | - // Originally Page Scan Period Mode parameter. No longer in use. | |
132 | - // Class of Device (3 octet * Num Responses) | |
133 | - // 0xXXXXXX: Class of device. | |
134 | - // Clock Offset (2 octet * Num Responses) | |
135 | - // Bits 14-0: Bits 16-2 of CLKNslave-CLK. | |
136 | - // Bits 15: Reserved. | |
137 | - // RSSI (1 octet) | |
138 | - // 0xXX: Ranges from -127 to +20. Units are dBm. | |
139 | - // Extended Inquiry Response (240 octets) | |
140 | - // Defined in Volumne 2, Part C, Section 8. Also see the Supplement to the | |
141 | - // Bluetooth Core Specificiation for data type definitions and formats. | |
142 | - static std::unique_ptr<EventPacket> CreateExtendedInquiryResultEvent( | |
143 | - const std::vector<uint8_t>& bd_address, | |
144 | - const std::vector<uint8_t>& page_scan_repetition_mode, | |
145 | - const std::vector<uint8_t>& page_scan_period_mode, | |
146 | - const std::vector<uint8_t>& class_of_device, | |
147 | - const std::vector<uint8_t>& clock_offset, | |
148 | - const std::vector<uint8_t>& rssi, | |
149 | - const std::vector<uint8_t>& extended_inquiry_response); | |
150 | - | |
151 | - // Size in octets of a data packet header, which consists of a 1 octet | |
152 | - // event code and a 1 octet payload size. | |
153 | - static const size_t kEventHeaderSize = 2; | |
154 | - | |
155 | - private: | |
156 | - // Takes in the event parameters in |payload|. These parameters vary by event | |
157 | - // and are detailed in the Bluetooth Core Specification. | |
158 | - EventPacket(uint8_t event_code, const std::vector<uint8_t>& payload); | |
159 | -}; | |
160 | - | |
161 | -} // namespace test_vendor_lib |
@@ -1,134 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <functional> | |
20 | -#include <memory> | |
21 | -#include <list> | |
22 | - | |
23 | -extern "C" { | |
24 | -#include <sys/epoll.h> | |
25 | -} // extern "C" | |
26 | - | |
27 | -#include "base/files/scoped_file.h" | |
28 | -#include "base/memory/weak_ptr.h" | |
29 | -#include "base/message_loop/message_loop.h" | |
30 | -#include "base/time/time.h" | |
31 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
32 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
33 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
34 | -#include "vendor_libs/test_vendor_lib/include/packet_stream.h" | |
35 | - | |
36 | -namespace test_vendor_lib { | |
37 | - | |
38 | -// Manages communication channel between HCI and the controller by providing the | |
39 | -// socketing mechanisms for reading/writing between the HCI and the controller. | |
40 | -class HciTransport : public base::MessageLoopForIO::Watcher { | |
41 | - public: | |
42 | - HciTransport(); | |
43 | - | |
44 | - virtual ~HciTransport() = default; | |
45 | - | |
46 | - void CloseHciFd(); | |
47 | - | |
48 | - void CloseVendorFd(); | |
49 | - | |
50 | - int GetHciFd() const; | |
51 | - | |
52 | - int GetVendorFd() const; | |
53 | - | |
54 | - // Creates the underlying socketpair to be used as a communication channel | |
55 | - // between the HCI and the vendor library/controller. Returns false if an | |
56 | - // error occurs. | |
57 | - bool SetUp(); | |
58 | - | |
59 | - // Sets the callback that is run when command packets are received. | |
60 | - void RegisterCommandHandler( | |
61 | - std::function<void(std::unique_ptr<CommandPacket>)> callback); | |
62 | - | |
63 | - // Posts the event onto |outbound_events_| to be written sometime in the | |
64 | - // future when the vendor file descriptor is ready for writing. | |
65 | - void PostEventResponse(std::unique_ptr<EventPacket> event); | |
66 | - | |
67 | - // Posts the event onto |outbound_events_| after |delay| ms. A call to | |
68 | - // |PostEventResponse| with |delay| 0 is equivalent to a call to |PostEvent|. | |
69 | - void PostDelayedEventResponse(std::unique_ptr<EventPacket> event, | |
70 | - base::TimeDelta delay); | |
71 | - | |
72 | - private: | |
73 | - // Wrapper class for sending events on a delay. The TimeStampedEvent object | |
74 | - // takes ownership of a given event packet. | |
75 | - class TimeStampedEvent { | |
76 | - public: | |
77 | - TimeStampedEvent(std::unique_ptr<EventPacket> event, base::TimeDelta delay); | |
78 | - | |
79 | - // Using this constructor is equivalent to calling the 2-argument | |
80 | - // constructor with a |delay| of 0. It is used to generate event responses | |
81 | - // with no delay. | |
82 | - TimeStampedEvent(std::unique_ptr<EventPacket> event); | |
83 | - | |
84 | - const base::TimeTicks& GetTimeStamp() const; | |
85 | - | |
86 | - const EventPacket& GetEvent(); | |
87 | - | |
88 | - private: | |
89 | - std::shared_ptr<EventPacket> event_; | |
90 | - | |
91 | - // The time associated with the event, indicating the earliest time at which | |
92 | - // |event_| will be sent. | |
93 | - base::TimeTicks time_stamp_; | |
94 | - }; | |
95 | - | |
96 | - // base::MessageLoopForIO::Watcher overrides: | |
97 | - void OnFileCanReadWithoutBlocking(int fd) override; | |
98 | - | |
99 | - void OnFileCanWriteWithoutBlocking(int fd) override; | |
100 | - | |
101 | - // Reads in a command packet and calls the command ready callback, | |
102 | - // |command_handler_|, passing ownership of the command packet to the handler. | |
103 | - void ReceiveReadyCommand() const; | |
104 | - | |
105 | - void AddEventToOutboundEvents(std::unique_ptr<TimeStampedEvent> event); | |
106 | - | |
107 | - // Write queue for sending events to the HCI. Event packets are removed from | |
108 | - // the queue and written when write-readiness is signalled by the message | |
109 | - // loop. After being written, the event packets are destructed. | |
110 | - std::list<std::unique_ptr<TimeStampedEvent>> outbound_events_; | |
111 | - | |
112 | - // Callback executed in ReceiveReadyCommand() to pass the incoming command | |
113 | - // over to the handler for further processing. | |
114 | - std::function<void(std::unique_ptr<CommandPacket>)> command_handler_; | |
115 | - | |
116 | - // For performing packet-based IO. | |
117 | - PacketStream packet_stream_; | |
118 | - | |
119 | - // The two ends of the socketpair. |hci_fd_| is handed back to the HCI in | |
120 | - // bt_vendor.cc and |vendor_fd_| is used by |packet_stream_| to receive/send | |
121 | - // data from/to the HCI. Both file descriptors are owned and managed by the | |
122 | - // transport object, although |hci_fd_| can be closed by the HCI in | |
123 | - // TestVendorOp(). | |
124 | - std::unique_ptr<base::ScopedFD> hci_fd_; | |
125 | - std::unique_ptr<base::ScopedFD> vendor_fd_; | |
126 | - | |
127 | - // This should remain the last member so it'll be destroyed and invalidate | |
128 | - // its weak pointers before any other members are destroyed. | |
129 | - base::WeakPtrFactory<HciTransport> weak_ptr_factory_; | |
130 | - | |
131 | - DISALLOW_COPY_AND_ASSIGN(HciTransport); | |
132 | -}; | |
133 | - | |
134 | -} // namespace test_vendor_lib |
@@ -1,78 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <cstdint> | |
20 | -#include <vector> | |
21 | - | |
22 | -extern "C" { | |
23 | -#include "hci/include/hci_hal.h" | |
24 | -} // extern "C" | |
25 | - | |
26 | -namespace test_vendor_lib { | |
27 | - | |
28 | -// Abstract base class that is subclassed to provide type-specifc accessors on | |
29 | -// data. Manages said data's memory and guarantees the data's persistence for IO | |
30 | -// operations. | |
31 | -class Packet { | |
32 | - public: | |
33 | - virtual ~Packet() = default; | |
34 | - | |
35 | - // Returns the size in octets of the entire packet, which consists of the type | |
36 | - // octet, the header, and the payload. | |
37 | - size_t GetPacketSize() const; | |
38 | - | |
39 | - const std::vector<uint8_t>& GetPayload() const; | |
40 | - | |
41 | - uint8_t GetPayloadSize() const; | |
42 | - | |
43 | - const std::vector<uint8_t>& GetHeader() const; | |
44 | - | |
45 | - uint8_t GetHeaderSize() const; | |
46 | - | |
47 | - serial_data_type_t GetType() const; | |
48 | - | |
49 | - // Validates the packet by checking that the payload size in the header is | |
50 | - // accurate. If the size is not valid, returns false. Otherwise, the data in | |
51 | - // |header| and |payload| is copied into |header_| and |payload_| | |
52 | - // respectively. If an error occurs while the data is being copied, the | |
53 | - // contents of |header| and |payload| are guaranteed to be preserved. The | |
54 | - // packet object will assume ownership of the copied data for its entire | |
55 | - // lifetime. | |
56 | - bool Encode(const std::vector<uint8_t>& header, | |
57 | - const std::vector<uint8_t>& payload); | |
58 | - | |
59 | - protected: | |
60 | - // Constructs an empty packet of type |type|. A call to Encode() shall be made | |
61 | - // to check and fill in the packet's data. | |
62 | - Packet(serial_data_type_t type); | |
63 | - | |
64 | - private: | |
65 | - // Underlying containers for storing the actual packet, broken down into the | |
66 | - // packet header and the packet payload. Data is copied into the vectors | |
67 | - // during the constructor and becomes accessible (read only) to children | |
68 | - // through GetHeader() and GetPayload(). | |
69 | - std::vector<uint8_t> header_; | |
70 | - | |
71 | - std::vector<uint8_t> payload_; | |
72 | - | |
73 | - // The packet type is one of DATA_TYPE_ACL, DATA_TYPE_COMMAND, | |
74 | - // DATA_TYPE_EVENT, or DATA_TYPE_SCO. | |
75 | - serial_data_type_t type_; | |
76 | -}; | |
77 | - | |
78 | -} // namespace test_vendor_lib |
@@ -1,66 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <cstdint> | |
20 | -#include <vector> | |
21 | -#include <memory> | |
22 | - | |
23 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
24 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
25 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
26 | - | |
27 | -namespace test_vendor_lib { | |
28 | - | |
29 | -// Provides abstractions for IO with Packet objects. Used to receive commands | |
30 | -// and data from the HCI and to send controller events back to the host. | |
31 | -class PacketStream { | |
32 | - public: | |
33 | - PacketStream() = default; | |
34 | - | |
35 | - virtual ~PacketStream() = default; | |
36 | - | |
37 | - // Reads a command packet from the file descriptor at |fd| and returns the | |
38 | - // packet back to the caller, along with the responsibility of managing the | |
39 | - // packet. | |
40 | - std::unique_ptr<CommandPacket> ReceiveCommand(int fd) const; | |
41 | - | |
42 | - // Reads a single octet from |fd| and interprets it as a packet type octet. | |
43 | - // Validates the type octet for correctness. | |
44 | - serial_data_type_t ReceivePacketType(int fd) const; | |
45 | - | |
46 | - // Sends an event to file descriptor |fd|. The ownership of the event is left | |
47 | - // with the caller. | |
48 | - bool SendEvent(const EventPacket& event, int fd) const; | |
49 | - | |
50 | - private: | |
51 | - // Checks if |type| is in the valid range from DATA_TYPE_COMMAND to | |
52 | - // DATA_TYPE_SCO. | |
53 | - bool ValidateTypeOctet(serial_data_type_t type) const; | |
54 | - | |
55 | - // Attempts to receive |num_octets_to_receive| into |destination| from |fd|, | |
56 | - // returning false if an error occurs. | |
57 | - bool ReceiveAll(std::vector<uint8_t>& destination, | |
58 | - size_t num_octets_to_receive, int fd) const; | |
59 | - | |
60 | - // Attempts to send |num_octets_to_send| from |source| to |fd|, returning | |
61 | - // false if an error occurs. | |
62 | - bool SendAll(const std::vector<uint8_t>& source, size_t num_octets_to_send, | |
63 | - int fd) const; | |
64 | -}; | |
65 | - | |
66 | -} // namespace test_vendor_lib |
@@ -1,77 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#pragma once | |
18 | - | |
19 | -#include <string> | |
20 | -#include <memory> | |
21 | - | |
22 | -#include "base/files/scoped_file.h" | |
23 | -#include "base/message_loop/message_loop.h" | |
24 | - | |
25 | -namespace test_vendor_lib { | |
26 | - | |
27 | -// Manages communications between test channel and the controller. Mirrors the | |
28 | -// HciTransport for the test channel. | |
29 | -class TestChannelTransport : public base::MessageLoopForIO::Watcher { | |
30 | - public: | |
31 | - TestChannelTransport(bool enabled, int port); | |
32 | - | |
33 | - ~TestChannelTransport() = default; | |
34 | - | |
35 | - // Waits for a connection request from the test channel program and | |
36 | - // allocates the file descriptor to watch for run-time parameters at. This | |
37 | - // file descriptor gets stored in |fd_|. | |
38 | - bool SetUp(); | |
39 | - | |
40 | - int GetFd(); | |
41 | - | |
42 | - // Because it imposes a different flow of work, the test channel must be | |
43 | - // actively enabled to be used. |enabled_| is set by the vendor manager. | |
44 | - bool IsEnabled(); | |
45 | - | |
46 | - // Turns the test channel off for use in circumstances where an error occurs | |
47 | - // and leaving the channel on would crash Bluetooth (e.g. if the test channel | |
48 | - // is unable to bind to its socket, Bluetooth should still start without the | |
49 | - // channel enabled). | |
50 | - void Disable(); | |
51 | - | |
52 | - // Sets the callback that fires when data is read in | |
53 | - // |OnFileCanReadWithoutBlocking|. | |
54 | - void RegisterCommandHandler( | |
55 | - std::function<void(const std::string&, const std::vector<std::string>&)> | |
56 | - callback); | |
57 | - | |
58 | - private: | |
59 | - // base::MessageLoopForIO::Watcher overrides: | |
60 | - void OnFileCanReadWithoutBlocking(int fd) override; | |
61 | - | |
62 | - void OnFileCanWriteWithoutBlocking(int fd) override; | |
63 | - | |
64 | - std::function<void(const std::string&, const std::vector<std::string>&)> | |
65 | - command_handler_; | |
66 | - | |
67 | - // File descriptor to watch for test hook data. | |
68 | - std::unique_ptr<base::ScopedFD> fd_; | |
69 | - | |
70 | - // TODO(dennischeng): Get port and enabled flag from a config file. | |
71 | - int port_; | |
72 | - bool enabled_; | |
73 | - | |
74 | - DISALLOW_COPY_AND_ASSIGN(TestChannelTransport); | |
75 | -}; | |
76 | - | |
77 | -} // namespace test_vendor_lib |
@@ -1,118 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#include "base/macros.h" | |
18 | -#include "base/memory/weak_ptr.h" | |
19 | -#include "base/threading/thread.h" | |
20 | -#include "base/time/time.h" | |
21 | -#include "hci/include/bt_vendor_lib.h" | |
22 | -#include "vendor_libs/test_vendor_lib/include/dual_mode_controller.h" | |
23 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
24 | -#include "vendor_libs/test_vendor_lib/include/hci_transport.h" | |
25 | -#include "vendor_libs/test_vendor_lib/include/test_channel_transport.h" | |
26 | - | |
27 | -#include <memory> | |
28 | - | |
29 | -namespace test_vendor_lib { | |
30 | - | |
31 | -// Contains the three core objects that make up the test vendor library: the | |
32 | -// HciTransport for communication, the HciHandler for processing commands, and | |
33 | -// the Controller for actual command implementations. The VendorManager shall | |
34 | -// operate as a global singleton and be used in bt_vendor.cc to perform vendor | |
35 | -// specific operations, via |vendor_callbacks_|, and to provide access to the | |
36 | -// test controller by setting up a message loop (on another thread) that the HCI | |
37 | -// will talk to and controller methods will execute on. | |
38 | -class VendorManager { | |
39 | - public: | |
40 | - // Functions that operate on the global manager instance. Initialize() | |
41 | - // is called by the vendor library's TestVendorInitialize() function to create | |
42 | - // the global manager and must be called before Get() and CleanUp(). | |
43 | - // CleanUp() should be called when a call to TestVendorCleanUp() is made | |
44 | - // since the global manager should live throughout the entire time the test | |
45 | - // vendor library is in use. | |
46 | - static void CleanUp(); | |
47 | - | |
48 | - static VendorManager* Get(); | |
49 | - | |
50 | - static void Initialize(); | |
51 | - | |
52 | - void CloseHciFd(); | |
53 | - | |
54 | - int GetHciFd() const; | |
55 | - | |
56 | - const bt_vendor_callbacks_t& GetVendorCallbacks() const; | |
57 | - | |
58 | - // Stores a copy of the vendor specific configuration callbacks passed into | |
59 | - // the vendor library from the HCI in TestVendorInit(). | |
60 | - void SetVendorCallbacks(const bt_vendor_callbacks_t& callbacks); | |
61 | - | |
62 | - // Returns true if |thread_| is able to be started and the | |
63 | - // StartingWatchingOnThread() task has been posted to the task runner. | |
64 | - bool Run(); | |
65 | - | |
66 | - private: | |
67 | - VendorManager(); | |
68 | - | |
69 | - ~VendorManager() = default; | |
70 | - | |
71 | - // Posts a callback to |thread_|'s task runner. Equivalent to calling | |
72 | - // |PostDelayedTask| with a delay of 0. | |
73 | - bool PostTask(const base::Closure& task); | |
74 | - | |
75 | - // Posts a callback to be run after |delay| ms (or longer) have passed. | |
76 | - bool PostDelayedTask(const base::Closure& task, base::TimeDelta delay); | |
77 | - | |
78 | - // Starts watching for incoming data from the HCI and the test hook. | |
79 | - void StartWatchingOnThread(); | |
80 | - | |
81 | - // Creates the HCI's communication channel and overrides IO callbacks to | |
82 | - // receive and send packets. | |
83 | - HciTransport transport_; | |
84 | - | |
85 | - // The controller object that provides implementations of Bluetooth commands. | |
86 | - DualModeController controller_; | |
87 | - | |
88 | - // The two test channel objects that perform functions corresponding to the | |
89 | - // HciTransport and HciHandler. | |
90 | - TestChannelTransport test_channel_transport_; | |
91 | - | |
92 | - // Configuration callbacks provided by the HCI for use in TestVendorOp(). | |
93 | - bt_vendor_callbacks_t vendor_callbacks_; | |
94 | - | |
95 | - // True if the underlying message loop (in |thread_|) is running. | |
96 | - bool running_; | |
97 | - | |
98 | - // Dedicated thread for managing the message loop to receive and send packets | |
99 | - // from the HCI and to receive additional parameters from the test hook file | |
100 | - // descriptor. | |
101 | - base::Thread thread_; | |
102 | - | |
103 | - // Used to handle further watching of the vendor's/test channel's file | |
104 | - // descriptor after WatchFileDescriptor() is called. | |
105 | - base::MessageLoopForIO::FileDescriptorWatcher hci_watcher_; | |
106 | - | |
107 | - // Used to handle further watching of the test channel's file descriptor after | |
108 | - // WatchFileDescriptor() is called. | |
109 | - base::MessageLoopForIO::FileDescriptorWatcher test_channel_watcher_; | |
110 | - | |
111 | - // This should remain the last member so it'll be destroyed and invalidate | |
112 | - // its weak pointers before any other members are destroyed. | |
113 | - base::WeakPtrFactory<VendorManager> weak_ptr_factory_; | |
114 | - | |
115 | - DISALLOW_COPY_AND_ASSIGN(VendorManager); | |
116 | -}; | |
117 | - | |
118 | -} // namespace test_vendor_lib |
@@ -1,127 +0,0 @@ | ||
1 | -#!/bin/bash | |
2 | - | |
3 | -# | |
4 | -# Copyright 2015 The Android Open Source Project | |
5 | -# | |
6 | -# Licensed under the Apache License, Version 2.0 (the "License"); | |
7 | -# you may not use this file except in compliance with the License. | |
8 | -# You may obtain a copy of the License at | |
9 | -# | |
10 | -# http://www.apache.org/licenses/LICENSE-2.0 | |
11 | -# | |
12 | -# Unless required by applicable law or agreed to in writing, software | |
13 | -# distributed under the License is distributed on an "AS IS" BASIS, | |
14 | -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
15 | -# See the License for the specific language governing permissions and | |
16 | -# limitations under the License. | |
17 | -# | |
18 | - | |
19 | -# Builds and pushes the test vendor library to a connected device and starts | |
20 | -# logcat with project-specific tag filters. If the --test-channel flag is set, | |
21 | -# logcat is started in a separate process and the test channel is run in the | |
22 | -# current shell. The kTestChannelEnabled flag must be set in the vendor manager | |
23 | -# if the test channel is to be used. Also ensure that 'lunch' has been run for | |
24 | -# the appropriate device. | |
25 | - | |
26 | -if [[ "$#" -ne 2 && "$#" -ne 4 ]]; then | |
27 | - echo "Usage:" | |
28 | - echo "./build_and_run.sh [/path/to/aosp] [device_name] or" | |
29 | - echo "./build_and_run.sh [/path/to/aosp] [device_name] --test-channel [port]" | |
30 | - exit 1 | |
31 | -fi | |
32 | - | |
33 | -# Exit the script if any command fails. | |
34 | -set -e | |
35 | - | |
36 | -# The home directory for AOSP. | |
37 | -AOSP_ABS=$1 | |
38 | -# The name of the device to build for. | |
39 | -DEVICE=$2 | |
40 | - | |
41 | -# The location of Bluetooth within AOSP. | |
42 | -BT_REL=/system/bt | |
43 | -BT_ABS=${AOSP_ABS}${BT_REL} | |
44 | - | |
45 | -# The location of the test vendor library. | |
46 | -TEST_VENDOR_LIB_REL=/vendor_libs/test_vendor_lib | |
47 | -TEST_VENDOR_LIB_ABS=${BT_ABS}${TEST_VENDOR_LIB_REL} | |
48 | - | |
49 | -DEVICE_TARGET_REL=/out/target/product | |
50 | -DEVICE_TARGET_ABS=${AOSP_ABS}${DEVICE_TARGET_REL} | |
51 | - | |
52 | -VENDOR_SYMBOLS_REL=/symbols/system/vendor/lib | |
53 | -VENDOR_SYMBOLS_ABS=${DEVICE_TARGET_ABS}/${DEVICE}/${VENDOR_SYMBOLS_REL} | |
54 | - | |
55 | -# The name of the object built by the test vendor library. | |
56 | -TEST_VENDOR_LIB=test-vendor.so | |
57 | -# The name of the regular vendor object to be replaced by $TEST_VENDOR_LIB. | |
58 | -VENDOR_LIB=libbt-vendor.so | |
59 | -# The config file specifying controller properties. | |
60 | -CONTROLLER_PROPERTIES=controller_properties.json | |
61 | - | |
62 | -if [[ "$#" -eq 4 && $3 == "--test-channel" ]]; then | |
63 | - TEST_CHANNEL_PORT=$4 | |
64 | - TEST_CHANNEL_REL=/scripts | |
65 | - TEST_CHANNEL_ABS=${TEST_VENDOR_LIB_ABS}${TEST_CHANNEL_REL} | |
66 | - | |
67 | - # Start logcat in a subshell. | |
68 | - x-terminal-emulator -e "scripts/build_and_run.sh ${AOSP_ABS} ${DEVICE}" | |
69 | - | |
70 | - echo "Setting up build environment." | |
71 | - cd ${AOSP_ABS} | |
72 | - source build/envsetup.sh | |
73 | - | |
74 | - # Forward local port to the same port on the device. | |
75 | - echo "Forwarding port ${TEST_CHANNEL_PORT} to device." | |
76 | - adb forward tcp:${TEST_CHANNEL_PORT} tcp:${TEST_CHANNEL_PORT} | |
77 | - | |
78 | - # Turn Bluetooth on. Requires user approval via a dialog on the device. | |
79 | - echo "Enabling Bluetooth. Please see dialog on device." | |
80 | - adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE | |
81 | - | |
82 | - # Start the test channel once Bluetooth is on and logcat has started. | |
83 | - read -p "Press [ENTER] once Bluetooth is enabling AND logcat has started." | |
84 | - | |
85 | - # Start the test channel. | |
86 | - python ${TEST_CHANNEL_ABS}/test_channel.py localhost ${TEST_CHANNEL_PORT} | |
87 | -else | |
88 | - echo "Setting up build environment." | |
89 | - cd ${AOSP_ABS} | |
90 | - source build/envsetup.sh | |
91 | - | |
92 | - echo "Navigating to test vendor library: ${TEST_VENDOR_LIB_ABS}" | |
93 | - cd ${TEST_VENDOR_LIB_ABS} | |
94 | - | |
95 | - echo "Building test vendor library." | |
96 | - mm | |
97 | - | |
98 | - echo "Remounting device rootfs." | |
99 | - adb shell mount -o remount,rw / | |
100 | - adb remount | |
101 | - | |
102 | - # Replace the actual vendor library with the test vendor library. | |
103 | - mv ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/${TEST_VENDOR_LIB} \ | |
104 | - ${VENDOR_SYMBOLS_ABS}/${VENDOR_LIB} | |
105 | - | |
106 | - # Push the test vendor library to the device. | |
107 | - echo "Pushing the test vendor library to device: $DEVICE" | |
108 | - adb push ${VENDOR_SYMBOLS_ABS}/${VENDOR_LIB} /vendor/lib | |
109 | - | |
110 | - echo "Pushing controller properties." | |
111 | - adb push ${TEST_VENDOR_LIB_ABS}/data/${CONTROLLER_PROPERTIES} /etc/bluetooth/ | |
112 | - | |
113 | - echo "Pushing libevent." | |
114 | - adb push ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/libevent.so /system/lib/ | |
115 | - | |
116 | - echo "Pushing libchrome." | |
117 | - adb push ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/libchrome.so /system/lib/ | |
118 | - | |
119 | - # Clear logcat. | |
120 | - adb logcat -c | |
121 | - | |
122 | - # Run logcat with filters. | |
123 | - adb logcat bt_btif:D bt_btif_core:D bt_hci:D bt_main:D bt_vendor:D \ | |
124 | - bte_logmsg:D command_packet:D dual_mode_controller:D event_packet:D \ | |
125 | - hci_transport:D hci_handler:D packet:D packet_stream:D \ | |
126 | - test_channel_transport:D vendor_manager:D *:S | |
127 | -fi |
@@ -1,247 +0,0 @@ | ||
1 | -# | |
2 | -# Copyright 2015 The Android Open Source Project | |
3 | -# | |
4 | -# Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -# you may not use this file except in compliance with the License. | |
6 | -# You may obtain a copy of the License at | |
7 | -# | |
8 | -# http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -# | |
10 | -# Unless required by applicable law or agreed to in writing, software | |
11 | -# distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -# See the License for the specific language governing permissions and | |
14 | -# limitations under the License. | |
15 | -# | |
16 | - | |
17 | -"""Script for sending testing parameters and commands to a Bluetooth device. | |
18 | - | |
19 | -This script provides a simple shell interface for sending data at run-time to a | |
20 | -Bluetooth device. It is intended to be used in tandem with the test vendor | |
21 | -library project. | |
22 | - | |
23 | -Usage: | |
24 | - Option A: Script | |
25 | - 1. Run build_and_run.sh in scripts/ with the --test-channel flag set and the | |
26 | - port to use for the test channel. | |
27 | - Option B: Manual | |
28 | - 1. Choose a port to use for the test channel. Use 'adb forward tcp:<port> | |
29 | - tcp:<port>' to forward the port to the device. | |
30 | - 2. In a separate shell, build and push the test vendor library to the device | |
31 | - using the script mentioned in option A (i.e. without the --test-channel flag | |
32 | - set). | |
33 | - 3. Once logcat has started, turn Bluetooth on from the device. | |
34 | - 4. Run this program, in the shell from step 1, the port, also from step 1, | |
35 | - as arguments. | |
36 | -""" | |
37 | - | |
38 | -#!/usr/bin/env python | |
39 | - | |
40 | -import cmd | |
41 | -import random | |
42 | -import socket | |
43 | -import string | |
44 | -import struct | |
45 | -import sys | |
46 | - | |
47 | -DEVICE_NAME_LENGTH = 6 | |
48 | -DEVICE_ADDRESS_LENGTH = 6 | |
49 | - | |
50 | -# Used to generate fake device names and addresses during discovery. | |
51 | -def generate_random_name(): | |
52 | - return ''.join(random.SystemRandom().choice(string.ascii_uppercase + \ | |
53 | - string.digits) for _ in range(DEVICE_NAME_LENGTH)) | |
54 | - | |
55 | -def generate_random_address(): | |
56 | - return ''.join(random.SystemRandom().choice(string.digits) for _ in \ | |
57 | - range(DEVICE_ADDRESS_LENGTH)) | |
58 | - | |
59 | -class Connection(object): | |
60 | - """Simple wrapper class for a socket object. | |
61 | - | |
62 | - Attributes: | |
63 | - socket: The underlying socket created for the specified address and port. | |
64 | - """ | |
65 | - | |
66 | - def __init__(self, port): | |
67 | - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
68 | - self._socket.connect(('localhost', port)) | |
69 | - | |
70 | - def close(self): | |
71 | - self._socket.close() | |
72 | - | |
73 | - def send(self, data): | |
74 | - self._socket.sendall(data) | |
75 | - | |
76 | -class TestChannel(object): | |
77 | - """Checks outgoing commands and sends them once verified. | |
78 | - | |
79 | - Attributes: | |
80 | - connection: The connection to the test vendor library that commands are sent | |
81 | - on. | |
82 | - """ | |
83 | - | |
84 | - def __init__(self, port): | |
85 | - self._connection = Connection(port) | |
86 | - self._discovered_devices = DeviceManager() | |
87 | - | |
88 | - def discover_new_device(self, name=None, address=None): | |
89 | - device = Device(name, address) | |
90 | - self._discovered_devices.add_device(device) | |
91 | - return device | |
92 | - | |
93 | - def close(self): | |
94 | - self._connection.close() | |
95 | - | |
96 | - def send_command(self, name, args): | |
97 | - name_size = len(name) | |
98 | - args_size = len(args) | |
99 | - self.lint_command(name, args, name_size, args_size) | |
100 | - encoded_name = chr(name_size) + name | |
101 | - encoded_args = chr(args_size) + ''.join(chr(len(arg)) + arg for arg in args) | |
102 | - command = encoded_name + encoded_args | |
103 | - self._connection.send(command) | |
104 | - | |
105 | - def lint_command(self, name, args, name_size, args_size): | |
106 | - assert name_size == len(name) and args_size == len(args) | |
107 | - try: | |
108 | - name.encode('utf-8') | |
109 | - for arg in args: | |
110 | - arg.encode('utf-8') | |
111 | - except UnicodeError: | |
112 | - print 'Unrecognized characters.' | |
113 | - raise | |
114 | - if name_size > 255 or args_size > 255: | |
115 | - raise ValueError # Size must be encodable in one octet. | |
116 | - for arg in args: | |
117 | - if len(arg) > 255: | |
118 | - raise ValueError # Size must be encodable in one octet. | |
119 | - | |
120 | -class DeviceManager(object): | |
121 | - """Maintains the active fake devices that have been "discovered". | |
122 | - | |
123 | - Attributes: | |
124 | - device_list: Maps device addresses (keys) to devices (values). | |
125 | - """ | |
126 | - | |
127 | - def __init__(self): | |
128 | - self.device_list = {} | |
129 | - | |
130 | - def add_device(self, device): | |
131 | - self.device_list[device.get_address()] = device | |
132 | - | |
133 | -class Device(object): | |
134 | - """A fake device to be returned in inquiry and scan results. Note that if an | |
135 | - explicit name or address is not provided, a random string of characters | |
136 | - is used. | |
137 | - | |
138 | - Attributes: | |
139 | - name: The device name for use in extended results. | |
140 | - address: The BD address of the device. | |
141 | - """ | |
142 | - | |
143 | - def __init__(self, name=None, address=None): | |
144 | - # TODO(dennischeng): Generate device properties more robustly. | |
145 | - self._name = generate_random_name() if name is None else name | |
146 | - self._address = generate_random_address() if address is None else address | |
147 | - | |
148 | - def get_name(self): | |
149 | - return self._name | |
150 | - | |
151 | - def get_address(self): | |
152 | - return self._address | |
153 | - | |
154 | -class TestChannelShell(cmd.Cmd): | |
155 | - """Shell for sending test channel data to controller. | |
156 | - | |
157 | - Manages the test channel to the controller and defines a set of commands the | |
158 | - user can send to the controller as well. These commands are processed parallel | |
159 | - to commands sent from the device stack and used to provide additional | |
160 | - debugging/testing capabilities. | |
161 | - | |
162 | - Attributes: | |
163 | - test_channel: The communication channel to send data to the controller. | |
164 | - """ | |
165 | - | |
166 | - def __init__(self, test_channel): | |
167 | - print 'Type \'help\' for more information.' | |
168 | - cmd.Cmd.__init__(self) | |
169 | - self._test_channel = test_channel | |
170 | - | |
171 | - def do_clear(self, args): | |
172 | - """ | |
173 | - Arguments: None. | |
174 | - Resets the controller to its original, unmodified state. | |
175 | - """ | |
176 | - self._test_channel.send_command('CLEAR', []) | |
177 | - | |
178 | - def do_clear_event_delay(self, args): | |
179 | - """ | |
180 | - Arguments: None. | |
181 | - Clears the response delay set by set_event_delay. | |
182 | - """ | |
183 | - self._test_channel.send_command('CLEAR_EVENT_DELAY', args.split()) | |
184 | - | |
185 | - def do_discover(self, args): | |
186 | - """ | |
187 | - Arguments: name_1 name_2 ... | |
188 | - Sends an inquiry result for named device(s). If no names are provided, a | |
189 | - random name is used instead. | |
190 | - """ | |
191 | - if len(args) == 0: | |
192 | - args = generate_random_name() | |
193 | - device_list = [self._test_channel.discover_new_device(arg) for arg in \ | |
194 | - args.split()] | |
195 | - device_names_and_addresses = [] | |
196 | - for device in device_list: | |
197 | - device_names_and_addresses.append(device.get_name()) | |
198 | - device_names_and_addresses.append(device.get_address()) | |
199 | - self._test_channel.send_command('DISCOVER', device_names_and_addresses) | |
200 | - | |
201 | - def do_set_event_delay(self, args): | |
202 | - """ | |
203 | - Arguments: interval_in_ms | |
204 | - Sets the response delay for all event packets sent from the controller back | |
205 | - to the HCI. | |
206 | - """ | |
207 | - self._test_channel.send_command('SET_EVENT_DELAY', args.split()) | |
208 | - | |
209 | - def do_timeout_all(self, args): | |
210 | - """ | |
211 | - Arguments: None. | |
212 | - Causes all HCI commands to timeout. | |
213 | - """ | |
214 | - self._test_channel.send_command('TIMEOUT_ALL', []) | |
215 | - | |
216 | - def do_quit(self, args): | |
217 | - """ | |
218 | - Arguments: None. | |
219 | - Exits the test channel. | |
220 | - """ | |
221 | - self._test_channel.send_command('CLOSE_TEST_CHANNEL', []) | |
222 | - self._test_channel.close() | |
223 | - print 'Goodbye.' | |
224 | - return True | |
225 | - | |
226 | -def main(argv): | |
227 | - if len(argv) != 2: | |
228 | - print 'Usage: python test_channel.py [port]' | |
229 | - return | |
230 | - try: | |
231 | - port = int(argv[1]) | |
232 | - except ValueError: | |
233 | - print 'Error parsing port.' | |
234 | - else: | |
235 | - try: | |
236 | - test_channel = TestChannel(port) | |
237 | - except socket.error, e: | |
238 | - print 'Error connecting to socket: %s' % e | |
239 | - except: | |
240 | - print 'Error creating test channel (check argument).' | |
241 | - else: | |
242 | - test_channel_shell = TestChannelShell(test_channel) | |
243 | - test_channel_shell.prompt = '$ ' | |
244 | - test_channel_shell.cmdloop() | |
245 | - | |
246 | -if __name__ == '__main__': | |
247 | - main(sys.argv) |
@@ -1,107 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "bt_vendor" | |
18 | - | |
19 | -#include "vendor_manager.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | - | |
23 | -extern "C" { | |
24 | -#include "osi/include/log.h" | |
25 | - | |
26 | -#include <unistd.h> | |
27 | -} // extern "C" | |
28 | - | |
29 | -namespace test_vendor_lib { | |
30 | - | |
31 | -// Initializes vendor manager for test controller. |p_cb| are the callbacks to | |
32 | -// be in TestVendorOp(). |local_bdaddr| points to the address of the Bluetooth | |
33 | -// device. Returns 0 on success, -1 on error. | |
34 | -static int TestVendorInitialize(const bt_vendor_callbacks_t* p_cb, | |
35 | - unsigned char* /* local_bdaddr */) { | |
36 | - LOG_INFO(LOG_TAG, "Initializing test controller."); | |
37 | - CHECK(p_cb); | |
38 | - | |
39 | - VendorManager::Initialize(); | |
40 | - VendorManager* manager = VendorManager::Get(); | |
41 | - manager->SetVendorCallbacks(*(const_cast<bt_vendor_callbacks_t*>(p_cb))); | |
42 | - return manager->Run() ? 0 : -1; | |
43 | -} | |
44 | - | |
45 | -// Vendor specific operations. |opcode| is the opcode for Bluedroid's vendor op | |
46 | -// definitions. |param| points to operation specific arguments. Return value is | |
47 | -// dependent on the operation invoked, or -1 on error. | |
48 | -static int TestVendorOp(bt_vendor_opcode_t opcode, void* param) { | |
49 | - LOG_INFO(LOG_TAG, "Opcode received in vendor library: %d", opcode); | |
50 | - | |
51 | - VendorManager* manager = VendorManager::Get(); | |
52 | - CHECK(manager); | |
53 | - | |
54 | - switch (opcode) { | |
55 | - case BT_VND_OP_POWER_CTRL: { | |
56 | - LOG_INFO(LOG_TAG, "Doing op: BT_VND_OP_POWER_CTRL"); | |
57 | - int* state = static_cast<int*>(param); | |
58 | - if (*state == BT_VND_PWR_OFF) | |
59 | - LOG_INFO(LOG_TAG, "Turning Bluetooth off."); | |
60 | - else if (*state == BT_VND_PWR_ON) | |
61 | - LOG_INFO(LOG_TAG, "Turning Bluetooth on."); | |
62 | - return 0; | |
63 | - } | |
64 | - | |
65 | - // Give the HCI its fd to communicate with the HciTransport. | |
66 | - case BT_VND_OP_USERIAL_OPEN: { | |
67 | - LOG_INFO(LOG_TAG, "Doing op: BT_VND_OP_USERIAL_OPEN"); | |
68 | - int* fd_list = static_cast<int*>(param); | |
69 | - fd_list[0] = manager->GetHciFd(); | |
70 | - LOG_INFO(LOG_TAG, "Setting HCI's fd to: %d", fd_list[0]); | |
71 | - return 1; | |
72 | - } | |
73 | - | |
74 | - // Close the HCI's file descriptor. | |
75 | - case BT_VND_OP_USERIAL_CLOSE: | |
76 | - LOG_INFO(LOG_TAG, "Doing op: BT_VND_OP_USERIAL_CLOSE"); | |
77 | - LOG_INFO(LOG_TAG, "Closing HCI's fd (fd: %d)", manager->GetHciFd()); | |
78 | - manager->CloseHciFd(); | |
79 | - return 1; | |
80 | - | |
81 | - case BT_VND_OP_FW_CFG: | |
82 | - LOG_INFO(LOG_TAG, "Unsupported op: BT_VND_OP_FW_CFG"); | |
83 | - manager->GetVendorCallbacks().fwcfg_cb(BT_VND_OP_RESULT_FAIL); | |
84 | - return -1; | |
85 | - | |
86 | - default: | |
87 | - LOG_INFO(LOG_TAG, "Op not recognized."); | |
88 | - return -1; | |
89 | - } | |
90 | - return 0; | |
91 | -} | |
92 | - | |
93 | -// Closes the vendor interface and cleans up the global vendor manager object. | |
94 | -static void TestVendorCleanUp(void) { | |
95 | - LOG_INFO(LOG_TAG, "Cleaning up vendor library."); | |
96 | - VendorManager::CleanUp(); | |
97 | -} | |
98 | - | |
99 | -} // namespace test_vendor_lib | |
100 | - | |
101 | -// Entry point of DLib. | |
102 | -const bt_vendor_interface_t BLUETOOTH_VENDOR_LIB_INTERFACE = { | |
103 | - sizeof(bt_vendor_interface_t), | |
104 | - test_vendor_lib::TestVendorInitialize, | |
105 | - test_vendor_lib::TestVendorOp, | |
106 | - test_vendor_lib::TestVendorCleanUp | |
107 | -}; |
@@ -1,43 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "command_packet" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
20 | - | |
21 | -extern "C" { | |
22 | -#include "hci/include/hci_hal.h" | |
23 | -#include "osi/include/log.h" | |
24 | -#include "stack/include/hcidefs.h" | |
25 | -} // extern "C" | |
26 | - | |
27 | -namespace test_vendor_lib { | |
28 | - | |
29 | -CommandPacket::CommandPacket() : Packet(DATA_TYPE_COMMAND) {} | |
30 | - | |
31 | -uint16_t CommandPacket::GetOpcode() const { | |
32 | - return 0 | (GetHeader()[0] | (GetHeader()[1] << 8)); | |
33 | -} | |
34 | - | |
35 | -uint8_t CommandPacket::GetOGF() const { | |
36 | - return HCI_OGF(GetOpcode()); | |
37 | -} | |
38 | - | |
39 | -uint16_t CommandPacket::GetOCF() const { | |
40 | - return HCI_OCF(GetOpcode()); | |
41 | -} | |
42 | - | |
43 | -} // namespace test_vendor_lib |
@@ -1,561 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "dual_mode_controller" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/dual_mode_controller.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | -#include "base/files/file_util.h" | |
23 | -#include "base/json/json_reader.h" | |
24 | -#include "base/values.h" | |
25 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
26 | -#include "vendor_libs/test_vendor_lib/include/hci_transport.h" | |
27 | - | |
28 | -extern "C" { | |
29 | -#include "stack/include/hcidefs.h" | |
30 | -#include "osi/include/log.h" | |
31 | -} // extern "C" | |
32 | - | |
33 | -namespace { | |
34 | - | |
35 | -// Included in certain events to indicate success (specific to the event | |
36 | -// context). | |
37 | -const uint8_t kSuccessStatus = 0; | |
38 | - | |
39 | -// The default number encoded in event packets to indicate to the HCI how many | |
40 | -// command packets it can send to the controller. | |
41 | -const uint8_t kNumHciCommandPackets = 1; | |
42 | - | |
43 | -// The location of the config file loaded to populate controller attributes. | |
44 | -const std::string kControllerPropertiesFile = | |
45 | - "/etc/bluetooth/controller_properties.json"; | |
46 | - | |
47 | -// Inquiry modes for specifiying inquiry result formats. | |
48 | -const uint8_t kStandardInquiry = 0x00; | |
49 | -const uint8_t kRssiInquiry = 0x01; | |
50 | -const uint8_t kExtendedOrRssiInquiry = 0x02; | |
51 | - | |
52 | -// The bd address of another (fake) device. | |
53 | -const std::vector<uint8_t> kOtherDeviceBdAddress = {6, 5, 4, 3, 2, 1}; | |
54 | - | |
55 | -// Fake inquiry response for a fake device. | |
56 | -const std::vector<uint8_t> kPageScanRepetitionMode = {0}; | |
57 | -const std::vector<uint8_t> kPageScanPeriodMode = {0}; | |
58 | -const std::vector<uint8_t> kPageScanMode = {0}; | |
59 | -const std::vector<uint8_t> kClassOfDevice = {1, 2, 3}; | |
60 | -const std::vector<uint8_t> kClockOffset = {1, 2}; | |
61 | - | |
62 | -void LogCommand(const char* command) { | |
63 | - LOG_INFO(LOG_TAG, "Controller performing command: %s", command); | |
64 | -} | |
65 | - | |
66 | -// Functions used by JSONValueConverter to read stringified JSON into Properties | |
67 | -// object. | |
68 | -bool ParseUint8t(const base::StringPiece& value, uint8_t* field) { | |
69 | - *field = std::stoi(value.as_string()); | |
70 | - return true; | |
71 | -} | |
72 | - | |
73 | -bool ParseUint16t(const base::StringPiece& value, uint16_t* field) { | |
74 | - *field = std::stoi(value.as_string()); | |
75 | - return true; | |
76 | -} | |
77 | - | |
78 | -bool ParseUint8tVector(const base::StringPiece& value, | |
79 | - std::vector<uint8_t>* field) { | |
80 | - for (char& c : value.as_string()) | |
81 | - field->push_back(c - '0'); | |
82 | - return true; | |
83 | -} | |
84 | - | |
85 | -} // namespace | |
86 | - | |
87 | -namespace test_vendor_lib { | |
88 | - | |
89 | -void DualModeController::SendCommandComplete( | |
90 | - uint16_t command_opcode, | |
91 | - const std::vector<uint8_t>& return_parameters) const { | |
92 | - std::unique_ptr<EventPacket> command_complete = | |
93 | - EventPacket::CreateCommandCompleteEvent( | |
94 | - kNumHciCommandPackets, command_opcode, return_parameters); | |
95 | - send_event_(std::move(command_complete)); | |
96 | -} | |
97 | - | |
98 | -void DualModeController::SendCommandCompleteSuccess( | |
99 | - uint16_t command_opcode) const { | |
100 | - SendCommandComplete(command_opcode, {kSuccessStatus}); | |
101 | -} | |
102 | - | |
103 | -void DualModeController::SendCommandStatus(uint8_t status, | |
104 | - uint16_t command_opcode) const { | |
105 | - std::unique_ptr<EventPacket> command_status = | |
106 | - EventPacket::CreateCommandStatusEvent(status, kNumHciCommandPackets, | |
107 | - command_opcode); | |
108 | - send_event_(std::move(command_status)); | |
109 | -} | |
110 | - | |
111 | -void DualModeController::SendCommandStatusSuccess( | |
112 | - uint16_t command_opcode) const { | |
113 | - SendCommandStatus(kSuccessStatus, command_opcode); | |
114 | -} | |
115 | - | |
116 | -void DualModeController::SendInquiryResult() const { | |
117 | - std::unique_ptr<EventPacket> inquiry_result = | |
118 | - EventPacket::CreateInquiryResultEvent( | |
119 | - 1, kOtherDeviceBdAddress, kPageScanRepetitionMode, | |
120 | - kPageScanPeriodMode, kPageScanMode, kClassOfDevice, kClockOffset); | |
121 | - send_event_(std::move(inquiry_result)); | |
122 | -} | |
123 | - | |
124 | -void DualModeController::SendExtendedInquiryResult( | |
125 | - const std::string& name, const std::string& address) const { | |
126 | - std::vector<uint8_t> rssi = {0}; | |
127 | - std::vector<uint8_t> extended_inquiry_data = {name.length() + 1, 0x09}; | |
128 | - std::copy(name.begin(), name.end(), | |
129 | - std::back_inserter(extended_inquiry_data)); | |
130 | - std::vector<uint8_t> bd_address(address.begin(), address.end()); | |
131 | - // TODO(dennischeng): Use constants for parameter sizes, here and elsewhere. | |
132 | - while (extended_inquiry_data.size() < 240) { | |
133 | - extended_inquiry_data.push_back(0); | |
134 | - } | |
135 | - std::unique_ptr<EventPacket> extended_inquiry_result = | |
136 | - EventPacket::CreateExtendedInquiryResultEvent( | |
137 | - bd_address, kPageScanRepetitionMode, kPageScanPeriodMode, | |
138 | - kClassOfDevice, kClockOffset, rssi, extended_inquiry_data); | |
139 | - send_event_(std::move(extended_inquiry_result)); | |
140 | -} | |
141 | - | |
142 | -DualModeController::DualModeController() | |
143 | - : state_(kStandby), | |
144 | - test_channel_state_(kNone), | |
145 | - properties_(kControllerPropertiesFile) { | |
146 | -#define SET_HANDLER(opcode, method) \ | |
147 | - active_hci_commands_[opcode] = \ | |
148 | - std::bind(&DualModeController::method, this, std::placeholders::_1); | |
149 | - SET_HANDLER(HCI_RESET, HciReset); | |
150 | - SET_HANDLER(HCI_READ_BUFFER_SIZE, HciReadBufferSize); | |
151 | - SET_HANDLER(HCI_HOST_BUFFER_SIZE, HciHostBufferSize); | |
152 | - SET_HANDLER(HCI_READ_LOCAL_VERSION_INFO, HciReadLocalVersionInformation); | |
153 | - SET_HANDLER(HCI_READ_BD_ADDR, HciReadBdAddr); | |
154 | - SET_HANDLER(HCI_READ_LOCAL_SUPPORTED_CMDS, HciReadLocalSupportedCommands); | |
155 | - SET_HANDLER(HCI_READ_LOCAL_EXT_FEATURES, HciReadLocalExtendedFeatures); | |
156 | - SET_HANDLER(HCI_WRITE_SIMPLE_PAIRING_MODE, HciWriteSimplePairingMode); | |
157 | - SET_HANDLER(HCI_WRITE_LE_HOST_SUPPORT, HciWriteLeHostSupport); | |
158 | - SET_HANDLER(HCI_SET_EVENT_MASK, HciSetEventMask); | |
159 | - SET_HANDLER(HCI_WRITE_INQUIRY_MODE, HciWriteInquiryMode); | |
160 | - SET_HANDLER(HCI_WRITE_PAGESCAN_TYPE, HciWritePageScanType); | |
161 | - SET_HANDLER(HCI_WRITE_INQSCAN_TYPE, HciWriteInquiryScanType); | |
162 | - SET_HANDLER(HCI_WRITE_CLASS_OF_DEVICE, HciWriteClassOfDevice); | |
163 | - SET_HANDLER(HCI_WRITE_PAGE_TOUT, HciWritePageTimeout); | |
164 | - SET_HANDLER(HCI_WRITE_DEF_POLICY_SETTINGS, HciWriteDefaultLinkPolicySettings); | |
165 | - SET_HANDLER(HCI_READ_LOCAL_NAME, HciReadLocalName); | |
166 | - SET_HANDLER(HCI_CHANGE_LOCAL_NAME, HciWriteLocalName); | |
167 | - SET_HANDLER(HCI_WRITE_EXT_INQ_RESPONSE, HciWriteExtendedInquiryResponse); | |
168 | - SET_HANDLER(HCI_WRITE_VOICE_SETTINGS, HciWriteVoiceSetting); | |
169 | - SET_HANDLER(HCI_WRITE_CURRENT_IAC_LAP, HciWriteCurrentIacLap); | |
170 | - SET_HANDLER(HCI_WRITE_INQUIRYSCAN_CFG, HciWriteInquiryScanActivity); | |
171 | - SET_HANDLER(HCI_WRITE_SCAN_ENABLE, HciWriteScanEnable); | |
172 | - SET_HANDLER(HCI_SET_EVENT_FILTER, HciSetEventFilter); | |
173 | - SET_HANDLER(HCI_INQUIRY, HciInquiry); | |
174 | - SET_HANDLER(HCI_INQUIRY_CANCEL, HciInquiryCancel); | |
175 | - SET_HANDLER(HCI_DELETE_STORED_LINK_KEY, HciDeleteStoredLinkKey); | |
176 | - SET_HANDLER(HCI_RMT_NAME_REQUEST, HciRemoteNameRequest); | |
177 | -#undef SET_HANDLER | |
178 | - | |
179 | -#define SET_TEST_HANDLER(command_name, method) \ | |
180 | - active_test_channel_commands_[command_name] = \ | |
181 | - std::bind(&DualModeController::method, this, std::placeholders::_1); | |
182 | - SET_TEST_HANDLER("CLEAR", TestChannelClear); | |
183 | - SET_TEST_HANDLER("CLEAR_EVENT_DELAY", TestChannelClearEventDelay); | |
184 | - SET_TEST_HANDLER("DISCOVER", TestChannelDiscover); | |
185 | - SET_TEST_HANDLER("SET_EVENT_DELAY", TestChannelSetEventDelay); | |
186 | - SET_TEST_HANDLER("TIMEOUT_ALL", TestChannelTimeoutAll); | |
187 | -#undef SET_TEST_HANDLER | |
188 | -} | |
189 | - | |
190 | -void DualModeController::RegisterHandlersWithHciTransport( | |
191 | - HciTransport& transport) { | |
192 | - transport.RegisterCommandHandler(std::bind(&DualModeController::HandleCommand, | |
193 | - this, std::placeholders::_1)); | |
194 | -} | |
195 | - | |
196 | -void DualModeController::RegisterHandlersWithTestChannelTransport( | |
197 | - TestChannelTransport& transport) { | |
198 | - transport.RegisterCommandHandler( | |
199 | - std::bind(&DualModeController::HandleTestChannelCommand, this, | |
200 | - std::placeholders::_1, std::placeholders::_2)); | |
201 | -} | |
202 | - | |
203 | -void DualModeController::HandleTestChannelCommand( | |
204 | - const std::string& name, const std::vector<std::string>& args) { | |
205 | - if (active_test_channel_commands_.count(name) == 0) | |
206 | - return; | |
207 | - active_test_channel_commands_[name](args); | |
208 | -} | |
209 | - | |
210 | -void DualModeController::HandleCommand( | |
211 | - std::unique_ptr<CommandPacket> command_packet) { | |
212 | - uint16_t opcode = command_packet->GetOpcode(); | |
213 | - LOG_INFO(LOG_TAG, "Command opcode: 0x%04X, OGF: 0x%04X, OCF: 0x%04X", opcode, | |
214 | - command_packet->GetOGF(), command_packet->GetOCF()); | |
215 | - | |
216 | - // The command hasn't been registered with the handler yet. There is nothing | |
217 | - // to do. | |
218 | - if (active_hci_commands_.count(opcode) == 0) | |
219 | - return; | |
220 | - else if (test_channel_state_ == kTimeoutAll) | |
221 | - return; | |
222 | - active_hci_commands_[opcode](command_packet->GetPayload()); | |
223 | -} | |
224 | - | |
225 | -void DualModeController::RegisterEventChannel( | |
226 | - std::function<void(std::unique_ptr<EventPacket>)> callback) { | |
227 | - send_event_ = callback; | |
228 | -} | |
229 | - | |
230 | -void DualModeController::RegisterDelayedEventChannel( | |
231 | - std::function<void(std::unique_ptr<EventPacket>, base::TimeDelta)> | |
232 | - callback) { | |
233 | - send_delayed_event_ = callback; | |
234 | - SetEventDelay(0); | |
235 | -} | |
236 | - | |
237 | -void DualModeController::SetEventDelay(int64_t delay) { | |
238 | - if (delay < 0) | |
239 | - delay = 0; | |
240 | - send_event_ = std::bind(send_delayed_event_, std::placeholders::_1, | |
241 | - base::TimeDelta::FromMilliseconds(delay)); | |
242 | -} | |
243 | - | |
244 | -void DualModeController::TestChannelClear( | |
245 | - const std::vector<std::string>& args) { | |
246 | - LogCommand("TestChannel Clear"); | |
247 | - test_channel_state_ = kNone; | |
248 | - SetEventDelay(0); | |
249 | -} | |
250 | - | |
251 | -void DualModeController::TestChannelDiscover( | |
252 | - const std::vector<std::string>& args) { | |
253 | - LogCommand("TestChannel Discover"); | |
254 | - for (size_t i = 0; i < args.size()-1; i+=2) | |
255 | - SendExtendedInquiryResult(args[i], args[i+1]); | |
256 | -} | |
257 | - | |
258 | -void DualModeController::TestChannelTimeoutAll( | |
259 | - const std::vector<std::string>& args) { | |
260 | - LogCommand("TestChannel Timeout All"); | |
261 | - test_channel_state_ = kTimeoutAll; | |
262 | -} | |
263 | - | |
264 | -void DualModeController::TestChannelSetEventDelay( | |
265 | - const std::vector<std::string>& args) { | |
266 | - LogCommand("TestChannel Set Event Delay"); | |
267 | - test_channel_state_ = kDelayedResponse; | |
268 | - SetEventDelay(std::stoi(args[0])); | |
269 | -} | |
270 | - | |
271 | -void DualModeController::TestChannelClearEventDelay( | |
272 | - const std::vector<std::string>& args) { | |
273 | - LogCommand("TestChannel Clear Event Delay"); | |
274 | - test_channel_state_ = kNone; | |
275 | - SetEventDelay(0); | |
276 | -} | |
277 | - | |
278 | -void DualModeController::HciReset(const std::vector<uint8_t>& /* args */) { | |
279 | - LogCommand("Reset"); | |
280 | - state_ = kStandby; | |
281 | - SendCommandCompleteSuccess(HCI_RESET); | |
282 | -} | |
283 | - | |
284 | -void DualModeController::HciReadBufferSize( | |
285 | - const std::vector<uint8_t>& /* args */) { | |
286 | - LogCommand("Read Buffer Size"); | |
287 | - SendCommandComplete(HCI_READ_BUFFER_SIZE, properties_.GetBufferSize()); | |
288 | -} | |
289 | - | |
290 | -void DualModeController::HciHostBufferSize( | |
291 | - const std::vector<uint8_t>& /* args */) { | |
292 | - LogCommand("Host Buffer Size"); | |
293 | - SendCommandCompleteSuccess(HCI_HOST_BUFFER_SIZE); | |
294 | -} | |
295 | - | |
296 | -void DualModeController::HciReadLocalVersionInformation( | |
297 | - const std::vector<uint8_t>& /* args */) { | |
298 | - LogCommand("Read Local Version Information"); | |
299 | - SendCommandComplete(HCI_READ_LOCAL_VERSION_INFO, | |
300 | - properties_.GetLocalVersionInformation()); | |
301 | -} | |
302 | - | |
303 | -void DualModeController::HciReadBdAddr(const std::vector<uint8_t>& /* args */) { | |
304 | - LogCommand("Read Bd Addr"); | |
305 | - std::vector<uint8_t> bd_address_with_status = properties_.GetBdAddress(); | |
306 | - bd_address_with_status.insert(bd_address_with_status.begin(), | |
307 | - kSuccessStatus); | |
308 | - SendCommandComplete(HCI_READ_BD_ADDR, bd_address_with_status); | |
309 | -} | |
310 | - | |
311 | -void DualModeController::HciReadLocalSupportedCommands( | |
312 | - const std::vector<uint8_t>& /* args */) { | |
313 | - LogCommand("Read Local Supported Commands"); | |
314 | - SendCommandComplete(HCI_READ_LOCAL_SUPPORTED_CMDS, | |
315 | - properties_.GetLocalSupportedCommands()); | |
316 | -} | |
317 | - | |
318 | -void DualModeController::HciReadLocalExtendedFeatures( | |
319 | - const std::vector<uint8_t>& args) { | |
320 | - LogCommand("Read Local Extended Features"); | |
321 | - SendCommandComplete(HCI_READ_LOCAL_EXT_FEATURES, | |
322 | - properties_.GetLocalExtendedFeatures(args[0])); | |
323 | -} | |
324 | - | |
325 | -void DualModeController::HciWriteSimplePairingMode( | |
326 | - const std::vector<uint8_t>& /* args */) { | |
327 | - LogCommand("Write Simple Pairing Mode"); | |
328 | - SendCommandCompleteSuccess(HCI_WRITE_SIMPLE_PAIRING_MODE); | |
329 | -} | |
330 | - | |
331 | -void DualModeController::HciWriteLeHostSupport( | |
332 | - const std::vector<uint8_t>& /* args */) { | |
333 | - LogCommand("Write Le Host Support"); | |
334 | - SendCommandCompleteSuccess(HCI_WRITE_LE_HOST_SUPPORT); | |
335 | -} | |
336 | - | |
337 | -void DualModeController::HciSetEventMask( | |
338 | - const std::vector<uint8_t>& /* args */) { | |
339 | - LogCommand("Set Event Mask"); | |
340 | - SendCommandCompleteSuccess(HCI_SET_EVENT_MASK); | |
341 | -} | |
342 | - | |
343 | -void DualModeController::HciWriteInquiryMode(const std::vector<uint8_t>& args) { | |
344 | - LogCommand("Write Inquiry Mode"); | |
345 | - CHECK(args.size() == 1); | |
346 | - inquiry_mode_ = args[0]; | |
347 | - SendCommandCompleteSuccess(HCI_WRITE_INQUIRY_MODE); | |
348 | -} | |
349 | - | |
350 | -void DualModeController::HciWritePageScanType( | |
351 | - const std::vector<uint8_t>& /* args */) { | |
352 | - LogCommand("Write Page Scan Type"); | |
353 | - SendCommandCompleteSuccess(HCI_WRITE_PAGESCAN_TYPE); | |
354 | -} | |
355 | - | |
356 | -void DualModeController::HciWriteInquiryScanType( | |
357 | - const std::vector<uint8_t>& /* args */) { | |
358 | - LogCommand("Write Inquiry Scan Type"); | |
359 | - SendCommandCompleteSuccess(HCI_WRITE_INQSCAN_TYPE); | |
360 | -} | |
361 | - | |
362 | -void DualModeController::HciWriteClassOfDevice( | |
363 | - const std::vector<uint8_t>& /* args */) { | |
364 | - LogCommand("Write Class Of Device"); | |
365 | - SendCommandCompleteSuccess(HCI_WRITE_CLASS_OF_DEVICE); | |
366 | -} | |
367 | - | |
368 | -void DualModeController::HciWritePageTimeout( | |
369 | - const std::vector<uint8_t>& /* args */) { | |
370 | - LogCommand("Write Page Timeout"); | |
371 | - SendCommandCompleteSuccess(HCI_WRITE_PAGE_TOUT); | |
372 | -} | |
373 | - | |
374 | -void DualModeController::HciWriteDefaultLinkPolicySettings( | |
375 | - const std::vector<uint8_t>& /* args */) { | |
376 | - LogCommand("Write Default Link Policy Settings"); | |
377 | - SendCommandCompleteSuccess(HCI_WRITE_DEF_POLICY_SETTINGS); | |
378 | -} | |
379 | - | |
380 | -void DualModeController::HciReadLocalName( | |
381 | - const std::vector<uint8_t>& /* args */) { | |
382 | - LogCommand("Get Local Name"); | |
383 | - SendCommandComplete(HCI_READ_LOCAL_NAME, properties_.GetLocalName()); | |
384 | -} | |
385 | - | |
386 | -void DualModeController::HciWriteLocalName( | |
387 | - const std::vector<uint8_t>& /* args */) { | |
388 | - LogCommand("Write Local Name"); | |
389 | - SendCommandCompleteSuccess(HCI_CHANGE_LOCAL_NAME); | |
390 | -} | |
391 | - | |
392 | -void DualModeController::HciWriteExtendedInquiryResponse( | |
393 | - const std::vector<uint8_t>& /* args */) { | |
394 | - LogCommand("Write Extended Inquiry Response"); | |
395 | - SendCommandCompleteSuccess(HCI_WRITE_EXT_INQ_RESPONSE); | |
396 | -} | |
397 | - | |
398 | -void DualModeController::HciWriteVoiceSetting( | |
399 | - const std::vector<uint8_t>& /* args */) { | |
400 | - LogCommand("Write Voice Setting"); | |
401 | - SendCommandCompleteSuccess(HCI_WRITE_VOICE_SETTINGS); | |
402 | -} | |
403 | - | |
404 | -void DualModeController::HciWriteCurrentIacLap( | |
405 | - const std::vector<uint8_t>& /* args */) { | |
406 | - LogCommand("Write Current IAC LAP"); | |
407 | - SendCommandCompleteSuccess(HCI_WRITE_CURRENT_IAC_LAP); | |
408 | -} | |
409 | - | |
410 | -void DualModeController::HciWriteInquiryScanActivity( | |
411 | - const std::vector<uint8_t>& /* args */) { | |
412 | - LogCommand("Write Inquiry Scan Activity"); | |
413 | - SendCommandCompleteSuccess(HCI_WRITE_INQUIRYSCAN_CFG); | |
414 | -} | |
415 | - | |
416 | -void DualModeController::HciWriteScanEnable( | |
417 | - const std::vector<uint8_t>& /* args */) { | |
418 | - LogCommand("Write Scan Enable"); | |
419 | - SendCommandCompleteSuccess(HCI_WRITE_SCAN_ENABLE); | |
420 | -} | |
421 | - | |
422 | -void DualModeController::HciSetEventFilter( | |
423 | - const std::vector<uint8_t>& /* args */) { | |
424 | - LogCommand("Set Event Filter"); | |
425 | - SendCommandCompleteSuccess(HCI_SET_EVENT_FILTER); | |
426 | -} | |
427 | - | |
428 | -void DualModeController::HciInquiry(const std::vector<uint8_t>& /* args */) { | |
429 | - LogCommand("Inquiry"); | |
430 | - state_ = kInquiry; | |
431 | - SendCommandStatusSuccess(HCI_INQUIRY); | |
432 | - switch (inquiry_mode_) { | |
433 | - case (kStandardInquiry): | |
434 | - SendInquiryResult(); | |
435 | - break; | |
436 | - | |
437 | - case (kRssiInquiry): | |
438 | - LOG_INFO(LOG_TAG, "RSSI Inquiry Mode currently not supported."); | |
439 | - break; | |
440 | - | |
441 | - case (kExtendedOrRssiInquiry): | |
442 | - SendExtendedInquiryResult("FooBar", "123456"); | |
443 | - break; | |
444 | - } | |
445 | -} | |
446 | - | |
447 | -void DualModeController::HciInquiryCancel( | |
448 | - const std::vector<uint8_t>& /* args */) { | |
449 | - LogCommand("Inquiry Cancel"); | |
450 | - CHECK(state_ == kInquiry); | |
451 | - state_ = kStandby; | |
452 | - SendCommandCompleteSuccess(HCI_INQUIRY_CANCEL); | |
453 | -} | |
454 | - | |
455 | -void DualModeController::HciDeleteStoredLinkKey( | |
456 | - const std::vector<uint8_t>& args) { | |
457 | - LogCommand("Delete Stored Link Key"); | |
458 | - /* Check the last octect in |args|. If it is 0, delete only the link key for | |
459 | - * the given BD_ADDR. If is is 1, delete all stored link keys. */ | |
460 | - SendCommandComplete(HCI_DELETE_STORED_LINK_KEY, {1}); | |
461 | -} | |
462 | - | |
463 | -void DualModeController::HciRemoteNameRequest( | |
464 | - const std::vector<uint8_t>& args) { | |
465 | - LogCommand("Remote Name Request"); | |
466 | - SendCommandStatusSuccess(HCI_RMT_NAME_REQUEST); | |
467 | -} | |
468 | - | |
469 | -DualModeController::Properties::Properties(const std::string& file_name) | |
470 | - : local_supported_commands_size_(64), local_name_size_(248) { | |
471 | - std::string properties_raw; | |
472 | - if (!base::ReadFileToString(base::FilePath(file_name), &properties_raw)) | |
473 | - LOG_INFO(LOG_TAG, "Error reading controller properties from file."); | |
474 | - | |
475 | - scoped_ptr<base::Value> properties_value_ptr = | |
476 | - base::JSONReader::Read(properties_raw); | |
477 | - if (properties_value_ptr.get() == nullptr) | |
478 | - LOG_INFO(LOG_TAG, | |
479 | - "Error controller properties may consist of ill-formed JSON."); | |
480 | - | |
481 | - // Get the underlying base::Value object, which is of type | |
482 | - // base::Value::TYPE_DICTIONARY, and read it into member variables. | |
483 | - base::Value& properties_dictionary = *(properties_value_ptr.get()); | |
484 | - base::JSONValueConverter<DualModeController::Properties> converter; | |
485 | - | |
486 | - if (!converter.Convert(properties_dictionary, this)) | |
487 | - LOG_INFO(LOG_TAG, | |
488 | - "Error converting JSON properties into Properties object."); | |
489 | -} | |
490 | - | |
491 | -const std::vector<uint8_t> DualModeController::Properties::GetBufferSize() { | |
492 | - return std::vector<uint8_t>( | |
493 | - {kSuccessStatus, acl_data_packet_size_, acl_data_packet_size_ >> 8, | |
494 | - sco_data_packet_size_, num_acl_data_packets_, num_acl_data_packets_ >> 8, | |
495 | - num_sco_data_packets_, num_sco_data_packets_ >> 8}); | |
496 | -} | |
497 | - | |
498 | -const std::vector<uint8_t> | |
499 | -DualModeController::Properties::GetLocalVersionInformation() { | |
500 | - return std::vector<uint8_t>({kSuccessStatus, version_, revision_, | |
501 | - revision_ >> 8, lmp_pal_version_, | |
502 | - manufacturer_name_, manufacturer_name_ >> 8, | |
503 | - lmp_pal_subversion_, lmp_pal_subversion_ >> 8}); | |
504 | -} | |
505 | - | |
506 | -const std::vector<uint8_t> DualModeController::Properties::GetBdAddress() { | |
507 | - return bd_address_; | |
508 | -} | |
509 | - | |
510 | -const std::vector<uint8_t> | |
511 | -DualModeController::Properties::GetLocalExtendedFeatures(uint8_t page_number) { | |
512 | - return std::vector<uint8_t>({kSuccessStatus, page_number, | |
513 | - maximum_page_number_, 0xFF, 0xFF, 0xFF, 0xFF, | |
514 | - 0xFF, 0xFF, 0xFF, 0xFF}); | |
515 | -} | |
516 | - | |
517 | -const std::vector<uint8_t> | |
518 | -DualModeController::Properties::GetLocalSupportedCommands() { | |
519 | - std::vector<uint8_t> local_supported_commands; | |
520 | - local_supported_commands.push_back(kSuccessStatus); | |
521 | - for (uint8_t i = 0; i < local_supported_commands_size_; ++i) | |
522 | - local_supported_commands.push_back(0xFF); | |
523 | - return local_supported_commands; | |
524 | -} | |
525 | - | |
526 | -const std::vector<uint8_t> DualModeController::Properties::GetLocalName() { | |
527 | - std::vector<uint8_t> local_name; | |
528 | - local_name.push_back(kSuccessStatus); | |
529 | - for (uint8_t i = 0; i < local_name_size_; ++i) | |
530 | - local_name.push_back(0xFF); | |
531 | - return local_name; | |
532 | -} | |
533 | - | |
534 | -// static | |
535 | -void DualModeController::Properties::RegisterJSONConverter( | |
536 | - base::JSONValueConverter<DualModeController::Properties>* converter) { | |
537 | - // TODO(dennischeng): Use RegisterIntField() here? | |
538 | -#define REGISTER_UINT8_T(field_name, field) \ | |
539 | - converter->RegisterCustomField<uint8_t>( \ | |
540 | - field_name, &DualModeController::Properties::field, &ParseUint8t); | |
541 | -#define REGISTER_UINT16_T(field_name, field) \ | |
542 | - converter->RegisterCustomField<uint16_t>( \ | |
543 | - field_name, &DualModeController::Properties::field, &ParseUint16t); | |
544 | - REGISTER_UINT16_T("AclDataPacketSize", acl_data_packet_size_); | |
545 | - REGISTER_UINT8_T("ScoDataPacketSize", sco_data_packet_size_); | |
546 | - REGISTER_UINT16_T("NumAclDataPackets", num_acl_data_packets_); | |
547 | - REGISTER_UINT16_T("NumScoDataPackets", num_sco_data_packets_); | |
548 | - REGISTER_UINT8_T("Version", version_); | |
549 | - REGISTER_UINT16_T("Revision", revision_); | |
550 | - REGISTER_UINT8_T("LmpPalVersion", lmp_pal_version_); | |
551 | - REGISTER_UINT16_T("ManufacturerName", manufacturer_name_); | |
552 | - REGISTER_UINT16_T("LmpPalSubversion", lmp_pal_subversion_); | |
553 | - REGISTER_UINT8_T("MaximumPageNumber", maximum_page_number_); | |
554 | - converter->RegisterCustomField<std::vector<uint8_t>>( | |
555 | - "BdAddress", &DualModeController::Properties::bd_address_, | |
556 | - &ParseUint8tVector); | |
557 | -#undef REGISTER_UINT8_T | |
558 | -#undef REGISTER_UINT16_T | |
559 | -} | |
560 | - | |
561 | -} // namespace test_vendor_lib |
@@ -1,131 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "event_packet" | |
18 | - | |
19 | -#define VECTOR_COPY_TO_END(source, destination) \ | |
20 | - std::copy(source.begin(), source.end(), std::back_inserter(destination)); | |
21 | - | |
22 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
23 | - | |
24 | -extern "C" { | |
25 | -#include "osi/include/log.h" | |
26 | -#include "stack/include/hcidefs.h" | |
27 | -} // extern "C" | |
28 | - | |
29 | -namespace test_vendor_lib { | |
30 | - | |
31 | -EventPacket::EventPacket(uint8_t event_code, | |
32 | - const std::vector<uint8_t>& payload) | |
33 | - : Packet(DATA_TYPE_EVENT) { | |
34 | - Encode({event_code, static_cast<uint8_t>(payload.size())}, payload); | |
35 | -} | |
36 | - | |
37 | -uint8_t EventPacket::GetEventCode() const { | |
38 | - return GetHeader()[0]; | |
39 | -} | |
40 | - | |
41 | -// static | |
42 | -std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteEvent( | |
43 | - uint8_t num_hci_command_packets, uint16_t command_opcode, | |
44 | - const std::vector<uint8_t>& event_return_parameters) { | |
45 | - size_t payload_size = sizeof(num_hci_command_packets) + | |
46 | - sizeof(command_opcode) + event_return_parameters.size(); | |
47 | - | |
48 | - std::vector<uint8_t> payload; | |
49 | - payload.reserve(payload_size); | |
50 | - payload.push_back(num_hci_command_packets); | |
51 | - payload.push_back(command_opcode); | |
52 | - payload.push_back(command_opcode >> 8); | |
53 | - VECTOR_COPY_TO_END(event_return_parameters, payload); | |
54 | - | |
55 | - return std::unique_ptr<EventPacket>( | |
56 | - new EventPacket(HCI_COMMAND_COMPLETE_EVT, payload)); | |
57 | -} | |
58 | - | |
59 | -// static | |
60 | -std::unique_ptr<EventPacket> EventPacket::CreateCommandStatusEvent( | |
61 | - uint8_t status, uint8_t num_hci_command_packets, uint16_t command_opcode) { | |
62 | - size_t payload_size = | |
63 | - sizeof(status) + sizeof(num_hci_command_packets) + sizeof(command_opcode); | |
64 | - | |
65 | - std::vector<uint8_t> payload; | |
66 | - payload.reserve(payload_size); | |
67 | - payload.push_back(status); | |
68 | - payload.push_back(num_hci_command_packets); | |
69 | - payload.push_back(command_opcode); | |
70 | - payload.push_back(command_opcode >> 8); | |
71 | - | |
72 | - return std::unique_ptr<EventPacket>( | |
73 | - new EventPacket(HCI_COMMAND_STATUS_EVT, payload)); | |
74 | -} | |
75 | - | |
76 | -//static | |
77 | -std::unique_ptr<EventPacket> EventPacket::CreateInquiryResultEvent( | |
78 | - uint8_t num_responses, const std::vector<uint8_t>& bd_addresses, | |
79 | - const std::vector<uint8_t>& page_scan_repetition_mode, | |
80 | - const std::vector<uint8_t>& page_scan_period_mode, | |
81 | - const std::vector<uint8_t>& page_scan_mode, | |
82 | - const std::vector<uint8_t>& class_of_device, | |
83 | - const std::vector<uint8_t>& clock_offset) { | |
84 | - size_t payload_size = sizeof(num_responses) + bd_addresses.size() + | |
85 | - page_scan_repetition_mode.size() + | |
86 | - page_scan_period_mode.size() + page_scan_mode.size() + | |
87 | - class_of_device.size() + clock_offset.size(); | |
88 | - | |
89 | - std::vector<uint8_t> payload; | |
90 | - payload.reserve(payload_size); | |
91 | - payload.push_back(num_responses); | |
92 | - VECTOR_COPY_TO_END(bd_addresses, payload); | |
93 | - VECTOR_COPY_TO_END(page_scan_repetition_mode, payload); | |
94 | - VECTOR_COPY_TO_END(page_scan_mode, payload); | |
95 | - VECTOR_COPY_TO_END(class_of_device, payload); | |
96 | - VECTOR_COPY_TO_END(clock_offset, payload); | |
97 | - | |
98 | - return std::unique_ptr<EventPacket>( | |
99 | - new EventPacket(HCI_INQUIRY_RESULT_EVT, payload)); | |
100 | -} | |
101 | - | |
102 | -//static | |
103 | -std::unique_ptr<EventPacket> EventPacket::CreateExtendedInquiryResultEvent( | |
104 | - const std::vector<uint8_t>& bd_address, | |
105 | - const std::vector<uint8_t>& page_scan_repetition_mode, | |
106 | - const std::vector<uint8_t>& page_scan_period_mode, | |
107 | - const std::vector<uint8_t>& class_of_device, | |
108 | - const std::vector<uint8_t>& clock_offset, | |
109 | - const std::vector<uint8_t>& rssi, | |
110 | - const std::vector<uint8_t>& extended_inquiry_response) { | |
111 | - size_t payload_size = | |
112 | - 1 + bd_address.size() + page_scan_repetition_mode.size() + | |
113 | - page_scan_period_mode.size() + class_of_device.size() + | |
114 | - clock_offset.size() + rssi.size() + extended_inquiry_response.size(); | |
115 | - | |
116 | - std::vector<uint8_t> payload; | |
117 | - payload.reserve(payload_size); | |
118 | - payload.push_back(1); // Each extended inquiry result contains one device. | |
119 | - VECTOR_COPY_TO_END(bd_address, payload); | |
120 | - VECTOR_COPY_TO_END(page_scan_repetition_mode, payload); | |
121 | - VECTOR_COPY_TO_END(page_scan_period_mode, payload); | |
122 | - VECTOR_COPY_TO_END(class_of_device, payload); | |
123 | - VECTOR_COPY_TO_END(clock_offset, payload); | |
124 | - VECTOR_COPY_TO_END(rssi, payload); | |
125 | - VECTOR_COPY_TO_END(extended_inquiry_response, payload); | |
126 | - | |
127 | - return std::unique_ptr<EventPacket>( | |
128 | - new EventPacket(HCI_EXTENDED_INQUIRY_RESULT_EVT, payload)); | |
129 | -} | |
130 | - | |
131 | -} // namespace test_vendor_lib |
@@ -1,173 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "hci_transport" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/hci_transport.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | -#include "base/bind.h" | |
23 | -#include "base/thread_task_runner_handle.h" | |
24 | - | |
25 | -extern "C" { | |
26 | -#include <inttypes.h> | |
27 | -#include <sys/socket.h> | |
28 | -#include "stack/include/hcidefs.h" | |
29 | -#include "osi/include/log.h" | |
30 | -} // extern "C" | |
31 | - | |
32 | -namespace test_vendor_lib { | |
33 | - | |
34 | -HciTransport::HciTransport() : weak_ptr_factory_(this) {} | |
35 | - | |
36 | -void HciTransport::CloseHciFd() { | |
37 | - hci_fd_.reset(nullptr); | |
38 | -} | |
39 | - | |
40 | -void HciTransport::CloseVendorFd() { | |
41 | - vendor_fd_.reset(nullptr); | |
42 | -} | |
43 | - | |
44 | -int HciTransport::GetHciFd() const { | |
45 | - return hci_fd_->get(); | |
46 | -} | |
47 | - | |
48 | -int HciTransport::GetVendorFd() const { | |
49 | - return vendor_fd_->get(); | |
50 | -} | |
51 | - | |
52 | -bool HciTransport::SetUp() { | |
53 | - int socketpair_fds[2]; | |
54 | - // TODO(dennischeng): Use SOCK_SEQPACKET here. | |
55 | - const int success = socketpair(AF_LOCAL, SOCK_STREAM, 0, socketpair_fds); | |
56 | - if (success < 0) | |
57 | - return false; | |
58 | - hci_fd_.reset(new base::ScopedFD(socketpair_fds[0])); | |
59 | - vendor_fd_.reset(new base::ScopedFD(socketpair_fds[1])); | |
60 | - return true; | |
61 | -} | |
62 | - | |
63 | -void HciTransport::OnFileCanReadWithoutBlocking(int fd) { | |
64 | - CHECK(fd == GetVendorFd()); | |
65 | - LOG_INFO(LOG_TAG, "Event ready in HciTransport on fd: %d.", fd); | |
66 | - | |
67 | - const serial_data_type_t packet_type = packet_stream_.ReceivePacketType(fd); | |
68 | - switch (packet_type) { | |
69 | - case (DATA_TYPE_COMMAND): { | |
70 | - ReceiveReadyCommand(); | |
71 | - break; | |
72 | - } | |
73 | - | |
74 | - case (DATA_TYPE_ACL): { | |
75 | - LOG_INFO(LOG_TAG, "ACL data packets not currently supported."); | |
76 | - break; | |
77 | - } | |
78 | - | |
79 | - case (DATA_TYPE_SCO): { | |
80 | - LOG_INFO(LOG_TAG, "SCO data packets not currently supported."); | |
81 | - break; | |
82 | - } | |
83 | - | |
84 | - // TODO(dennischeng): Add debug level assert here. | |
85 | - default: { | |
86 | - LOG_INFO(LOG_TAG, "Error received an invalid packet type from the HCI."); | |
87 | - break; | |
88 | - } | |
89 | - } | |
90 | -} | |
91 | - | |
92 | -void HciTransport::ReceiveReadyCommand() const { | |
93 | - std::unique_ptr<CommandPacket> command = | |
94 | - packet_stream_.ReceiveCommand(GetVendorFd()); | |
95 | - LOG_INFO(LOG_TAG, "Received command packet."); | |
96 | - command_handler_(std::move(command)); | |
97 | -} | |
98 | - | |
99 | -void HciTransport::RegisterCommandHandler( | |
100 | - std::function<void(std::unique_ptr<CommandPacket>)> callback) { | |
101 | - command_handler_ = callback; | |
102 | -} | |
103 | - | |
104 | -void HciTransport::OnFileCanWriteWithoutBlocking(int fd) { | |
105 | - CHECK(fd == GetVendorFd()); | |
106 | - if (!outbound_events_.empty()) { | |
107 | - base::TimeTicks current_time = base::TimeTicks::Now(); | |
108 | - // Check outbound events for events that can be sent, i.e. events with a | |
109 | - // timestamp before the current time. Stop sending events when | |
110 | - // |packet_stream_| fails writing. | |
111 | - for (auto it = outbound_events_.begin(); it != outbound_events_.end();) { | |
112 | - if ((*it)->GetTimeStamp() > current_time) { | |
113 | - ++it; | |
114 | - continue; | |
115 | - } | |
116 | - if (!packet_stream_.SendEvent((*it)->GetEvent(), fd)) | |
117 | - return; | |
118 | - it = outbound_events_.erase(it); | |
119 | - } | |
120 | - } | |
121 | -} | |
122 | - | |
123 | -void HciTransport::AddEventToOutboundEvents( | |
124 | - std::unique_ptr<TimeStampedEvent> event) { | |
125 | - outbound_events_.push_back(std::move(event)); | |
126 | -} | |
127 | - | |
128 | -void HciTransport::PostEventResponse(std::unique_ptr<EventPacket> event) { | |
129 | - AddEventToOutboundEvents( | |
130 | - std::make_unique<TimeStampedEvent>(std::move(event))); | |
131 | -} | |
132 | - | |
133 | -void HciTransport::PostDelayedEventResponse(std::unique_ptr<EventPacket> event, | |
134 | - base::TimeDelta delay) { | |
135 | - // TODO(dennischeng): When it becomes available for MessageLoopForIO, use the | |
136 | - // thread's task runner to post |PostEventResponse| as a delayed task, being | |
137 | - // sure to CHECK the appropriate task runner attributes using | |
138 | - // base::ThreadTaskRunnerHandle. | |
139 | - | |
140 | - // The system does not support high resolution timing and the clock could be | |
141 | - // as coarse as ~15.6 ms so the event is sent without a delay to avoid | |
142 | - // inconsistent event responses. | |
143 | - if (!base::TimeTicks::IsHighResolution()) { | |
144 | - LOG_INFO(LOG_TAG, | |
145 | - "System does not support high resolution timing. Sending event " | |
146 | - "without delay."); | |
147 | - PostEventResponse(std::move(event)); | |
148 | - } | |
149 | - | |
150 | - LOG_INFO(LOG_TAG, "Posting event response with delay of %" PRId64 " ms.", | |
151 | - delay.InMilliseconds()); | |
152 | - | |
153 | - AddEventToOutboundEvents( | |
154 | - std::make_unique<TimeStampedEvent>(std::move(event), delay)); | |
155 | -} | |
156 | - | |
157 | -HciTransport::TimeStampedEvent::TimeStampedEvent( | |
158 | - std::unique_ptr<EventPacket> event, base::TimeDelta delay) | |
159 | - : event_(std::move(event)), time_stamp_(base::TimeTicks::Now() + delay) {} | |
160 | - | |
161 | -HciTransport::TimeStampedEvent::TimeStampedEvent( | |
162 | - std::unique_ptr<EventPacket> event) | |
163 | - : event_(std::move(event)), time_stamp_(base::TimeTicks::UnixEpoch()) {} | |
164 | - | |
165 | -const base::TimeTicks& HciTransport::TimeStampedEvent::GetTimeStamp() const { | |
166 | - return time_stamp_; | |
167 | -} | |
168 | - | |
169 | -const EventPacket& HciTransport::TimeStampedEvent::GetEvent() { | |
170 | - return *(event_.get()); | |
171 | -} | |
172 | - | |
173 | -} // namespace test_vendor_lib |
@@ -1,69 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "packet" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | - | |
23 | -#include <algorithm> | |
24 | - | |
25 | -extern "C" { | |
26 | -#include "osi/include/log.h" | |
27 | -} // extern "C" | |
28 | - | |
29 | -namespace test_vendor_lib { | |
30 | - | |
31 | -Packet::Packet(serial_data_type_t type) : type_(type) {} | |
32 | - | |
33 | -bool Packet::Encode(const std::vector<uint8_t>& header, | |
34 | - const std::vector<uint8_t>& payload) { | |
35 | - if (header.back() != payload.size()) | |
36 | - return false; | |
37 | - header_ = header; | |
38 | - payload_ = payload; | |
39 | - return true; | |
40 | -} | |
41 | - | |
42 | -const std::vector<uint8_t>& Packet::GetHeader() const { | |
43 | - // Every packet must have a header. | |
44 | - CHECK(GetHeaderSize() > 0); | |
45 | - return header_; | |
46 | -} | |
47 | - | |
48 | -uint8_t Packet::GetHeaderSize() const { | |
49 | - return header_.size(); | |
50 | -} | |
51 | - | |
52 | -size_t Packet::GetPacketSize() const { | |
53 | - // Add one for the type octet. | |
54 | - return 1 + header_.size() + payload_.size(); | |
55 | -} | |
56 | - | |
57 | -const std::vector<uint8_t>& Packet::GetPayload() const { | |
58 | - return payload_; | |
59 | -} | |
60 | - | |
61 | -uint8_t Packet::GetPayloadSize() const { | |
62 | - return payload_.size(); | |
63 | -} | |
64 | - | |
65 | -serial_data_type_t Packet::GetType() const { | |
66 | - return type_; | |
67 | -} | |
68 | - | |
69 | -} // namespace test_vendor_lib |
@@ -1,134 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "packet_stream" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/packet_stream.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | - | |
23 | -extern "C" { | |
24 | -#include <errno.h> | |
25 | -#include <unistd.h> | |
26 | - | |
27 | -#include "osi/include/log.h" | |
28 | -} // extern "C" | |
29 | - | |
30 | -namespace test_vendor_lib { | |
31 | - | |
32 | -std::unique_ptr<CommandPacket> PacketStream::ReceiveCommand(int fd) const { | |
33 | - std::vector<uint8_t> header; | |
34 | - std::vector<uint8_t> payload; | |
35 | - | |
36 | - if (!ReceiveAll(header, CommandPacket::kCommandHeaderSize, fd)) { | |
37 | - LOG_ERROR(LOG_TAG, "Error: receiving command header."); | |
38 | - return std::unique_ptr<CommandPacket>(nullptr); | |
39 | - } | |
40 | - | |
41 | - if (!ReceiveAll(payload, header.back(), fd)) { | |
42 | - LOG_ERROR(LOG_TAG, "Error: receiving command payload."); | |
43 | - return std::unique_ptr<CommandPacket>(nullptr); | |
44 | - } | |
45 | - | |
46 | - std::unique_ptr<CommandPacket> command(new CommandPacket()); | |
47 | - if (!command->Encode(header, payload)) { | |
48 | - LOG_ERROR(LOG_TAG, "Error: encoding command packet."); | |
49 | - command.reset(nullptr); | |
50 | - } | |
51 | - return command; | |
52 | -} | |
53 | - | |
54 | -serial_data_type_t PacketStream::ReceivePacketType(int fd) const { | |
55 | - LOG_INFO(LOG_TAG, "Receiving packet type."); | |
56 | - | |
57 | - std::vector<uint8_t> raw_type_octet; | |
58 | - | |
59 | - if (!ReceiveAll(raw_type_octet, 1, fd)) { | |
60 | - // TODO(dennischeng): Proper error handling. | |
61 | - LOG_ERROR(LOG_TAG, "Error: Could not receive packet type."); | |
62 | - } | |
63 | - | |
64 | - // Check that the type octet received is in the valid range, i.e. the packet | |
65 | - // must be a command or data packet. | |
66 | - const serial_data_type_t type = | |
67 | - static_cast<serial_data_type_t>(raw_type_octet[0]); | |
68 | - if (!ValidateTypeOctet(type)) { | |
69 | - // TODO(dennischeng): Proper error handling. | |
70 | - LOG_ERROR(LOG_TAG, "Error: Received invalid packet type."); | |
71 | - } | |
72 | - return type; | |
73 | -} | |
74 | - | |
75 | -bool PacketStream::SendEvent(const EventPacket& event, int fd) const { | |
76 | - LOG_INFO(LOG_TAG, "Sending event with event code: 0x%04X", | |
77 | - event.GetEventCode()); | |
78 | - LOG_INFO(LOG_TAG, "Sending event with size: %zu octets", | |
79 | - event.GetPacketSize()); | |
80 | - | |
81 | - if (!SendAll({static_cast<uint8_t>(event.GetType())}, 1, fd)) { | |
82 | - LOG_ERROR(LOG_TAG, "Error: Could not send event type."); | |
83 | - return false; | |
84 | - } | |
85 | - | |
86 | - if (!SendAll(event.GetHeader(), event.GetHeaderSize(), fd)) { | |
87 | - LOG_ERROR(LOG_TAG, "Error: Could not send event header."); | |
88 | - return false; | |
89 | - } | |
90 | - | |
91 | - if (!SendAll(event.GetPayload(), event.GetPayloadSize(), fd)) { | |
92 | - LOG_ERROR(LOG_TAG, "Error: Could not send event payload."); | |
93 | - return false; | |
94 | - } | |
95 | - return true; | |
96 | -} | |
97 | - | |
98 | -bool PacketStream::ValidateTypeOctet(serial_data_type_t type) const { | |
99 | - LOG_INFO(LOG_TAG, "Signal octet is 0x%02X.", type); | |
100 | - // The only types of packets that should be received from the HCI are command | |
101 | - // packets and data packets. | |
102 | - return (type >= DATA_TYPE_COMMAND) && (type <= DATA_TYPE_SCO); | |
103 | -} | |
104 | - | |
105 | -bool PacketStream::ReceiveAll(std::vector<uint8_t>& destination, | |
106 | - size_t num_octets_to_receive, int fd) const { | |
107 | - destination.resize(num_octets_to_receive); | |
108 | - size_t octets_remaining = num_octets_to_receive; | |
109 | - while (octets_remaining > 0) { | |
110 | - const int num_octets_received = | |
111 | - read(fd, &destination[num_octets_to_receive - octets_remaining], | |
112 | - octets_remaining); | |
113 | - if (num_octets_received < 0) | |
114 | - return false; | |
115 | - octets_remaining -= num_octets_received; | |
116 | - } | |
117 | - return true; | |
118 | -} | |
119 | - | |
120 | -bool PacketStream::SendAll(const std::vector<uint8_t>& source, | |
121 | - size_t num_octets_to_send, int fd) const { | |
122 | - CHECK(source.size() >= num_octets_to_send); | |
123 | - size_t octets_remaining = num_octets_to_send; | |
124 | - while (octets_remaining > 0) { | |
125 | - const int num_octets_sent = write( | |
126 | - fd, &source[num_octets_to_send - octets_remaining], octets_remaining); | |
127 | - if (num_octets_sent < 0) | |
128 | - return false; | |
129 | - octets_remaining -= num_octets_sent; | |
130 | - } | |
131 | - return true; | |
132 | -} | |
133 | - | |
134 | -} // namespace test_vendor_lib |
@@ -1,138 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "test_channel_transport" | |
18 | - | |
19 | -#include "vendor_libs/test_vendor_lib/include/test_channel_transport.h" | |
20 | - | |
21 | -#include "base/logging.h" | |
22 | - | |
23 | -extern "C" { | |
24 | -#include "osi/include/log.h" | |
25 | - | |
26 | -#include <sys/socket.h> | |
27 | -#include <netinet/in.h> | |
28 | -} // extern "C" | |
29 | - | |
30 | -namespace test_vendor_lib { | |
31 | - | |
32 | -TestChannelTransport::TestChannelTransport(bool enabled, int port) | |
33 | - : enabled_(enabled), port_(port) {} | |
34 | - | |
35 | -bool TestChannelTransport::SetUp() { | |
36 | - CHECK(enabled_); | |
37 | - | |
38 | - struct sockaddr_in listen_address, test_channel_address; | |
39 | - int sockaddr_in_size = sizeof(struct sockaddr_in); | |
40 | - int listen_fd = -1; | |
41 | - int accept_fd = -1; | |
42 | - memset(&listen_address, 0, sockaddr_in_size); | |
43 | - memset(&test_channel_address, 0, sockaddr_in_size); | |
44 | - | |
45 | - if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { | |
46 | - LOG_INFO(LOG_TAG, "Error creating socket for test channel."); | |
47 | - return false; | |
48 | - } | |
49 | - | |
50 | - LOG_INFO(LOG_TAG, "port: %d", port_); | |
51 | - listen_address.sin_family = AF_INET; | |
52 | - listen_address.sin_port = htons(port_); | |
53 | - listen_address.sin_addr.s_addr = htonl(INADDR_ANY); | |
54 | - | |
55 | - if (bind(listen_fd, reinterpret_cast<sockaddr*>(&listen_address), | |
56 | - sockaddr_in_size) < 0) { | |
57 | - LOG_INFO(LOG_TAG, "Error binding test channel listener socket to address."); | |
58 | - close(listen_fd); | |
59 | - return false; | |
60 | - } | |
61 | - | |
62 | - if (listen(listen_fd, 1) < 0) { | |
63 | - LOG_INFO(LOG_TAG, "Error listening for test channel."); | |
64 | - close(listen_fd); | |
65 | - return false; | |
66 | - } | |
67 | - | |
68 | - if ((accept_fd = | |
69 | - accept(listen_fd, reinterpret_cast<sockaddr*>(&test_channel_address), | |
70 | - &sockaddr_in_size)) < 0) { | |
71 | - LOG_INFO(LOG_TAG, "Error accepting test channel connection."); | |
72 | - close(listen_fd); | |
73 | - return false; | |
74 | - } | |
75 | - | |
76 | - fd_.reset(new base::ScopedFD(accept_fd)); | |
77 | - return GetFd() >= 0; | |
78 | -} | |
79 | - | |
80 | -int TestChannelTransport::GetFd() { | |
81 | - return fd_->get(); | |
82 | -} | |
83 | - | |
84 | -bool TestChannelTransport::IsEnabled() { | |
85 | - return enabled_; | |
86 | -} | |
87 | - | |
88 | -// base::MessageLoopForIO::Watcher overrides: | |
89 | -void TestChannelTransport::OnFileCanReadWithoutBlocking(int fd) { | |
90 | - CHECK(fd == GetFd()); | |
91 | - | |
92 | - LOG_INFO(LOG_TAG, "Event ready in TestChannelTransport on fd: %d", fd); | |
93 | - uint8_t command_name_size = 0; | |
94 | - read(fd, &command_name_size, 1); | |
95 | - std::vector<uint8_t> command_name_raw; | |
96 | - command_name_raw.resize(command_name_size); | |
97 | - read(fd, &command_name_raw[0], command_name_size); | |
98 | - std::string command_name(command_name_raw.begin(), command_name_raw.end()); | |
99 | - LOG_INFO(LOG_TAG, "Received command from test channel: %s", | |
100 | - command_name.data()); | |
101 | - | |
102 | - if (command_name == "CLOSE_TEST_CHANNEL") { | |
103 | - fd_.reset(nullptr); | |
104 | - return; | |
105 | - } | |
106 | - | |
107 | - uint8_t num_args = 0; | |
108 | - read(fd, &num_args, 1); | |
109 | - LOG_INFO(LOG_TAG, "num_args: %d", num_args); | |
110 | - std::vector<std::string> args; | |
111 | - for (uint8_t i = 0; i < num_args; ++i) { | |
112 | - uint8_t arg_size = 0; | |
113 | - read(fd, &arg_size, 1); | |
114 | - std::vector<uint8_t> arg; | |
115 | - arg.resize(arg_size); | |
116 | - read(fd, &arg[0], arg_size); | |
117 | - args.push_back(std::string(arg.begin(), arg.end())); | |
118 | - } | |
119 | - | |
120 | - for (size_t i = 0; i < args.size(); ++i) | |
121 | - LOG_INFO(LOG_TAG, "Command argument %zu: %s", i, args[i].data()); | |
122 | - | |
123 | - command_handler_(command_name, args); | |
124 | -} | |
125 | - | |
126 | -void TestChannelTransport::OnFileCanWriteWithoutBlocking(int fd) {} | |
127 | - | |
128 | -void TestChannelTransport::RegisterCommandHandler( | |
129 | - std::function<void(const std::string&, const std::vector<std::string>&)> | |
130 | - callback) { | |
131 | - command_handler_ = callback; | |
132 | -} | |
133 | - | |
134 | -void TestChannelTransport::Disable() { | |
135 | - enabled_ = false; | |
136 | -} | |
137 | - | |
138 | -} // namespace test_vendor_lib { |
@@ -1,149 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#define LOG_TAG "vendor_manager" | |
18 | - | |
19 | -#include "vendor_manager.h" | |
20 | - | |
21 | -#include "base/bind.h" | |
22 | -#include "base/logging.h" | |
23 | - | |
24 | -extern "C" { | |
25 | -#include "osi/include/log.h" | |
26 | -} // extern "C" | |
27 | - | |
28 | -namespace test_vendor_lib { | |
29 | - | |
30 | -VendorManager* g_manager = nullptr; | |
31 | - | |
32 | -// static | |
33 | -void VendorManager::CleanUp() { | |
34 | - delete g_manager; | |
35 | - g_manager = nullptr; | |
36 | -} | |
37 | - | |
38 | -// static | |
39 | -VendorManager* VendorManager::Get() { | |
40 | - // Initialize should have been called already. | |
41 | - CHECK(g_manager); | |
42 | - return g_manager; | |
43 | -} | |
44 | - | |
45 | -// static | |
46 | -void VendorManager::Initialize() { | |
47 | - CHECK(!g_manager); | |
48 | - g_manager = new VendorManager(); | |
49 | -} | |
50 | - | |
51 | -VendorManager::VendorManager() | |
52 | - : running_(false), | |
53 | - test_channel_transport_(true, 6111), | |
54 | - thread_("TestVendorLibrary"), | |
55 | - weak_ptr_factory_(this) {} | |
56 | - | |
57 | -bool VendorManager::Run() { | |
58 | - CHECK(!running_); | |
59 | - | |
60 | - if (!transport_.SetUp()) { | |
61 | - LOG_ERROR(LOG_TAG, "Error setting up transport object."); | |
62 | - return false; | |
63 | - } | |
64 | - | |
65 | - if (test_channel_transport_.IsEnabled()) { | |
66 | - LOG_INFO(LOG_TAG, "Test channel is enabled."); | |
67 | - | |
68 | - if (test_channel_transport_.SetUp()) { | |
69 | - controller_.RegisterHandlersWithTestChannelTransport( | |
70 | - test_channel_transport_); | |
71 | - } else { | |
72 | - LOG_ERROR(LOG_TAG, | |
73 | - "Error setting up test channel object, continuing without it."); | |
74 | - test_channel_transport_.Disable(); | |
75 | - } | |
76 | - } else { | |
77 | - LOG_INFO(LOG_TAG, "Test channel is disabled."); | |
78 | - } | |
79 | - | |
80 | - controller_.RegisterHandlersWithHciTransport(transport_); | |
81 | - // TODO(dennischeng): Register PostDelayedEventResponse instead. | |
82 | - controller_.RegisterDelayedEventChannel( | |
83 | - std::bind(&HciTransport::PostDelayedEventResponse, &transport_, | |
84 | - std::placeholders::_1, std::placeholders::_2)); | |
85 | - | |
86 | - running_ = true; | |
87 | - if (!thread_.StartWithOptions( | |
88 | - base::Thread::Options(base::MessageLoop::TYPE_IO, 0))) { | |
89 | - LOG_ERROR(LOG_TAG, "Error starting TestVendorLibrary thread."); | |
90 | - running_ = false; | |
91 | - return false; | |
92 | - } | |
93 | - | |
94 | - if (!PostTask(base::Bind(&VendorManager::StartWatchingOnThread, | |
95 | - weak_ptr_factory_.GetWeakPtr()))) { | |
96 | - LOG_ERROR(LOG_TAG, "Error posting StartWatchingOnThread to task runner."); | |
97 | - running_ = false; | |
98 | - return false; | |
99 | - } | |
100 | - | |
101 | - return true; | |
102 | -} | |
103 | - | |
104 | -void VendorManager::StartWatchingOnThread() { | |
105 | - CHECK(running_); | |
106 | - CHECK(base::MessageLoopForIO::IsCurrent()); | |
107 | - | |
108 | - if (!base::MessageLoopForIO::current()->WatchFileDescriptor( | |
109 | - transport_.GetVendorFd(), true, | |
110 | - base::MessageLoopForIO::WATCH_READ_WRITE, &hci_watcher_, | |
111 | - &transport_)) { | |
112 | - LOG_ERROR(LOG_TAG, "Error watching vendor fd."); | |
113 | - return; | |
114 | - } | |
115 | - | |
116 | - if (test_channel_transport_.IsEnabled()) | |
117 | - if (!base::MessageLoopForIO::current()->WatchFileDescriptor( | |
118 | - test_channel_transport_.GetFd(), true, | |
119 | - base::MessageLoopForIO::WATCH_READ, &test_channel_watcher_, | |
120 | - &test_channel_transport_)) | |
121 | - LOG_ERROR(LOG_TAG, "Error watching test channel fd."); | |
122 | -} | |
123 | - | |
124 | -bool VendorManager::PostTask(const base::Closure& task) { | |
125 | - return PostDelayedTask(task, base::TimeDelta::FromMilliseconds(0)); | |
126 | -} | |
127 | - | |
128 | -bool VendorManager::PostDelayedTask(const base::Closure& task, | |
129 | - base::TimeDelta delay) { | |
130 | - return thread_.task_runner()->PostDelayedTask(FROM_HERE, task, delay); | |
131 | -} | |
132 | - | |
133 | -void VendorManager::SetVendorCallbacks(const bt_vendor_callbacks_t& callbacks) { | |
134 | - vendor_callbacks_ = callbacks; | |
135 | -} | |
136 | - | |
137 | -const bt_vendor_callbacks_t& VendorManager::GetVendorCallbacks() const { | |
138 | - return vendor_callbacks_; | |
139 | -} | |
140 | - | |
141 | -void VendorManager::CloseHciFd() { | |
142 | - transport_.CloseHciFd(); | |
143 | -} | |
144 | - | |
145 | -int VendorManager::GetHciFd() const { | |
146 | - return transport_.GetHciFd(); | |
147 | -} | |
148 | - | |
149 | -} // namespace test_vendor_lib |
@@ -1,140 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
18 | -#include "vendor_libs/test_vendor_lib/include/hci_transport.h" | |
19 | - | |
20 | -#include "base/bind.h" | |
21 | -#include "base/message_loop/message_loop.h" | |
22 | -#include "base/threading/thread.h" | |
23 | - | |
24 | -#include <gtest/gtest.h> | |
25 | -#include <functional> | |
26 | -#include <mutex> | |
27 | - | |
28 | -extern "C" { | |
29 | -#include "stack/include/hcidefs.h" | |
30 | -} // extern "C" | |
31 | - | |
32 | -namespace { | |
33 | -const std::vector<uint8_t> stub_command({DATA_TYPE_COMMAND, | |
34 | - static_cast<uint8_t>(HCI_RESET), | |
35 | - static_cast<uint8_t>(HCI_RESET >> 8), | |
36 | - 0}); | |
37 | - | |
38 | -const int kMultiIterations = 10000; | |
39 | - | |
40 | -void WriteStubCommand(int fd) { | |
41 | - write(fd, &stub_command[0], stub_command.size()); | |
42 | -} | |
43 | - | |
44 | -} // namespace | |
45 | - | |
46 | -namespace test_vendor_lib { | |
47 | - | |
48 | -class HciTransportTest : public ::testing::Test { | |
49 | - public: | |
50 | - HciTransportTest() | |
51 | - : command_callback_count_(0), | |
52 | - thread_("HciTransportTest"), | |
53 | - weak_ptr_factory_(this) { | |
54 | - SetUpTransport(); | |
55 | - StartThread(); | |
56 | - PostStartWatchingOnThread(); | |
57 | - } | |
58 | - | |
59 | - ~HciTransportTest() { | |
60 | - transport_.CloseHciFd(); | |
61 | - } | |
62 | - | |
63 | - void CommandCallback(std::unique_ptr<CommandPacket> command) { | |
64 | - ++command_callback_count_; | |
65 | - // Ensure that the received packet matches the stub command. | |
66 | - EXPECT_EQ(DATA_TYPE_COMMAND, command->GetType()); | |
67 | - EXPECT_EQ(HCI_RESET, command->GetOpcode()); | |
68 | - EXPECT_EQ(0, command->GetPayloadSize()); | |
69 | - transport_.CloseVendorFd(); | |
70 | - } | |
71 | - | |
72 | - void MultiCommandCallback(std::unique_ptr<CommandPacket> command) { | |
73 | - ++command_callback_count_; | |
74 | - // Ensure that the received packet matches the stub command. | |
75 | - EXPECT_EQ(DATA_TYPE_COMMAND, command->GetType()); | |
76 | - EXPECT_EQ(HCI_RESET, command->GetOpcode()); | |
77 | - EXPECT_EQ(0, command->GetPayloadSize()); | |
78 | - if (command_callback_count_ == kMultiIterations) | |
79 | - transport_.CloseVendorFd(); | |
80 | - } | |
81 | - | |
82 | - protected: | |
83 | - // Tracks the number of commands received. | |
84 | - int command_callback_count_; | |
85 | - base::Thread thread_; | |
86 | - HciTransport transport_; | |
87 | - base::MessageLoopForIO::FileDescriptorWatcher watcher_; | |
88 | - base::WeakPtrFactory<HciTransportTest> weak_ptr_factory_; | |
89 | - | |
90 | - private: | |
91 | - // Workaround because ASSERT cannot be used directly in a constructor | |
92 | - void SetUpTransport() { | |
93 | - ASSERT_TRUE(transport_.SetUp()); | |
94 | - } | |
95 | - | |
96 | - void StartThread() { | |
97 | - ASSERT_TRUE(thread_.StartWithOptions( | |
98 | - base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); | |
99 | - } | |
100 | - | |
101 | - void PostStartWatchingOnThread() { | |
102 | - thread_.task_runner()->PostTask( | |
103 | - FROM_HERE, base::Bind(&HciTransportTest::StartWatchingOnThread, | |
104 | - weak_ptr_factory_.GetWeakPtr())); | |
105 | - } | |
106 | - | |
107 | - void StartWatchingOnThread() { | |
108 | - base::MessageLoopForIO* loop = | |
109 | - static_cast<base::MessageLoopForIO*>(thread_.message_loop()); | |
110 | - ASSERT_TRUE(loop); | |
111 | - ASSERT_TRUE(loop->WatchFileDescriptor( | |
112 | - transport_.GetVendorFd(), true, | |
113 | - base::MessageLoopForIO::WATCH_READ_WRITE, &watcher_, &transport_)); | |
114 | - } | |
115 | -}; | |
116 | - | |
117 | -TEST_F(HciTransportTest, SingleCommandCallback) { | |
118 | - transport_.RegisterCommandHandler(std::bind( | |
119 | - &HciTransportTest::CommandCallback, this, std::placeholders::_1)); | |
120 | - EXPECT_EQ(0, command_callback_count_); | |
121 | - WriteStubCommand(transport_.GetHciFd()); | |
122 | - thread_.Stop(); // Wait for the command handler to finish. | |
123 | - EXPECT_EQ(1, command_callback_count_); | |
124 | -} | |
125 | - | |
126 | -TEST_F(HciTransportTest, MultiCommandCallback) { | |
127 | - transport_.RegisterCommandHandler(std::bind( | |
128 | - &HciTransportTest::MultiCommandCallback, this, std::placeholders::_1)); | |
129 | - EXPECT_EQ(0, command_callback_count_); | |
130 | - WriteStubCommand(transport_.GetHciFd()); | |
131 | - for (int i = 1; i < kMultiIterations; ++i) | |
132 | - WriteStubCommand(transport_.GetHciFd()); | |
133 | - thread_.Stop(); // Wait for the command handler to finish. | |
134 | - EXPECT_EQ(kMultiIterations, command_callback_count_); | |
135 | -} | |
136 | - | |
137 | -// TODO(dennischeng): Add tests for PostEventResponse and | |
138 | -// PostDelayedEventResponse. | |
139 | - | |
140 | -} // namespace test_vendor_lib |
@@ -1,151 +0,0 @@ | ||
1 | -// | |
2 | -// Copyright 2015 The Android Open Source Project | |
3 | -// | |
4 | -// Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | -// you may not use this file except in compliance with the License. | |
6 | -// You may obtain a copy of the License at | |
7 | -// | |
8 | -// http://www.apache.org/licenses/LICENSE-2.0 | |
9 | -// | |
10 | -// Unless required by applicable law or agreed to in writing, software | |
11 | -// distributed under the License is distributed on an "AS IS" BASIS, | |
12 | -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | -// See the License for the specific language governing permissions and | |
14 | -// limitations under the License. | |
15 | -// | |
16 | - | |
17 | -#include "vendor_libs/test_vendor_lib/include/packet_stream.h" | |
18 | -#include "vendor_libs/test_vendor_lib/include/command_packet.h" | |
19 | -#include "vendor_libs/test_vendor_lib/include/event_packet.h" | |
20 | -#include "vendor_libs/test_vendor_lib/include/packet.h" | |
21 | - | |
22 | -#include <gtest/gtest.h> | |
23 | -#include <cstdint> | |
24 | -#include <memory> | |
25 | -#include <vector> | |
26 | - | |
27 | -extern "C" { | |
28 | -#include "hci/include/hci_hal.h" | |
29 | -#include "stack/include/hcidefs.h" | |
30 | - | |
31 | -#include <sys/socket.h> | |
32 | -} // extern "C" | |
33 | - | |
34 | -namespace { | |
35 | -const char small_payload[] = "foo bar baz"; | |
36 | -const char large_payload[] = | |
37 | - "Aristotle's principles will then be no more principles to him, than those " | |
38 | - "of Epicurus and the Stoics: let this diversity of opinions be propounded " | |
39 | - "to, and laid before him; he will himself choose, if he be able; if not, " | |
40 | - "he will remain in doubt."; | |
41 | -} // namespace | |
42 | - | |
43 | -namespace test_vendor_lib { | |
44 | - | |
45 | -class PacketStreamTest : public ::testing::Test { | |
46 | - public: | |
47 | - PacketStreamTest() { | |
48 | - socketpair(AF_LOCAL, SOCK_STREAM, 0, socketpair_fds_); | |
49 | - CheckSocketpairInit(); | |
50 | - } | |
51 | - | |
52 | - ~PacketStreamTest() { | |
53 | - close(socketpair_fds_[0]); | |
54 | - close(socketpair_fds_[1]); | |
55 | - } | |
56 | - | |
57 | - void CheckedReceiveCommand(const char* payload, uint16_t opcode) { | |
58 | - uint8_t payload_size = strlen(payload); | |
59 | - std::vector<uint8_t> packet; | |
60 | - | |
61 | - packet.push_back(DATA_TYPE_COMMAND); | |
62 | - packet.push_back(opcode); | |
63 | - packet.push_back(opcode >> 8); | |
64 | - packet.push_back(payload_size); | |
65 | - | |
66 | - // Set the packet's payload. | |
67 | - for (int i = 0; i < payload_size; ++i) | |
68 | - packet.push_back(payload[i]); | |
69 | - | |
70 | - // Send the packet to |packet_stream_|. | |
71 | - write(socketpair_fds_[1], &packet[1], packet.size()); | |
72 | - | |
73 | - // Read the command packet. | |
74 | - std::unique_ptr<CommandPacket> command = | |
75 | - packet_stream_.ReceiveCommand(socketpair_fds_[0]); | |
76 | - | |
77 | - const std::vector<uint8_t> received_payload = command->GetPayload(); | |
78 | - | |
79 | - // Validate the packet by checking that it's the appropriate size and then | |
80 | - // checking each byte. | |
81 | - EXPECT_EQ(packet.size(), command->GetPacketSize()); | |
82 | - EXPECT_EQ(DATA_TYPE_COMMAND, command->GetType()); | |
83 | - EXPECT_EQ(opcode, command->GetOpcode()); | |
84 | - EXPECT_EQ(payload_size, command->GetPayloadSize()); | |
85 | - for (int i = 0; i < payload_size; ++i) | |
86 | - EXPECT_EQ(packet[4 + i], received_payload[i]); | |
87 | - } | |
88 | - | |
89 | - void CheckedSendEvent(std::unique_ptr<EventPacket> event) { | |
90 | - EXPECT_TRUE(packet_stream_.SendEvent(*(event.get()), socketpair_fds_[0])); | |
91 | - | |
92 | - // Read the packet sent by |packet_stream_|. | |
93 | - uint8_t event_header[3]; | |
94 | - read(socketpair_fds_[1], event_header, 3); | |
95 | - | |
96 | - uint8_t return_parameters_size = event_header[2]; | |
97 | - uint8_t return_parameters[return_parameters_size]; | |
98 | - read(socketpair_fds_[1], return_parameters, sizeof(return_parameters)); | |
99 | - | |
100 | - const std::vector<uint8_t> expected_payload = event->GetPayload(); | |
101 | - | |
102 | - // Validate the packet by checking that it's the | |
103 | - // appropriate size and then checking each byte. | |
104 | - EXPECT_EQ(event->GetPacketSize(), | |
105 | - sizeof(event_header) + sizeof(return_parameters)); | |
106 | - EXPECT_EQ(DATA_TYPE_EVENT, event_header[0]); | |
107 | - EXPECT_EQ(event->GetEventCode(), event_header[1]); | |
108 | - EXPECT_EQ(event->GetPayloadSize(), return_parameters_size); | |
109 | - for (int i = 0; i < return_parameters_size; ++i) | |
110 | - EXPECT_EQ(expected_payload[i], return_parameters[i]); | |
111 | - } | |
112 | - | |
113 | - protected: | |
114 | - PacketStream packet_stream_; | |
115 | - | |
116 | - int socketpair_fds_[2]; | |
117 | - | |
118 | - private: | |
119 | - // Workaround because ASSERT cannot be used directly in a constructor | |
120 | - void CheckSocketpairInit() { | |
121 | - ASSERT_TRUE(socketpair_fds_[0] > 0); | |
122 | - ASSERT_TRUE(socketpair_fds_[1] > 0); | |
123 | - } | |
124 | - | |
125 | -}; | |
126 | - | |
127 | -TEST_F(PacketStreamTest, ReceivePacketType) { | |
128 | - serial_data_type_t command_type = DATA_TYPE_COMMAND; | |
129 | - write(socketpair_fds_[1], &command_type, 1); | |
130 | - EXPECT_EQ(command_type, packet_stream_.ReceivePacketType(socketpair_fds_[0])); | |
131 | -} | |
132 | - | |
133 | -TEST_F(PacketStreamTest, ReceiveEmptyCommand) { | |
134 | - CheckedReceiveCommand("", HCI_RESET); | |
135 | -} | |
136 | - | |
137 | -TEST_F(PacketStreamTest, ReceiveSmallCommand) { | |
138 | - CheckedReceiveCommand(small_payload, HCI_RESET); | |
139 | -} | |
140 | - | |
141 | -TEST_F(PacketStreamTest, ReceiveLargeCommand) { | |
142 | - CheckedReceiveCommand(large_payload, HCI_RESET); | |
143 | -} | |
144 | - | |
145 | -TEST_F(PacketStreamTest, SendEvent) { | |
146 | - const std::vector<uint8_t> return_parameters = {0}; | |
147 | - CheckedSendEvent( | |
148 | - EventPacket::CreateCommandCompleteEvent(1, HCI_RESET, return_parameters)); | |
149 | -} | |
150 | - | |
151 | -} // namespace test_vendor_lib |