• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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/acl_manager/classic_acl_connection.h"
18 #include "hci/acl_manager/event_checkers.h"
19 #include "hci/address.h"
20 #include "os/metrics.h"
21 
22 using bluetooth::hci::Address;
23 
24 namespace bluetooth {
25 namespace hci {
26 namespace acl_manager {
27 
28 class AclConnectionTracker : public ConnectionManagementCallbacks {
29  public:
AclConnectionTracker(AclConnectionInterface * acl_connection_interface,const Address & address,uint16_t connection_handle)30   AclConnectionTracker(
31       AclConnectionInterface* acl_connection_interface, const Address& address, uint16_t connection_handle)
32       : acl_connection_interface_(acl_connection_interface), address_(address), connection_handle_(connection_handle) {}
~AclConnectionTracker()33   ~AclConnectionTracker() {
34     // If callbacks were registered, they should have been delivered.
35     ASSERT(client_callbacks_ == nullptr || queued_callbacks_.empty());
36   }
RegisterCallbacks(ConnectionManagementCallbacks * callbacks,os::Handler * handler)37   void RegisterCallbacks(ConnectionManagementCallbacks* callbacks, os::Handler* handler) {
38     client_handler_ = handler;
39     client_callbacks_ = callbacks;
40     while (!queued_callbacks_.empty()) {
41       auto iter = queued_callbacks_.begin();
42       handler->Post(std::move(*iter));
43       queued_callbacks_.erase(iter);
44     }
45   }
46 
47 #define SAVE_OR_CALL(f, ...)                                                                                        \
48   if (client_handler_ == nullptr) {                                                                                 \
49     queued_callbacks_.emplace_back(                                                                                 \
50         common::BindOnce(&ConnectionManagementCallbacks::f, common::Unretained(this), ##__VA_ARGS__));              \
51   } else {                                                                                                          \
52     client_handler_->Post(                                                                                          \
53         common::BindOnce(&ConnectionManagementCallbacks::f, common::Unretained(client_callbacks_), ##__VA_ARGS__)); \
54   }
55 
OnConnectionPacketTypeChanged(uint16_t packet_type)56   void OnConnectionPacketTypeChanged(uint16_t packet_type) override {
57     SAVE_OR_CALL(OnConnectionPacketTypeChanged, packet_type)
58   }
OnAuthenticationComplete(hci::ErrorCode hci_status)59   void OnAuthenticationComplete(hci::ErrorCode hci_status) override {
60     SAVE_OR_CALL(OnAuthenticationComplete, hci_status)
61   }
OnEncryptionChange(EncryptionEnabled enabled)62   void OnEncryptionChange(EncryptionEnabled enabled) override {
63     SAVE_OR_CALL(OnEncryptionChange, enabled)
64   }
OnChangeConnectionLinkKeyComplete()65   void OnChangeConnectionLinkKeyComplete() override {
66     SAVE_OR_CALL(OnChangeConnectionLinkKeyComplete)
67   }
OnReadClockOffsetComplete(uint16_t clock_offset)68   void OnReadClockOffsetComplete(uint16_t clock_offset) override {
69     SAVE_OR_CALL(OnReadClockOffsetComplete, clock_offset)
70   }
OnModeChange(ErrorCode status,Mode current_mode,uint16_t interval)71   void OnModeChange(ErrorCode status, Mode current_mode, uint16_t interval) override {
72     SAVE_OR_CALL(OnModeChange, status, current_mode, interval)
73   }
OnSniffSubrating(hci::ErrorCode hci_status,uint16_t maximum_transmit_latency,uint16_t maximum_receive_latency,uint16_t minimum_remote_timeout,uint16_t minimum_local_timeout)74   void OnSniffSubrating(
75       hci::ErrorCode hci_status,
76       uint16_t maximum_transmit_latency,
77       uint16_t maximum_receive_latency,
78       uint16_t minimum_remote_timeout,
79       uint16_t minimum_local_timeout) override {
80     SAVE_OR_CALL(
81         OnSniffSubrating,
82         hci_status,
83         maximum_transmit_latency,
84         maximum_receive_latency,
85         minimum_remote_timeout,
86         minimum_local_timeout);
87   }
OnQosSetupComplete(ServiceType service_type,uint32_t token_rate,uint32_t peak_bandwidth,uint32_t latency,uint32_t delay_variation)88   void OnQosSetupComplete(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth, uint32_t latency,
89                           uint32_t delay_variation) override {
90     SAVE_OR_CALL(OnQosSetupComplete, service_type, token_rate, peak_bandwidth, latency, delay_variation)
91   }
OnFlowSpecificationComplete(FlowDirection flow_direction,ServiceType service_type,uint32_t token_rate,uint32_t token_bucket_size,uint32_t peak_bandwidth,uint32_t access_latency)92   void OnFlowSpecificationComplete(FlowDirection flow_direction, ServiceType service_type, uint32_t token_rate,
93                                    uint32_t token_bucket_size, uint32_t peak_bandwidth,
94                                    uint32_t access_latency) override {
95     SAVE_OR_CALL(OnFlowSpecificationComplete, flow_direction, service_type, token_rate, token_bucket_size,
96                  peak_bandwidth, access_latency)
97   }
OnFlushOccurred()98   void OnFlushOccurred() override {
99     SAVE_OR_CALL(OnFlushOccurred)
100   }
OnRoleDiscoveryComplete(Role current_role)101   void OnRoleDiscoveryComplete(Role current_role) override {
102     SAVE_OR_CALL(OnRoleDiscoveryComplete, current_role)
103   }
OnReadLinkPolicySettingsComplete(uint16_t link_policy_settings)104   void OnReadLinkPolicySettingsComplete(uint16_t link_policy_settings) override {
105     SAVE_OR_CALL(OnReadLinkPolicySettingsComplete, link_policy_settings)
106   }
OnReadAutomaticFlushTimeoutComplete(uint16_t flush_timeout)107   void OnReadAutomaticFlushTimeoutComplete(uint16_t flush_timeout) override {
108     SAVE_OR_CALL(OnReadAutomaticFlushTimeoutComplete, flush_timeout)
109   }
OnReadTransmitPowerLevelComplete(uint8_t transmit_power_level)110   void OnReadTransmitPowerLevelComplete(uint8_t transmit_power_level) override {
111     bluetooth::os::LogMetricReadTxPowerLevelResult(
112         address_, connection_handle_, static_cast<uint8_t>(ErrorCode::SUCCESS), transmit_power_level);
113     SAVE_OR_CALL(OnReadTransmitPowerLevelComplete, transmit_power_level)
114   }
OnReadLinkSupervisionTimeoutComplete(uint16_t link_supervision_timeout)115   void OnReadLinkSupervisionTimeoutComplete(uint16_t link_supervision_timeout) override {
116     SAVE_OR_CALL(OnReadLinkSupervisionTimeoutComplete, link_supervision_timeout)
117   }
OnReadFailedContactCounterComplete(uint16_t failed_contact_counter)118   void OnReadFailedContactCounterComplete(uint16_t failed_contact_counter) override {
119     bluetooth::os::LogMetricReadFailedContactCounterResult(
120         address_, connection_handle_, static_cast<uint8_t>(ErrorCode::SUCCESS), failed_contact_counter);
121     SAVE_OR_CALL(OnReadFailedContactCounterComplete, failed_contact_counter);
122   }
OnReadLinkQualityComplete(uint8_t link_quality)123   void OnReadLinkQualityComplete(uint8_t link_quality) override {
124     SAVE_OR_CALL(OnReadLinkQualityComplete, link_quality)
125   }
OnReadAfhChannelMapComplete(AfhMode afh_mode,std::array<uint8_t,10> afh_channel_map)126   void OnReadAfhChannelMapComplete(AfhMode afh_mode, std::array<uint8_t, 10> afh_channel_map) override {
127     SAVE_OR_CALL(OnReadAfhChannelMapComplete, afh_mode, afh_channel_map)
128   }
OnReadRssiComplete(uint8_t rssi)129   void OnReadRssiComplete(uint8_t rssi) override {
130     bluetooth::os::LogMetricReadRssiResult(
131         address_, connection_handle_, static_cast<uint8_t>(ErrorCode::SUCCESS), rssi);
132     SAVE_OR_CALL(OnReadRssiComplete, rssi);
133   }
OnReadClockComplete(uint32_t clock,uint16_t accuracy)134   void OnReadClockComplete(uint32_t clock, uint16_t accuracy) override {
135     SAVE_OR_CALL(OnReadClockComplete, clock, accuracy)
136   }
OnCentralLinkKeyComplete(KeyFlag key_flag)137   void OnCentralLinkKeyComplete(KeyFlag key_flag) override {
138     SAVE_OR_CALL(OnCentralLinkKeyComplete, key_flag)
139   }
OnRoleChange(hci::ErrorCode hci_status,Role new_role)140   void OnRoleChange(hci::ErrorCode hci_status, Role new_role) override {
141     SAVE_OR_CALL(OnRoleChange, hci_status, new_role)
142   }
OnReadRemoteVersionInformationComplete(hci::ErrorCode hci_status,uint8_t lmp_version,uint16_t manufacturer_name,uint16_t sub_version)143   void OnReadRemoteVersionInformationComplete(
144       hci::ErrorCode hci_status, uint8_t lmp_version, uint16_t manufacturer_name, uint16_t sub_version) override {
145     bluetooth::os::LogMetricRemoteVersionInfo(
146         connection_handle_, static_cast<uint8_t>(hci_status), lmp_version, manufacturer_name, sub_version);
147     SAVE_OR_CALL(OnReadRemoteVersionInformationComplete, hci_status, lmp_version, manufacturer_name, sub_version);
148   }
OnReadRemoteSupportedFeaturesComplete(uint64_t features)149   void OnReadRemoteSupportedFeaturesComplete(uint64_t features) override {
150     SAVE_OR_CALL(OnReadRemoteSupportedFeaturesComplete, features);
151   }
OnReadRemoteExtendedFeaturesComplete(uint8_t page_number,uint8_t max_page_number,uint64_t features)152   void OnReadRemoteExtendedFeaturesComplete(uint8_t page_number, uint8_t max_page_number, uint64_t features) override {
153     SAVE_OR_CALL(OnReadRemoteExtendedFeaturesComplete, page_number, max_page_number, features);
154   }
OnDisconnection(ErrorCode reason)155   void OnDisconnection(ErrorCode reason) {
156     SAVE_OR_CALL(OnDisconnection, reason);
157   }
158 
159 #undef SAVE_OR_CALL
160 
on_role_discovery_complete(CommandCompleteView view)161   void on_role_discovery_complete(CommandCompleteView view) {
162     auto complete_view = RoleDiscoveryCompleteView::Create(view);
163     if (!complete_view.IsValid()) {
164       LOG_ERROR("Received on_role_discovery_complete with invalid packet");
165       return;
166     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
167       auto status = complete_view.GetStatus();
168       std::string error_code = ErrorCodeText(status);
169       LOG_ERROR("Received on_role_discovery_complete with error code %s", error_code.c_str());
170       return;
171     }
172     OnRoleDiscoveryComplete(complete_view.GetCurrentRole());
173   }
174 
on_read_link_policy_settings_complete(CommandCompleteView view)175   void on_read_link_policy_settings_complete(CommandCompleteView view) {
176     auto complete_view = ReadLinkPolicySettingsCompleteView::Create(view);
177     if (!complete_view.IsValid()) {
178       LOG_ERROR("Received on_read_link_policy_settings_complete with invalid packet");
179       return;
180     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
181       auto status = complete_view.GetStatus();
182       std::string error_code = ErrorCodeText(status);
183       LOG_ERROR("Received on_read_link_policy_settings_complete with error code %s", error_code.c_str());
184       return;
185     }
186     OnReadLinkPolicySettingsComplete(complete_view.GetLinkPolicySettings());
187   }
188 
on_read_automatic_flush_timeout_complete(CommandCompleteView view)189   void on_read_automatic_flush_timeout_complete(CommandCompleteView view) {
190     auto complete_view = ReadAutomaticFlushTimeoutCompleteView::Create(view);
191     if (!complete_view.IsValid()) {
192       LOG_ERROR("Received on_read_automatic_flush_timeout_complete with invalid packet");
193       return;
194     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
195       auto status = complete_view.GetStatus();
196       std::string error_code = ErrorCodeText(status);
197       LOG_ERROR("Received on_read_automatic_flush_timeout_complete with error code %s", error_code.c_str());
198       return;
199     }
200     OnReadAutomaticFlushTimeoutComplete(complete_view.GetFlushTimeout());
201   }
202 
on_read_transmit_power_level_complete(CommandCompleteView view)203   void on_read_transmit_power_level_complete(CommandCompleteView view) {
204     auto complete_view = ReadTransmitPowerLevelCompleteView::Create(view);
205     if (!complete_view.IsValid()) {
206       LOG_ERROR("Received on_read_transmit_power_level_complete with invalid packet");
207       return;
208     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
209       auto status = complete_view.GetStatus();
210       std::string error_code = ErrorCodeText(status);
211       LOG_ERROR("Received on_read_transmit_power_level_complete with error code %s", error_code.c_str());
212       return;
213     }
214     OnReadTransmitPowerLevelComplete(complete_view.GetTransmitPowerLevel());
215   }
216 
on_read_link_supervision_timeout_complete(CommandCompleteView view)217   void on_read_link_supervision_timeout_complete(CommandCompleteView view) {
218     auto complete_view = ReadLinkSupervisionTimeoutCompleteView::Create(view);
219     if (!complete_view.IsValid()) {
220       LOG_ERROR("Received on_read_link_supervision_timeout_complete with invalid packet");
221       return;
222     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
223       auto status = complete_view.GetStatus();
224       std::string error_code = ErrorCodeText(status);
225       LOG_ERROR("Received on_read_link_supervision_timeout_complete with error code %s", error_code.c_str());
226       return;
227     }
228     OnReadLinkSupervisionTimeoutComplete(complete_view.GetLinkSupervisionTimeout());
229   }
230 
on_read_failed_contact_counter_complete(CommandCompleteView view)231   void on_read_failed_contact_counter_complete(CommandCompleteView view) {
232     auto complete_view = ReadFailedContactCounterCompleteView::Create(view);
233     if (!complete_view.IsValid()) {
234       LOG_ERROR("Received on_read_failed_contact_counter_complete with invalid packet");
235       return;
236     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
237       auto status = complete_view.GetStatus();
238       std::string error_code = ErrorCodeText(status);
239       LOG_ERROR("Received on_read_failed_contact_counter_complete with error code %s", error_code.c_str());
240       return;
241     }
242     OnReadFailedContactCounterComplete(complete_view.GetFailedContactCounter());
243   }
244 
on_read_link_quality_complete(CommandCompleteView view)245   void on_read_link_quality_complete(CommandCompleteView view) {
246     auto complete_view = ReadLinkQualityCompleteView::Create(view);
247     if (!complete_view.IsValid()) {
248       LOG_ERROR("Received on_read_link_quality_complete with invalid packet");
249       return;
250     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
251       auto status = complete_view.GetStatus();
252       std::string error_code = ErrorCodeText(status);
253       LOG_ERROR("Received on_read_link_quality_complete with error code %s", error_code.c_str());
254       return;
255     }
256     OnReadLinkQualityComplete(complete_view.GetLinkQuality());
257   }
258 
on_read_afh_channel_map_complete(CommandCompleteView view)259   void on_read_afh_channel_map_complete(CommandCompleteView view) {
260     auto complete_view = ReadAfhChannelMapCompleteView::Create(view);
261     if (!complete_view.IsValid()) {
262       LOG_ERROR("Received on_read_afh_channel_map_complete with invalid packet");
263       return;
264     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
265       auto status = complete_view.GetStatus();
266       std::string error_code = ErrorCodeText(status);
267       LOG_ERROR("Received on_read_afh_channel_map_complete with error code %s", error_code.c_str());
268       return;
269     }
270     OnReadAfhChannelMapComplete(complete_view.GetAfhMode(), complete_view.GetAfhChannelMap());
271   }
272 
on_read_rssi_complete(CommandCompleteView view)273   void on_read_rssi_complete(CommandCompleteView view) {
274     auto complete_view = ReadRssiCompleteView::Create(view);
275     if (!complete_view.IsValid()) {
276       LOG_ERROR("Received on_read_rssi_complete with invalid packet");
277       return;
278     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
279       auto status = complete_view.GetStatus();
280       std::string error_code = ErrorCodeText(status);
281       LOG_ERROR("Received on_read_rssi_complete with error code %s", error_code.c_str());
282       return;
283     }
284     OnReadRssiComplete(complete_view.GetRssi());
285   }
286 
on_read_remote_version_information_status(CommandStatusView view)287   void on_read_remote_version_information_status(CommandStatusView view) {
288     ASSERT_LOG(view.IsValid(), "Bad status packet!");
289   }
290 
on_read_remote_supported_features_status(CommandStatusView view)291   void on_read_remote_supported_features_status(CommandStatusView view) {
292     ASSERT_LOG(view.IsValid(), "Bad status packet!");
293   }
294 
on_read_remote_extended_features_status(CommandStatusView view)295   void on_read_remote_extended_features_status(CommandStatusView view) {
296     ASSERT_LOG(view.IsValid(), "Bad status packet!");
297   }
298 
on_read_clock_complete(CommandCompleteView view)299   void on_read_clock_complete(CommandCompleteView view) {
300     auto complete_view = ReadClockCompleteView::Create(view);
301     if (!complete_view.IsValid()) {
302       LOG_ERROR("Received on_read_clock_complete with invalid packet");
303       return;
304     } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
305       auto status = complete_view.GetStatus();
306       std::string error_code = ErrorCodeText(status);
307       LOG_ERROR("Received on_read_clock_complete with error code %s", error_code.c_str());
308       return;
309     }
310     uint32_t clock = complete_view.GetClock();
311     uint16_t accuracy = complete_view.GetAccuracy();
312     OnReadClockComplete(clock, accuracy);
313   }
314 
315   AclConnectionInterface* acl_connection_interface_;
316   os::Handler* client_handler_ = nullptr;
317   ConnectionManagementCallbacks* client_callbacks_ = nullptr;
318   std::list<common::OnceClosure> queued_callbacks_;
319   Address address_;
320   uint16_t connection_handle_;
321 };
322 
323 struct ClassicAclConnection::impl {
implbluetooth::hci::acl_manager::ClassicAclConnection::impl324   impl(
325       AclConnectionInterface* acl_connection_interface,
326       std::shared_ptr<Queue> queue,
327       const Address& address,
328       uint16_t connection_handle)
329       : tracker(acl_connection_interface, address, connection_handle), queue_(std::move(queue)) {}
GetEventCallbacksbluetooth::hci::acl_manager::ClassicAclConnection::impl330   ConnectionManagementCallbacks* GetEventCallbacks(std::function<void(uint16_t)> invalidate_callbacks) {
331     ASSERT_LOG(!invalidate_callbacks_, "Already returned event callbacks for this connection");
332     invalidate_callbacks_ = std::move(invalidate_callbacks);
333     return &tracker;
334   }
PutEventCallbacksbluetooth::hci::acl_manager::ClassicAclConnection::impl335   void PutEventCallbacks() {
336     if (invalidate_callbacks_) invalidate_callbacks_(tracker.connection_handle_);
337     invalidate_callbacks_ = {};
338   }
339 
340   AclConnectionTracker tracker;
341   std::shared_ptr<Queue> queue_;
342   std::function<void(uint16_t)> invalidate_callbacks_;
343 };
344 
ClassicAclConnection()345 ClassicAclConnection::ClassicAclConnection()
346     : AclConnection(), acl_connection_interface_(nullptr), address_(Address::kEmpty) {}
347 
ClassicAclConnection(std::shared_ptr<Queue> queue,AclConnectionInterface * acl_connection_interface,uint16_t handle,Address address)348 ClassicAclConnection::ClassicAclConnection(std::shared_ptr<Queue> queue,
349                                            AclConnectionInterface* acl_connection_interface, uint16_t handle,
350                                            Address address)
351     : AclConnection(queue->GetUpEnd(), handle), acl_connection_interface_(acl_connection_interface), address_(address) {
352   pimpl_ = new ClassicAclConnection::impl(acl_connection_interface, std::move(queue), address, handle);
353 }
354 
~ClassicAclConnection()355 ClassicAclConnection::~ClassicAclConnection() {
356   if (pimpl_) pimpl_->PutEventCallbacks();
357   delete pimpl_;
358 }
359 
GetEventCallbacks(std::function<void (uint16_t)> invalidate_callbacks)360 ConnectionManagementCallbacks* ClassicAclConnection::GetEventCallbacks(
361     std::function<void(uint16_t)> invalidate_callbacks) {
362   return pimpl_->GetEventCallbacks(std::move(invalidate_callbacks));
363 }
364 
RegisterCallbacks(ConnectionManagementCallbacks * callbacks,os::Handler * handler)365 void ClassicAclConnection::RegisterCallbacks(ConnectionManagementCallbacks* callbacks, os::Handler* handler) {
366   return pimpl_->tracker.RegisterCallbacks(callbacks, handler);
367 }
368 
Disconnect(DisconnectReason reason)369 bool ClassicAclConnection::Disconnect(DisconnectReason reason) {
370   acl_connection_interface_->EnqueueCommand(
371       DisconnectBuilder::Create(handle_, reason),
372       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<DisconnectStatusView>));
373   return true;
374 }
375 
ChangeConnectionPacketType(uint16_t packet_type)376 bool ClassicAclConnection::ChangeConnectionPacketType(uint16_t packet_type) {
377   acl_connection_interface_->EnqueueCommand(
378       ChangeConnectionPacketTypeBuilder::Create(handle_, packet_type),
379       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ChangeConnectionPacketTypeStatusView>));
380   return true;
381 }
382 
AuthenticationRequested()383 bool ClassicAclConnection::AuthenticationRequested() {
384   acl_connection_interface_->EnqueueCommand(
385       AuthenticationRequestedBuilder::Create(handle_),
386       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<AuthenticationRequestedStatusView>));
387   return true;
388 }
389 
SetConnectionEncryption(Enable enable)390 bool ClassicAclConnection::SetConnectionEncryption(Enable enable) {
391   acl_connection_interface_->EnqueueCommand(
392       SetConnectionEncryptionBuilder::Create(handle_, enable),
393       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<SetConnectionEncryptionStatusView>));
394   return true;
395 }
396 
ChangeConnectionLinkKey()397 bool ClassicAclConnection::ChangeConnectionLinkKey() {
398   acl_connection_interface_->EnqueueCommand(
399       ChangeConnectionLinkKeyBuilder::Create(handle_),
400       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ChangeConnectionLinkKeyStatusView>));
401   return true;
402 }
403 
ReadClockOffset()404 bool ClassicAclConnection::ReadClockOffset() {
405   acl_connection_interface_->EnqueueCommand(
406       ReadClockOffsetBuilder::Create(handle_),
407       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ReadClockOffsetStatusView>));
408   return true;
409 }
410 
HoldMode(uint16_t max_interval,uint16_t min_interval)411 bool ClassicAclConnection::HoldMode(uint16_t max_interval, uint16_t min_interval) {
412   acl_connection_interface_->EnqueueCommand(
413       HoldModeBuilder::Create(handle_, max_interval, min_interval),
414       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<HoldModeStatusView>));
415   return true;
416 }
417 
SniffMode(uint16_t max_interval,uint16_t min_interval,uint16_t attempt,uint16_t timeout)418 bool ClassicAclConnection::SniffMode(uint16_t max_interval, uint16_t min_interval, uint16_t attempt, uint16_t timeout) {
419   acl_connection_interface_->EnqueueCommand(
420       SniffModeBuilder::Create(handle_, max_interval, min_interval, attempt, timeout),
421       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<SniffModeStatusView>));
422   return true;
423 }
424 
ExitSniffMode()425 bool ClassicAclConnection::ExitSniffMode() {
426   acl_connection_interface_->EnqueueCommand(
427       ExitSniffModeBuilder::Create(handle_),
428       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ExitSniffModeStatusView>));
429   return true;
430 }
431 
QosSetup(ServiceType service_type,uint32_t token_rate,uint32_t peak_bandwidth,uint32_t latency,uint32_t delay_variation)432 bool ClassicAclConnection::QosSetup(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
433                                     uint32_t latency, uint32_t delay_variation) {
434   acl_connection_interface_->EnqueueCommand(
435       QosSetupBuilder::Create(handle_, service_type, token_rate, peak_bandwidth, latency, delay_variation),
436       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<QosSetupStatusView>));
437   return true;
438 }
439 
RoleDiscovery()440 bool ClassicAclConnection::RoleDiscovery() {
441   acl_connection_interface_->EnqueueCommand(
442       RoleDiscoveryBuilder::Create(handle_),
443       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_role_discovery_complete));
444   return true;
445 }
446 
ReadLinkPolicySettings()447 bool ClassicAclConnection::ReadLinkPolicySettings() {
448   acl_connection_interface_->EnqueueCommand(
449       ReadLinkPolicySettingsBuilder::Create(handle_),
450       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
451                                                   &AclConnectionTracker::on_read_link_policy_settings_complete));
452   return true;
453 }
454 
WriteLinkPolicySettings(uint16_t link_policy_settings)455 bool ClassicAclConnection::WriteLinkPolicySettings(uint16_t link_policy_settings) {
456   acl_connection_interface_->EnqueueCommand(
457       WriteLinkPolicySettingsBuilder::Create(handle_, link_policy_settings),
458       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteLinkPolicySettingsCompleteView>));
459   return true;
460 }
461 
FlowSpecification(FlowDirection flow_direction,ServiceType service_type,uint32_t token_rate,uint32_t token_bucket_size,uint32_t peak_bandwidth,uint32_t access_latency)462 bool ClassicAclConnection::FlowSpecification(FlowDirection flow_direction, ServiceType service_type,
463                                              uint32_t token_rate, uint32_t token_bucket_size, uint32_t peak_bandwidth,
464                                              uint32_t access_latency) {
465   acl_connection_interface_->EnqueueCommand(
466       FlowSpecificationBuilder::Create(handle_, flow_direction, service_type, token_rate, token_bucket_size,
467                                        peak_bandwidth, access_latency),
468       pimpl_->tracker.client_handler_->BindOnce(&check_command_status<FlowSpecificationStatusView>));
469   return true;
470 }
471 
SniffSubrating(uint16_t maximum_latency,uint16_t minimum_remote_timeout,uint16_t minimum_local_timeout)472 bool ClassicAclConnection::SniffSubrating(uint16_t maximum_latency, uint16_t minimum_remote_timeout,
473                                           uint16_t minimum_local_timeout) {
474   acl_connection_interface_->EnqueueCommand(
475       SniffSubratingBuilder::Create(handle_, maximum_latency, minimum_remote_timeout, minimum_local_timeout),
476       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<SniffSubratingCompleteView>));
477   return true;
478 }
479 
Flush()480 bool ClassicAclConnection::Flush() {
481   acl_connection_interface_->EnqueueCommand(
482       FlushBuilder::Create(handle_),
483       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<FlushCompleteView>));
484   return true;
485 }
486 
ReadAutomaticFlushTimeout()487 bool ClassicAclConnection::ReadAutomaticFlushTimeout() {
488   acl_connection_interface_->EnqueueCommand(
489       ReadAutomaticFlushTimeoutBuilder::Create(handle_),
490       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
491                                                   &AclConnectionTracker::on_read_automatic_flush_timeout_complete));
492   return true;
493 }
494 
WriteAutomaticFlushTimeout(uint16_t flush_timeout)495 bool ClassicAclConnection::WriteAutomaticFlushTimeout(uint16_t flush_timeout) {
496   acl_connection_interface_->EnqueueCommand(
497       WriteAutomaticFlushTimeoutBuilder::Create(handle_, flush_timeout),
498       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteAutomaticFlushTimeoutCompleteView>));
499   return true;
500 }
501 
ReadTransmitPowerLevel(TransmitPowerLevelType type)502 bool ClassicAclConnection::ReadTransmitPowerLevel(TransmitPowerLevelType type) {
503   acl_connection_interface_->EnqueueCommand(
504       ReadTransmitPowerLevelBuilder::Create(handle_, type),
505       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
506                                                   &AclConnectionTracker::on_read_transmit_power_level_complete));
507   return true;
508 }
509 
ReadLinkSupervisionTimeout()510 bool ClassicAclConnection::ReadLinkSupervisionTimeout() {
511   acl_connection_interface_->EnqueueCommand(
512       ReadLinkSupervisionTimeoutBuilder::Create(handle_),
513       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
514                                                   &AclConnectionTracker::on_read_link_supervision_timeout_complete));
515   return true;
516 }
517 
WriteLinkSupervisionTimeout(uint16_t link_supervision_timeout)518 bool ClassicAclConnection::WriteLinkSupervisionTimeout(uint16_t link_supervision_timeout) {
519   acl_connection_interface_->EnqueueCommand(
520       WriteLinkSupervisionTimeoutBuilder::Create(handle_, link_supervision_timeout),
521       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteLinkSupervisionTimeoutCompleteView>));
522   return true;
523 }
524 
ReadFailedContactCounter()525 bool ClassicAclConnection::ReadFailedContactCounter() {
526   acl_connection_interface_->EnqueueCommand(
527       ReadFailedContactCounterBuilder::Create(handle_),
528       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
529                                                   &AclConnectionTracker::on_read_failed_contact_counter_complete));
530   return true;
531 }
532 
ResetFailedContactCounter()533 bool ClassicAclConnection::ResetFailedContactCounter() {
534   acl_connection_interface_->EnqueueCommand(
535       ResetFailedContactCounterBuilder::Create(handle_),
536       pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<ResetFailedContactCounterCompleteView>));
537   return true;
538 }
539 
ReadLinkQuality()540 bool ClassicAclConnection::ReadLinkQuality() {
541   acl_connection_interface_->EnqueueCommand(
542       ReadLinkQualityBuilder::Create(handle_),
543       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
544                                                   &AclConnectionTracker::on_read_link_quality_complete));
545   return true;
546 }
547 
ReadAfhChannelMap()548 bool ClassicAclConnection::ReadAfhChannelMap() {
549   acl_connection_interface_->EnqueueCommand(
550       ReadAfhChannelMapBuilder::Create(handle_),
551       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
552                                                   &AclConnectionTracker::on_read_afh_channel_map_complete));
553   return true;
554 }
555 
ReadRssi()556 bool ClassicAclConnection::ReadRssi() {
557   acl_connection_interface_->EnqueueCommand(
558       ReadRssiBuilder::Create(handle_),
559       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_read_rssi_complete));
560   return true;
561 }
562 
ReadRemoteVersionInformation()563 bool ClassicAclConnection::ReadRemoteVersionInformation() {
564   acl_connection_interface_->EnqueueCommand(
565       ReadRemoteVersionInformationBuilder::Create(handle_),
566       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
567                                                   &AclConnectionTracker::on_read_remote_version_information_status));
568   return true;
569 }
570 
ReadRemoteSupportedFeatures()571 bool ClassicAclConnection::ReadRemoteSupportedFeatures() {
572   acl_connection_interface_->EnqueueCommand(
573       ReadRemoteSupportedFeaturesBuilder::Create(handle_),
574       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
575                                                   &AclConnectionTracker::on_read_remote_supported_features_status));
576   return true;
577 }
578 
ReadRemoteExtendedFeatures(uint8_t page_number)579 bool ClassicAclConnection::ReadRemoteExtendedFeatures(uint8_t page_number) {
580   acl_connection_interface_->EnqueueCommand(
581       ReadRemoteExtendedFeaturesBuilder::Create(handle_, page_number),
582       pimpl_->tracker.client_handler_->BindOnceOn(
583           &pimpl_->tracker, &AclConnectionTracker::on_read_remote_extended_features_status));
584   return true;
585 }
586 
ReadClock(WhichClock which_clock)587 bool ClassicAclConnection::ReadClock(WhichClock which_clock) {
588   pimpl_->tracker.acl_connection_interface_->EnqueueCommand(
589       ReadClockBuilder::Create(handle_, which_clock),
590       pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_read_clock_complete));
591   return true;
592 }
593 
594 }  // namespace acl_manager
595 }  // namespace hci
596 }  // namespace bluetooth
597