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() {
331 ASSERT(!callbacks_given_);
332 callbacks_given_ = true;
333 return &tracker;
334 }
335
336 bool callbacks_given_{false};
337 AclConnectionTracker tracker;
338 std::shared_ptr<Queue> queue_;
339 };
340
ClassicAclConnection()341 ClassicAclConnection::ClassicAclConnection()
342 : AclConnection(), acl_connection_interface_(nullptr), address_(Address::kEmpty) {}
343
ClassicAclConnection(std::shared_ptr<Queue> queue,AclConnectionInterface * acl_connection_interface,uint16_t handle,Address address)344 ClassicAclConnection::ClassicAclConnection(std::shared_ptr<Queue> queue,
345 AclConnectionInterface* acl_connection_interface, uint16_t handle,
346 Address address)
347 : AclConnection(queue->GetUpEnd(), handle), acl_connection_interface_(acl_connection_interface), address_(address) {
348 pimpl_ = new ClassicAclConnection::impl(acl_connection_interface, std::move(queue), address, handle);
349 }
350
~ClassicAclConnection()351 ClassicAclConnection::~ClassicAclConnection() {
352 delete pimpl_;
353 }
354
GetEventCallbacks()355 ConnectionManagementCallbacks* ClassicAclConnection::GetEventCallbacks() {
356 return pimpl_->GetEventCallbacks();
357 }
358
RegisterCallbacks(ConnectionManagementCallbacks * callbacks,os::Handler * handler)359 void ClassicAclConnection::RegisterCallbacks(ConnectionManagementCallbacks* callbacks, os::Handler* handler) {
360 return pimpl_->tracker.RegisterCallbacks(callbacks, handler);
361 }
362
Disconnect(DisconnectReason reason)363 bool ClassicAclConnection::Disconnect(DisconnectReason reason) {
364 acl_connection_interface_->EnqueueCommand(
365 DisconnectBuilder::Create(handle_, reason),
366 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<DisconnectStatusView>));
367 return true;
368 }
369
ChangeConnectionPacketType(uint16_t packet_type)370 bool ClassicAclConnection::ChangeConnectionPacketType(uint16_t packet_type) {
371 acl_connection_interface_->EnqueueCommand(
372 ChangeConnectionPacketTypeBuilder::Create(handle_, packet_type),
373 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ChangeConnectionPacketTypeStatusView>));
374 return true;
375 }
376
AuthenticationRequested()377 bool ClassicAclConnection::AuthenticationRequested() {
378 acl_connection_interface_->EnqueueCommand(
379 AuthenticationRequestedBuilder::Create(handle_),
380 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<AuthenticationRequestedStatusView>));
381 return true;
382 }
383
SetConnectionEncryption(Enable enable)384 bool ClassicAclConnection::SetConnectionEncryption(Enable enable) {
385 acl_connection_interface_->EnqueueCommand(
386 SetConnectionEncryptionBuilder::Create(handle_, enable),
387 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<SetConnectionEncryptionStatusView>));
388 return true;
389 }
390
ChangeConnectionLinkKey()391 bool ClassicAclConnection::ChangeConnectionLinkKey() {
392 acl_connection_interface_->EnqueueCommand(
393 ChangeConnectionLinkKeyBuilder::Create(handle_),
394 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ChangeConnectionLinkKeyStatusView>));
395 return true;
396 }
397
ReadClockOffset()398 bool ClassicAclConnection::ReadClockOffset() {
399 acl_connection_interface_->EnqueueCommand(
400 ReadClockOffsetBuilder::Create(handle_),
401 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ReadClockOffsetStatusView>));
402 return true;
403 }
404
HoldMode(uint16_t max_interval,uint16_t min_interval)405 bool ClassicAclConnection::HoldMode(uint16_t max_interval, uint16_t min_interval) {
406 acl_connection_interface_->EnqueueCommand(
407 HoldModeBuilder::Create(handle_, max_interval, min_interval),
408 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<HoldModeStatusView>));
409 return true;
410 }
411
SniffMode(uint16_t max_interval,uint16_t min_interval,uint16_t attempt,uint16_t timeout)412 bool ClassicAclConnection::SniffMode(uint16_t max_interval, uint16_t min_interval, uint16_t attempt, uint16_t timeout) {
413 acl_connection_interface_->EnqueueCommand(
414 SniffModeBuilder::Create(handle_, max_interval, min_interval, attempt, timeout),
415 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<SniffModeStatusView>));
416 return true;
417 }
418
ExitSniffMode()419 bool ClassicAclConnection::ExitSniffMode() {
420 acl_connection_interface_->EnqueueCommand(
421 ExitSniffModeBuilder::Create(handle_),
422 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<ExitSniffModeStatusView>));
423 return true;
424 }
425
QosSetup(ServiceType service_type,uint32_t token_rate,uint32_t peak_bandwidth,uint32_t latency,uint32_t delay_variation)426 bool ClassicAclConnection::QosSetup(ServiceType service_type, uint32_t token_rate, uint32_t peak_bandwidth,
427 uint32_t latency, uint32_t delay_variation) {
428 acl_connection_interface_->EnqueueCommand(
429 QosSetupBuilder::Create(handle_, service_type, token_rate, peak_bandwidth, latency, delay_variation),
430 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<QosSetupStatusView>));
431 return true;
432 }
433
RoleDiscovery()434 bool ClassicAclConnection::RoleDiscovery() {
435 acl_connection_interface_->EnqueueCommand(
436 RoleDiscoveryBuilder::Create(handle_),
437 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_role_discovery_complete));
438 return true;
439 }
440
ReadLinkPolicySettings()441 bool ClassicAclConnection::ReadLinkPolicySettings() {
442 acl_connection_interface_->EnqueueCommand(
443 ReadLinkPolicySettingsBuilder::Create(handle_),
444 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
445 &AclConnectionTracker::on_read_link_policy_settings_complete));
446 return true;
447 }
448
WriteLinkPolicySettings(uint16_t link_policy_settings)449 bool ClassicAclConnection::WriteLinkPolicySettings(uint16_t link_policy_settings) {
450 acl_connection_interface_->EnqueueCommand(
451 WriteLinkPolicySettingsBuilder::Create(handle_, link_policy_settings),
452 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteLinkPolicySettingsCompleteView>));
453 return true;
454 }
455
FlowSpecification(FlowDirection flow_direction,ServiceType service_type,uint32_t token_rate,uint32_t token_bucket_size,uint32_t peak_bandwidth,uint32_t access_latency)456 bool ClassicAclConnection::FlowSpecification(FlowDirection flow_direction, ServiceType service_type,
457 uint32_t token_rate, uint32_t token_bucket_size, uint32_t peak_bandwidth,
458 uint32_t access_latency) {
459 acl_connection_interface_->EnqueueCommand(
460 FlowSpecificationBuilder::Create(handle_, flow_direction, service_type, token_rate, token_bucket_size,
461 peak_bandwidth, access_latency),
462 pimpl_->tracker.client_handler_->BindOnce(&check_command_status<FlowSpecificationStatusView>));
463 return true;
464 }
465
SniffSubrating(uint16_t maximum_latency,uint16_t minimum_remote_timeout,uint16_t minimum_local_timeout)466 bool ClassicAclConnection::SniffSubrating(uint16_t maximum_latency, uint16_t minimum_remote_timeout,
467 uint16_t minimum_local_timeout) {
468 acl_connection_interface_->EnqueueCommand(
469 SniffSubratingBuilder::Create(handle_, maximum_latency, minimum_remote_timeout, minimum_local_timeout),
470 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<SniffSubratingCompleteView>));
471 return true;
472 }
473
Flush()474 bool ClassicAclConnection::Flush() {
475 acl_connection_interface_->EnqueueCommand(
476 FlushBuilder::Create(handle_),
477 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<FlushCompleteView>));
478 return true;
479 }
480
ReadAutomaticFlushTimeout()481 bool ClassicAclConnection::ReadAutomaticFlushTimeout() {
482 acl_connection_interface_->EnqueueCommand(
483 ReadAutomaticFlushTimeoutBuilder::Create(handle_),
484 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
485 &AclConnectionTracker::on_read_automatic_flush_timeout_complete));
486 return true;
487 }
488
WriteAutomaticFlushTimeout(uint16_t flush_timeout)489 bool ClassicAclConnection::WriteAutomaticFlushTimeout(uint16_t flush_timeout) {
490 acl_connection_interface_->EnqueueCommand(
491 WriteAutomaticFlushTimeoutBuilder::Create(handle_, flush_timeout),
492 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteAutomaticFlushTimeoutCompleteView>));
493 return true;
494 }
495
ReadTransmitPowerLevel(TransmitPowerLevelType type)496 bool ClassicAclConnection::ReadTransmitPowerLevel(TransmitPowerLevelType type) {
497 acl_connection_interface_->EnqueueCommand(
498 ReadTransmitPowerLevelBuilder::Create(handle_, type),
499 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
500 &AclConnectionTracker::on_read_transmit_power_level_complete));
501 return true;
502 }
503
ReadLinkSupervisionTimeout()504 bool ClassicAclConnection::ReadLinkSupervisionTimeout() {
505 acl_connection_interface_->EnqueueCommand(
506 ReadLinkSupervisionTimeoutBuilder::Create(handle_),
507 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
508 &AclConnectionTracker::on_read_link_supervision_timeout_complete));
509 return true;
510 }
511
WriteLinkSupervisionTimeout(uint16_t link_supervision_timeout)512 bool ClassicAclConnection::WriteLinkSupervisionTimeout(uint16_t link_supervision_timeout) {
513 acl_connection_interface_->EnqueueCommand(
514 WriteLinkSupervisionTimeoutBuilder::Create(handle_, link_supervision_timeout),
515 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<WriteLinkSupervisionTimeoutCompleteView>));
516 return true;
517 }
518
ReadFailedContactCounter()519 bool ClassicAclConnection::ReadFailedContactCounter() {
520 acl_connection_interface_->EnqueueCommand(
521 ReadFailedContactCounterBuilder::Create(handle_),
522 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
523 &AclConnectionTracker::on_read_failed_contact_counter_complete));
524 return true;
525 }
526
ResetFailedContactCounter()527 bool ClassicAclConnection::ResetFailedContactCounter() {
528 acl_connection_interface_->EnqueueCommand(
529 ResetFailedContactCounterBuilder::Create(handle_),
530 pimpl_->tracker.client_handler_->BindOnce(&check_command_complete<ResetFailedContactCounterCompleteView>));
531 return true;
532 }
533
ReadLinkQuality()534 bool ClassicAclConnection::ReadLinkQuality() {
535 acl_connection_interface_->EnqueueCommand(
536 ReadLinkQualityBuilder::Create(handle_),
537 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
538 &AclConnectionTracker::on_read_link_quality_complete));
539 return true;
540 }
541
ReadAfhChannelMap()542 bool ClassicAclConnection::ReadAfhChannelMap() {
543 acl_connection_interface_->EnqueueCommand(
544 ReadAfhChannelMapBuilder::Create(handle_),
545 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
546 &AclConnectionTracker::on_read_afh_channel_map_complete));
547 return true;
548 }
549
ReadRssi()550 bool ClassicAclConnection::ReadRssi() {
551 acl_connection_interface_->EnqueueCommand(
552 ReadRssiBuilder::Create(handle_),
553 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_read_rssi_complete));
554 return true;
555 }
556
ReadRemoteVersionInformation()557 bool ClassicAclConnection::ReadRemoteVersionInformation() {
558 acl_connection_interface_->EnqueueCommand(
559 ReadRemoteVersionInformationBuilder::Create(handle_),
560 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
561 &AclConnectionTracker::on_read_remote_version_information_status));
562 return true;
563 }
564
ReadRemoteSupportedFeatures()565 bool ClassicAclConnection::ReadRemoteSupportedFeatures() {
566 acl_connection_interface_->EnqueueCommand(
567 ReadRemoteSupportedFeaturesBuilder::Create(handle_),
568 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker,
569 &AclConnectionTracker::on_read_remote_supported_features_status));
570 return true;
571 }
572
ReadRemoteExtendedFeatures(uint8_t page_number)573 bool ClassicAclConnection::ReadRemoteExtendedFeatures(uint8_t page_number) {
574 acl_connection_interface_->EnqueueCommand(
575 ReadRemoteExtendedFeaturesBuilder::Create(handle_, page_number),
576 pimpl_->tracker.client_handler_->BindOnceOn(
577 &pimpl_->tracker, &AclConnectionTracker::on_read_remote_extended_features_status));
578 return true;
579 }
580
ReadClock(WhichClock which_clock)581 bool ClassicAclConnection::ReadClock(WhichClock which_clock) {
582 pimpl_->tracker.acl_connection_interface_->EnqueueCommand(
583 ReadClockBuilder::Create(handle_, which_clock),
584 pimpl_->tracker.client_handler_->BindOnceOn(&pimpl_->tracker, &AclConnectionTracker::on_read_clock_complete));
585 return true;
586 }
587
588 } // namespace acl_manager
589 } // namespace hci
590 } // namespace bluetooth
591