1 /*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "hci/le_scanning_manager.h"
17
18 #include <bluetooth/log.h>
19 #include <com_android_bluetooth_flags.h>
20
21 #include <memory>
22 #include <unordered_map>
23
24 #include "hci/acl_manager.h"
25 #include "hci/controller.h"
26 #include "hci/event_checkers.h"
27 #include "hci/hci_layer.h"
28 #include "hci/hci_packets.h"
29 #include "hci/le_periodic_sync_manager.h"
30 #include "hci/le_scanning_interface.h"
31 #include "hci/le_scanning_reassembler.h"
32 #include "main/shim/entry.h"
33 #include "module.h"
34 #include "os/handler.h"
35 #include "os/system_properties.h"
36 #include "storage/storage_module.h"
37
38 namespace bluetooth {
39 namespace hci {
40
41 constexpr uint16_t kLeScanWindowMin = 0x0004;
42 constexpr uint16_t kLeScanWindowMax = 0x4000;
43 constexpr int64_t kLeScanRssiMin = -127;
44 constexpr int64_t kLeScanRssiMax = 20;
45 constexpr int64_t kLeScanRssiUnknown = 127;
46 constexpr int64_t kLeRxPathLossCompMin = -128;
47 constexpr int64_t kLeRxPathLossCompMax = 127;
48 constexpr uint16_t kDefaultLeExtendedScanWindow = 4800;
49 constexpr uint16_t kLeExtendedScanWindowMax = 0xFFFF;
50 constexpr uint16_t kLeScanIntervalMin = 0x0004;
51 constexpr uint16_t kLeScanIntervalMax = 0x4000;
52 constexpr uint16_t kDefaultLeExtendedScanInterval = 4800;
53 constexpr uint16_t kLeExtendedScanIntervalMax = 0xFFFF;
54
55 constexpr uint8_t kScannableBit = 1;
56 constexpr uint8_t kDirectedBit = 2;
57 constexpr uint8_t kScanResponseBit = 3;
58 constexpr uint8_t kLegacyBit = 4;
59 constexpr uint8_t kDataStatusBits = 5;
60
61 constexpr uint8_t k1mPhyMask = 1;
62 constexpr uint8_t kCodedPhyMask = 1 << 2;
63
64 // system properties
65 const std::string kLeRxPathLossCompProperty = "bluetooth.hardware.radio.le_rx_path_loss_comp_db";
66
67 const ModuleFactory LeScanningManager::Factory =
__anon7229f0f00102() 68 ModuleFactory([]() { return new LeScanningManager(); });
69
70 enum class ScanApiType {
71 LEGACY = 1,
72 ANDROID_HCI = 2,
73 EXTENDED = 3,
74 };
75
76 struct Scanner {
77 Uuid app_uuid;
78 bool in_use;
79 };
80
81 class NullScanningCallback : public ScanningCallback {
OnScannerRegistered(const Uuid,ScannerId,ScanningStatus)82 void OnScannerRegistered(const Uuid /* app_uuid */, ScannerId /* scanner_id */,
83 ScanningStatus /* status */) override {
84 log::info("OnScannerRegistered in NullScanningCallback");
85 }
OnSetScannerParameterComplete(ScannerId,ScanningStatus)86 void OnSetScannerParameterComplete(ScannerId /* scanner_id */,
87 ScanningStatus /* status */) override {
88 log::info("OnSetScannerParameterComplete in NullScanningCallback");
89 }
OnScanResult(uint16_t,uint8_t,Address,uint8_t,uint8_t,uint8_t,int8_t,int8_t,uint16_t,std::vector<uint8_t>)90 void OnScanResult(uint16_t /* event_type */, uint8_t /* address_type */, Address /* address */,
91 uint8_t /* primary_phy */, uint8_t /* secondary_phy */,
92 uint8_t /* advertising_sid */, int8_t /* tx_power */, int8_t /* rssi */,
93 uint16_t /* periodic_advertising_interval */,
94 std::vector<uint8_t> /* advertising_data */) override {
95 log::info("OnScanResult in NullScanningCallback");
96 }
OnTrackAdvFoundLost(AdvertisingFilterOnFoundOnLostInfo)97 void OnTrackAdvFoundLost(
98 AdvertisingFilterOnFoundOnLostInfo /* on_found_on_lost_info */) override {
99 log::info("OnTrackAdvFoundLost in NullScanningCallback");
100 }
OnBatchScanReports(int,int,int,int,std::vector<uint8_t>)101 void OnBatchScanReports(int /* client_if */, int /* status */, int /* report_format */,
102 int /* num_records */, std::vector<uint8_t> /* data */) override {
103 log::info("OnBatchScanReports in NullScanningCallback");
104 }
OnBatchScanThresholdCrossed(int)105 void OnBatchScanThresholdCrossed(int /* client_if */) override {
106 log::info("OnBatchScanThresholdCrossed in NullScanningCallback");
107 }
OnTimeout()108 void OnTimeout() override { log::info("OnTimeout in NullScanningCallback"); }
OnFilterEnable(Enable,uint8_t)109 void OnFilterEnable(Enable /* enable */, uint8_t /* status */) override {
110 log::info("OnFilterEnable in NullScanningCallback");
111 }
OnFilterParamSetup(uint8_t,ApcfAction,uint8_t)112 void OnFilterParamSetup(uint8_t /* available_spaces */, ApcfAction /* action */,
113 uint8_t /* status */) override {
114 log::info("OnFilterParamSetup in NullScanningCallback");
115 }
OnFilterConfigCallback(ApcfFilterType,uint8_t,ApcfAction,uint8_t)116 void OnFilterConfigCallback(ApcfFilterType /* filter_type */, uint8_t /* available_spaces */,
117 ApcfAction /* action */, uint8_t /* status */) override {
118 log::info("OnFilterConfigCallback in NullScanningCallback");
119 }
OnPeriodicSyncStarted(int,uint8_t,uint16_t,uint8_t,AddressWithType,uint8_t,uint16_t)120 void OnPeriodicSyncStarted(int /* reg_id */, uint8_t /* status */, uint16_t /* sync_handle */,
121 uint8_t /* advertising_sid */, AddressWithType /* address_with_type */,
122 uint8_t /* phy */, uint16_t /* interval */) override {
123 log::info("OnPeriodicSyncStarted in NullScanningCallback");
124 }
OnPeriodicSyncReport(uint16_t,int8_t,int8_t,uint8_t,std::vector<uint8_t>)125 void OnPeriodicSyncReport(uint16_t /* sync_handle */, int8_t /* tx_power */, int8_t /* rssi */,
126 uint8_t /* status */, std::vector<uint8_t> /* data */) override {
127 log::info("OnPeriodicSyncReport in NullScanningCallback");
128 }
OnPeriodicSyncLost(uint16_t)129 void OnPeriodicSyncLost(uint16_t /* sync_handle */) override {
130 log::info("OnPeriodicSyncLost in NullScanningCallback");
131 }
OnPeriodicSyncTransferred(int,uint8_t,Address)132 void OnPeriodicSyncTransferred(int /* pa_source */, uint8_t /* status */,
133 Address /* address */) override {
134 log::info("OnPeriodicSyncTransferred in NullScanningCallback");
135 }
OnBigInfoReport(uint16_t,bool)136 void OnBigInfoReport(uint16_t /* sync_handle */, bool /* encrypted */) {
137 log::info("OnBigInfoReport in NullScanningCallback");
138 }
139 };
140
141 enum class BatchScanState {
142 ERROR_STATE = 0,
143 ENABLE_CALLED = 1,
144 ENABLED_STATE = 2,
145 DISABLE_CALLED = 3,
146 DISABLED_STATE = 4,
147 };
148
149 #define BTM_BLE_BATCH_SCAN_MODE_DISABLE 0
150 #define BTM_BLE_BATCH_SCAN_MODE_PASS 1
151 #define BTM_BLE_BATCH_SCAN_MODE_ACTI 2
152 #define BTM_BLE_BATCH_SCAN_MODE_PASS_ACTI 3
153
154 struct BatchScanConfig {
155 BatchScanState current_state;
156 BatchScanMode scan_mode;
157 uint32_t scan_interval;
158 uint32_t scan_window;
159 BatchScanDiscardRule discard_rule;
160 ScannerId ref_value;
161 };
162
163 struct LeScanningManager::impl : public LeAddressManagerCallback {
implbluetooth::hci::LeScanningManager::impl164 impl(Module* module) : module_(module), le_scanning_interface_(nullptr) {}
165
~implbluetooth::hci::LeScanningManager::impl166 ~impl() {
167 if (address_manager_registered_) {
168 le_address_manager_->Unregister(this);
169 }
170 }
171
startbluetooth::hci::LeScanningManager::impl172 void start(os::Handler* handler, HciLayer* hci_layer, Controller* controller,
173 AclManager* acl_manager, storage::StorageModule* storage_module) {
174 module_handler_ = handler;
175 hci_layer_ = hci_layer;
176 controller_ = controller;
177 acl_manager_ = acl_manager;
178 storage_module_ = storage_module;
179 le_address_manager_ = acl_manager->GetLeAddressManager();
180 le_scanning_interface_ = hci_layer_->GetLeScanningInterface(
181 module_handler_->BindOn(this, &LeScanningManager::impl::handle_scan_results));
182 periodic_sync_manager_.Init(le_scanning_interface_, module_handler_);
183 /* Check to see if the opcode is supported and C19 (support for extended advertising). */
184 if (controller_->IsSupported(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS) &&
185 controller->SupportsBleExtendedAdvertising()) {
186 api_type_ = ScanApiType::EXTENDED;
187 interval_ms_1m_ = kDefaultLeExtendedScanInterval;
188 window_ms_1m_ = kDefaultLeExtendedScanWindow;
189 phy_ = static_cast<uint8_t>(PhyType::LE_1M);
190 } else if (controller_->IsSupported(OpCode::LE_EXTENDED_SCAN_PARAMS)) {
191 api_type_ = ScanApiType::ANDROID_HCI;
192 } else {
193 api_type_ = ScanApiType::LEGACY;
194 }
195 is_filter_supported_ = controller_->IsSupported(OpCode::LE_ADV_FILTER);
196 if (is_filter_supported_) {
197 le_scanning_interface_->EnqueueCommand(
198 LeAdvFilterReadExtendedFeaturesBuilder::Create(),
199 module_handler_->BindOnceOn(this, &impl::on_apcf_read_extended_features_complete));
200 }
201 is_batch_scan_supported_ = controller->IsSupported(OpCode::LE_BATCH_SCAN);
202 is_periodic_advertising_sync_transfer_sender_supported_ =
203 controller_->SupportsBlePeriodicAdvertisingSyncTransferSender();
204 total_num_of_advt_tracked_ = controller->GetVendorCapabilities().total_num_of_advt_tracked_;
205 if (is_batch_scan_supported_) {
206 hci_layer_->RegisterVendorSpecificEventHandler(
207 VseSubeventCode::BLE_THRESHOLD,
208 handler->BindOn(this, &LeScanningManager::impl::on_storage_threshold_breach));
209 hci_layer_->RegisterVendorSpecificEventHandler(
210 VseSubeventCode::BLE_TRACKING,
211 handler->BindOn(this, &LeScanningManager::impl::on_advertisement_tracking));
212 }
213 scanners_ = std::vector<Scanner>(kMaxAppNum + 1);
214 for (size_t i = 0; i < scanners_.size(); i++) {
215 scanners_[i].app_uuid = Uuid::kEmpty;
216 scanners_[i].in_use = false;
217 }
218 batch_scan_config_.current_state = BatchScanState::DISABLED_STATE;
219 batch_scan_config_.ref_value = kInvalidScannerId;
220 le_rx_path_loss_comp_ = get_rx_path_loss_compensation();
221 }
222
stopbluetooth::hci::LeScanningManager::impl223 void stop() {
224 for (auto subevent_code : LeScanningEvents) {
225 hci_layer_->UnregisterLeEventHandler(subevent_code);
226 }
227 if (is_batch_scan_supported_) {
228 // TODO implete vse module
229 // hci_layer_->UnregisterVesEventHandler(VseSubeventCode::BLE_THRESHOLD);
230 // hci_layer_->UnregisterVesEventHandler(VseSubeventCode::BLE_TRACKING);
231 }
232 batch_scan_config_.current_state = BatchScanState::DISABLED_STATE;
233 batch_scan_config_.ref_value = kInvalidScannerId;
234 scanning_callbacks_ = &null_scanning_callback_;
235 periodic_sync_manager_.SetScanningCallback(scanning_callbacks_);
236 }
237
handle_scan_resultsbluetooth::hci::LeScanningManager::impl238 void handle_scan_results(LeMetaEventView event) {
239 switch (event.GetSubeventCode()) {
240 case SubeventCode::ADVERTISING_REPORT:
241 handle_advertising_report(LeAdvertisingReportRawView::Create(event));
242 break;
243 case SubeventCode::DIRECTED_ADVERTISING_REPORT:
244 handle_directed_advertising_report(LeDirectedAdvertisingReportView::Create(event));
245 break;
246 case SubeventCode::EXTENDED_ADVERTISING_REPORT:
247 handle_extended_advertising_report(LeExtendedAdvertisingReportRawView::Create(event));
248 break;
249 case SubeventCode::PERIODIC_ADVERTISING_SYNC_ESTABLISHED:
250 LePeriodicAdvertisingSyncEstablishedView::Create(event);
251 periodic_sync_manager_.HandleLePeriodicAdvertisingSyncEstablished(
252 LePeriodicAdvertisingSyncEstablishedView::Create(event));
253 break;
254 case SubeventCode::PERIODIC_ADVERTISING_REPORT:
255 periodic_sync_manager_.HandleLePeriodicAdvertisingReport(
256 LePeriodicAdvertisingReportView::Create(event));
257 break;
258 case SubeventCode::PERIODIC_ADVERTISING_SYNC_LOST:
259 periodic_sync_manager_.HandleLePeriodicAdvertisingSyncLost(
260 LePeriodicAdvertisingSyncLostView::Create(event));
261 break;
262 case SubeventCode::PERIODIC_ADVERTISING_SYNC_TRANSFER_RECEIVED:
263 periodic_sync_manager_.HandleLePeriodicAdvertisingSyncTransferReceived(
264 LePeriodicAdvertisingSyncTransferReceivedView::Create(event));
265 break;
266 case SubeventCode::SCAN_TIMEOUT:
267 scanning_callbacks_->OnTimeout();
268 break;
269 case SubeventCode::BIG_INFO_ADVERTISING_REPORT:
270 periodic_sync_manager_.HandleLeBigInfoAdvertisingReport(
271 LeBigInfoAdvertisingReportView::Create(event));
272 break;
273 default:
274 log::fatal("Unknown advertising subevent {}", SubeventCodeText(event.GetSubeventCode()));
275 }
276 }
277
278 struct ExtendedEventTypeOptions {
279 bool connectable{false};
280 bool scannable{false};
281 bool directed{false};
282 bool scan_response{false};
283 bool legacy{false};
284 bool continuing{false};
285 bool truncated{false};
286 };
287
get_rx_path_loss_compensationbluetooth::hci::LeScanningManager::impl288 int8_t get_rx_path_loss_compensation() {
289 int8_t compensation = 0;
290 auto compensation_prop = os::GetSystemProperty(kLeRxPathLossCompProperty);
291 if (compensation_prop) {
292 auto compensation_number = common::Int64FromString(compensation_prop.value());
293 if (compensation_number) {
294 int64_t number = compensation_number.value();
295 if (number < kLeRxPathLossCompMin || number > kLeRxPathLossCompMax) {
296 log::error("Invalid number for rx path loss compensation: {}", number);
297 } else {
298 compensation = number;
299 }
300 }
301 }
302 log::info("Rx path loss compensation: {}", compensation);
303 return compensation;
304 }
305
get_rssi_after_calibrationbluetooth::hci::LeScanningManager::impl306 int8_t get_rssi_after_calibration(int8_t rssi) {
307 if (le_rx_path_loss_comp_ == 0 || rssi == kLeScanRssiUnknown) {
308 return rssi;
309 }
310 int8_t calibrated_rssi = rssi;
311 int64_t number = rssi + le_rx_path_loss_comp_;
312 if (number < kLeScanRssiMin || number > kLeScanRssiMax) {
313 log::error("Invalid number for calibrated rssi: {}", number);
314 } else {
315 calibrated_rssi = number;
316 }
317 return calibrated_rssi;
318 }
319
transform_to_extended_event_typebluetooth::hci::LeScanningManager::impl320 uint16_t transform_to_extended_event_type(ExtendedEventTypeOptions o) {
321 return (o.connectable ? 0x0001 << 0 : 0) | (o.scannable ? 0x0001 << 1 : 0) |
322 (o.directed ? 0x0001 << 2 : 0) | (o.scan_response ? 0x0001 << 3 : 0) |
323 (o.legacy ? 0x0001 << 4 : 0) | (o.continuing ? 0x0001 << 5 : 0) |
324 (o.truncated ? 0x0001 << 6 : 0);
325 }
326
handle_advertising_reportbluetooth::hci::LeScanningManager::impl327 void handle_advertising_report(LeAdvertisingReportRawView event_view) {
328 if (!event_view.IsValid()) {
329 log::info("Dropping invalid advertising event");
330 return;
331 }
332 std::vector<LeAdvertisingResponseRaw> reports = event_view.GetResponses();
333 if (reports.empty()) {
334 log::info("Zero results in advertising event");
335 return;
336 }
337
338 for (LeAdvertisingResponseRaw report : reports) {
339 uint16_t extended_event_type = 0;
340 switch (report.event_type_) {
341 case AdvertisingEventType::ADV_IND:
342 extended_event_type = transform_to_extended_event_type(
343 {.connectable = true, .scannable = true, .legacy = true});
344 break;
345 case AdvertisingEventType::ADV_DIRECT_IND:
346 extended_event_type = transform_to_extended_event_type(
347 {.connectable = true, .directed = true, .legacy = true});
348 break;
349 case AdvertisingEventType::ADV_SCAN_IND:
350 extended_event_type =
351 transform_to_extended_event_type({.scannable = true, .legacy = true});
352 break;
353 case AdvertisingEventType::ADV_NONCONN_IND:
354 extended_event_type = transform_to_extended_event_type({.legacy = true});
355 break;
356 case AdvertisingEventType::SCAN_RESPONSE:
357 // We don't know if the initial advertising report was connectable or not.
358 // LeScanningReassembler fixes the connectable field.
359 extended_event_type = transform_to_extended_event_type(
360 {.scannable = true, .scan_response = true, .legacy = true});
361 break;
362 default:
363 log::warn("Unsupported event type:{}", (uint16_t)report.event_type_);
364 return;
365 }
366
367 process_advertising_package_content(
368 extended_event_type, (uint8_t)report.address_type_, report.address_,
369 (uint8_t)PrimaryPhyType::LE_1M, (uint8_t)SecondaryPhyType::NO_PACKETS,
370 kAdvertisingDataInfoNotPresent, kTxPowerInformationNotPresent, report.rssi_,
371 kNotPeriodicAdvertisement, report.advertising_data_);
372 }
373 }
374
handle_directed_advertising_reportbluetooth::hci::LeScanningManager::impl375 void handle_directed_advertising_report(LeDirectedAdvertisingReportView /*event_view*/) {
376 log::warn("HCI Directed Advertising Report events are not supported");
377 }
378
handle_extended_advertising_reportbluetooth::hci::LeScanningManager::impl379 void handle_extended_advertising_report(LeExtendedAdvertisingReportRawView event_view) {
380 if (!event_view.IsValid()) {
381 log::info("Dropping invalid advertising event");
382 return;
383 }
384
385 std::vector<LeExtendedAdvertisingResponseRaw> reports = event_view.GetResponses();
386 if (reports.empty()) {
387 log::info("Zero results in advertising event");
388 return;
389 }
390
391 for (LeExtendedAdvertisingResponseRaw& report : reports) {
392 uint16_t event_type =
393 report.connectable_ | (report.scannable_ << kScannableBit) |
394 (report.directed_ << kDirectedBit) | (report.scan_response_ << kScanResponseBit) |
395 (report.legacy_ << kLegacyBit) | ((uint16_t)report.data_status_ << kDataStatusBits);
396 process_advertising_package_content(
397 event_type, (uint8_t)report.address_type_, report.address_,
398 (uint8_t)report.primary_phy_, (uint8_t)report.secondary_phy_, report.advertising_sid_,
399 report.tx_power_, report.rssi_, report.periodic_advertising_interval_,
400 report.advertising_data_);
401 }
402 }
403
process_advertising_package_contentbluetooth::hci::LeScanningManager::impl404 void process_advertising_package_content(uint16_t event_type, uint8_t address_type,
405 Address address, uint8_t primary_phy,
406 uint8_t secondary_phy, uint8_t advertising_sid,
407 int8_t tx_power, int8_t rssi,
408 uint16_t periodic_advertising_interval,
409 const std::vector<uint8_t>& advertising_data) {
410 // When using the vendor command Le Set Extended Params to
411 // configure a filter accept list based e.g. on the service UUIDs
412 // found in the report, we ignore the scan responses as we cannot be
413 // certain that they will not be dropped by the filter.
414 // TODO(b/275754998): Improve the decision on what to do with scan responses: Only when used
415 // with hardware-filtering features should we ignore waiting for scan response, and make sure
416 // scan responses are still reported too.
417 scanning_reassembler_.SetIgnoreScanResponses(
418 le_scan_type_ == LeScanType::PASSIVE ||
419 filter_policy_ == LeScanningFilterPolicy::FILTER_ACCEPT_LIST_ONLY);
420
421 std::optional<LeScanningReassembler::CompleteAdvertisingData> processed_report =
422 scanning_reassembler_.ProcessAdvertisingReport(event_type, address_type, address,
423 advertising_sid, advertising_data);
424
425 if (processed_report.has_value()) {
426 switch (address_type) {
427 case (uint8_t)AddressType::PUBLIC_DEVICE_ADDRESS:
428 case (uint8_t)AddressType::PUBLIC_IDENTITY_ADDRESS:
429 address_type = (uint8_t)AddressType::PUBLIC_DEVICE_ADDRESS;
430 break;
431 case (uint8_t)AddressType::RANDOM_DEVICE_ADDRESS:
432 case (uint8_t)AddressType::RANDOM_IDENTITY_ADDRESS:
433 address_type = (uint8_t)AddressType::RANDOM_DEVICE_ADDRESS;
434 break;
435 }
436
437 scanning_callbacks_->OnScanResult(
438 processed_report->extended_event_type, address_type, address, primary_phy,
439 secondary_phy, advertising_sid, tx_power, get_rssi_after_calibration(rssi),
440 periodic_advertising_interval, std::move(processed_report->data));
441 }
442 }
443
configure_scanbluetooth::hci::LeScanningManager::impl444 void configure_scan() {
445 std::vector<PhyScanParameters> parameter_vector;
446
447 // The Host shall not issue set scan parameter command when scanning is enabled
448 stop_scan();
449
450 if (le_address_manager_->GetAddressPolicy() != LeAddressManager::USE_PUBLIC_ADDRESS) {
451 if (controller_->IsRpaGenerationSupported()) {
452 log::info("Support RPA offload, set own address type RESOLVABLE_OR_RANDOM_ADDRESS");
453 own_address_type_ = OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS;
454 } else {
455 own_address_type_ = OwnAddressType::RANDOM_DEVICE_ADDRESS;
456 }
457 } else {
458 own_address_type_ = OwnAddressType::PUBLIC_DEVICE_ADDRESS;
459 }
460
461 switch (api_type_) {
462 case ScanApiType::EXTENDED:
463 if ((phy_ & k1mPhyMask) != 0) {
464 PhyScanParameters phy_scan_parameters;
465 phy_scan_parameters.le_scan_window_ = window_ms_1m_;
466 phy_scan_parameters.le_scan_interval_ = interval_ms_1m_;
467 phy_scan_parameters.le_scan_type_ = le_scan_type_;
468 parameter_vector.push_back(phy_scan_parameters);
469 }
470 if ((phy_ & kCodedPhyMask) != 0) {
471 PhyScanParameters phy_scan_parameters;
472 phy_scan_parameters.le_scan_window_ = window_ms_coded_;
473 phy_scan_parameters.le_scan_interval_ = interval_ms_coded_;
474 phy_scan_parameters.le_scan_type_ = le_scan_type_;
475 parameter_vector.push_back(phy_scan_parameters);
476 }
477 le_scanning_interface_->EnqueueCommand(
478 LeSetExtendedScanParametersBuilder::Create(own_address_type_, filter_policy_, phy_,
479 parameter_vector),
480 module_handler_->BindOnceOn(this, &impl::on_set_scan_parameter_complete));
481 break;
482 case ScanApiType::ANDROID_HCI:
483 if ((phy_ & k1mPhyMask) == 0) {
484 log::warn("Only 1M phy supported");
485 return;
486 }
487 le_scanning_interface_->EnqueueCommand(
488 LeExtendedScanParamsBuilder::Create(le_scan_type_, interval_ms_1m_, window_ms_1m_,
489 own_address_type_, filter_policy_),
490 module_handler_->BindOnceOn(this, &impl::on_set_scan_parameter_complete));
491
492 break;
493 case ScanApiType::LEGACY:
494 if ((phy_ & k1mPhyMask) == 0) {
495 log::warn("Only 1M phy supported");
496 return;
497 }
498 le_scanning_interface_->EnqueueCommand(
499
500 LeSetScanParametersBuilder::Create(le_scan_type_, interval_ms_1m_, window_ms_1m_,
501 own_address_type_, filter_policy_),
502 module_handler_->BindOnceOn(this, &impl::on_set_scan_parameter_complete));
503 break;
504 }
505 }
506
register_scannerbluetooth::hci::LeScanningManager::impl507 void register_scanner(const Uuid app_uuid) {
508 for (uint8_t i = 1; i <= kMaxAppNum; i++) {
509 if (scanners_[i].in_use && scanners_[i].app_uuid == app_uuid) {
510 log::error("Application already registered {}", app_uuid.ToString());
511 scanning_callbacks_->OnScannerRegistered(app_uuid, 0x00,
512 ScanningCallback::ScanningStatus::INTERNAL_ERROR);
513 return;
514 }
515 }
516
517 // valid value of scanner id : 1 ~ kMaxAppNum
518 for (uint8_t i = 1; i <= kMaxAppNum; i++) {
519 if (!scanners_[i].in_use) {
520 scanners_[i].app_uuid = app_uuid;
521 scanners_[i].in_use = true;
522 scanning_callbacks_->OnScannerRegistered(app_uuid, i,
523 ScanningCallback::ScanningStatus::SUCCESS);
524 return;
525 }
526 }
527
528 log::error("Unable to register scanner, max client reached:{}", kMaxAppNum);
529 scanning_callbacks_->OnScannerRegistered(app_uuid, 0x00,
530 ScanningCallback::ScanningStatus::NO_RESOURCES);
531 }
532
unregister_scannerbluetooth::hci::LeScanningManager::impl533 void unregister_scanner(ScannerId scanner_id) {
534 if (scanner_id <= 0 || scanner_id > kMaxAppNum) {
535 log::warn("Invalid scanner id");
536 return;
537 }
538
539 if (scanners_[scanner_id].in_use) {
540 scanners_[scanner_id].in_use = false;
541 scanners_[scanner_id].app_uuid = Uuid::kEmpty;
542 log::debug("Unregister scanner successful, scannerId={}", scanner_id);
543 } else {
544 log::warn("Unregister scanner with unused scanner id");
545 }
546 }
547
scanbluetooth::hci::LeScanningManager::impl548 void scan(bool start) {
549 // On-resume flag should always be reset if there is an explicit start/stop call.
550 scan_on_resume_ = false;
551 if (start) {
552 configure_scan();
553 start_scan();
554 } else {
555 if (address_manager_registered_) {
556 le_address_manager_->Unregister(this);
557 address_manager_registered_ = false;
558 paused_ = false;
559 }
560 stop_scan();
561 }
562 }
563
start_scanbluetooth::hci::LeScanningManager::impl564 void start_scan() {
565 // If we receive start_scan during paused, set scan_on_resume_ to true
566 if (paused_ && address_manager_registered_) {
567 scan_on_resume_ = true;
568 return;
569 }
570 is_scanning_ = true;
571 if (!address_manager_registered_) {
572 le_address_manager_->Register(this);
573 address_manager_registered_ = true;
574 }
575
576 switch (api_type_) {
577 case ScanApiType::EXTENDED:
578 le_scanning_interface_->EnqueueCommand(
579 LeSetExtendedScanEnableBuilder::Create(
580 Enable::ENABLED,
581 #if TARGET_FLOSS
582 FilterDuplicates::ENABLED /* filter duplicates */,
583 #else
584 FilterDuplicates::DISABLED /* filter duplicates */,
585 #endif
586 0, 0),
587 module_handler_->BindOnce(check_complete<LeSetExtendedScanEnableCompleteView>));
588 break;
589 case ScanApiType::ANDROID_HCI:
590 case ScanApiType::LEGACY:
591 le_scanning_interface_->EnqueueCommand(
592 LeSetScanEnableBuilder::Create(Enable::ENABLED,
593 Enable::DISABLED /* filter duplicates */),
594 module_handler_->BindOnce(check_complete<LeSetScanEnableCompleteView>));
595 break;
596 }
597 }
598
stop_scanbluetooth::hci::LeScanningManager::impl599 void stop_scan() {
600 if (!is_scanning_) {
601 log::info("Scanning already stopped, return!");
602 return;
603 }
604 is_scanning_ = false;
605
606 switch (api_type_) {
607 case ScanApiType::EXTENDED:
608 le_scanning_interface_->EnqueueCommand(
609 LeSetExtendedScanEnableBuilder::Create(
610 Enable::DISABLED,
611 #if TARGET_FLOSS
612 FilterDuplicates::ENABLED /* filter duplicates */,
613 #else
614 FilterDuplicates::DISABLED /* filter duplicates */,
615 #endif
616 0, 0),
617 module_handler_->BindOnce(check_complete<LeSetExtendedScanEnableCompleteView>));
618 break;
619 case ScanApiType::ANDROID_HCI:
620 case ScanApiType::LEGACY:
621 le_scanning_interface_->EnqueueCommand(
622 LeSetScanEnableBuilder::Create(Enable::DISABLED,
623 Enable::DISABLED /* filter duplicates */),
624 module_handler_->BindOnce(check_complete<LeSetScanEnableCompleteView>));
625 break;
626 }
627 }
628
set_scan_parametersbluetooth::hci::LeScanningManager::impl629 void set_scan_parameters(LeScanType scan_type, ScannerId scanner_id_1m, uint16_t scan_interval_1m,
630 uint16_t scan_window_1m, ScannerId scanner_id_coded,
631 uint16_t scan_interval_coded, uint16_t scan_window_coded,
632 uint8_t scan_phy) {
633 bool requested_1m = (scan_phy & k1mPhyMask) != 0;
634 bool requested_coded = (scan_phy & kCodedPhyMask) != 0;
635 if (requested_1m &&
636 !validate_scan_params(scan_type, scanner_id_1m, scan_interval_1m, scan_window_1m)) {
637 return;
638 }
639
640 if (requested_coded && !validate_scan_params(scan_type, scanner_id_coded, scan_interval_coded,
641 scan_window_coded)) {
642 return;
643 }
644
645 le_scan_type_ = scan_type;
646 interval_ms_1m_ = scan_interval_1m;
647 window_ms_1m_ = scan_window_1m;
648 interval_ms_coded_ = scan_interval_coded;
649 window_ms_coded_ = scan_window_coded;
650 phy_ = scan_phy;
651
652 if (requested_1m) {
653 scanning_callbacks_->OnSetScannerParameterComplete(scanner_id_1m, ScanningCallback::SUCCESS);
654 }
655 if (requested_coded) {
656 scanning_callbacks_->OnSetScannerParameterComplete(scanner_id_coded,
657 ScanningCallback::SUCCESS);
658 }
659 }
660
validate_scan_paramsbluetooth::hci::LeScanningManager::impl661 bool validate_scan_params(LeScanType scan_type, ScannerId scanner_id, uint16_t scan_interval,
662 uint16_t scan_window) {
663 uint32_t max_scan_interval = kLeScanIntervalMax;
664 uint32_t max_scan_window = kLeScanWindowMax;
665 if (api_type_ == ScanApiType::EXTENDED) {
666 max_scan_interval = kLeExtendedScanIntervalMax;
667 max_scan_window = kLeExtendedScanWindowMax;
668 }
669
670 if (scan_type != LeScanType::ACTIVE && scan_type != LeScanType::PASSIVE) {
671 log::error("Invalid scan type");
672 scanning_callbacks_->OnSetScannerParameterComplete(
673 scanner_id, ScanningCallback::ScanningStatus::ILLEGAL_PARAMETER);
674 return false;
675 }
676 if (scan_interval > max_scan_interval || scan_interval < kLeScanIntervalMin) {
677 log::error("Invalid scan_interval {}", scan_interval);
678 scanning_callbacks_->OnSetScannerParameterComplete(
679 scanner_id, ScanningCallback::ScanningStatus::ILLEGAL_PARAMETER);
680 return false;
681 }
682 if (scan_window > max_scan_window || scan_window < kLeScanWindowMin) {
683 log::error("Invalid scan_window {}", scan_window);
684 scanning_callbacks_->OnSetScannerParameterComplete(
685 scanner_id, ScanningCallback::ScanningStatus::ILLEGAL_PARAMETER);
686 return false;
687 }
688 return true;
689 }
690
set_scan_filter_policybluetooth::hci::LeScanningManager::impl691 void set_scan_filter_policy(LeScanningFilterPolicy filter_policy) {
692 filter_policy_ = filter_policy;
693 }
694
scan_filter_enablebluetooth::hci::LeScanningManager::impl695 void scan_filter_enable(bool enable) {
696 if (!is_filter_supported_) {
697 log::warn("Advertising filter is not supported");
698 return;
699 }
700
701 Enable apcf_enable = enable ? Enable::ENABLED : Enable::DISABLED;
702 le_scanning_interface_->EnqueueCommand(
703 LeAdvFilterEnableBuilder::Create(apcf_enable),
704 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
705 }
706
is_bondedbluetooth::hci::LeScanningManager::impl707 bool is_bonded(Address target_address) {
708 for (auto device : storage_module_->GetBondedDevices()) {
709 if (device.GetAddress() == target_address) {
710 log::debug("Addresses match!");
711 return true;
712 }
713 }
714 log::debug("Addresse DON'Ts match!");
715 return false;
716 }
717
scan_filter_parameter_setupbluetooth::hci::LeScanningManager::impl718 void scan_filter_parameter_setup(ApcfAction action, uint8_t filter_index,
719 AdvertisingFilterParameter advertising_filter_parameter) {
720 if (!is_filter_supported_) {
721 log::warn("Advertising filter is not supported");
722 return;
723 }
724
725 auto entry = remove_me_later_map_.find(filter_index);
726 switch (action) {
727 case ApcfAction::ADD:
728 le_scanning_interface_->EnqueueCommand(
729 LeAdvFilterAddFilteringParametersBuilder::Create(
730 filter_index, advertising_filter_parameter.feature_selection,
731 advertising_filter_parameter.list_logic_type,
732 advertising_filter_parameter.filter_logic_type,
733 advertising_filter_parameter.rssi_high_thresh,
734 advertising_filter_parameter.delivery_mode,
735 advertising_filter_parameter.onfound_timeout,
736 advertising_filter_parameter.onfound_timeout_cnt,
737 advertising_filter_parameter.rssi_low_thresh,
738 advertising_filter_parameter.onlost_timeout,
739 advertising_filter_parameter.num_of_tracking_entries),
740 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
741 break;
742 case ApcfAction::DELETE:
743 tracker_id_map_.erase(filter_index);
744 le_scanning_interface_->EnqueueCommand(
745 LeAdvFilterDeleteFilteringParametersBuilder::Create(filter_index),
746 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
747
748 // IRK Scanning
749 if (entry != remove_me_later_map_.end()) {
750 // Don't want to remove for a bonded device
751 if (!is_bonded(entry->second.GetAddress())) {
752 le_address_manager_->RemoveDeviceFromResolvingList(
753 static_cast<PeerAddressType>(entry->second.GetAddressType()),
754 entry->second.GetAddress());
755 }
756 remove_me_later_map_.erase(filter_index);
757 }
758
759 break;
760 case ApcfAction::CLEAR:
761 le_scanning_interface_->EnqueueCommand(
762 LeAdvFilterClearFilteringParametersBuilder::Create(),
763 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
764
765 // IRK Scanning
766 if (entry != remove_me_later_map_.end()) {
767 // Don't want to remove for a bonded device
768 if (!is_bonded(entry->second.GetAddress())) {
769 le_address_manager_->RemoveDeviceFromResolvingList(
770 static_cast<PeerAddressType>(entry->second.GetAddressType()),
771 entry->second.GetAddress());
772 }
773 remove_me_later_map_.erase(filter_index);
774 }
775
776 break;
777 default:
778 log::error("Unknown action type: {}", (uint16_t)action);
779 break;
780 }
781 }
782
scan_filter_addbluetooth::hci::LeScanningManager::impl783 void scan_filter_add(uint8_t filter_index,
784 std::vector<AdvertisingPacketContentFilterCommand> filters) {
785 if (!is_filter_supported_) {
786 log::warn("Advertising filter is not supported");
787 return;
788 }
789
790 ApcfAction apcf_action = ApcfAction::ADD;
791 for (auto filter : filters) {
792 /* If data is passed, both mask and data have to be the same length */
793 if (filter.data.size() != filter.data_mask.size() && filter.data.size() != 0 &&
794 filter.data_mask.size() != 0) {
795 log::error("data and data_mask are of different size");
796 continue;
797 }
798
799 switch (filter.filter_type) {
800 case ApcfFilterType::BROADCASTER_ADDRESS: {
801 update_address_filter(apcf_action, filter_index, filter.address,
802 filter.application_address_type, filter.irk);
803 break;
804 }
805 case ApcfFilterType::SERVICE_UUID:
806 case ApcfFilterType::SERVICE_SOLICITATION_UUID: {
807 update_uuid_filter(apcf_action, filter_index, filter.filter_type, filter.uuid,
808 filter.uuid_mask);
809 break;
810 }
811 case ApcfFilterType::LOCAL_NAME: {
812 update_local_name_filter(apcf_action, filter_index, filter.name);
813 break;
814 }
815 case ApcfFilterType::MANUFACTURER_DATA: {
816 update_manufacturer_data_filter(apcf_action, filter_index, filter.company,
817 filter.company_mask, filter.data, filter.data_mask);
818 break;
819 }
820 case ApcfFilterType::SERVICE_DATA: {
821 update_service_data_filter(apcf_action, filter_index, filter.data, filter.data_mask);
822 break;
823 }
824 case ApcfFilterType::TRANSPORT_DISCOVERY_DATA: {
825 update_transport_discovery_data_filter(
826 apcf_action, filter_index, filter.org_id, filter.tds_flags, filter.tds_flags_mask,
827 filter.data, filter.data_mask, filter.meta_data_type, filter.meta_data);
828 break;
829 }
830 case ApcfFilterType::AD_TYPE: {
831 update_ad_type_filter(apcf_action, filter_index, filter.ad_type, filter.data,
832 filter.data_mask);
833 break;
834 }
835 default:
836 log::error("Unknown filter type: {}", (uint16_t)filter.filter_type);
837 break;
838 }
839 }
840 }
841
842 std::unordered_map<uint8_t, AddressWithType> remove_me_later_map_;
843
update_address_filterbluetooth::hci::LeScanningManager::impl844 void update_address_filter(ApcfAction action, uint8_t filter_index, Address address,
845 ApcfApplicationAddressType address_type, std::array<uint8_t, 16> irk) {
846 if (action != ApcfAction::CLEAR) {
847 /*
848 * The vendor command (APCF Filtering 0x0157) takes Public (0) or Random (1)
849 * or Addresses type not applicable (2).
850 *
851 * Advertising results have four types:
852 *  - Public = 0
853 *  - Random = 1
854 *  - Public ID = 2
855 *  - Random ID = 3
856 *
857 * e.g. specifying PUBLIC (0) will only return results with a public
858 * address. It will ignore resolved addresses, since they return PUBLIC
859 * IDENTITY (2). For this, Addresses type not applicable (0x02) must be specified.
860 * This should also cover if the RPA is derived from RANDOM STATIC.
861 */
862 le_scanning_interface_->EnqueueCommand(
863 LeAdvFilterBroadcasterAddressBuilder::Create(
864 action, filter_index, address, ApcfApplicationAddressType::NOT_APPLICABLE),
865 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
866 if (!is_empty_128bit(irk)) {
867 // If an entry exists for this filter index, replace data because the filter has been
868 // updated.
869 auto entry = remove_me_later_map_.find(filter_index);
870 // IRK Scanning
871 if (entry != remove_me_later_map_.end()) {
872 // Don't want to remove for a bonded device
873 if (!is_bonded(entry->second.GetAddress())) {
874 le_address_manager_->RemoveDeviceFromResolvingList(
875 static_cast<PeerAddressType>(entry->second.GetAddressType()),
876 entry->second.GetAddress());
877 }
878 remove_me_later_map_.erase(filter_index);
879 }
880
881 // Now replace it with a new one
882 std::array<uint8_t, 16> empty_irk;
883 le_address_manager_->AddDeviceToResolvingList(static_cast<PeerAddressType>(address_type),
884 address, irk, empty_irk);
885 remove_me_later_map_.emplace(
886 filter_index, AddressWithType(address, static_cast<AddressType>(address_type)));
887 }
888 } else {
889 le_scanning_interface_->EnqueueCommand(
890 LeAdvFilterClearBroadcasterAddressBuilder::Create(filter_index),
891 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
892 auto entry = remove_me_later_map_.find(filter_index);
893 if (entry != remove_me_later_map_.end()) {
894 // TODO(optedoblivion): If not bonded
895 le_address_manager_->RemoveDeviceFromResolvingList(
896 static_cast<PeerAddressType>(address_type), address);
897 remove_me_later_map_.erase(filter_index);
898 }
899 }
900 }
901
is_empty_128bitbluetooth::hci::LeScanningManager::impl902 bool is_empty_128bit(const std::array<uint8_t, 16> data) {
903 for (int i = 0; i < 16; i++) {
904 if (data[i] != (uint8_t)0) {
905 return false;
906 }
907 }
908 return true;
909 }
910
update_uuid_filterbluetooth::hci::LeScanningManager::impl911 void update_uuid_filter(ApcfAction action, uint8_t filter_index, ApcfFilterType filter_type,
912 Uuid uuid, Uuid uuid_mask) {
913 std::vector<uint8_t> combined_data = {};
914 if (action != ApcfAction::CLEAR) {
915 uint8_t uuid_len = uuid.GetShortestRepresentationSize();
916 if (uuid_len == Uuid::kNumBytes16) {
917 uint16_t data = uuid.As16Bit();
918 combined_data.push_back((uint8_t)data);
919 combined_data.push_back((uint8_t)(data >> 8));
920 } else if (uuid_len == Uuid::kNumBytes32) {
921 uint32_t data = uuid.As32Bit();
922 combined_data.push_back((uint8_t)data);
923 combined_data.push_back((uint8_t)(data >> 8));
924 combined_data.push_back((uint8_t)(data >> 16));
925 combined_data.push_back((uint8_t)(data >> 24));
926 } else if (uuid_len == Uuid::kNumBytes128) {
927 auto data = uuid.To128BitLE();
928 combined_data.insert(combined_data.end(), data.begin(), data.end());
929 } else {
930 log::error("illegal UUID length: {}", (uint16_t)uuid_len);
931 return;
932 }
933
934 if (!uuid_mask.IsEmpty()) {
935 if (uuid_len == Uuid::kNumBytes16) {
936 uint16_t data = uuid_mask.As16Bit();
937 combined_data.push_back((uint8_t)data);
938 combined_data.push_back((uint8_t)(data >> 8));
939 } else if (uuid_len == Uuid::kNumBytes32) {
940 uint32_t data = uuid_mask.As32Bit();
941 combined_data.push_back((uint8_t)data);
942 combined_data.push_back((uint8_t)(data >> 8));
943 combined_data.push_back((uint8_t)(data >> 16));
944 combined_data.push_back((uint8_t)(data >> 24));
945 } else if (uuid_len == Uuid::kNumBytes128) {
946 auto data = uuid_mask.To128BitLE();
947 combined_data.insert(combined_data.end(), data.begin(), data.end());
948 }
949 } else {
950 std::vector<uint8_t> data(uuid_len, 0xFF);
951 combined_data.insert(combined_data.end(), data.begin(), data.end());
952 }
953 }
954
955 if (filter_type == ApcfFilterType::SERVICE_UUID) {
956 le_scanning_interface_->EnqueueCommand(
957 LeAdvFilterServiceUuidBuilder::Create(action, filter_index, combined_data),
958 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
959 } else {
960 le_scanning_interface_->EnqueueCommand(
961 LeAdvFilterSolicitationUuidBuilder::Create(action, filter_index, combined_data),
962 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
963 }
964 }
965
update_local_name_filterbluetooth::hci::LeScanningManager::impl966 void update_local_name_filter(ApcfAction action, uint8_t filter_index,
967 std::vector<uint8_t> name) {
968 le_scanning_interface_->EnqueueCommand(
969 LeAdvFilterLocalNameBuilder::Create(action, filter_index, name),
970 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
971 }
972
update_manufacturer_data_filterbluetooth::hci::LeScanningManager::impl973 void update_manufacturer_data_filter(ApcfAction action, uint8_t filter_index, uint16_t company_id,
974 uint16_t company_id_mask, std::vector<uint8_t> data,
975 std::vector<uint8_t> data_mask) {
976 if (data.size() != data_mask.size()) {
977 log::error("manufacturer data mask should have the same length as manufacturer data");
978 return;
979 }
980 std::vector<uint8_t> combined_data = {};
981 if (action != ApcfAction::CLEAR) {
982 combined_data.push_back((uint8_t)company_id);
983 combined_data.push_back((uint8_t)(company_id >> 8));
984 if (data.size() != 0) {
985 combined_data.insert(combined_data.end(), data.begin(), data.end());
986 }
987 if (company_id_mask != 0) {
988 combined_data.push_back((uint8_t)company_id_mask);
989 combined_data.push_back((uint8_t)(company_id_mask >> 8));
990 } else {
991 combined_data.push_back(0xFF);
992 combined_data.push_back(0xFF);
993 }
994 if (data_mask.size() != 0) {
995 combined_data.insert(combined_data.end(), data_mask.begin(), data_mask.end());
996 }
997 }
998
999 le_scanning_interface_->EnqueueCommand(
1000 LeAdvFilterManufacturerDataBuilder::Create(action, filter_index, combined_data),
1001 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
1002 }
1003
update_service_data_filterbluetooth::hci::LeScanningManager::impl1004 void update_service_data_filter(ApcfAction action, uint8_t filter_index,
1005 std::vector<uint8_t> data, std::vector<uint8_t> data_mask) {
1006 if (data.size() != data_mask.size()) {
1007 log::error("service data mask should have the same length as service data");
1008 return;
1009 }
1010 std::vector<uint8_t> combined_data = {};
1011 if (action != ApcfAction::CLEAR && data.size() != 0) {
1012 combined_data.insert(combined_data.end(), data.begin(), data.end());
1013 combined_data.insert(combined_data.end(), data_mask.begin(), data_mask.end());
1014 }
1015
1016 le_scanning_interface_->EnqueueCommand(
1017 LeAdvFilterServiceDataBuilder::Create(action, filter_index, combined_data),
1018 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
1019 }
1020
update_transport_discovery_data_filterbluetooth::hci::LeScanningManager::impl1021 void update_transport_discovery_data_filter(ApcfAction action, uint8_t filter_index,
1022 uint8_t org_id, uint8_t tds_flags,
1023 uint8_t tds_flags_mask,
1024 std::vector<uint8_t> transport_data,
1025 std::vector<uint8_t> transport_data_mask,
1026 ApcfMetaDataType meta_data_type,
1027 std::vector<uint8_t> meta_data) {
1028 LocalVersionInformation local_version_information = controller_->GetLocalVersionInformation();
1029
1030 // In QTI controller, transport discovery data filter are supported by default. Check is added
1031 // to keep backward compatibility.
1032 if (!is_transport_discovery_data_filter_supported_ &&
1033 !(local_version_information.manufacturer_name_ == LMP_COMPID_QTI)) {
1034 log::warn("transport discovery data filter isn't supported");
1035 return;
1036 }
1037
1038 log::info(
1039 "org id: {}, tds_flags: {}, tds_flags_mask: {}, transport_data size: {}, "
1040 "transport_data_mask size: {}, meta_data_type: {}, meta_data size: {}",
1041 org_id, tds_flags, tds_flags_mask, transport_data.size(), transport_data_mask.size(),
1042 (uint8_t)meta_data_type, meta_data.size());
1043
1044 // 0x02 Wi-Fi Alliance Neighbor Awareness Networking & meta_data_type is 0x01 for NAN Hash.
1045 if (org_id == 0x02) {
1046 // meta data contains WIFI NAN hash, reverse it before sending controller.
1047 switch (meta_data_type) {
1048 case ApcfMetaDataType::WIFI_NAN_HASH:
1049 std::reverse(meta_data.begin(), meta_data.end());
1050 break;
1051 default:
1052 break;
1053 }
1054 }
1055
1056 if (is_transport_discovery_data_filter_supported_) {
1057 le_scanning_interface_->EnqueueCommand(
1058 LeAdvFilterTransportDiscoveryDataBuilder::Create(
1059 action, filter_index, org_id, tds_flags, tds_flags_mask, transport_data,
1060 transport_data_mask, meta_data_type, meta_data),
1061 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
1062 } else {
1063 // In QTI controller, transport discovery data filter are supported by default.
1064 // keeping old version for backward compatibility
1065 std::vector<uint8_t> combined_data = {};
1066 if (action != ApcfAction::CLEAR) {
1067 combined_data.push_back((uint8_t)org_id);
1068 combined_data.push_back((uint8_t)tds_flags);
1069 combined_data.push_back((uint8_t)tds_flags_mask);
1070 if (org_id == 0x02 && meta_data_type == ApcfMetaDataType::WIFI_NAN_HASH) {
1071 // meta data contains WIFI NAN hash
1072 combined_data.insert(combined_data.end(), meta_data.begin(), meta_data.end());
1073 }
1074 }
1075 le_scanning_interface_->EnqueueCommand(
1076 LeAdvFilterTransportDiscoveryDataOldBuilder::Create(action, filter_index,
1077 combined_data),
1078 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
1079 }
1080 }
1081
update_ad_type_filterbluetooth::hci::LeScanningManager::impl1082 void update_ad_type_filter(ApcfAction action, uint8_t filter_index, uint8_t ad_type,
1083 std::vector<uint8_t> data, std::vector<uint8_t> data_mask) {
1084 if (!is_ad_type_filter_supported_) {
1085 log::error("AD type filter isn't supported");
1086 return;
1087 }
1088
1089 if (data.size() != data_mask.size()) {
1090 log::error("ad type mask should have the same length as ad type data");
1091 return;
1092 }
1093 std::vector<uint8_t> combined_data = {};
1094 if (action != ApcfAction::CLEAR) {
1095 combined_data.push_back((uint8_t)ad_type);
1096 combined_data.push_back((uint8_t)(data.size()));
1097 if (data.size() != 0) {
1098 combined_data.insert(combined_data.end(), data.begin(), data.end());
1099 combined_data.insert(combined_data.end(), data_mask.begin(), data_mask.end());
1100 }
1101 }
1102
1103 le_scanning_interface_->EnqueueCommand(
1104 LeAdvFilterADTypeBuilder::Create(action, filter_index, combined_data),
1105 module_handler_->BindOnceOn(this, &impl::on_advertising_filter_complete));
1106 }
1107
batch_scan_set_storage_parameterbluetooth::hci::LeScanningManager::impl1108 void batch_scan_set_storage_parameter(uint8_t batch_scan_full_max,
1109 uint8_t batch_scan_truncated_max,
1110 uint8_t batch_scan_notify_threshold, ScannerId scanner_id) {
1111 if (!is_batch_scan_supported_) {
1112 log::warn("Batch scan is not supported");
1113 return;
1114 }
1115 // scanner id for OnBatchScanThresholdCrossed
1116 batch_scan_config_.ref_value = scanner_id;
1117
1118 if (batch_scan_config_.current_state == BatchScanState::ERROR_STATE ||
1119 batch_scan_config_.current_state == BatchScanState::DISABLED_STATE ||
1120 batch_scan_config_.current_state == BatchScanState::DISABLE_CALLED) {
1121 batch_scan_config_.current_state = BatchScanState::ENABLE_CALLED;
1122 le_scanning_interface_->EnqueueCommand(
1123 LeBatchScanEnableBuilder::Create(Enable::ENABLED),
1124 module_handler_->BindOnceOn(this, &impl::on_batch_scan_enable_complete));
1125 }
1126
1127 le_scanning_interface_->EnqueueCommand(
1128 LeBatchScanSetStorageParametersBuilder::Create(
1129 batch_scan_full_max, batch_scan_truncated_max, batch_scan_notify_threshold),
1130 module_handler_->BindOnceOn(this, &impl::on_batch_scan_complete));
1131 }
1132
batch_scan_enablebluetooth::hci::LeScanningManager::impl1133 void batch_scan_enable(BatchScanMode scan_mode, uint32_t duty_cycle_scan_window_slots,
1134 uint32_t duty_cycle_scan_interval_slots,
1135 BatchScanDiscardRule batch_scan_discard_rule) {
1136 if (!is_batch_scan_supported_) {
1137 log::warn("Batch scan is not supported");
1138 return;
1139 }
1140
1141 if (batch_scan_config_.current_state == BatchScanState::ERROR_STATE ||
1142 batch_scan_config_.current_state == BatchScanState::DISABLED_STATE ||
1143 batch_scan_config_.current_state == BatchScanState::DISABLE_CALLED) {
1144 batch_scan_config_.current_state = BatchScanState::ENABLE_CALLED;
1145 le_scanning_interface_->EnqueueCommand(
1146 LeBatchScanEnableBuilder::Create(Enable::ENABLED),
1147 module_handler_->BindOnceOn(this, &impl::on_batch_scan_enable_complete));
1148 }
1149
1150 batch_scan_config_.scan_mode = scan_mode;
1151 batch_scan_config_.scan_interval = duty_cycle_scan_interval_slots;
1152 batch_scan_config_.scan_window = duty_cycle_scan_window_slots;
1153 batch_scan_config_.discard_rule = batch_scan_discard_rule;
1154 /* This command starts batch scanning, if enabled */
1155 batch_scan_set_scan_parameter(scan_mode, duty_cycle_scan_window_slots,
1156 duty_cycle_scan_interval_slots, batch_scan_discard_rule);
1157 }
1158
batch_scan_disablebluetooth::hci::LeScanningManager::impl1159 void batch_scan_disable() {
1160 if (!is_batch_scan_supported_) {
1161 log::warn("Batch scan is not supported");
1162 return;
1163 }
1164 batch_scan_config_.current_state = BatchScanState::DISABLE_CALLED;
1165 batch_scan_set_scan_parameter(BatchScanMode::DISABLE, batch_scan_config_.scan_window,
1166 batch_scan_config_.scan_interval,
1167 batch_scan_config_.discard_rule);
1168 }
1169
batch_scan_set_scan_parameterbluetooth::hci::LeScanningManager::impl1170 void batch_scan_set_scan_parameter(BatchScanMode scan_mode, uint32_t duty_cycle_scan_window_slots,
1171 uint32_t duty_cycle_scan_interval_slots,
1172 BatchScanDiscardRule batch_scan_discard_rule) {
1173 if (!is_batch_scan_supported_) {
1174 log::warn("Batch scan is not supported");
1175 return;
1176 }
1177 PeerAddressType own_address_type = PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS;
1178 if (own_address_type_ == OwnAddressType::RANDOM_DEVICE_ADDRESS ||
1179 own_address_type_ == OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS) {
1180 own_address_type = PeerAddressType::RANDOM_DEVICE_OR_IDENTITY_ADDRESS;
1181 }
1182 uint8_t truncated_mode_enabled = 0x00;
1183 uint8_t full_mode_enabled = 0x00;
1184 if (scan_mode == BatchScanMode::TRUNCATED || scan_mode == BatchScanMode::TRUNCATED_AND_FULL) {
1185 truncated_mode_enabled = 0x01;
1186 }
1187 if (scan_mode == BatchScanMode::FULL || scan_mode == BatchScanMode::TRUNCATED_AND_FULL) {
1188 full_mode_enabled = 0x01;
1189 }
1190
1191 if (scan_mode == BatchScanMode::DISABLE) {
1192 le_scanning_interface_->EnqueueCommand(
1193 LeBatchScanSetScanParametersBuilder::Create(
1194 truncated_mode_enabled, full_mode_enabled, duty_cycle_scan_window_slots,
1195 duty_cycle_scan_interval_slots, own_address_type, batch_scan_discard_rule),
1196 module_handler_->BindOnceOn(this, &impl::on_batch_scan_disable_complete));
1197 } else {
1198 le_scanning_interface_->EnqueueCommand(
1199 LeBatchScanSetScanParametersBuilder::Create(
1200 truncated_mode_enabled, full_mode_enabled, duty_cycle_scan_window_slots,
1201 duty_cycle_scan_interval_slots, own_address_type, batch_scan_discard_rule),
1202 module_handler_->BindOnceOn(this, &impl::on_batch_scan_complete));
1203 }
1204 }
1205
batch_scan_read_resultsbluetooth::hci::LeScanningManager::impl1206 void batch_scan_read_results(ScannerId scanner_id, uint16_t total_num_of_records,
1207 BatchScanMode scan_mode) {
1208 if (!is_batch_scan_supported_) {
1209 log::warn("Batch scan is not supported");
1210 int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
1211 scanning_callbacks_->OnBatchScanReports(scanner_id, status, 0, 0, {});
1212 return;
1213 }
1214
1215 if (scan_mode != BatchScanMode::FULL && scan_mode != BatchScanMode::TRUNCATED) {
1216 log::warn("Invalid scan mode {}", (uint16_t)scan_mode);
1217 int status = static_cast<int>(ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
1218 scanning_callbacks_->OnBatchScanReports(scanner_id, status, 0, 0, {});
1219 return;
1220 }
1221
1222 if (batch_scan_result_cache_.find(scanner_id) == batch_scan_result_cache_.end()) {
1223 std::vector<uint8_t> empty_data = {};
1224 batch_scan_result_cache_.emplace(scanner_id, empty_data);
1225 }
1226
1227 le_scanning_interface_->EnqueueCommand(
1228 LeBatchScanReadResultParametersBuilder::Create(
1229 static_cast<BatchScanDataRead>(scan_mode)),
1230 module_handler_->BindOnceOn(this, &impl::on_batch_scan_read_result_complete, scanner_id,
1231 total_num_of_records));
1232 }
1233
start_syncbluetooth::hci::LeScanningManager::impl1234 void start_sync(uint8_t sid, const AddressWithType& address_with_type, uint16_t skip,
1235 uint16_t timeout, int request_id) {
1236 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1237 log::warn("PAST sender not supported on this device");
1238 int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
1239 scanning_callbacks_->OnPeriodicSyncStarted(request_id, status, -1, sid, address_with_type, 0,
1240 0);
1241 return;
1242 }
1243 PeriodicSyncStates request{
1244 .request_id = request_id,
1245 .advertiser_sid = sid,
1246 .address_with_type = address_with_type,
1247 .sync_handle = 0,
1248 .sync_state = PeriodicSyncState::PERIODIC_SYNC_STATE_IDLE,
1249 };
1250 periodic_sync_manager_.StartSync(request, skip, timeout);
1251 }
1252
stop_syncbluetooth::hci::LeScanningManager::impl1253 void stop_sync(uint16_t handle) {
1254 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1255 log::warn("PAST sender not supported on this device");
1256 return;
1257 }
1258 periodic_sync_manager_.StopSync(handle);
1259 }
1260
cancel_create_syncbluetooth::hci::LeScanningManager::impl1261 void cancel_create_sync(uint8_t sid, const Address& address) {
1262 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1263 log::warn("PAST sender not supported on this device");
1264 return;
1265 }
1266 periodic_sync_manager_.CancelCreateSync(sid, address);
1267 }
1268
transfer_syncbluetooth::hci::LeScanningManager::impl1269 void transfer_sync(const Address& address, uint16_t connection_handle, uint16_t service_data,
1270 uint16_t sync_handle, int pa_source) {
1271 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1272 log::warn("PAST sender not supported on this device");
1273 int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
1274 scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
1275 return;
1276 }
1277 if (connection_handle == 0xFFFF) {
1278 log::error("[PAST]: Invalid connection handle or no LE ACL link");
1279 int status = static_cast<int>(ErrorCode::UNKNOWN_CONNECTION);
1280 scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
1281 return;
1282 }
1283 periodic_sync_manager_.TransferSync(address, service_data, sync_handle, pa_source,
1284 connection_handle);
1285 }
1286
transfer_set_infobluetooth::hci::LeScanningManager::impl1287 void transfer_set_info(const Address& address, uint16_t connection_handle, uint16_t service_data,
1288 uint8_t adv_handle, int pa_source) {
1289 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1290 log::warn("PAST sender not supported on this device");
1291 int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
1292 scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
1293 return;
1294 }
1295 if (connection_handle == 0xFFFF) {
1296 log::error("[PAST]:Invalid connection handle or no LE ACL link");
1297 int status = static_cast<int>(ErrorCode::UNKNOWN_CONNECTION);
1298 scanning_callbacks_->OnPeriodicSyncTransferred(pa_source, status, address);
1299 return;
1300 }
1301 periodic_sync_manager_.SyncSetInfo(address, service_data, adv_handle, pa_source,
1302 connection_handle);
1303 }
1304
sync_tx_parametersbluetooth::hci::LeScanningManager::impl1305 void sync_tx_parameters(const Address& address, uint8_t mode, uint16_t skip, uint16_t timeout,
1306 int reg_id) {
1307 if (!is_periodic_advertising_sync_transfer_sender_supported_) {
1308 log::warn("PAST sender not supported on this device");
1309 int status = static_cast<int>(ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
1310 AddressWithType address_with_type(address, AddressType::RANDOM_DEVICE_ADDRESS);
1311 scanning_callbacks_->OnPeriodicSyncStarted(reg_id, status, -1, -1, address_with_type, 0, 0);
1312 return;
1313 }
1314 periodic_sync_manager_.SyncTxParameters(address, mode, skip, timeout, reg_id);
1315 }
1316
track_advertiserbluetooth::hci::LeScanningManager::impl1317 void track_advertiser(uint8_t filter_index, ScannerId scanner_id) {
1318 if (total_num_of_advt_tracked_ <= 0) {
1319 log::warn("advertisement tracking is not supported");
1320 AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {};
1321 on_found_on_lost_info.scanner_id = scanner_id;
1322 on_found_on_lost_info.advertiser_info_present = AdvtInfoPresent::NO_ADVT_INFO_PRESENT;
1323 scanning_callbacks_->OnTrackAdvFoundLost(on_found_on_lost_info);
1324 return;
1325 } else if (tracker_id_map_.size() >= total_num_of_advt_tracked_) {
1326 AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {};
1327 on_found_on_lost_info.scanner_id = scanner_id;
1328 on_found_on_lost_info.advertiser_info_present = AdvtInfoPresent::NO_ADVT_INFO_PRESENT;
1329 scanning_callbacks_->OnTrackAdvFoundLost(on_found_on_lost_info);
1330 return;
1331 }
1332 log::info("track_advertiser scanner_id {}, filter_index {}", (uint16_t)scanner_id,
1333 (uint16_t)filter_index);
1334 tracker_id_map_[filter_index] = scanner_id;
1335 }
1336
register_scanning_callbackbluetooth::hci::LeScanningManager::impl1337 void register_scanning_callback(ScanningCallback* scanning_callbacks) {
1338 scanning_callbacks_ = scanning_callbacks;
1339 periodic_sync_manager_.SetScanningCallback(scanning_callbacks_);
1340 }
1341
is_ad_type_filter_supportedbluetooth::hci::LeScanningManager::impl1342 bool is_ad_type_filter_supported() { return is_ad_type_filter_supported_; }
1343
on_set_scan_parameter_completebluetooth::hci::LeScanningManager::impl1344 void on_set_scan_parameter_complete(CommandCompleteView view) {
1345 switch (view.GetCommandOpCode()) {
1346 case (OpCode::LE_SET_SCAN_PARAMETERS): {
1347 auto status_view = LeSetScanParametersCompleteView::Create(view);
1348 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1349 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1350 log::info("Receive set scan parameter complete with error code {}",
1351 ErrorCodeText(status_view.GetStatus()));
1352 }
1353 } break;
1354 case (OpCode::LE_EXTENDED_SCAN_PARAMS): {
1355 auto status_view = LeExtendedScanParamsCompleteView::Create(view);
1356 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1357 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1358 log::info("Receive extended scan parameter complete with error code {}",
1359 ErrorCodeText(status_view.GetStatus()));
1360 }
1361 } break;
1362 case (OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS): {
1363 auto status_view = LeSetExtendedScanParametersCompleteView::Create(view);
1364 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1365 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1366 log::info("Receive set extended scan parameter complete with error code {}",
1367 ErrorCodeText(status_view.GetStatus()));
1368 }
1369 } break;
1370 default:
1371 log::fatal("Unhandled event {}", OpCodeText(view.GetCommandOpCode()));
1372 }
1373 }
1374
on_advertising_filter_completebluetooth::hci::LeScanningManager::impl1375 void on_advertising_filter_complete(CommandCompleteView view) {
1376 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1377 auto status_view = LeAdvFilterCompleteView::Create(view);
1378 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1379 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1380 log::info("Got a Command complete {}, status {}", OpCodeText(view.GetCommandOpCode()),
1381 ErrorCodeText(status_view.GetStatus()));
1382 }
1383
1384 ApcfOpcode apcf_opcode = status_view.GetApcfOpcode();
1385 switch (apcf_opcode) {
1386 case ApcfOpcode::ENABLE: {
1387 auto complete_view = LeAdvFilterEnableCompleteView::Create(status_view);
1388 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1389 scanning_callbacks_->OnFilterEnable(complete_view.GetApcfEnable(),
1390 (uint8_t)complete_view.GetStatus());
1391 } break;
1392 case ApcfOpcode::SET_FILTERING_PARAMETERS: {
1393 auto complete_view = LeAdvFilterSetFilteringParametersCompleteView::Create(status_view);
1394 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1395 scanning_callbacks_->OnFilterParamSetup(complete_view.GetApcfAvailableSpaces(),
1396 complete_view.GetApcfAction(),
1397 (uint8_t)complete_view.GetStatus());
1398 } break;
1399 case ApcfOpcode::BROADCASTER_ADDRESS: {
1400 auto complete_view = LeAdvFilterBroadcasterAddressCompleteView::Create(status_view);
1401 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1402 scanning_callbacks_->OnFilterConfigCallback(
1403 ApcfFilterType::BROADCASTER_ADDRESS, complete_view.GetApcfAvailableSpaces(),
1404 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1405 } break;
1406 case ApcfOpcode::SERVICE_UUID: {
1407 auto complete_view = LeAdvFilterServiceUuidCompleteView::Create(status_view);
1408 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1409 scanning_callbacks_->OnFilterConfigCallback(
1410 ApcfFilterType::SERVICE_UUID, complete_view.GetApcfAvailableSpaces(),
1411 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1412 } break;
1413 case ApcfOpcode::SERVICE_SOLICITATION_UUID: {
1414 auto complete_view = LeAdvFilterSolicitationUuidCompleteView::Create(status_view);
1415 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1416 scanning_callbacks_->OnFilterConfigCallback(
1417 ApcfFilterType::SERVICE_SOLICITATION_UUID, complete_view.GetApcfAvailableSpaces(),
1418 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1419 } break;
1420 case ApcfOpcode::LOCAL_NAME: {
1421 auto complete_view = LeAdvFilterLocalNameCompleteView::Create(status_view);
1422 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1423 scanning_callbacks_->OnFilterConfigCallback(
1424 ApcfFilterType::LOCAL_NAME, complete_view.GetApcfAvailableSpaces(),
1425 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1426 } break;
1427 case ApcfOpcode::MANUFACTURER_DATA: {
1428 auto complete_view = LeAdvFilterManufacturerDataCompleteView::Create(status_view);
1429 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1430 scanning_callbacks_->OnFilterConfigCallback(
1431 ApcfFilterType::MANUFACTURER_DATA, complete_view.GetApcfAvailableSpaces(),
1432 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1433 } break;
1434 case ApcfOpcode::SERVICE_DATA: {
1435 auto complete_view = LeAdvFilterServiceDataCompleteView::Create(status_view);
1436 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1437 scanning_callbacks_->OnFilterConfigCallback(
1438 ApcfFilterType::SERVICE_DATA, complete_view.GetApcfAvailableSpaces(),
1439 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1440 } break;
1441 case ApcfOpcode::TRANSPORT_DISCOVERY_DATA: {
1442 auto complete_view = LeAdvFilterTransportDiscoveryDataCompleteView::Create(status_view);
1443 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1444 scanning_callbacks_->OnFilterConfigCallback(
1445 ApcfFilterType::TRANSPORT_DISCOVERY_DATA, complete_view.GetApcfAvailableSpaces(),
1446 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1447 } break;
1448 case ApcfOpcode::AD_TYPE: {
1449 auto complete_view = LeAdvFilterADTypeCompleteView::Create(status_view);
1450 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1451 scanning_callbacks_->OnFilterConfigCallback(
1452 ApcfFilterType::AD_TYPE, complete_view.GetApcfAvailableSpaces(),
1453 complete_view.GetApcfAction(), (uint8_t)complete_view.GetStatus());
1454 } break;
1455 default:
1456 log::warn("Unexpected event type {}", OpCodeText(view.GetCommandOpCode()));
1457 }
1458 }
1459
on_apcf_read_extended_features_completebluetooth::hci::LeScanningManager::impl1460 void on_apcf_read_extended_features_complete(CommandCompleteView view) {
1461 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1462 auto status_view = LeAdvFilterCompleteView::Create(view);
1463 if (!status_view.IsValid()) {
1464 log::warn("Can not get valid LeAdvFilterCompleteView, return");
1465 return;
1466 }
1467 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1468 log::warn("Got a Command complete {}, status {}", OpCodeText(view.GetCommandOpCode()),
1469 ErrorCodeText(status_view.GetStatus()));
1470 return;
1471 }
1472 auto complete_view = LeAdvFilterReadExtendedFeaturesCompleteView::Create(status_view);
1473 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1474 is_transport_discovery_data_filter_supported_ =
1475 complete_view.GetTransportDiscoveryDataFilter() == 1;
1476 is_ad_type_filter_supported_ = complete_view.GetAdTypeFilter() == 1;
1477 log::info(
1478 "set is_ad_type_filter_supported_ to {} & "
1479 "is_transport_discovery_data_filter_supported_ to {}",
1480 is_ad_type_filter_supported_, is_transport_discovery_data_filter_supported_);
1481 }
1482
on_batch_scan_completebluetooth::hci::LeScanningManager::impl1483 void on_batch_scan_complete(CommandCompleteView view) {
1484 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1485 auto status_view = LeBatchScanCompleteView::Create(view);
1486 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1487 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1488 log::info("Got a Command complete {}, status {}, batch_scan_opcode {}",
1489 OpCodeText(view.GetCommandOpCode()), ErrorCodeText(status_view.GetStatus()),
1490 BatchScanOpcodeText(status_view.GetBatchScanOpcode()));
1491 }
1492 }
1493
on_batch_scan_enable_completebluetooth::hci::LeScanningManager::impl1494 void on_batch_scan_enable_complete(CommandCompleteView view) {
1495 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1496 auto status_view = LeBatchScanCompleteView::Create(view);
1497 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1498 auto complete_view = LeBatchScanEnableCompleteView::Create(status_view);
1499 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1500 if (status_view.GetStatus() != ErrorCode::SUCCESS) {
1501 log::info("Got batch scan enable complete, status {}",
1502 ErrorCodeText(status_view.GetStatus()));
1503 batch_scan_config_.current_state = BatchScanState::ERROR_STATE;
1504 } else {
1505 batch_scan_config_.current_state = BatchScanState::ENABLED_STATE;
1506 }
1507 }
1508
on_batch_scan_disable_completebluetooth::hci::LeScanningManager::impl1509 void on_batch_scan_disable_complete(CommandCompleteView view) {
1510 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1511 auto status_view = LeBatchScanCompleteView::Create(view);
1512 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1513 auto complete_view = LeBatchScanSetScanParametersCompleteView::Create(status_view);
1514 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1515 log::assert_that(status_view.GetStatus() == ErrorCode::SUCCESS,
1516 "assert failed: status_view.GetStatus() == ErrorCode::SUCCESS");
1517 batch_scan_config_.current_state = BatchScanState::DISABLED_STATE;
1518 }
1519
on_batch_scan_read_result_completebluetooth::hci::LeScanningManager::impl1520 void on_batch_scan_read_result_complete(ScannerId scanner_id, uint16_t total_num_of_records,
1521 CommandCompleteView view) {
1522 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1523 auto status_view = LeBatchScanCompleteView::Create(view);
1524 log::assert_that(status_view.IsValid(), "assert failed: status_view.IsValid()");
1525 auto complete_view = LeBatchScanReadResultParametersCompleteRawView::Create(status_view);
1526 log::assert_that(complete_view.IsValid(), "assert failed: complete_view.IsValid()");
1527 if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
1528 log::info("Got batch scan read result complete, status {}",
1529 ErrorCodeText(status_view.GetStatus()));
1530 }
1531 uint8_t num_of_records = complete_view.GetNumOfRecords();
1532 auto report_format = complete_view.GetBatchScanDataRead();
1533 if (num_of_records == 0) {
1534 scanning_callbacks_->OnBatchScanReports(scanner_id, 0x00, (int)report_format,
1535 total_num_of_records,
1536 batch_scan_result_cache_[scanner_id]);
1537 batch_scan_result_cache_.erase(scanner_id);
1538 } else {
1539 auto raw_data = complete_view.GetRawData();
1540 batch_scan_result_cache_[scanner_id].insert(batch_scan_result_cache_[scanner_id].end(),
1541 raw_data.begin(), raw_data.end());
1542 total_num_of_records += num_of_records;
1543 batch_scan_read_results(scanner_id, total_num_of_records,
1544 static_cast<BatchScanMode>(report_format));
1545 }
1546 }
1547
on_storage_threshold_breachbluetooth::hci::LeScanningManager::impl1548 void on_storage_threshold_breach(VendorSpecificEventView /* event */) {
1549 if (batch_scan_config_.ref_value == kInvalidScannerId) {
1550 log::warn("storage threshold was not set !!");
1551 return;
1552 }
1553 scanning_callbacks_->OnBatchScanThresholdCrossed(
1554 static_cast<int>(batch_scan_config_.ref_value));
1555 }
1556
on_advertisement_trackingbluetooth::hci::LeScanningManager::impl1557 void on_advertisement_tracking(VendorSpecificEventView event) {
1558 auto view = LEAdvertisementTrackingEventView::Create(event);
1559 log::assert_that(view.IsValid(), "assert failed: view.IsValid()");
1560 uint8_t filter_index = view.GetApcfFilterIndex();
1561 if (tracker_id_map_.find(filter_index) == tracker_id_map_.end()) {
1562 log::warn("Advertisement track for filter_index {} is not register", (uint16_t)filter_index);
1563 return;
1564 }
1565 AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info = {};
1566 on_found_on_lost_info.scanner_id = tracker_id_map_[filter_index];
1567 on_found_on_lost_info.filter_index = filter_index;
1568 on_found_on_lost_info.advertiser_state = view.GetAdvertiserState();
1569 on_found_on_lost_info.advertiser_address = view.GetAdvertiserAddress();
1570 on_found_on_lost_info.advertiser_address_type = view.GetAdvertiserAddressType();
1571 on_found_on_lost_info.advertiser_info_present = view.GetAdvtInfoPresent();
1572 /* Extract the adv info details */
1573 if (on_found_on_lost_info.advertiser_info_present == AdvtInfoPresent::ADVT_INFO_PRESENT) {
1574 auto info_view = LEAdvertisementTrackingWithInfoEventView::Create(view);
1575 log::assert_that(info_view.IsValid(), "assert failed: info_view.IsValid()");
1576 on_found_on_lost_info.tx_power = info_view.GetTxPower();
1577 on_found_on_lost_info.rssi = info_view.GetRssi();
1578 on_found_on_lost_info.time_stamp = info_view.GetTimestamp();
1579 auto adv_data = info_view.GetAdvPacket();
1580 on_found_on_lost_info.adv_packet.reserve(adv_data.size());
1581 on_found_on_lost_info.adv_packet.insert(on_found_on_lost_info.adv_packet.end(),
1582 adv_data.begin(), adv_data.end());
1583 auto scan_rsp_data = info_view.GetScanResponse();
1584 on_found_on_lost_info.scan_response.reserve(scan_rsp_data.size());
1585 on_found_on_lost_info.scan_response.insert(on_found_on_lost_info.scan_response.end(),
1586 scan_rsp_data.begin(), scan_rsp_data.end());
1587 }
1588 scanning_callbacks_->OnTrackAdvFoundLost(on_found_on_lost_info);
1589 }
1590
OnPausebluetooth::hci::LeScanningManager::impl1591 void OnPause() override {
1592 if (!address_manager_registered_) {
1593 log::warn("Unregistered!");
1594 return;
1595 }
1596 paused_ = true;
1597 scan_on_resume_ = is_scanning_;
1598 stop_scan();
1599 ack_pause();
1600 }
1601
ack_pausebluetooth::hci::LeScanningManager::impl1602 void ack_pause() { le_address_manager_->AckPause(this); }
1603
OnResumebluetooth::hci::LeScanningManager::impl1604 void OnResume() override {
1605 if (!address_manager_registered_) {
1606 log::warn("Unregistered!");
1607 return;
1608 }
1609 paused_ = false;
1610 if (scan_on_resume_) {
1611 scan_on_resume_ = false;
1612 if (com::android::bluetooth::flags::configure_scan_on_resume()) {
1613 // This is a workaround for b/381010390.
1614 // We'll eventually recover scan parameters which could be overridden by
1615 // btm_send_hci_set_scan_params.
1616 configure_scan();
1617 }
1618 start_scan();
1619 }
1620 le_address_manager_->AckResume(this);
1621 }
1622
1623 ScanApiType api_type_;
1624
1625 Module* module_;
1626 os::Handler* module_handler_;
1627 HciLayer* hci_layer_;
1628 Controller* controller_;
1629 AclManager* acl_manager_;
1630 storage::StorageModule* storage_module_;
1631 LeScanningInterface* le_scanning_interface_;
1632 LeAddressManager* le_address_manager_;
1633 bool address_manager_registered_ = false;
1634 NullScanningCallback null_scanning_callback_;
1635 ScanningCallback* scanning_callbacks_ = &null_scanning_callback_;
1636 PeriodicSyncManager periodic_sync_manager_{&null_scanning_callback_};
1637 std::vector<Scanner> scanners_;
1638 bool is_scanning_ = false;
1639 bool scan_on_resume_ = false;
1640 bool paused_ = false;
1641 LeScanningReassembler scanning_reassembler_;
1642 bool is_filter_supported_ = false;
1643 bool is_ad_type_filter_supported_ = false;
1644 bool is_batch_scan_supported_ = false;
1645 bool is_periodic_advertising_sync_transfer_sender_supported_ = false;
1646 bool is_transport_discovery_data_filter_supported_ = false;
1647
1648 LeScanType le_scan_type_ = LeScanType::ACTIVE;
1649 uint32_t interval_ms_1m_{1000};
1650 uint16_t window_ms_1m_{1000};
1651 uint32_t interval_ms_coded_{1000};
1652 uint16_t window_ms_coded_{1000};
1653 uint8_t phy_{(uint8_t)PhyType::LE_1M};
1654 OwnAddressType own_address_type_{OwnAddressType::PUBLIC_DEVICE_ADDRESS};
1655 LeScanningFilterPolicy filter_policy_{LeScanningFilterPolicy::ACCEPT_ALL};
1656 BatchScanConfig batch_scan_config_;
1657 std::map<ScannerId, std::vector<uint8_t>> batch_scan_result_cache_;
1658 std::unordered_map<uint8_t, ScannerId> tracker_id_map_;
1659 uint16_t total_num_of_advt_tracked_ = 0x00;
1660 int8_t le_rx_path_loss_comp_ = 0;
1661 };
1662
LeScanningManager()1663 LeScanningManager::LeScanningManager() { pimpl_ = std::make_unique<impl>(this); }
1664
ListDependencies(ModuleList * list) const1665 void LeScanningManager::ListDependencies(ModuleList* list) const {
1666 list->add<HciLayer>();
1667 list->add<Controller>();
1668 list->add<AclManager>();
1669 }
1670
Start()1671 void LeScanningManager::Start() {
1672 pimpl_->start(GetHandler(), GetDependency<HciLayer>(), GetDependency<Controller>(),
1673 GetDependency<AclManager>(), shim::GetStorage());
1674 }
1675
Stop()1676 void LeScanningManager::Stop() {
1677 pimpl_->stop();
1678 pimpl_.reset();
1679 }
1680
ToString() const1681 std::string LeScanningManager::ToString() const { return "Le Scanning Manager"; }
1682
RegisterScanner(Uuid app_uuid)1683 void LeScanningManager::RegisterScanner(Uuid app_uuid) {
1684 CallOn(pimpl_.get(), &impl::register_scanner, app_uuid);
1685 }
1686
Unregister(ScannerId scanner_id)1687 void LeScanningManager::Unregister(ScannerId scanner_id) {
1688 CallOn(pimpl_.get(), &impl::unregister_scanner, scanner_id);
1689 }
1690
Scan(bool start)1691 void LeScanningManager::Scan(bool start) { CallOn(pimpl_.get(), &impl::scan, start); }
1692
SetScanParameters(LeScanType scan_type,ScannerId scanner_id_1m,uint16_t scan_interval_1m,uint16_t scan_window_1m,ScannerId scanner_id_coded,uint16_t scan_interval_coded,uint16_t scan_window_coded,uint8_t scan_phy)1693 void LeScanningManager::SetScanParameters(LeScanType scan_type, ScannerId scanner_id_1m,
1694 uint16_t scan_interval_1m, uint16_t scan_window_1m,
1695 ScannerId scanner_id_coded, uint16_t scan_interval_coded,
1696 uint16_t scan_window_coded, uint8_t scan_phy) {
1697 CallOn(pimpl_.get(), &impl::set_scan_parameters, scan_type, scanner_id_1m, scan_interval_1m,
1698 scan_window_1m, scanner_id_coded, scan_interval_coded, scan_window_coded, scan_phy);
1699 }
1700
SetScanFilterPolicy(LeScanningFilterPolicy filter_policy)1701 void LeScanningManager::SetScanFilterPolicy(LeScanningFilterPolicy filter_policy) {
1702 CallOn(pimpl_.get(), &impl::set_scan_filter_policy, filter_policy);
1703 }
1704
ScanFilterEnable(bool enable)1705 void LeScanningManager::ScanFilterEnable(bool enable) {
1706 CallOn(pimpl_.get(), &impl::scan_filter_enable, enable);
1707 }
1708
ScanFilterParameterSetup(ApcfAction action,uint8_t filter_index,AdvertisingFilterParameter advertising_filter_parameter)1709 void LeScanningManager::ScanFilterParameterSetup(
1710 ApcfAction action, uint8_t filter_index,
1711 AdvertisingFilterParameter advertising_filter_parameter) {
1712 CallOn(pimpl_.get(), &impl::scan_filter_parameter_setup, action, filter_index,
1713 advertising_filter_parameter);
1714 }
1715
ScanFilterAdd(uint8_t filter_index,std::vector<AdvertisingPacketContentFilterCommand> filters)1716 void LeScanningManager::ScanFilterAdd(uint8_t filter_index,
1717 std::vector<AdvertisingPacketContentFilterCommand> filters) {
1718 CallOn(pimpl_.get(), &impl::scan_filter_add, filter_index, filters);
1719 }
1720
BatchScanConifgStorage(uint8_t batch_scan_full_max,uint8_t batch_scan_truncated_max,uint8_t batch_scan_notify_threshold,ScannerId scanner_id)1721 void LeScanningManager::BatchScanConifgStorage(uint8_t batch_scan_full_max,
1722 uint8_t batch_scan_truncated_max,
1723 uint8_t batch_scan_notify_threshold,
1724 ScannerId scanner_id) {
1725 CallOn(pimpl_.get(), &impl::batch_scan_set_storage_parameter, batch_scan_full_max,
1726 batch_scan_truncated_max, batch_scan_notify_threshold, scanner_id);
1727 }
1728
BatchScanEnable(BatchScanMode scan_mode,uint32_t duty_cycle_scan_window_slots,uint32_t duty_cycle_scan_interval_slots,BatchScanDiscardRule batch_scan_discard_rule)1729 void LeScanningManager::BatchScanEnable(BatchScanMode scan_mode,
1730 uint32_t duty_cycle_scan_window_slots,
1731 uint32_t duty_cycle_scan_interval_slots,
1732 BatchScanDiscardRule batch_scan_discard_rule) {
1733 CallOn(pimpl_.get(), &impl::batch_scan_enable, scan_mode, duty_cycle_scan_window_slots,
1734 duty_cycle_scan_interval_slots, batch_scan_discard_rule);
1735 }
1736
BatchScanDisable()1737 void LeScanningManager::BatchScanDisable() { CallOn(pimpl_.get(), &impl::batch_scan_disable); }
1738
BatchScanReadReport(ScannerId scanner_id,BatchScanMode scan_mode)1739 void LeScanningManager::BatchScanReadReport(ScannerId scanner_id, BatchScanMode scan_mode) {
1740 CallOn(pimpl_.get(), &impl::batch_scan_read_results, scanner_id, 0, scan_mode);
1741 }
1742
StartSync(uint8_t sid,const AddressWithType & address_with_type,uint16_t skip,uint16_t timeout,int reg_id)1743 void LeScanningManager::StartSync(uint8_t sid, const AddressWithType& address_with_type,
1744 uint16_t skip, uint16_t timeout, int reg_id) {
1745 CallOn(pimpl_.get(), &impl::start_sync, sid, address_with_type, skip, timeout, reg_id);
1746 }
1747
StopSync(uint16_t handle)1748 void LeScanningManager::StopSync(uint16_t handle) {
1749 CallOn(pimpl_.get(), &impl::stop_sync, handle);
1750 }
1751
CancelCreateSync(uint8_t sid,const Address & address)1752 void LeScanningManager::CancelCreateSync(uint8_t sid, const Address& address) {
1753 CallOn(pimpl_.get(), &impl::cancel_create_sync, sid, address);
1754 }
1755
TransferSync(const Address & address,uint16_t handle,uint16_t service_data,uint16_t sync_handle,int pa_source)1756 void LeScanningManager::TransferSync(const Address& address, uint16_t handle, uint16_t service_data,
1757 uint16_t sync_handle, int pa_source) {
1758 CallOn(pimpl_.get(), &impl::transfer_sync, address, handle, service_data, sync_handle, pa_source);
1759 }
1760
TransferSetInfo(const Address & address,uint16_t handle,uint16_t service_data,uint8_t adv_handle,int pa_source)1761 void LeScanningManager::TransferSetInfo(const Address& address, uint16_t handle,
1762 uint16_t service_data, uint8_t adv_handle, int pa_source) {
1763 CallOn(pimpl_.get(), &impl::transfer_set_info, address, handle, service_data, adv_handle,
1764 pa_source);
1765 }
1766
SyncTxParameters(const Address & address,uint8_t mode,uint16_t skip,uint16_t timeout,int reg_id)1767 void LeScanningManager::SyncTxParameters(const Address& address, uint8_t mode, uint16_t skip,
1768 uint16_t timeout, int reg_id) {
1769 CallOn(pimpl_.get(), &impl::sync_tx_parameters, address, mode, skip, timeout, reg_id);
1770 }
1771
TrackAdvertiser(uint8_t filter_index,ScannerId scanner_id)1772 void LeScanningManager::TrackAdvertiser(uint8_t filter_index, ScannerId scanner_id) {
1773 CallOn(pimpl_.get(), &impl::track_advertiser, filter_index, scanner_id);
1774 }
1775
RegisterScanningCallback(ScanningCallback * scanning_callback)1776 void LeScanningManager::RegisterScanningCallback(ScanningCallback* scanning_callback) {
1777 CallOn(pimpl_.get(), &impl::register_scanning_callback, scanning_callback);
1778 }
1779
IsAdTypeFilterSupported() const1780 bool LeScanningManager::IsAdTypeFilterSupported() const {
1781 return pimpl_->is_ad_type_filter_supported();
1782 }
1783
1784 } // namespace hci
1785 } // namespace bluetooth
1786