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