• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <unordered_map>
23 #include <vector>
24 
25 #include "async_manager.h"
26 #include "base/json/json_value_converter.h"
27 #include "base/time/time.h"
28 #include "bt_address.h"
29 #include "command_packet.h"
30 #include "event_packet.h"
31 #include "test_channel_transport.h"
32 
33 namespace test_vendor_lib {
34 
35 // Emulates a dual mode BR/EDR + LE controller by maintaining the link layer
36 // state machine detailed in the Bluetooth Core Specification Version 4.2,
37 // Volume 6, Part B, Section 1.1 (page 30). Provides methods corresponding to
38 // commands sent by the HCI. These methods will be registered as callbacks from
39 // a controller instance with the HciHandler. To implement a new Bluetooth
40 // command, simply add the method declaration below, with return type void and a
41 // single const std::vector<uint8_t>& argument. After implementing the
42 // method, simply register it with the HciHandler using the SET_HANDLER macro in
43 // the controller's default constructor. Be sure to name your method after the
44 // corresponding Bluetooth command in the Core Specification with the prefix
45 // "Hci" to distinguish it as a controller command.
46 class DualModeController {
47  public:
48   class Properties {
49    public:
50     explicit Properties(const std::string& file_name);
51 
52     // Access private configuration data
53 
54     // Specification Version 4.2, Volume 2, Part E, Section 7.4.1
55     const std::vector<uint8_t>& GetLocalVersionInformation() const;
56 
57     // Specification Version 4.2, Volume 2, Part E, Section 7.4.2
GetLocalSupportedCommands()58     const std::vector<uint8_t>& GetLocalSupportedCommands() const {
59       return local_supported_commands_;
60     }
61 
62     // Specification Version 4.2, Volume 2, Part E, Section 7.4.3
GetLocalSupportedFeatures()63     uint64_t GetLocalSupportedFeatures() const {
64       return local_extended_features_[0];
65     };
66 
67     // Specification Version 4.2, Volume 2, Part E, Section 7.4.4
GetLocalExtendedFeaturesMaximumPageNumber()68     uint8_t GetLocalExtendedFeaturesMaximumPageNumber() const {
69       return local_extended_features_.size() - 1;
70     };
71 
GetLocalExtendedFeatures(uint8_t page_number)72     uint64_t GetLocalExtendedFeatures(uint8_t page_number) const {
73       CHECK(page_number < local_extended_features_.size());
74       return local_extended_features_[page_number];
75     };
76 
77     // Specification Version 4.2, Volume 2, Part E, Section 7.4.5
GetAclDataPacketSize()78     uint16_t GetAclDataPacketSize() const { return acl_data_packet_size_; }
79 
GetSynchronousDataPacketSize()80     uint8_t GetSynchronousDataPacketSize() const {
81       return sco_data_packet_size_;
82     }
83 
GetTotalNumAclDataPackets()84     uint16_t GetTotalNumAclDataPackets() const { return num_acl_data_packets_; }
85 
GetTotalNumSynchronousDataPackets()86     uint16_t GetTotalNumSynchronousDataPackets() const {
87       return num_sco_data_packets_;
88     }
89 
GetAddress()90     const BtAddress& GetAddress() const { return address_; }
91 
92     // Specification Version 4.2, Volume 2, Part E, Section 7.4.8
GetSupportedCodecs()93     const std::vector<uint8_t>& GetSupportedCodecs() const {
94       return supported_codecs_;
95     }
96 
GetVendorSpecificCodecs()97     const std::vector<uint32_t>& GetVendorSpecificCodecs() const {
98       return vendor_specific_codecs_;
99     }
100 
GetLocalName()101     const std::string& GetLocalName() const { return local_name_; }
102 
GetVersion()103     uint8_t GetVersion() const { return version_; }
104 
GetRevision()105     uint16_t GetRevision() const { return revision_; }
106 
GetLmpPalVersion()107     uint8_t GetLmpPalVersion() const { return lmp_pal_version_; }
108 
GetLmpPalSubversion()109     uint16_t GetLmpPalSubversion() const { return lmp_pal_subversion_; }
110 
GetManufacturerName()111     uint16_t GetManufacturerName() const { return manufacturer_name_; }
112 
113     // Specification Version 4.2, Volume 2, Part E, Section 7.8.2
GetLeDataPacketLength()114     uint16_t GetLeDataPacketLength() const { return le_data_packet_length_; }
115 
GetTotalNumLeDataPackets()116     uint8_t GetTotalNumLeDataPackets() const { return num_le_data_packets_; }
117 
118     // Specification Version 4.2, Volume 2, Part E, Section 7.8.3
GetLeLocalSupportedFeatures()119     uint64_t GetLeLocalSupportedFeatures() const {
120       return le_supported_features_;
121     }
122 
123     // Specification Version 4.2, Volume 2, Part E, Section 7.8.14
GetLeWhiteListSize()124     uint8_t GetLeWhiteListSize() const { return le_white_list_size_; }
125 
126     // Specification Version 4.2, Volume 2, Part E, Section 7.8.27
GetLeSupportedStates()127     uint64_t GetLeSupportedStates() const { return le_supported_states_; }
128 
129     // Vendor-specific commands (see hcidefs.h)
GetLeVendorCap()130     const std::vector<uint8_t>& GetLeVendorCap() const {
131       return le_vendor_cap_;
132     }
133 
134     static void RegisterJSONConverter(
135         base::JSONValueConverter<Properties>* converter);
136 
137    private:
138     uint16_t acl_data_packet_size_;
139     uint8_t sco_data_packet_size_;
140     uint16_t num_acl_data_packets_;
141     uint16_t num_sco_data_packets_;
142     uint8_t version_;
143     uint16_t revision_;
144     uint8_t lmp_pal_version_;
145     uint16_t manufacturer_name_;
146     uint16_t lmp_pal_subversion_;
147     std::vector<uint8_t> supported_codecs_;
148     std::vector<uint32_t> vendor_specific_codecs_;
149     std::vector<uint8_t> local_supported_commands_;
150     std::string local_name_;
151     std::vector<uint64_t> local_extended_features_;
152     BtAddress address_;
153 
154     uint16_t le_data_packet_length_;
155     uint8_t num_le_data_packets_;
156     uint8_t le_white_list_size_;
157     uint64_t le_supported_features_;
158     uint64_t le_supported_states_;
159     std::vector<uint8_t> le_vendor_cap_;
160   };
161 
162   // Sets all of the methods to be used as callbacks in the HciHandler.
163   DualModeController();
164 
165   ~DualModeController() = default;
166 
167   // Preprocesses the command, primarily checking testh channel hooks. If
168   // possible, dispatches the corresponding controller method corresponding to
169   // carry out the command.
170   void HandleCommand(std::unique_ptr<CommandPacket> command_packet);
171 
172   // Dispatches the test channel action corresponding to the command specified
173   // by |name|.
174   void HandleTestChannelCommand(const std::string& name,
175                                 const std::vector<std::string>& args);
176 
177   // Set the callbacks for scheduling tasks.
178   void RegisterTaskScheduler(
179       std::function<AsyncTaskId(std::chrono::milliseconds, const TaskCallback&)>
180           evtScheduler);
181 
182   void RegisterPeriodicTaskScheduler(
183       std::function<AsyncTaskId(std::chrono::milliseconds,
184                                 std::chrono::milliseconds, const TaskCallback&)>
185           periodicEvtScheduler);
186 
187   void RegisterTaskCancel(std::function<void(AsyncTaskId)> cancel);
188 
189   // Sets the callback to be used for sending events back to the HCI.
190   void RegisterEventChannel(
191       const std::function<void(std::unique_ptr<EventPacket>)>& send_event);
192 
193   // Controller commands. For error codes, see the Bluetooth Core Specification,
194   // Version 4.2, Volume 2, Part D (page 370).
195 
196   // OGF: 0x0003
197   // OCF: 0x0003
198   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.2
199   void HciReset(const std::vector<uint8_t>& args);
200 
201   // OGF: 0x0004
202   // OGF: 0x0005
203   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.5
204   void HciReadBufferSize(const std::vector<uint8_t>& args);
205 
206   // OGF: 0x0003
207   // OCF: 0x0033
208   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.39
209   void HciHostBufferSize(const std::vector<uint8_t>& args);
210 
211   // OGF: 0x0004
212   // OCF: 0x0001
213   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.1
214   void HciReadLocalVersionInformation(const std::vector<uint8_t>& args);
215 
216   // OGF: 0x0004
217   // OCF: 0x0009
218   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.6
219   void HciReadBdAddr(const std::vector<uint8_t>& args);
220 
221   // OGF: 0x0004
222   // OCF: 0x0002
223   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.2
224   void HciReadLocalSupportedCommands(const std::vector<uint8_t>& args);
225 
226   // OGF: 0x0004
227   // OCF: 0x0004
228   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.4
229   void HciReadLocalExtendedFeatures(const std::vector<uint8_t>& args);
230 
231   // OGF: 0x0004
232   // OCF: 0x000B
233   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.4.8
234   void HciReadLocalSupportedCodecs(const std::vector<uint8_t>& args);
235 
236   // OGF: 0x0003
237   // OCF: 0x0056
238   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.59
239   void HciWriteSimplePairingMode(const std::vector<uint8_t>& args);
240 
241   // OGF: 0x0003
242   // OCF: 0x006D
243   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.79
244   void HciWriteLeHostSupport(const std::vector<uint8_t>& args);
245 
246   // OGF: 0x0003
247   // OCF: 0x0001
248   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.1
249   void HciSetEventMask(const std::vector<uint8_t>& args);
250 
251   // OGF: 0x0003
252   // OCF: 0x0045
253   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.50
254   void HciWriteInquiryMode(const std::vector<uint8_t>& args);
255 
256   // OGF: 0x0003
257   // OCF: 0x0047
258   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.52
259   void HciWritePageScanType(const std::vector<uint8_t>& args);
260 
261   // OGF: 0x0003
262   // OCF: 0x0043
263   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.48
264   void HciWriteInquiryScanType(const std::vector<uint8_t>& args);
265 
266   // OGF: 0x0003
267   // OCF: 0x0024
268   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.26
269   void HciWriteClassOfDevice(const std::vector<uint8_t>& args);
270 
271   // OGF: 0x0003
272   // OCF: 0x0018
273   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.16
274   void HciWritePageTimeout(const std::vector<uint8_t>& args);
275 
276   // OGF: 0x0002
277   // OCF: 0x000F
278   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.2.12
279   void HciWriteDefaultLinkPolicySettings(const std::vector<uint8_t>& args);
280 
281   // OGF: 0x0003
282   // OCF: 0x0014
283   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.12
284   void HciReadLocalName(const std::vector<uint8_t>& args);
285 
286   // OGF: 0x0003
287   // OCF: 0x0013
288   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.11
289   void HciWriteLocalName(const std::vector<uint8_t>& args);
290 
291   // OGF: 0x0003
292   // OCF: 0x0052
293   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.56
294   void HciWriteExtendedInquiryResponse(const std::vector<uint8_t>& args);
295 
296   // OGF: 0x0003
297   // OCF: 0x0026
298   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.28
299   void HciWriteVoiceSetting(const std::vector<uint8_t>& args);
300 
301   // OGF: 0x0003
302   // OCF: 0x003A
303   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.45
304   void HciWriteCurrentIacLap(const std::vector<uint8_t>& args);
305 
306   // OGF: 0x0003
307   // OCF: 0x001E
308   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.22
309   void HciWriteInquiryScanActivity(const std::vector<uint8_t>& args);
310 
311   // OGF: 0x0003
312   // OCF: 0x001A
313   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.18
314   void HciWriteScanEnable(const std::vector<uint8_t>& args);
315 
316   // OGF: 0x0003
317   // OCF: 0x0005
318   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.3
319   void HciSetEventFilter(const std::vector<uint8_t>& args);
320 
321   // OGF: 0x0001
322   // OCF: 0x0001
323   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.1
324   void HciInquiry(const std::vector<uint8_t>& args);
325 
326   void InquiryTimeout();
327 
328   // OGF: 0x0001
329   // OCF: 0x0002
330   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.2
331   void HciInquiryCancel(const std::vector<uint8_t>& args);
332 
333   // OGF: 0x0003
334   // OCF: 0x0012
335   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.3.10
336   void HciDeleteStoredLinkKey(const std::vector<uint8_t>& args);
337 
338   // OGF: 0x0001
339   // OCF: 0x0019
340   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.1.19
341   void HciRemoteNameRequest(const std::vector<uint8_t>& args);
342 
343   // LE Controller Commands
344 
345   // OGF: 0x0008
346   // OCF: 0x0001
347   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.1
348   void HciLeSetEventMask(const std::vector<uint8_t>& args);
349 
350   // OGF: 0x0008
351   // OCF: 0x0002
352   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.2
353   void HciLeReadBufferSize(const std::vector<uint8_t>& args);
354 
355   // OGF: 0x0008
356   // OCF: 0x0003
357   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.3
358   void HciLeReadLocalSupportedFeatures(const std::vector<uint8_t>& args);
359 
360   // OGF: 0x0008
361   // OCF: 0x0005
362   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.4
363   void HciLeSetRandomAddress(const std::vector<uint8_t>& args);
364 
365   // OGF: 0x0008
366   // OCF: 0x0006
367   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.5
368   void HciLeSetAdvertisingParameters(const std::vector<uint8_t>& args);
369 
370   // OGF: 0x0008
371   // OCF: 0x0008
372   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.7
373   void HciLeSetAdvertisingData(const std::vector<uint8_t>& args);
374 
375   // OGF: 0x0008
376   // OCF: 0x000B
377   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.10
378   void HciLeSetScanParameters(const std::vector<uint8_t>& args);
379 
380   // OGF: 0x0008
381   // OCF: 0x000C
382   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.11
383   void HciLeSetScanEnable(const std::vector<uint8_t>& args);
384 
385   // OGF: 0x0008
386   // OCF: 0x000F
387   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.14
388   void HciLeReadWhiteListSize(const std::vector<uint8_t>& args);
389 
390   // OGF: 0x0008
391   // OCF: 0x0018
392   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.23
393   void HciLeRand(const std::vector<uint8_t>& args);
394 
395   // OGF: 0x0008
396   // OCF: 0x001C
397   // Bluetooth Core Specification Version 4.2 Volume 2 Part E 7.8.27
398   void HciLeReadSupportedStates(const std::vector<uint8_t>& args);
399 
400   // Vendor-specific commands (see hcidefs.h)
401 
402   // OGF: 0x00FC
403   // OCF: 0x0027
404   void HciBleVendorSleepMode(const std::vector<uint8_t>& args);
405 
406   // OGF: 0x00FC
407   // OCF: 0x0153
408   void HciBleVendorCap(const std::vector<uint8_t>& args);
409 
410   // OGF: 0x00FC
411   // OCF: 0x0154
412   void HciBleVendorMultiAdv(const std::vector<uint8_t>& args);
413 
414   // OGF: 0x00FC
415   // OCF: 0x0155
416   void HciBleVendor155(const std::vector<uint8_t>& args);
417 
418   // OGF: 0x00FC
419   // OCF: 0x0157
420   void HciBleVendor157(const std::vector<uint8_t>& args);
421 
422   // OGF: 0x00FC
423   // OCF: 0x0159
424   void HciBleEnergyInfo(const std::vector<uint8_t>& args);
425 
426   // OGF: 0x00FC
427   // OCF: 0x015A
428   void HciBleExtendedScanParams(const std::vector<uint8_t>& args);
429 
430   // Test Channel commands:
431 
432   // Clears all test channel modifications.
433   void TestChannelClear(const std::vector<std::string>& args);
434 
435   // Sets the response delay for events to 0.
436   void TestChannelClearEventDelay(const std::vector<std::string>& args);
437 
438   // Discovers a fake device.
439   void TestChannelDiscover(const std::vector<std::string>& args);
440 
441   // Causes events to be sent after a delay.
442   void TestChannelSetEventDelay(const std::vector<std::string>& args);
443 
444   // Causes all future HCI commands to timeout.
445   void TestChannelTimeoutAll(const std::vector<std::string>& args);
446 
447   void HandleTimerTick();
448   void SetTimerPeriod(std::chrono::milliseconds new_period);
449   void StartTimer();
450   void StopTimer();
451 
452  private:
453   // Current link layer state of the controller.
454   enum State {
455     kStandby,  // Not receiving/transmitting any packets from/to other devices.
456     kInquiry,  // The controller is discovering other nearby devices.
457   };
458 
459   enum TestChannelState {
460     kNone,             // The controller is running normally.
461     kTimeoutAll,       // All commands should time out, i.e. send no response.
462     kDelayedResponse,  // Event responses are sent after a delay.
463   };
464 
465   // Set a timer for a future action
466   void AddControllerEvent(std::chrono::milliseconds,
467                           const TaskCallback& callback);
468 
469   // Creates a command complete event and sends it back to the HCI.
470   void SendCommandComplete(uint16_t command_opcode,
471                            const std::vector<uint8_t>& return_parameters) const;
472 
473   // Sends a command complete event with no return parameters. This event is
474   // typically sent for commands that can be completed immediately.
475   void SendCommandCompleteSuccess(uint16_t command_opcode) const;
476 
477   // Sends a command complete event with no return parameters. This event is
478   // typically sent for commands that can be completed immediately.
479   void SendCommandCompleteOnlyStatus(uint16_t command_opcode,
480                                      uint8_t status) const;
481 
482   // Creates a command status event and sends it back to the HCI.
483   void SendCommandStatus(uint8_t status, uint16_t command_opcode) const;
484 
485   // Sends a command status event with default event parameters.
486   void SendCommandStatusSuccess(uint16_t command_opcode) const;
487 
488   void SetEventDelay(int64_t delay);
489 
490   // Callbacks to schedule tasks.
491   std::function<AsyncTaskId(std::chrono::milliseconds, const TaskCallback&)>
492       schedule_task_;
493   std::function<AsyncTaskId(std::chrono::milliseconds,
494                             std::chrono::milliseconds, const TaskCallback&)>
495       schedule_periodic_task_;
496 
497   std::function<void(AsyncTaskId)> cancel_task_;
498 
499   // Callback provided to send events from the controller back to the HCI.
500   std::function<void(std::unique_ptr<EventPacket>)> send_event_;
501 
502   // Maintains the commands to be registered and used in the HciHandler object.
503   // Keys are command opcodes and values are the callbacks to handle each
504   // command.
505   std::unordered_map<uint16_t, std::function<void(const std::vector<uint8_t>&)>>
506       active_hci_commands_;
507 
508   std::unordered_map<std::string,
509                      std::function<void(const std::vector<std::string>&)>>
510       active_test_channel_commands_;
511 
512   // Specifies the format of Inquiry Result events to be returned during the
513   // Inquiry command.
514   // 0x00: Standard Inquiry Result event format (default).
515   // 0x01: Inquiry Result format with RSSI.
516   // 0x02 Inquiry Result with RSSI format or Extended Inquiry Result format.
517   // 0x03-0xFF: Reserved.
518   uint8_t inquiry_mode_;
519 
520   std::vector<uint8_t> le_event_mask_;
521 
522   BtAddress le_random_address_;
523 
524   uint8_t le_scan_type_;
525   uint16_t le_scan_interval_;
526   uint16_t le_scan_window_;
527   uint8_t own_address_type_;
528   uint8_t scanning_filter_policy_;
529 
530   uint8_t le_scan_enable_;
531   uint8_t filter_duplicates_;
532 
533   State state_;
534 
535   Properties properties_;
536 
537   TestChannelState test_channel_state_;
538 
539   std::vector<AsyncTaskId> controller_events_;
540   AsyncTaskId timer_tick_task_;
541   std::chrono::milliseconds timer_period_ = std::chrono::milliseconds(1000);
542 
543   DualModeController(const DualModeController& cmdPckt) = delete;
544   DualModeController& operator=(const DualModeController& cmdPckt) = delete;
545 };
546 
547 }  // namespace test_vendor_lib
548