• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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