1 /*
2  * Copyright 2019 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 "hci/controller.h"
18 
19 #include <future>
20 #include <memory>
21 #include <utility>
22 
23 #include "common/bind.h"
24 #include "common/callback.h"
25 #include "hci/hci_layer.h"
26 
27 namespace bluetooth {
28 namespace hci {
29 
30 using common::Bind;
31 using common::BindOnce;
32 using common::Callback;
33 using common::Closure;
34 using common::OnceCallback;
35 using common::OnceClosure;
36 using os::Handler;
37 
38 struct Controller::impl {
39   impl(Controller& module) : module_(module) {}
40 
41   void Start(hci::HciLayer* hci) {
42     hci_ = hci;
43     hci_->RegisterEventHandler(EventCode::NUMBER_OF_COMPLETED_PACKETS,
44                                Bind(&Controller::impl::NumberOfCompletedPackets, common::Unretained(this)),
45                                module_.GetHandler());
46 
47     set_event_mask(kDefaultEventMask);
48     hci_->EnqueueCommand(ReadLocalNameBuilder::Create(),
49                          BindOnce(&Controller::impl::read_local_name_complete_handler, common::Unretained(this)),
50                          module_.GetHandler());
51     hci_->EnqueueCommand(
52         ReadLocalVersionInformationBuilder::Create(),
53         BindOnce(&Controller::impl::read_local_version_information_complete_handler, common::Unretained(this)),
54         module_.GetHandler());
55     hci_->EnqueueCommand(
56         ReadLocalSupportedCommandsBuilder::Create(),
57         BindOnce(&Controller::impl::read_local_supported_commands_complete_handler, common::Unretained(this)),
58         module_.GetHandler());
59     hci_->EnqueueCommand(
60         ReadLocalSupportedFeaturesBuilder::Create(),
61         BindOnce(&Controller::impl::read_local_supported_features_complete_handler, common::Unretained(this)),
62         module_.GetHandler());
63 
64     // Wait for all extended features read
65     std::promise<void> features_promise;
66     auto features_future = features_promise.get_future();
67     hci_->EnqueueCommand(ReadLocalExtendedFeaturesBuilder::Create(0x00),
68                          BindOnce(&Controller::impl::read_local_extended_features_complete_handler,
69                                   common::Unretained(this), std::move(features_promise)),
70                          module_.GetHandler());
71     features_future.wait();
72 
73     hci_->EnqueueCommand(ReadBufferSizeBuilder::Create(),
74                          BindOnce(&Controller::impl::read_buffer_size_complete_handler, common::Unretained(this)),
75                          module_.GetHandler());
76 
77     hci_->EnqueueCommand(LeReadBufferSizeBuilder::Create(),
78                          BindOnce(&Controller::impl::le_read_buffer_size_handler, common::Unretained(this)),
79                          module_.GetHandler());
80 
81     hci_->EnqueueCommand(
82         LeReadLocalSupportedFeaturesBuilder::Create(),
83         BindOnce(&Controller::impl::le_read_local_supported_features_handler, common::Unretained(this)),
84         module_.GetHandler());
85 
86     hci_->EnqueueCommand(LeReadSupportedStatesBuilder::Create(),
87                          BindOnce(&Controller::impl::le_read_supported_states_handler, common::Unretained(this)),
88                          module_.GetHandler());
89 
90     if (is_supported(OpCode::LE_READ_MAXIMUM_DATA_LENGTH)) {
91       hci_->EnqueueCommand(LeReadMaximumDataLengthBuilder::Create(),
92                            BindOnce(&Controller::impl::le_read_maximum_data_length_handler, common::Unretained(this)),
93                            module_.GetHandler());
94     }
95     if (is_supported(OpCode::LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH)) {
96       hci_->EnqueueCommand(
97           LeReadMaximumAdvertisingDataLengthBuilder::Create(),
98           BindOnce(&Controller::impl::le_read_maximum_advertising_data_length_handler, common::Unretained(this)),
99           module_.GetHandler());
100     }
101     if (is_supported(OpCode::LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS)) {
102       hci_->EnqueueCommand(
103           LeReadNumberOfSupportedAdvertisingSetsBuilder::Create(),
104           BindOnce(&Controller::impl::le_read_number_of_supported_advertising_sets_handler, common::Unretained(this)),
105           module_.GetHandler());
106     }
107 
108     hci_->EnqueueCommand(LeGetVendorCapabilitiesBuilder::Create(),
109                          BindOnce(&Controller::impl::le_get_vendor_capabilities_handler, common::Unretained(this)),
110                          module_.GetHandler());
111 
112     // We only need to synchronize the last read. Make BD_ADDR to be the last one.
113     std::promise<void> promise;
114     auto future = promise.get_future();
115     hci_->EnqueueCommand(
116         ReadBdAddrBuilder::Create(),
117         BindOnce(&Controller::impl::read_controller_mac_address_handler, common::Unretained(this), std::move(promise)),
118         module_.GetHandler());
119     future.wait();
120   }
121 
122   void Stop() {
123     hci_->UnregisterEventHandler(EventCode::NUMBER_OF_COMPLETED_PACKETS);
124     hci_ = nullptr;
125   }
126 
127   void NumberOfCompletedPackets(EventPacketView event) {
128     ASSERT(acl_credits_handler_ != nullptr);
129     auto complete_view = NumberOfCompletedPacketsView::Create(event);
130     ASSERT(complete_view.IsValid());
131     for (auto completed_packets : complete_view.GetCompletedPackets()) {
132       uint16_t handle = completed_packets.connection_handle_;
133       uint16_t credits = completed_packets.host_num_of_completed_packets_;
134       acl_credits_handler_->Post(Bind(acl_credits_callback_, handle, credits));
135     }
136   }
137 
138   void RegisterCompletedAclPacketsCallback(Callback<void(uint16_t /* handle */, uint16_t /* packets */)> cb,
139                                            Handler* handler) {
140     ASSERT(acl_credits_handler_ == nullptr);
141     acl_credits_callback_ = cb;
142     acl_credits_handler_ = handler;
143   }
144 
145   void read_local_name_complete_handler(CommandCompleteView view) {
146     auto complete_view = ReadLocalNameCompleteView::Create(view);
147     ASSERT(complete_view.IsValid());
148     ErrorCode status = complete_view.GetStatus();
149     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
150     std::array<uint8_t, 248> local_name_array = complete_view.GetLocalName();
151 
152     local_name_ = std::string(local_name_array.begin(), local_name_array.end());
153     // erase \0
154     local_name_.erase(std::find(local_name_.begin(), local_name_.end(), '\0'), local_name_.end());
155   }
156 
157   void read_local_version_information_complete_handler(CommandCompleteView view) {
158     auto complete_view = ReadLocalVersionInformationCompleteView::Create(view);
159     ASSERT(complete_view.IsValid());
160     ErrorCode status = complete_view.GetStatus();
161     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
162 
163     local_version_information_ = complete_view.GetLocalVersionInformation();
164   }
165 
166   void read_local_supported_commands_complete_handler(CommandCompleteView view) {
167     auto complete_view = ReadLocalSupportedCommandsCompleteView::Create(view);
168     ASSERT(complete_view.IsValid());
169     ErrorCode status = complete_view.GetStatus();
170     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
171     local_supported_commands_ = complete_view.GetSupportedCommands();
172   }
173 
174   void read_local_supported_features_complete_handler(CommandCompleteView view) {
175     auto complete_view = ReadLocalSupportedFeaturesCompleteView::Create(view);
176     ASSERT(complete_view.IsValid());
177     ErrorCode status = complete_view.GetStatus();
178     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
179     local_supported_features_ = complete_view.GetLmpFeatures();
180   }
181 
182   void read_local_extended_features_complete_handler(std::promise<void> promise, CommandCompleteView view) {
183     auto complete_view = ReadLocalExtendedFeaturesCompleteView::Create(view);
184     ASSERT(complete_view.IsValid());
185     ErrorCode status = complete_view.GetStatus();
186     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
187     uint8_t page_number = complete_view.GetPageNumber();
188     maximum_page_number_ = complete_view.GetMaximumPageNumber();
189     extended_lmp_features_array_.push_back(complete_view.GetExtendedLmpFeatures());
190 
191     // Query all extended features
192     if (page_number < maximum_page_number_) {
193       page_number++;
194       hci_->EnqueueCommand(ReadLocalExtendedFeaturesBuilder::Create(page_number),
195                            BindOnce(&Controller::impl::read_local_extended_features_complete_handler,
196                                     common::Unretained(this), std::move(promise)),
197                            module_.GetHandler());
198     } else {
199       promise.set_value();
200     }
201   }
202 
203   void read_buffer_size_complete_handler(CommandCompleteView view) {
204     auto complete_view = ReadBufferSizeCompleteView::Create(view);
205     ASSERT(complete_view.IsValid());
206     ErrorCode status = complete_view.GetStatus();
207     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
208     acl_buffer_length_ = complete_view.GetAclDataPacketLength();
209     acl_buffers_ = complete_view.GetTotalNumAclDataPackets();
210 
211     sco_buffer_length_ = complete_view.GetSynchronousDataPacketLength();
212     sco_buffers_ = complete_view.GetTotalNumSynchronousDataPackets();
213   }
214 
215   void read_controller_mac_address_handler(std::promise<void> promise, CommandCompleteView view) {
216     auto complete_view = ReadBdAddrCompleteView::Create(view);
217     ASSERT(complete_view.IsValid());
218     ErrorCode status = complete_view.GetStatus();
219     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
220     mac_address_ = complete_view.GetBdAddr();
221     promise.set_value();
222   }
223 
224   void le_read_buffer_size_handler(CommandCompleteView view) {
225     auto complete_view = LeReadBufferSizeCompleteView::Create(view);
226     ASSERT(complete_view.IsValid());
227     ErrorCode status = complete_view.GetStatus();
228     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
229     le_buffer_size_ = complete_view.GetLeBufferSize();
230   }
231 
232   void le_read_local_supported_features_handler(CommandCompleteView view) {
233     auto complete_view = LeReadLocalSupportedFeaturesCompleteView::Create(view);
234     ASSERT(complete_view.IsValid());
235     ErrorCode status = complete_view.GetStatus();
236     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
237     le_local_supported_features_ = complete_view.GetLeFeatures();
238   }
239 
240   void le_read_supported_states_handler(CommandCompleteView view) {
241     auto complete_view = LeReadSupportedStatesCompleteView::Create(view);
242     ASSERT(complete_view.IsValid());
243     ErrorCode status = complete_view.GetStatus();
244     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
245     le_supported_states_ = complete_view.GetLeStates();
246   }
247 
248   void le_read_maximum_data_length_handler(CommandCompleteView view) {
249     auto complete_view = LeReadMaximumDataLengthCompleteView::Create(view);
250     ASSERT(complete_view.IsValid());
251     ErrorCode status = complete_view.GetStatus();
252     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
253     le_maximum_data_length_ = complete_view.GetLeMaximumDataLength();
254   }
255 
256   void le_read_maximum_advertising_data_length_handler(CommandCompleteView view) {
257     auto complete_view = LeReadMaximumAdvertisingDataLengthCompleteView::Create(view);
258     ASSERT(complete_view.IsValid());
259     ErrorCode status = complete_view.GetStatus();
260     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
261     le_maximum_advertising_data_length_ = complete_view.GetMaximumAdvertisingDataLength();
262   }
263 
264   void le_read_number_of_supported_advertising_sets_handler(CommandCompleteView view) {
265     auto complete_view = LeReadNumberOfSupportedAdvertisingSetsCompleteView::Create(view);
266     ASSERT(complete_view.IsValid());
267     ErrorCode status = complete_view.GetStatus();
268     ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());
269     le_number_supported_advertising_sets_ = complete_view.GetNumberSupportedAdvertisingSets();
270   }
271 
272   void le_get_vendor_capabilities_handler(CommandCompleteView view) {
273     auto complete_view = LeGetVendorCapabilitiesCompleteView::Create(view);
274 
275     vendor_capabilities_.is_supported_ = 0x00;
276     vendor_capabilities_.max_advt_instances_ = 0x00;
277     vendor_capabilities_.offloaded_resolution_of_private_address_ = 0x00;
278     vendor_capabilities_.total_scan_results_storage_ = 0x00;
279     vendor_capabilities_.max_irk_list_sz_ = 0x00;
280     vendor_capabilities_.filtering_support_ = 0x00;
281     vendor_capabilities_.max_filter_ = 0x00;
282     vendor_capabilities_.activity_energy_info_support_ = 0x00;
283     vendor_capabilities_.version_supported_ = 0x00;
284     vendor_capabilities_.version_supported_ = 0x00;
285     vendor_capabilities_.total_num_of_advt_tracked_ = 0x00;
286     vendor_capabilities_.extended_scan_support_ = 0x00;
287     vendor_capabilities_.debug_logging_supported_ = 0x00;
288     vendor_capabilities_.le_address_generation_offloading_support_ = 0x00;
289     vendor_capabilities_.a2dp_source_offload_capability_mask_ = 0x00;
290     vendor_capabilities_.bluetooth_quality_report_support_ = 0x00;
291 
292     if (complete_view.IsValid()) {
293       vendor_capabilities_.is_supported_ = 0x01;
294 
295       // v0.55
296       BaseVendorCapabilities base_vendor_capabilities = complete_view.GetBaseVendorCapabilities();
297       vendor_capabilities_.max_advt_instances_ = base_vendor_capabilities.max_advt_instances_;
298       vendor_capabilities_.offloaded_resolution_of_private_address_ =
299           base_vendor_capabilities.offloaded_resolution_of_private_address_;
300       vendor_capabilities_.total_scan_results_storage_ = base_vendor_capabilities.total_scan_results_storage_;
301       vendor_capabilities_.max_irk_list_sz_ = base_vendor_capabilities.max_irk_list_sz_;
302       vendor_capabilities_.filtering_support_ = base_vendor_capabilities.filtering_support_;
303       vendor_capabilities_.max_filter_ = base_vendor_capabilities.max_filter_;
304       vendor_capabilities_.activity_energy_info_support_ = base_vendor_capabilities.activity_energy_info_support_;
305       if (complete_view.GetPayload().size() == 0) {
306         vendor_capabilities_.version_supported_ = 55;
307         return;
308       }
309 
310       // v0.95
311       auto v95 = LeGetVendorCapabilitiesComplete095View::Create(complete_view);
312       if (!v95.IsValid()) {
313         LOG_ERROR("invalid data for hci requirements v0.95");
314         return;
315       }
316       vendor_capabilities_.version_supported_ = v95.GetVersionSupported();
317       vendor_capabilities_.total_num_of_advt_tracked_ = v95.GetTotalNumOfAdvtTracked();
318       vendor_capabilities_.extended_scan_support_ = v95.GetExtendedScanSupport();
319       vendor_capabilities_.debug_logging_supported_ = v95.GetDebugLoggingSupported();
320       if (vendor_capabilities_.version_supported_ <= 95 || complete_view.GetPayload().size() == 0) {
321         return;
322       }
323 
324       // v0.96
325       auto v96 = LeGetVendorCapabilitiesComplete096View::Create(v95);
326       if (!v96.IsValid()) {
327         LOG_ERROR("invalid data for hci requirements v0.96");
328         return;
329       }
330       vendor_capabilities_.le_address_generation_offloading_support_ = v96.GetLeAddressGenerationOffloadingSupport();
331       if (vendor_capabilities_.version_supported_ <= 96 || complete_view.GetPayload().size() == 0) {
332         return;
333       }
334 
335       // v0.98
336       auto v98 = LeGetVendorCapabilitiesComplete098View::Create(v96);
337       if (!v98.IsValid()) {
338         LOG_ERROR("invalid data for hci requirements v0.98");
339         return;
340       }
341       vendor_capabilities_.a2dp_source_offload_capability_mask_ = v98.GetA2dpSourceOffloadCapabilityMask();
342       vendor_capabilities_.bluetooth_quality_report_support_ = v98.GetBluetoothQualityReportSupport();
343     }
344   }
345 
346   void set_event_mask(uint64_t event_mask) {
347     std::unique_ptr<SetEventMaskBuilder> packet = SetEventMaskBuilder::Create(event_mask);
348     hci_->EnqueueCommand(std::move(packet),
349                          BindOnce(&Controller::impl::check_status<SetEventMaskCompleteView>, common::Unretained(this)),
350                          module_.GetHandler());
351   }
352 
353   void reset() {
354     std::unique_ptr<ResetBuilder> packet = ResetBuilder::Create();
355     hci_->EnqueueCommand(std::move(packet),
356                          BindOnce(&Controller::impl::check_status<ResetCompleteView>, common::Unretained(this)),
357                          module_.GetHandler());
358   }
359 
360   void set_event_filter(std::unique_ptr<SetEventFilterBuilder> packet) {
361     hci_->EnqueueCommand(
362         std::move(packet),
363         BindOnce(&Controller::impl::check_status<SetEventFilterCompleteView>, common::Unretained(this)),
364         module_.GetHandler());
365   }
366 
367   void write_local_name(std::string local_name) {
368     ASSERT(local_name.length() <= 248);
369     // Fill remaining char with 0
370     local_name.append(std::string(248 - local_name.length(), '\0'));
371     std::array<uint8_t, 248> local_name_array;
372     std::copy(std::begin(local_name), std::end(local_name), std::begin(local_name_array));
373 
374     std::unique_ptr<WriteLocalNameBuilder> packet = WriteLocalNameBuilder::Create(local_name_array);
375     hci_->EnqueueCommand(
376         std::move(packet),
377         BindOnce(&Controller::impl::check_status<WriteLocalNameCompleteView>, common::Unretained(this)),
378         module_.GetHandler());
379   }
380 
381   void host_buffer_size(uint16_t host_acl_data_packet_length, uint8_t host_synchronous_data_packet_length,
382                         uint16_t host_total_num_acl_data_packets, uint16_t host_total_num_synchronous_data_packets) {
383     std::unique_ptr<HostBufferSizeBuilder> packet =
384         HostBufferSizeBuilder::Create(host_acl_data_packet_length, host_synchronous_data_packet_length,
385                                       host_total_num_acl_data_packets, host_total_num_synchronous_data_packets);
386     hci_->EnqueueCommand(
387         std::move(packet),
388         BindOnce(&Controller::impl::check_status<HostBufferSizeCompleteView>, common::Unretained(this)),
389         module_.GetHandler());
390   }
391 
392   void le_set_event_mask(uint64_t le_event_mask) {
393     std::unique_ptr<LeSetEventMaskBuilder> packet = LeSetEventMaskBuilder::Create(le_event_mask);
394     hci_->EnqueueCommand(
395         std::move(packet),
396         BindOnce(&Controller::impl::check_status<LeSetEventMaskCompleteView>, common::Unretained(this)),
397         module_.GetHandler());
398   }
399 
400   template <class T>
401   void check_status(CommandCompleteView view) {
402     ASSERT(view.IsValid());
403     auto status_view = T::Create(view);
404     ASSERT(status_view.IsValid());
405     ASSERT(status_view.GetStatus() == ErrorCode::SUCCESS);
406   }
407 
408 #define OP_CODE_MAPPING(name)                                                  \
409   case OpCode::name: {                                                         \
410     uint16_t index = (uint16_t)OpCodeIndex::name;                              \
411     uint16_t byte_index = index / 10;                                          \
412     uint16_t bit_index = index % 10;                                           \
413     bool supported = local_supported_commands_[byte_index] & (1 << bit_index); \
414     if (!supported) {                                                          \
415       LOG_WARN("unsupported command opcode: 0x%04x", (uint16_t)OpCode::name);  \
416     }                                                                          \
417     return supported;                                                          \
418   }
419 
420   bool is_supported(OpCode op_code) {
421     switch (op_code) {
422       OP_CODE_MAPPING(INQUIRY)
423       OP_CODE_MAPPING(INQUIRY_CANCEL)
424       OP_CODE_MAPPING(PERIODIC_INQUIRY_MODE)
425       OP_CODE_MAPPING(EXIT_PERIODIC_INQUIRY_MODE)
426       OP_CODE_MAPPING(CREATE_CONNECTION)
427       OP_CODE_MAPPING(DISCONNECT)
428       OP_CODE_MAPPING(CREATE_CONNECTION_CANCEL)
429       OP_CODE_MAPPING(ACCEPT_CONNECTION_REQUEST)
430       OP_CODE_MAPPING(REJECT_CONNECTION_REQUEST)
431       OP_CODE_MAPPING(LINK_KEY_REQUEST_REPLY)
432       OP_CODE_MAPPING(LINK_KEY_REQUEST_NEGATIVE_REPLY)
433       OP_CODE_MAPPING(PIN_CODE_REQUEST_REPLY)
434       OP_CODE_MAPPING(PIN_CODE_REQUEST_NEGATIVE_REPLY)
435       OP_CODE_MAPPING(CHANGE_CONNECTION_PACKET_TYPE)
436       OP_CODE_MAPPING(AUTHENTICATION_REQUESTED)
437       OP_CODE_MAPPING(SET_CONNECTION_ENCRYPTION)
438       OP_CODE_MAPPING(CHANGE_CONNECTION_LINK_KEY)
439       OP_CODE_MAPPING(MASTER_LINK_KEY)
440       OP_CODE_MAPPING(REMOTE_NAME_REQUEST)
441       OP_CODE_MAPPING(REMOTE_NAME_REQUEST_CANCEL)
442       OP_CODE_MAPPING(READ_REMOTE_SUPPORTED_FEATURES)
443       OP_CODE_MAPPING(READ_REMOTE_EXTENDED_FEATURES)
444       OP_CODE_MAPPING(READ_REMOTE_VERSION_INFORMATION)
445       OP_CODE_MAPPING(READ_CLOCK_OFFSET)
446       OP_CODE_MAPPING(READ_LMP_HANDLE)
447       OP_CODE_MAPPING(HOLD_MODE)
448       OP_CODE_MAPPING(SNIFF_MODE)
449       OP_CODE_MAPPING(EXIT_SNIFF_MODE)
450       OP_CODE_MAPPING(QOS_SETUP)
451       OP_CODE_MAPPING(ROLE_DISCOVERY)
452       OP_CODE_MAPPING(SWITCH_ROLE)
453       OP_CODE_MAPPING(READ_LINK_POLICY_SETTINGS)
454       OP_CODE_MAPPING(WRITE_LINK_POLICY_SETTINGS)
455       OP_CODE_MAPPING(READ_DEFAULT_LINK_POLICY_SETTINGS)
456       OP_CODE_MAPPING(WRITE_DEFAULT_LINK_POLICY_SETTINGS)
457       OP_CODE_MAPPING(FLOW_SPECIFICATION)
458       OP_CODE_MAPPING(SET_EVENT_MASK)
459       OP_CODE_MAPPING(RESET)
460       OP_CODE_MAPPING(SET_EVENT_FILTER)
461       OP_CODE_MAPPING(FLUSH)
462       OP_CODE_MAPPING(READ_PIN_TYPE)
463       OP_CODE_MAPPING(WRITE_PIN_TYPE)
464       OP_CODE_MAPPING(READ_STORED_LINK_KEY)
465       OP_CODE_MAPPING(WRITE_STORED_LINK_KEY)
466       OP_CODE_MAPPING(DELETE_STORED_LINK_KEY)
467       OP_CODE_MAPPING(WRITE_LOCAL_NAME)
468       OP_CODE_MAPPING(READ_LOCAL_NAME)
469       OP_CODE_MAPPING(READ_CONNECTION_ACCEPT_TIMEOUT)
470       OP_CODE_MAPPING(WRITE_CONNECTION_ACCEPT_TIMEOUT)
471       OP_CODE_MAPPING(READ_PAGE_TIMEOUT)
472       OP_CODE_MAPPING(WRITE_PAGE_TIMEOUT)
473       OP_CODE_MAPPING(READ_SCAN_ENABLE)
474       OP_CODE_MAPPING(WRITE_SCAN_ENABLE)
475       OP_CODE_MAPPING(READ_PAGE_SCAN_ACTIVITY)
476       OP_CODE_MAPPING(WRITE_PAGE_SCAN_ACTIVITY)
477       OP_CODE_MAPPING(READ_INQUIRY_SCAN_ACTIVITY)
478       OP_CODE_MAPPING(WRITE_INQUIRY_SCAN_ACTIVITY)
479       OP_CODE_MAPPING(READ_AUTHENTICATION_ENABLE)
480       OP_CODE_MAPPING(WRITE_AUTHENTICATION_ENABLE)
481       OP_CODE_MAPPING(READ_CLASS_OF_DEVICE)
482       OP_CODE_MAPPING(WRITE_CLASS_OF_DEVICE)
483       OP_CODE_MAPPING(READ_VOICE_SETTING)
484       OP_CODE_MAPPING(WRITE_VOICE_SETTING)
485       OP_CODE_MAPPING(READ_AUTOMATIC_FLUSH_TIMEOUT)
486       OP_CODE_MAPPING(WRITE_AUTOMATIC_FLUSH_TIMEOUT)
487       OP_CODE_MAPPING(READ_NUM_BROADCAST_RETRANSMITS)
488       OP_CODE_MAPPING(WRITE_NUM_BROADCAST_RETRANSMITS)
489       OP_CODE_MAPPING(READ_HOLD_MODE_ACTIVITY)
490       OP_CODE_MAPPING(WRITE_HOLD_MODE_ACTIVITY)
491       OP_CODE_MAPPING(READ_TRANSMIT_POWER_LEVEL)
492       OP_CODE_MAPPING(READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE)
493       OP_CODE_MAPPING(WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE)
494       OP_CODE_MAPPING(SET_CONTROLLER_TO_HOST_FLOW_CONTROL)
495       OP_CODE_MAPPING(HOST_BUFFER_SIZE)
496       OP_CODE_MAPPING(HOST_NUM_COMPLETED_PACKETS)
497       OP_CODE_MAPPING(READ_LINK_SUPERVISION_TIMEOUT)
498       OP_CODE_MAPPING(WRITE_LINK_SUPERVISION_TIMEOUT)
499       OP_CODE_MAPPING(READ_NUMBER_OF_SUPPORTED_IAC)
500       OP_CODE_MAPPING(READ_CURRENT_IAC_LAP)
501       OP_CODE_MAPPING(WRITE_CURRENT_IAC_LAP)
502       OP_CODE_MAPPING(SET_AFH_HOST_CHANNEL_CLASSIFICATION)
503       OP_CODE_MAPPING(READ_INQUIRY_SCAN_TYPE)
504       OP_CODE_MAPPING(WRITE_INQUIRY_SCAN_TYPE)
505       OP_CODE_MAPPING(READ_INQUIRY_MODE)
506       OP_CODE_MAPPING(WRITE_INQUIRY_MODE)
507       OP_CODE_MAPPING(READ_PAGE_SCAN_TYPE)
508       OP_CODE_MAPPING(WRITE_PAGE_SCAN_TYPE)
509       OP_CODE_MAPPING(READ_AFH_CHANNEL_ASSESSMENT_MODE)
510       OP_CODE_MAPPING(WRITE_AFH_CHANNEL_ASSESSMENT_MODE)
511       OP_CODE_MAPPING(READ_LOCAL_VERSION_INFORMATION)
512       OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_FEATURES)
513       OP_CODE_MAPPING(READ_LOCAL_EXTENDED_FEATURES)
514       OP_CODE_MAPPING(READ_BUFFER_SIZE)
515       OP_CODE_MAPPING(READ_BD_ADDR)
516       OP_CODE_MAPPING(READ_FAILED_CONTACT_COUNTER)
517       OP_CODE_MAPPING(RESET_FAILED_CONTACT_COUNTER)
518       OP_CODE_MAPPING(READ_LINK_QUALITY)
519       OP_CODE_MAPPING(READ_RSSI)
520       OP_CODE_MAPPING(READ_AFH_CHANNEL_MAP)
521       OP_CODE_MAPPING(READ_CLOCK)
522       OP_CODE_MAPPING(READ_LOOPBACK_MODE)
523       OP_CODE_MAPPING(WRITE_LOOPBACK_MODE)
524       OP_CODE_MAPPING(ENABLE_DEVICE_UNDER_TEST_MODE)
525       OP_CODE_MAPPING(SETUP_SYNCHRONOUS_CONNECTION)
526       OP_CODE_MAPPING(ACCEPT_SYNCHRONOUS_CONNECTION)
527       OP_CODE_MAPPING(REJECT_SYNCHRONOUS_CONNECTION)
528       OP_CODE_MAPPING(READ_EXTENDED_INQUIRY_RESPONSE)
529       OP_CODE_MAPPING(WRITE_EXTENDED_INQUIRY_RESPONSE)
530       OP_CODE_MAPPING(REFRESH_ENCRYPTION_KEY)
531       OP_CODE_MAPPING(SNIFF_SUBRATING)
532       OP_CODE_MAPPING(READ_SIMPLE_PAIRING_MODE)
533       OP_CODE_MAPPING(WRITE_SIMPLE_PAIRING_MODE)
534       OP_CODE_MAPPING(READ_LOCAL_OOB_DATA)
535       OP_CODE_MAPPING(READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL)
536       OP_CODE_MAPPING(WRITE_INQUIRY_TRANSMIT_POWER_LEVEL)
537       OP_CODE_MAPPING(IO_CAPABILITY_REQUEST_REPLY)
538       OP_CODE_MAPPING(USER_CONFIRMATION_REQUEST_REPLY)
539       OP_CODE_MAPPING(USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY)
540       OP_CODE_MAPPING(USER_PASSKEY_REQUEST_REPLY)
541       OP_CODE_MAPPING(USER_PASSKEY_REQUEST_NEGATIVE_REPLY)
542       OP_CODE_MAPPING(REMOTE_OOB_DATA_REQUEST_REPLY)
543       OP_CODE_MAPPING(WRITE_SIMPLE_PAIRING_DEBUG_MODE)
544       OP_CODE_MAPPING(REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY)
545       OP_CODE_MAPPING(SEND_KEYPRESS_NOTIFICATION)
546       OP_CODE_MAPPING(IO_CAPABILITY_REQUEST_NEGATIVE_REPLY)
547       OP_CODE_MAPPING(READ_ENCRYPTION_KEY_SIZE)
548       OP_CODE_MAPPING(READ_DATA_BLOCK_SIZE)
549       OP_CODE_MAPPING(READ_LE_HOST_SUPPORT)
550       OP_CODE_MAPPING(WRITE_LE_HOST_SUPPORT)
551       OP_CODE_MAPPING(LE_SET_EVENT_MASK)
552       OP_CODE_MAPPING(LE_READ_BUFFER_SIZE)
553       OP_CODE_MAPPING(LE_READ_LOCAL_SUPPORTED_FEATURES)
554       OP_CODE_MAPPING(LE_SET_RANDOM_ADDRESS)
555       OP_CODE_MAPPING(LE_SET_ADVERTISING_PARAMETERS)
556       OP_CODE_MAPPING(LE_READ_ADVERTISING_CHANNEL_TX_POWER)
557       OP_CODE_MAPPING(LE_SET_ADVERTISING_DATA)
558       OP_CODE_MAPPING(LE_SET_SCAN_RESPONSE_DATA)
559       OP_CODE_MAPPING(LE_SET_ADVERTISING_ENABLE)
560       OP_CODE_MAPPING(LE_SET_SCAN_PARAMETERS)
561       OP_CODE_MAPPING(LE_SET_SCAN_ENABLE)
562       OP_CODE_MAPPING(LE_CREATE_CONNECTION)
563       OP_CODE_MAPPING(LE_CREATE_CONNECTION_CANCEL)
564       OP_CODE_MAPPING(LE_READ_WHITE_LIST_SIZE)
565       OP_CODE_MAPPING(LE_CLEAR_WHITE_LIST)
566       OP_CODE_MAPPING(LE_ADD_DEVICE_TO_WHITE_LIST)
567       OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_WHITE_LIST)
568       OP_CODE_MAPPING(LE_CONNECTION_UPDATE)
569       OP_CODE_MAPPING(LE_SET_HOST_CHANNEL_CLASSIFICATION)
570       OP_CODE_MAPPING(LE_READ_CHANNEL_MAP)
571       OP_CODE_MAPPING(LE_READ_REMOTE_FEATURES)
572       OP_CODE_MAPPING(LE_ENCRYPT)
573       OP_CODE_MAPPING(LE_RAND)
574       OP_CODE_MAPPING(LE_START_ENCRYPTION)
575       OP_CODE_MAPPING(LE_LONG_TERM_KEY_REQUEST_REPLY)
576       OP_CODE_MAPPING(LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY)
577       OP_CODE_MAPPING(LE_READ_SUPPORTED_STATES)
578       OP_CODE_MAPPING(LE_RECEIVER_TEST)
579       OP_CODE_MAPPING(LE_TRANSMITTER_TEST)
580       OP_CODE_MAPPING(LE_TEST_END)
581       OP_CODE_MAPPING(ENHANCED_SETUP_SYNCHRONOUS_CONNECTION)
582       OP_CODE_MAPPING(ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION)
583       OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_CODECS)
584       OP_CODE_MAPPING(READ_SECURE_CONNECTIONS_HOST_SUPPORT)
585       OP_CODE_MAPPING(WRITE_SECURE_CONNECTIONS_HOST_SUPPORT)
586       OP_CODE_MAPPING(READ_LOCAL_OOB_EXTENDED_DATA)
587       OP_CODE_MAPPING(WRITE_SECURE_CONNECTIONS_TEST_MODE)
588       OP_CODE_MAPPING(LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY)
589       OP_CODE_MAPPING(LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY)
590       OP_CODE_MAPPING(LE_SET_DATA_LENGTH)
591       OP_CODE_MAPPING(LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH)
592       OP_CODE_MAPPING(LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH)
593       OP_CODE_MAPPING(LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND)
594       OP_CODE_MAPPING(LE_GENERATE_DHKEY_COMMAND_V1)
595       OP_CODE_MAPPING(LE_ADD_DEVICE_TO_RESOLVING_LIST)
596       OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_RESOLVING_LIST)
597       OP_CODE_MAPPING(LE_CLEAR_RESOLVING_LIST)
598       OP_CODE_MAPPING(LE_READ_RESOLVING_LIST_SIZE)
599       OP_CODE_MAPPING(LE_READ_PEER_RESOLVABLE_ADDRESS)
600       OP_CODE_MAPPING(LE_READ_LOCAL_RESOLVABLE_ADDRESS)
601       OP_CODE_MAPPING(LE_SET_ADDRESS_RESOLUTION_ENABLE)
602       OP_CODE_MAPPING(LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT)
603       OP_CODE_MAPPING(LE_READ_MAXIMUM_DATA_LENGTH)
604       OP_CODE_MAPPING(LE_READ_PHY)
605       OP_CODE_MAPPING(LE_SET_DEFAULT_PHY)
606       OP_CODE_MAPPING(LE_SET_PHY)
607       OP_CODE_MAPPING(LE_ENHANCED_RECEIVER_TEST)
608       OP_CODE_MAPPING(LE_ENHANCED_TRANSMITTER_TEST)
609       OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS)
610       OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_PARAMETERS)
611       OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_DATA)
612       OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE)
613       OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_ENABLE)
614       OP_CODE_MAPPING(LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH)
615       OP_CODE_MAPPING(LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS)
616       OP_CODE_MAPPING(LE_REMOVE_ADVERTISING_SET)
617       OP_CODE_MAPPING(LE_CLEAR_ADVERTISING_SETS)
618       OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_PARAM)
619       OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_DATA)
620       OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_ENABLE)
621       OP_CODE_MAPPING(LE_SET_EXTENDED_SCAN_PARAMETERS)
622       OP_CODE_MAPPING(LE_SET_EXTENDED_SCAN_ENABLE)
623       OP_CODE_MAPPING(LE_EXTENDED_CREATE_CONNECTION)
624       OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_CREATE_SYNC)
625       OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL)
626       OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_TERMINATE_SYNC)
627       OP_CODE_MAPPING(LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST)
628       OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST)
629       OP_CODE_MAPPING(LE_CLEAR_PERIODIC_ADVERTISING_LIST)
630       OP_CODE_MAPPING(LE_READ_PERIODIC_ADVERTISING_LIST_SIZE)
631       OP_CODE_MAPPING(LE_READ_TRANSMIT_POWER)
632       OP_CODE_MAPPING(LE_READ_RF_PATH_COMPENSATION_POWER)
633       OP_CODE_MAPPING(LE_WRITE_RF_PATH_COMPENSATION_POWER)
634       OP_CODE_MAPPING(LE_SET_PRIVACY_MODE)
635       OP_CODE_MAPPING(LE_GENERATE_DHKEY_COMMAND)
636       // vendor specific
637       case OpCode::LE_GET_VENDOR_CAPABILITIES:
638         return vendor_capabilities_.is_supported_ == 0x01;
639       case OpCode::LE_MULTI_ADVT:
640         return vendor_capabilities_.max_advt_instances_ != 0x00;
641       case OpCode::LE_BATCH_SCAN:
642         return vendor_capabilities_.total_scan_results_storage_ != 0x00;
643       case OpCode::LE_ADV_FILTER:
644         return vendor_capabilities_.filtering_support_ == 0x01;
645       case OpCode::LE_TRACK_ADV:
646         return vendor_capabilities_.total_num_of_advt_tracked_ > 0;
647       case OpCode::LE_ENERGY_INFO:
648         return vendor_capabilities_.activity_energy_info_support_ == 0x01;
649       case OpCode::LE_EXTENDED_SCAN_PARAMS:
650         return vendor_capabilities_.extended_scan_support_ == 0x01;
651       case OpCode::CONTROLLER_DEBUG_INFO:
652         return vendor_capabilities_.debug_logging_supported_ == 0x01;
653       case OpCode::CONTROLLER_A2DP_OPCODE:
654         return vendor_capabilities_.a2dp_source_offload_capability_mask_ != 0x00;
655       case OpCode::CONTROLLER_BQR:
656         return vendor_capabilities_.bluetooth_quality_report_support_ == 0x01;
657       // undefined in local_supported_commands_
658       case OpCode::CREATE_NEW_UNIT_KEY:
659       case OpCode::READ_LOCAL_SUPPORTED_COMMANDS:
660         return true;
661       case OpCode::NONE:
662         return false;
663     }
664     return false;
665   }
666 #undef OP_CODE_MAPPING
667 
668   Controller& module_;
669 
670   HciLayer* hci_;
671 
672   Callback<void(uint16_t, uint16_t)> acl_credits_callback_;
673   Handler* acl_credits_handler_ = nullptr;
674   LocalVersionInformation local_version_information_;
675   std::array<uint8_t, 64> local_supported_commands_;
676   uint64_t local_supported_features_;
677   uint8_t maximum_page_number_;
678   std::vector<uint64_t> extended_lmp_features_array_;
679   uint16_t acl_buffer_length_ = 0;
680   uint16_t acl_buffers_ = 0;
681   uint8_t sco_buffer_length_ = 0;
682   uint16_t sco_buffers_ = 0;
683   Address mac_address_;
684   std::string local_name_;
685   LeBufferSize le_buffer_size_;
686   uint64_t le_local_supported_features_;
687   uint64_t le_supported_states_;
688   LeMaximumDataLength le_maximum_data_length_;
689   uint16_t le_maximum_advertising_data_length_;
690   uint8_t le_number_supported_advertising_sets_;
691   VendorCapabilities vendor_capabilities_;
692 };  // namespace hci
693 
694 Controller::Controller() : impl_(std::make_unique<impl>(*this)) {}
695 
696 Controller::~Controller() = default;
697 
698 void Controller::RegisterCompletedAclPacketsCallback(Callback<void(uint16_t /* handle */, uint16_t /* packets */)> cb,
699                                                      Handler* handler) {
700   impl_->RegisterCompletedAclPacketsCallback(cb, handler);  // TODO hsz: why here?
701 }
702 
703 std::string Controller::GetControllerLocalName() const {
704   return impl_->local_name_;
705 }
706 
707 LocalVersionInformation Controller::GetControllerLocalVersionInformation() const {
708   return impl_->local_version_information_;
709 }
710 
711 std::array<uint8_t, 64> Controller::GetControllerLocalSupportedCommands() const {
712   return impl_->local_supported_commands_;
713 }
714 
715 uint8_t Controller::GetControllerLocalExtendedFeaturesMaxPageNumber() const {
716   return impl_->maximum_page_number_;
717 }
718 
719 uint64_t Controller::GetControllerLocalSupportedFeatures() const {
720   return impl_->local_supported_features_;
721 }
722 
723 uint64_t Controller::GetControllerLocalExtendedFeatures(uint8_t page_number) const {
724   if (page_number <= impl_->maximum_page_number_) {
725     return impl_->extended_lmp_features_array_[page_number];
726   }
727   return 0x00;
728 }
729 
730 uint16_t Controller::GetControllerAclPacketLength() const {
731   return impl_->acl_buffer_length_;
732 }
733 
734 uint16_t Controller::GetControllerNumAclPacketBuffers() const {
735   return impl_->acl_buffers_;
736 }
737 
738 uint8_t Controller::GetControllerScoPacketLength() const {
739   return impl_->sco_buffer_length_;
740 }
741 
742 uint16_t Controller::GetControllerNumScoPacketBuffers() const {
743   return impl_->sco_buffers_;
744 }
745 
746 Address Controller::GetControllerMacAddress() const {
747   return impl_->mac_address_;
748 }
749 
750 void Controller::SetEventMask(uint64_t event_mask) {
751   GetHandler()->Post(common::BindOnce(&impl::set_event_mask, common::Unretained(impl_.get()), event_mask));
752 }
753 
754 void Controller::Reset() {
755   GetHandler()->Post(common::BindOnce(&impl::reset, common::Unretained(impl_.get())));
756 }
757 
758 void Controller::SetEventFilterClearAll() {
759   std::unique_ptr<SetEventFilterClearAllBuilder> packet = SetEventFilterClearAllBuilder::Create();
760   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
761 }
762 
763 void Controller::SetEventFilterInquiryResultAllDevices() {
764   std::unique_ptr<SetEventFilterInquiryResultAllDevicesBuilder> packet =
765       SetEventFilterInquiryResultAllDevicesBuilder::Create();
766   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
767 }
768 
769 void Controller::SetEventFilterInquiryResultClassOfDevice(ClassOfDevice class_of_device,
770                                                           ClassOfDevice class_of_device_mask) {
771   std::unique_ptr<SetEventFilterInquiryResultClassOfDeviceBuilder> packet =
772       SetEventFilterInquiryResultClassOfDeviceBuilder::Create(class_of_device, class_of_device_mask);
773   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
774 }
775 
776 void Controller::SetEventFilterInquiryResultAddress(Address address) {
777   std::unique_ptr<SetEventFilterInquiryResultAddressBuilder> packet =
778       SetEventFilterInquiryResultAddressBuilder::Create(address);
779   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
780 }
781 
782 void Controller::SetEventFilterConnectionSetupAllDevices(AutoAcceptFlag auto_accept_flag) {
783   std::unique_ptr<SetEventFilterConnectionSetupAllDevicesBuilder> packet =
784       SetEventFilterConnectionSetupAllDevicesBuilder::Create(auto_accept_flag);
785   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
786 }
787 
788 void Controller::SetEventFilterConnectionSetupClassOfDevice(ClassOfDevice class_of_device,
789                                                             ClassOfDevice class_of_device_mask,
790                                                             AutoAcceptFlag auto_accept_flag) {
791   std::unique_ptr<SetEventFilterConnectionSetupClassOfDeviceBuilder> packet =
792       SetEventFilterConnectionSetupClassOfDeviceBuilder::Create(class_of_device, class_of_device_mask,
793                                                                 auto_accept_flag);
794   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
795 }
796 
797 void Controller::SetEventFilterConnectionSetupAddress(Address address, AutoAcceptFlag auto_accept_flag) {
798   std::unique_ptr<SetEventFilterConnectionSetupAddressBuilder> packet =
799       SetEventFilterConnectionSetupAddressBuilder::Create(address, auto_accept_flag);
800   GetHandler()->Post(common::BindOnce(&impl::set_event_filter, common::Unretained(impl_.get()), std::move(packet)));
801 }
802 
803 void Controller::WriteLocalName(std::string local_name) {
804   impl_->local_name_ = local_name;
805   GetHandler()->Post(common::BindOnce(&impl::write_local_name, common::Unretained(impl_.get()), local_name));
806 }
807 
808 void Controller::HostBufferSize(uint16_t host_acl_data_packet_length, uint8_t host_synchronous_data_packet_length,
809                                 uint16_t host_total_num_acl_data_packets,
810                                 uint16_t host_total_num_synchronous_data_packets) {
811   GetHandler()->Post(common::BindOnce(&impl::host_buffer_size, common::Unretained(impl_.get()),
812                                       host_acl_data_packet_length, host_synchronous_data_packet_length,
813                                       host_total_num_acl_data_packets, host_total_num_synchronous_data_packets));
814 }
815 
816 void Controller::LeSetEventMask(uint64_t le_event_mask) {
817   GetHandler()->Post(common::BindOnce(&impl::le_set_event_mask, common::Unretained(impl_.get()), le_event_mask));
818 }
819 
820 LeBufferSize Controller::GetControllerLeBufferSize() const {
821   return impl_->le_buffer_size_;
822 }
823 
824 uint64_t Controller::GetControllerLeLocalSupportedFeatures() const {
825   return impl_->le_local_supported_features_;
826 }
827 
828 uint64_t Controller::GetControllerLeSupportedStates() const {
829   return impl_->le_supported_states_;
830 }
831 
832 LeMaximumDataLength Controller::GetControllerLeMaximumDataLength() const {
833   return impl_->le_maximum_data_length_;
834 }
835 
836 uint16_t Controller::GetControllerLeMaximumAdvertisingDataLength() const {
837   return impl_->le_maximum_advertising_data_length_;
838 }
839 
840 uint8_t Controller::GetControllerLeNumberOfSupportedAdverisingSets() const {
841   return impl_->le_number_supported_advertising_sets_;
842 }
843 
844 VendorCapabilities Controller::GetControllerVendorCapabilities() const {
845   return impl_->vendor_capabilities_;
846 }
847 
848 bool Controller::IsSupported(bluetooth::hci::OpCode op_code) const {
849   return impl_->is_supported(op_code);
850 }
851 
852 const ModuleFactory Controller::Factory = ModuleFactory([]() { return new Controller(); });
853 
854 void Controller::ListDependencies(ModuleList* list) {
855   list->add<hci::HciLayer>();
856 }
857 
858 void Controller::Start() {
859   impl_->Start(GetDependency<hci::HciLayer>());
860 }
861 
862 void Controller::Stop() {
863   impl_->Stop();
864 }
865 
866 std::string Controller::ToString() const {
867   return "Controller";
868 }
869 }  // namespace hci
870 }  // namespace bluetooth
871