1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "bt_shim_scanner"
18 
19 #include "le_scanning_manager.h"
20 
21 #include <base/functional/bind.h>
22 #include <base/threading/thread.h>
23 #include <bluetooth/log.h>
24 #include <com_android_bluetooth_flags.h>
25 #include <hardware/bluetooth.h>
26 
27 #include "btif/include/btif_common.h"
28 #include "hci/address.h"
29 #include "hci/le_scanning_manager.h"
30 #include "hci/msft.h"
31 #include "include/hardware/ble_scanner.h"
32 #include "main/shim/ble_scanner_interface_impl.h"
33 #include "main/shim/entry.h"
34 #include "main/shim/helpers.h"
35 #include "main/shim/le_scanning_manager.h"
36 #include "main/shim/shim.h"
37 #include "stack/btm/btm_int_types.h"
38 #include "stack/include/advertise_data_parser.h"
39 #include "stack/include/bt_dev_class.h"
40 #include "stack/include/btm_log_history.h"
41 #include "stack/include/btm_sec_api.h"
42 #include "stack/include/btm_status.h"
43 #include "storage/device.h"
44 #include "storage/le_device.h"
45 #include "storage/storage_module.h"
46 #include "types/ble_address_with_type.h"
47 #include "types/bluetooth/uuid.h"
48 #include "types/raw_address.h"
49 
50 using namespace bluetooth;
51 
52 extern tBTM_CB btm_cb;
53 
54 namespace {
55 constexpr char kBtmLogTag[] = "SCAN";
56 constexpr uint16_t kAllowServiceDataFilter = 0x0040;
57 // Bit 8 for enable AD Type Check
58 constexpr uint16_t kAllowADTypeFilter = 0x100;
59 constexpr uint8_t kFilterLogicOr = 0x00;
60 constexpr uint8_t kFilterLogicAnd = 0x01;
61 constexpr uint8_t kLowestRssiValue = 129;
62 constexpr uint16_t kAllowAllFilter = 0x00;
63 constexpr uint16_t kListLogicOr = 0x01;
64 
65 class DefaultScanningCallback : public ::ScanningCallbacks {
OnScannerRegistered(const bluetooth::Uuid,uint8_t,uint8_t)66   void OnScannerRegistered(const bluetooth::Uuid /* app_uuid */, uint8_t /* scanner_id */,
67                            uint8_t /* status */) override {
68     LogUnused();
69   }
OnSetScannerParameterComplete(uint8_t,uint8_t)70   void OnSetScannerParameterComplete(uint8_t /* scanner_id */, uint8_t /* status */) override {
71     LogUnused();
72   }
OnScanResult(uint16_t,uint8_t,RawAddress,uint8_t,uint8_t,uint8_t,int8_t,int8_t,uint16_t,std::vector<uint8_t>)73   void OnScanResult(uint16_t /* event_type */, uint8_t /* address_type */, RawAddress /* bda */,
74                     uint8_t /* primary_phy */, uint8_t /* secondary_phy */,
75                     uint8_t /* advertising_sid */, int8_t /* tx_power */, int8_t /* rssi */,
76                     uint16_t /* periodic_advertising_interval */,
77                     std::vector<uint8_t> /* advertising_data */) override {
78     LogUnused();
79   }
OnTrackAdvFoundLost(AdvertisingTrackInfo)80   void OnTrackAdvFoundLost(AdvertisingTrackInfo /* advertising_track_info */) override {
81     LogUnused();
82   }
OnBatchScanReports(int,int,int,int,std::vector<uint8_t>)83   void OnBatchScanReports(int /* client_if */, int /* status */, int /* report_format */,
84                           int /* num_records */, std::vector<uint8_t> /* data */) override {
85     LogUnused();
86   }
OnBatchScanThresholdCrossed(int)87   void OnBatchScanThresholdCrossed(int /* client_if */) override { LogUnused(); }
OnPeriodicSyncStarted(int,uint8_t,uint16_t,uint8_t,uint8_t,RawAddress,uint8_t,uint16_t)88   void OnPeriodicSyncStarted(int /* reg_id */, uint8_t /* status */, uint16_t /* sync_handle */,
89                              uint8_t /* advertising_sid */, uint8_t /* address_type */,
90                              RawAddress /* address */, uint8_t /* phy */,
91                              uint16_t /* interval */) override {
92     LogUnused();
93   }
OnPeriodicSyncReport(uint16_t,int8_t,int8_t,uint8_t,std::vector<uint8_t>)94   void OnPeriodicSyncReport(uint16_t /* sync_handle */, int8_t /* tx_power */, int8_t /* rssi */,
95                             uint8_t /* status */, std::vector<uint8_t> /* data */) override {
96     LogUnused();
97   }
OnPeriodicSyncLost(uint16_t)98   void OnPeriodicSyncLost(uint16_t /* sync_handle */) override { LogUnused(); }
OnPeriodicSyncTransferred(int,uint8_t,RawAddress)99   void OnPeriodicSyncTransferred(int /* pa_source */, uint8_t /* status */,
100                                  RawAddress /* address */) override {
101     LogUnused();
102   }
103 
OnBigInfoReport(uint16_t,bool)104   void OnBigInfoReport(uint16_t /* sync_handle */, bool /* encrypted */) override { LogUnused(); }
105 
106 private:
LogUnused()107   static void LogUnused() { log::warn("BLE Scanning callbacks have not been registered"); }
108 } default_scanning_callback_;
109 
110 }  // namespace
111 
112 ::ScanningCallbacks* bluetooth::shim::default_scanning_callback =
113         static_cast<::ScanningCallbacks*>(&default_scanning_callback_);
114 extern ::ScanningCallbacks* bluetooth::shim::default_scanning_callback;
115 
116 void btm_ble_process_adv_pkt_cont_for_inquiry(uint16_t event_type, tBLE_ADDR_TYPE address_type,
117                                               const RawAddress& raw_address, uint8_t primary_phy,
118                                               uint8_t secondary_phy, uint8_t advertising_sid,
119                                               int8_t tx_power, int8_t rssi,
120                                               uint16_t periodic_adv_int,
121                                               std::vector<uint8_t> advertising_data);
122 
123 extern void btif_update_remote_properties(const RawAddress& bd_addr, BD_NAME bd_name,
124                                           DEV_CLASS dev_class, tBT_DEVICE_TYPE dev_type);
125 
126 void btm_ble_process_adv_addr(RawAddress& raw_address, tBLE_ADDR_TYPE* address_type);
127 
128 extern DEV_CLASS btm_ble_get_appearance_as_cod(std::vector<uint8_t> const& data);
129 
130 using bluetooth::shim::BleScannerInterfaceImpl;
131 
Init()132 void BleScannerInterfaceImpl::Init() {
133   log::info("init BleScannerInterfaceImpl");
134   bluetooth::shim::GetScanning()->RegisterScanningCallback(this);
135 
136   if (bluetooth::shim::GetMsftExtensionManager()) {
137     bluetooth::shim::GetMsftExtensionManager()->SetScanningCallback(this);
138   }
139 }
140 
141 /** Registers a scanner with the stack */
RegisterScanner(const bluetooth::Uuid & uuid,RegisterCallback)142 void BleScannerInterfaceImpl::RegisterScanner(const bluetooth::Uuid& uuid, RegisterCallback) {
143   auto app_uuid = bluetooth::hci::Uuid::From128BitBE(uuid.To128BitBE());
144   log::info("in shim layer, UUID={}", app_uuid.ToString());
145   bluetooth::shim::GetScanning()->RegisterScanner(app_uuid);
146 }
147 
148 /** Unregister a scanner from the stack */
Unregister(int scanner_id)149 void BleScannerInterfaceImpl::Unregister(int scanner_id) {
150   log::info("in shim layer, scannerId={}", scanner_id);
151   bluetooth::shim::GetScanning()->Unregister(scanner_id);
152 }
153 
154 /** Start or stop LE device scanning */
Scan(bool start)155 void BleScannerInterfaceImpl::Scan(bool start) {
156   log::info("in shim layer {}", (start) ? "started" : "stopped");
157   bluetooth::shim::GetScanning()->Scan(start);
158   if (start && !btm_cb.ble_ctr_cb.is_ble_observe_active()) {
159     btm_cb.neighbor.le_scan = {
160             .start_time_ms = timestamper_in_milliseconds.GetTimestamp(),
161             .results = 0,
162     };
163     BTM_LogHistory(kBtmLogTag, RawAddress::kEmpty, "Le scan started");
164     btm_cb.ble_ctr_cb.set_ble_observe_active();
165   } else if (!start && btm_cb.ble_ctr_cb.is_ble_observe_active()) {
166     // stopped
167     const uint64_t duration_timestamp =
168             timestamper_in_milliseconds.GetTimestamp() - btm_cb.neighbor.le_scan.start_time_ms;
169     BTM_LogHistory(kBtmLogTag, RawAddress::kEmpty, "Le scan stopped",
170                    base::StringPrintf("duration_s:%6.3f results:%-3lu",
171                                       (double)duration_timestamp / 1000.0,
172                                       (unsigned long)btm_cb.neighbor.le_scan.results));
173     btm_cb.ble_ctr_cb.reset_ble_observe();
174     btm_cb.neighbor.le_scan = {};
175   } else {
176     log::warn("Invalid state: start:{}, current scan state: {}", start,
177               btm_cb.ble_ctr_cb.is_ble_observe_active());
178     return;
179   }
180 
181   do_in_jni_thread(base::BindOnce(&BleScannerInterfaceImpl::AddressCache::init,
182                                   base::Unretained(&address_cache_)));
183 }
184 
185 /** Setup scan filter params */
ScanFilterParamSetup(uint8_t client_if,uint8_t action,uint8_t filter_index,std::unique_ptr<btgatt_filt_param_setup_t> filt_param,FilterParamSetupCallback cb)186 void BleScannerInterfaceImpl::ScanFilterParamSetup(
187         uint8_t client_if, uint8_t action, uint8_t filter_index,
188         std::unique_ptr<btgatt_filt_param_setup_t> filt_param, FilterParamSetupCallback cb) {
189   log::info("in shim layer, clientIf={}", client_if);
190 
191   auto apcf_action = static_cast<bluetooth::hci::ApcfAction>(action);
192   bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter;
193 
194   if (filt_param != nullptr) {
195     if (filt_param && filt_param->dely_mode == 1 && apcf_action == hci::ApcfAction::ADD) {
196       bluetooth::shim::GetScanning()->TrackAdvertiser(filter_index, client_if);
197     }
198     advertising_filter_parameter.feature_selection = filt_param->feat_seln;
199     advertising_filter_parameter.list_logic_type = filt_param->list_logic_type;
200     advertising_filter_parameter.filter_logic_type = filt_param->filt_logic_type;
201     advertising_filter_parameter.rssi_high_thresh = filt_param->rssi_high_thres;
202     advertising_filter_parameter.delivery_mode =
203             static_cast<bluetooth::hci::DeliveryMode>(filt_param->dely_mode);
204     if (filt_param && filt_param->dely_mode == 1) {
205       advertising_filter_parameter.onfound_timeout = filt_param->found_timeout;
206       advertising_filter_parameter.onfound_timeout_cnt = filt_param->found_timeout_cnt;
207       advertising_filter_parameter.rssi_low_thresh = filt_param->rssi_low_thres;
208       advertising_filter_parameter.onlost_timeout = filt_param->lost_timeout;
209       advertising_filter_parameter.num_of_tracking_entries = filt_param->num_of_tracking_entries;
210     }
211   }
212 
213   bluetooth::shim::GetScanning()->ScanFilterParameterSetup(apcf_action, filter_index,
214                                                            advertising_filter_parameter);
215   // TODO refactor callback mechanism
216   do_in_jni_thread(base::BindOnce(cb, 0, 0, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
217 }
218 
219 /** Configure a scan filter condition  */
ScanFilterAdd(int filter_index,std::vector<ApcfCommand> filters,FilterConfigCallback cb)220 void BleScannerInterfaceImpl::ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
221                                             FilterConfigCallback cb) {
222   log::info("in shim layer");
223   std::vector<bluetooth::hci::AdvertisingPacketContentFilterCommand> new_filters = {};
224   for (size_t i = 0; i < filters.size(); i++) {
225     bluetooth::hci::AdvertisingPacketContentFilterCommand command{};
226     if (!parse_filter_command(command, filters[i])) {
227       log::error("invalid apcf command");
228       return;
229     }
230     new_filters.push_back(command);
231   }
232   bluetooth::shim::GetScanning()->ScanFilterAdd(filter_index, new_filters);
233   do_in_jni_thread(base::BindOnce(cb, 0, 0, 0, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
234 }
235 
236 /** Clear all scan filter conditions for specific filter index*/
ScanFilterClear(int,FilterConfigCallback)237 void BleScannerInterfaceImpl::ScanFilterClear(int /* filter_index */,
238                                               FilterConfigCallback /* cb */) {
239   log::info("in shim layer");
240   // This function doesn't used in java layer
241 }
242 
243 /** Enable / disable scan filter feature*/
ScanFilterEnable(bool enable,EnableCallback cb)244 void BleScannerInterfaceImpl::ScanFilterEnable(bool enable, EnableCallback cb) {
245   log::info("in shim layer");
246   bluetooth::shim::GetScanning()->ScanFilterEnable(enable);
247 
248   uint8_t action = enable ? 1 : 0;
249   do_in_jni_thread(base::BindOnce(cb, action, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
250 }
251 
252 /** Is MSFT Extension supported? */
IsMsftSupported()253 bool BleScannerInterfaceImpl::IsMsftSupported() {
254   log::info("in shim layer");
255 
256   return bluetooth::shim::GetMsftExtensionManager()->SupportsMsftExtensions();
257 }
258 
259 /** Adds MSFT filter */
MsftAdvMonitorAdd(MsftAdvMonitor monitor,MsftAdvMonitorAddCallback cb)260 void BleScannerInterfaceImpl::MsftAdvMonitorAdd(MsftAdvMonitor monitor,
261                                                 MsftAdvMonitorAddCallback cb) {
262   log::info("in shim layer");
263   msft_callbacks_.Add = cb;
264   bluetooth::shim::GetMsftExtensionManager()->MsftAdvMonitorAdd(
265           monitor,
266           base::Bind(&BleScannerInterfaceImpl::OnMsftAdvMonitorAdd, base::Unretained(this)));
267 }
268 
269 /** Removes MSFT filter */
MsftAdvMonitorRemove(uint8_t monitor_handle,MsftAdvMonitorRemoveCallback cb)270 void BleScannerInterfaceImpl::MsftAdvMonitorRemove(uint8_t monitor_handle,
271                                                    MsftAdvMonitorRemoveCallback cb) {
272   log::info("in shim layer");
273   msft_callbacks_.Remove = cb;
274   bluetooth::shim::GetMsftExtensionManager()->MsftAdvMonitorRemove(
275           monitor_handle,
276           base::Bind(&BleScannerInterfaceImpl::OnMsftAdvMonitorRemove, base::Unretained(this)));
277 }
278 
279 /** Enable / disable MSFT scan filter */
MsftAdvMonitorEnable(bool enable,MsftAdvMonitorEnableCallback cb)280 void BleScannerInterfaceImpl::MsftAdvMonitorEnable(bool enable, MsftAdvMonitorEnableCallback cb) {
281   log::info("in shim layer");
282   msft_callbacks_.Enable = cb;
283   bluetooth::shim::GetMsftExtensionManager()->MsftAdvMonitorEnable(
284           enable, base::Bind(&BleScannerInterfaceImpl::OnMsftAdvMonitorEnable,
285                              base::Unretained(this), enable));
286 }
287 
288 /** Callback of adding MSFT filter */
OnMsftAdvMonitorAdd(uint8_t monitor_handle,bluetooth::hci::ErrorCode status)289 void BleScannerInterfaceImpl::OnMsftAdvMonitorAdd(uint8_t monitor_handle,
290                                                   bluetooth::hci::ErrorCode status) {
291   log::info("in shim layer");
292   do_in_jni_thread(base::BindOnce(msft_callbacks_.Add, monitor_handle, (uint8_t)status));
293 }
294 
295 /** Callback of removing MSFT filter */
OnMsftAdvMonitorRemove(bluetooth::hci::ErrorCode status)296 void BleScannerInterfaceImpl::OnMsftAdvMonitorRemove(bluetooth::hci::ErrorCode status) {
297   log::info("in shim layer");
298   do_in_jni_thread(base::BindOnce(msft_callbacks_.Remove, (uint8_t)status));
299 }
300 
301 /** Callback of enabling / disabling MSFT scan filter */
OnMsftAdvMonitorEnable(bool enable,bluetooth::hci::ErrorCode status)302 void BleScannerInterfaceImpl::OnMsftAdvMonitorEnable(bool enable,
303                                                      bluetooth::hci::ErrorCode status) {
304   log::info("in shim layer");
305 
306   if (status == bluetooth::hci::ErrorCode::SUCCESS) {
307     bluetooth::shim::GetScanning()->SetScanFilterPolicy(
308             enable ? bluetooth::hci::LeScanningFilterPolicy::FILTER_ACCEPT_LIST_ONLY
309                    : bluetooth::hci::LeScanningFilterPolicy::ACCEPT_ALL);
310   }
311 
312   do_in_jni_thread(base::BindOnce(msft_callbacks_.Enable, (uint8_t)status));
313 }
314 
315 /** Sets the LE scan interval and window in units of N*0.625 msec */
SetScanParameters(int scanner_id,uint8_t scan_type,int scan_interval,int scan_window,int scan_phy,Callback)316 void BleScannerInterfaceImpl::SetScanParameters(int scanner_id, uint8_t scan_type,
317                                                 int scan_interval, int scan_window, int scan_phy,
318                                                 Callback /* cb */) {
319   log::info("in shim layer, scannerId={}", scanner_id);
320   if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_EXT_SCAN_INT_MAX) &&
321       BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_EXT_SCAN_WIN_MAX)) {
322     btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_ACTI;
323     btm_cb.ble_ctr_cb.inq_var.scan_interval = scan_interval;
324     btm_cb.ble_ctr_cb.inq_var.scan_window = scan_window;
325     btm_cb.ble_ctr_cb.inq_var.scan_phy = scan_phy;
326   }
327 
328   bluetooth::shim::GetScanning()->SetScanParameters(
329           scanner_id, static_cast<bluetooth::hci::LeScanType>(scan_type), scan_interval,
330           scan_window, scan_phy);
331 }
332 
333 /* Configure the batchscan storage */
BatchscanConfigStorage(int client_if,int batch_scan_full_max,int batch_scan_trunc_max,int batch_scan_notify_threshold,Callback cb)334 void BleScannerInterfaceImpl::BatchscanConfigStorage(int client_if, int batch_scan_full_max,
335                                                      int batch_scan_trunc_max,
336                                                      int batch_scan_notify_threshold, Callback cb) {
337   log::info("in shim layer");
338   bluetooth::shim::GetScanning()->BatchScanConifgStorage(batch_scan_full_max, batch_scan_trunc_max,
339                                                          batch_scan_notify_threshold, client_if);
340   do_in_jni_thread(base::BindOnce(cb, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
341 }
342 
343 /* Enable batchscan */
BatchscanEnable(int scan_mode,int scan_interval,int scan_window,int,int discard_rule,Callback cb)344 void BleScannerInterfaceImpl::BatchscanEnable(int scan_mode, int scan_interval, int scan_window,
345                                               int /* addr_type */, int discard_rule, Callback cb) {
346   log::info("in shim layer");
347   auto batch_scan_mode = static_cast<bluetooth::hci::BatchScanMode>(scan_mode);
348   auto batch_scan_discard_rule = static_cast<bluetooth::hci::BatchScanDiscardRule>(discard_rule);
349   bluetooth::shim::GetScanning()->BatchScanEnable(batch_scan_mode, scan_window, scan_interval,
350                                                   batch_scan_discard_rule);
351   do_in_jni_thread(base::BindOnce(cb, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
352 }
353 
354 /* Disable batchscan */
BatchscanDisable(Callback cb)355 void BleScannerInterfaceImpl::BatchscanDisable(Callback cb) {
356   log::info("in shim layer");
357   bluetooth::shim::GetScanning()->BatchScanDisable();
358   do_in_jni_thread(base::BindOnce(cb, btm_status_value(tBTM_STATUS::BTM_SUCCESS)));
359 }
360 
361 /* Read out batchscan reports */
BatchscanReadReports(int client_if,int scan_mode)362 void BleScannerInterfaceImpl::BatchscanReadReports(int client_if, int scan_mode) {
363   log::info("in shim layer");
364   auto batch_scan_mode = static_cast<bluetooth::hci::BatchScanMode>(scan_mode);
365   auto scanner_id = static_cast<bluetooth::hci::ScannerId>(client_if);
366   bluetooth::shim::GetScanning()->BatchScanReadReport(scanner_id, batch_scan_mode);
367 }
368 
369 bool btm_random_pseudo_to_identity_addr(RawAddress* random_pseudo,
370                                         tBLE_ADDR_TYPE* p_identity_addr_type);
371 
372 bool btm_identity_addr_to_random_pseudo(RawAddress* bd_addr, tBLE_ADDR_TYPE* p_addr_type,
373                                         bool refresh);
374 
375 extern tACL_CONN* btm_acl_for_bda(const RawAddress& bd_addr, tBT_TRANSPORT transport);
376 
StartSync(uint8_t sid,RawAddress address,uint16_t skip,uint16_t timeout,int reg_id)377 void BleScannerInterfaceImpl::StartSync(uint8_t sid, RawAddress address, uint16_t skip,
378                                         uint16_t timeout, int reg_id) {
379   log::info("in shim layer");
380   tBLE_ADDR_TYPE address_type = BLE_ADDR_RANDOM;
381   tINQ_DB_ENT* p_i = btm_inq_db_find(address);
382   if (p_i) {
383     address_type = p_i->inq_info.results.ble_addr_type;  // Random
384   }
385   btm_random_pseudo_to_identity_addr(&address, &address_type);
386   address_type &= ~BLE_ADDR_TYPE_ID_BIT;
387   bluetooth::shim::GetScanning()->StartSync(sid, ToAddressWithType(address, address_type), skip,
388                                             timeout, reg_id);
389 }
390 
StopSync(uint16_t handle)391 void BleScannerInterfaceImpl::StopSync(uint16_t handle) {
392   log::info("in shim layer");
393   bluetooth::shim::GetScanning()->StopSync(handle);
394 }
395 
CancelCreateSync(uint8_t sid,RawAddress address)396 void BleScannerInterfaceImpl::CancelCreateSync(uint8_t sid, RawAddress address) {
397   log::info("in shim layer");
398   bluetooth::shim::GetScanning()->CancelCreateSync(sid, ToGdAddress(address));
399 }
400 
TransferSync(RawAddress address,uint16_t service_data,uint16_t sync_handle,int pa_source)401 void BleScannerInterfaceImpl::TransferSync(RawAddress address, uint16_t service_data,
402                                            uint16_t sync_handle, int pa_source) {
403   log::info("in shim layer");
404   tACL_CONN* p_acl = btm_acl_for_bda(address, BT_TRANSPORT_LE);
405   if (p_acl == NULL ||
406       !HCI_LE_PERIODIC_ADVERTISING_SYNC_TRANSFER_RECIPIENT(p_acl->peer_le_features)) {
407     log::error("[PAST] Remote doesn't support PAST");
408     scanning_callbacks_->OnPeriodicSyncTransferred(
409             pa_source, static_cast<uint8_t>(tBTM_STATUS::BTM_MODE_UNSUPPORTED), address);
410     return;
411   }
412 
413   bluetooth::shim::GetScanning()->TransferSync(ToGdAddress(address), p_acl->Handle(), service_data,
414                                                sync_handle, pa_source);
415 }
416 
TransferSetInfo(RawAddress address,uint16_t service_data,uint8_t adv_handle,int pa_source)417 void BleScannerInterfaceImpl::TransferSetInfo(RawAddress address, uint16_t service_data,
418                                               uint8_t adv_handle, int pa_source) {
419   log::info("in shim layer");
420   tACL_CONN* p_acl = btm_acl_for_bda(address, BT_TRANSPORT_LE);
421   if (p_acl == NULL ||
422       !HCI_LE_PERIODIC_ADVERTISING_SYNC_TRANSFER_RECIPIENT(p_acl->peer_le_features)) {
423     log::error("[PAST] Remote doesn't support PAST");
424     scanning_callbacks_->OnPeriodicSyncTransferred(
425             pa_source, static_cast<uint8_t>(tBTM_STATUS::BTM_MODE_UNSUPPORTED), address);
426     return;
427   }
428 
429   bluetooth::shim::GetScanning()->TransferSetInfo(ToGdAddress(address), p_acl->Handle(),
430                                                   service_data, adv_handle, pa_source);
431 }
432 
SyncTxParameters(RawAddress addr,uint8_t mode,uint16_t skip,uint16_t timeout,int reg_id)433 void BleScannerInterfaceImpl::SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
434                                                uint16_t timeout, int reg_id) {
435   log::info("in shim layer");
436   bluetooth::shim::GetScanning()->SyncTxParameters(ToGdAddress(addr), mode, skip, timeout, reg_id);
437 }
438 
RegisterCallbacks(ScanningCallbacks * callbacks)439 void BleScannerInterfaceImpl::RegisterCallbacks(ScanningCallbacks* callbacks) {
440   log::info("in shim layer");
441   scanning_callbacks_ = callbacks;
442 }
443 
OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,bluetooth::hci::ScannerId scanner_id,ScanningStatus status)444 void BleScannerInterfaceImpl::OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,
445                                                   bluetooth::hci::ScannerId scanner_id,
446                                                   ScanningStatus status) {
447   auto uuid = bluetooth::Uuid::From128BitBE(app_uuid.To128BitBE());
448   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnScannerRegistered,
449                                   base::Unretained(scanning_callbacks_), uuid, scanner_id, status));
450 }
451 
OnSetScannerParameterComplete(bluetooth::hci::ScannerId scanner_id,ScanningStatus status)452 void BleScannerInterfaceImpl::OnSetScannerParameterComplete(bluetooth::hci::ScannerId scanner_id,
453                                                             ScanningStatus status) {
454   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnSetScannerParameterComplete,
455                                   base::Unretained(scanning_callbacks_), scanner_id, status));
456 }
457 
OnScanResult(uint16_t event_type,uint8_t address_type,bluetooth::hci::Address address,uint8_t primary_phy,uint8_t secondary_phy,uint8_t advertising_sid,int8_t tx_power,int8_t rssi,uint16_t periodic_advertising_interval,std::vector<uint8_t> advertising_data)458 void BleScannerInterfaceImpl::OnScanResult(uint16_t event_type, uint8_t address_type,
459                                            bluetooth::hci::Address address, uint8_t primary_phy,
460                                            uint8_t secondary_phy, uint8_t advertising_sid,
461                                            int8_t tx_power, int8_t rssi,
462                                            uint16_t periodic_advertising_interval,
463                                            std::vector<uint8_t> advertising_data) {
464   RawAddress raw_address = ToRawAddress(address);
465   tBLE_ADDR_TYPE ble_addr_type = to_ble_addr_type(address_type);
466 
467   btm_cb.neighbor.le_scan.results++;
468   if (ble_addr_type != BLE_ADDR_ANONYMOUS) {
469     btm_ble_process_adv_addr(raw_address, &ble_addr_type);
470   }
471 
472   // Do not update device properties of already bonded devices.
473   if (!com::android::bluetooth::flags::guard_bonded_device_properties() ||
474       !btm_sec_is_a_bonded_dev(raw_address)) {
475     do_in_jni_thread(base::BindOnce(&BleScannerInterfaceImpl::handle_remote_properties,
476                                     base::Unretained(this), raw_address, ble_addr_type,
477                                     advertising_data));
478   }
479 
480   do_in_jni_thread(base::BindOnce(
481           &ScanningCallbacks::OnScanResult, base::Unretained(scanning_callbacks_), event_type,
482           static_cast<uint8_t>(address_type), raw_address, primary_phy, secondary_phy,
483           advertising_sid, tx_power, rssi, periodic_advertising_interval, advertising_data));
484 
485   // TODO: Remove when StartInquiry in GD part implemented
486   btm_ble_process_adv_pkt_cont_for_inquiry(event_type, ble_addr_type, raw_address, primary_phy,
487                                            secondary_phy, advertising_sid, tx_power, rssi,
488                                            periodic_advertising_interval, advertising_data);
489 }
490 
OnTrackAdvFoundLost(bluetooth::hci::AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info)491 void BleScannerInterfaceImpl::OnTrackAdvFoundLost(
492         bluetooth::hci::AdvertisingFilterOnFoundOnLostInfo on_found_on_lost_info) {
493   AdvertisingTrackInfo track_info = {};
494   RawAddress raw_address = ToRawAddress(on_found_on_lost_info.advertiser_address);
495 
496   if (on_found_on_lost_info.advertiser_address_type != BLE_ADDR_ANONYMOUS) {
497     btm_ble_process_adv_addr(raw_address, &on_found_on_lost_info.advertiser_address_type);
498   }
499 
500   track_info.monitor_handle = on_found_on_lost_info.monitor_handle;
501   track_info.advertiser_address = raw_address;
502   track_info.advertiser_address_type = on_found_on_lost_info.advertiser_address_type;
503   track_info.scanner_id = on_found_on_lost_info.scanner_id;
504   track_info.filter_index = on_found_on_lost_info.filter_index;
505   track_info.advertiser_state = on_found_on_lost_info.advertiser_state;
506   track_info.advertiser_info_present =
507           static_cast<uint8_t>(on_found_on_lost_info.advertiser_info_present);
508   if (on_found_on_lost_info.advertiser_info_present ==
509       bluetooth::hci::AdvtInfoPresent::ADVT_INFO_PRESENT) {
510     track_info.tx_power = on_found_on_lost_info.tx_power;
511     track_info.rssi = on_found_on_lost_info.rssi;
512     track_info.time_stamp = on_found_on_lost_info.time_stamp;
513     auto adv_data = on_found_on_lost_info.adv_packet;
514     track_info.adv_packet_len = (uint8_t)adv_data.size();
515     track_info.adv_packet.reserve(adv_data.size());
516     track_info.adv_packet.insert(track_info.adv_packet.end(), adv_data.begin(), adv_data.end());
517     auto scan_rsp_data = on_found_on_lost_info.scan_response;
518     track_info.scan_response_len = (uint8_t)scan_rsp_data.size();
519     track_info.scan_response.reserve(adv_data.size());
520     track_info.scan_response.insert(track_info.scan_response.end(), scan_rsp_data.begin(),
521                                     scan_rsp_data.end());
522   }
523   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnTrackAdvFoundLost,
524                                   base::Unretained(scanning_callbacks_), track_info));
525 }
526 
OnBatchScanReports(int client_if,int status,int report_format,int num_records,std::vector<uint8_t> data)527 void BleScannerInterfaceImpl::OnBatchScanReports(int client_if, int status, int report_format,
528                                                  int num_records, std::vector<uint8_t> data) {
529   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnBatchScanReports,
530                                   base::Unretained(scanning_callbacks_), client_if, status,
531                                   report_format, num_records, data));
532 }
533 
OnBatchScanThresholdCrossed(int client_if)534 void BleScannerInterfaceImpl::OnBatchScanThresholdCrossed(int client_if) {
535   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnBatchScanThresholdCrossed,
536                                   base::Unretained(scanning_callbacks_), client_if));
537 }
538 
OnPeriodicSyncStarted(int reg_id,uint8_t status,uint16_t sync_handle,uint8_t advertising_sid,bluetooth::hci::AddressWithType address_with_type,uint8_t phy,uint16_t interval)539 void BleScannerInterfaceImpl::OnPeriodicSyncStarted(
540         int reg_id, uint8_t status, uint16_t sync_handle, uint8_t advertising_sid,
541         bluetooth::hci::AddressWithType address_with_type, uint8_t phy, uint16_t interval) {
542   RawAddress raw_address = ToRawAddress(address_with_type.GetAddress());
543   tBLE_ADDR_TYPE ble_addr_type = to_ble_addr_type((uint8_t)address_with_type.GetAddressType());
544   if (ble_addr_type & BLE_ADDR_TYPE_ID_BIT) {
545     btm_identity_addr_to_random_pseudo(&raw_address, &ble_addr_type, true);
546   }
547 
548   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnPeriodicSyncStarted,
549                                   base::Unretained(scanning_callbacks_), reg_id, status,
550                                   sync_handle, advertising_sid, static_cast<int>(ble_addr_type),
551                                   raw_address, phy, interval));
552 }
553 
OnPeriodicSyncReport(uint16_t sync_handle,int8_t tx_power,int8_t rssi,uint8_t status,std::vector<uint8_t> data)554 void BleScannerInterfaceImpl::OnPeriodicSyncReport(uint16_t sync_handle, int8_t tx_power,
555                                                    int8_t rssi, uint8_t status,
556                                                    std::vector<uint8_t> data) {
557   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnPeriodicSyncReport,
558                                   base::Unretained(scanning_callbacks_), sync_handle, tx_power,
559                                   rssi, status, std::move(data)));
560 }
561 
OnPeriodicSyncLost(uint16_t sync_handle)562 void BleScannerInterfaceImpl::OnPeriodicSyncLost(uint16_t sync_handle) {
563   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnPeriodicSyncLost,
564                                   base::Unretained(scanning_callbacks_), sync_handle));
565 }
566 
OnPeriodicSyncTransferred(int pa_source,uint8_t status,bluetooth::hci::Address address)567 void BleScannerInterfaceImpl::OnPeriodicSyncTransferred(int pa_source, uint8_t status,
568                                                         bluetooth::hci::Address address) {
569   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnPeriodicSyncTransferred,
570                                   base::Unretained(scanning_callbacks_), pa_source, status,
571                                   ToRawAddress(address)));
572 }
573 
OnBigInfoReport(uint16_t sync_handle,bool encrypted)574 void BleScannerInterfaceImpl::OnBigInfoReport(uint16_t sync_handle, bool encrypted) {
575   do_in_jni_thread(base::BindOnce(&ScanningCallbacks::OnBigInfoReport,
576                                   base::Unretained(scanning_callbacks_), sync_handle, encrypted));
577 }
578 
OnTimeout()579 void BleScannerInterfaceImpl::OnTimeout() {}
OnFilterEnable(bluetooth::hci::Enable,uint8_t)580 void BleScannerInterfaceImpl::OnFilterEnable(bluetooth::hci::Enable /* enable */,
581                                              uint8_t /* status */) {}
OnFilterParamSetup(uint8_t,bluetooth::hci::ApcfAction,uint8_t)582 void BleScannerInterfaceImpl::OnFilterParamSetup(uint8_t /* available_spaces */,
583                                                  bluetooth::hci::ApcfAction /* action */,
584                                                  uint8_t /* status */) {}
OnFilterConfigCallback(bluetooth::hci::ApcfFilterType,uint8_t,bluetooth::hci::ApcfAction,uint8_t)585 void BleScannerInterfaceImpl::OnFilterConfigCallback(
586         bluetooth::hci::ApcfFilterType /* filter_type */, uint8_t /* available_spaces */,
587         bluetooth::hci::ApcfAction /* action */, uint8_t /* status */) {}
588 
parse_filter_command(bluetooth::hci::AdvertisingPacketContentFilterCommand & advertising_packet_content_filter_command,ApcfCommand apcf_command)589 bool BleScannerInterfaceImpl::parse_filter_command(
590         bluetooth::hci::AdvertisingPacketContentFilterCommand&
591                 advertising_packet_content_filter_command,
592         ApcfCommand apcf_command) {
593   advertising_packet_content_filter_command.filter_type =
594           static_cast<bluetooth::hci::ApcfFilterType>(apcf_command.type);
595   bluetooth::hci::Address address = ToGdAddress(apcf_command.address);
596   advertising_packet_content_filter_command.address = address;
597   advertising_packet_content_filter_command.application_address_type =
598           static_cast<bluetooth::hci::ApcfApplicationAddressType>(apcf_command.addr_type);
599 
600   if (!apcf_command.uuid.IsEmpty()) {
601     uint8_t uuid_len = apcf_command.uuid.GetShortestRepresentationSize();
602     switch (uuid_len) {
603       case bluetooth::Uuid::kNumBytes16: {
604         advertising_packet_content_filter_command.uuid =
605                 bluetooth::hci::Uuid::From16Bit(apcf_command.uuid.As16Bit());
606       } break;
607       case bluetooth::Uuid::kNumBytes32: {
608         advertising_packet_content_filter_command.uuid =
609                 bluetooth::hci::Uuid::From32Bit(apcf_command.uuid.As32Bit());
610       } break;
611       case bluetooth::Uuid::kNumBytes128: {
612         advertising_packet_content_filter_command.uuid =
613                 bluetooth::hci::Uuid::From128BitBE(apcf_command.uuid.To128BitBE());
614       } break;
615       default:
616         log::warn("illegal UUID length {}", (uint16_t)uuid_len);
617         return false;
618     }
619   }
620 
621   if (!apcf_command.uuid_mask.IsEmpty()) {
622     uint8_t uuid_len = apcf_command.uuid.GetShortestRepresentationSize();
623     switch (uuid_len) {
624       case bluetooth::Uuid::kNumBytes16: {
625         advertising_packet_content_filter_command.uuid_mask =
626                 bluetooth::hci::Uuid::From16Bit(apcf_command.uuid_mask.As16Bit());
627       } break;
628       case bluetooth::Uuid::kNumBytes32: {
629         advertising_packet_content_filter_command.uuid_mask =
630                 bluetooth::hci::Uuid::From32Bit(apcf_command.uuid_mask.As32Bit());
631       } break;
632       case bluetooth::Uuid::kNumBytes128: {
633         advertising_packet_content_filter_command.uuid_mask =
634                 bluetooth::hci::Uuid::From128BitBE(apcf_command.uuid_mask.To128BitBE());
635       } break;
636       default:
637         log::warn("illegal UUID length {}", (uint16_t)uuid_len);
638         return false;
639     }
640   }
641 
642   advertising_packet_content_filter_command.name.assign(apcf_command.name.begin(),
643                                                         apcf_command.name.end());
644   advertising_packet_content_filter_command.company = apcf_command.company;
645   advertising_packet_content_filter_command.company_mask = apcf_command.company_mask;
646   advertising_packet_content_filter_command.ad_type = apcf_command.ad_type;
647   advertising_packet_content_filter_command.org_id = apcf_command.org_id;
648   advertising_packet_content_filter_command.tds_flags = apcf_command.tds_flags;
649   advertising_packet_content_filter_command.tds_flags_mask = apcf_command.tds_flags_mask;
650   advertising_packet_content_filter_command.meta_data_type =
651           static_cast<bluetooth::hci::ApcfMetaDataType>(apcf_command.meta_data_type);
652   advertising_packet_content_filter_command.meta_data.assign(apcf_command.meta_data.begin(),
653                                                              apcf_command.meta_data.end());
654   advertising_packet_content_filter_command.data.assign(apcf_command.data.begin(),
655                                                         apcf_command.data.end());
656   advertising_packet_content_filter_command.data_mask.assign(apcf_command.data_mask.begin(),
657                                                              apcf_command.data_mask.end());
658   advertising_packet_content_filter_command.irk = apcf_command.irk;
659   return true;
660 }
661 
handle_remote_properties(RawAddress bd_addr,tBLE_ADDR_TYPE addr_type,std::vector<uint8_t> advertising_data)662 void BleScannerInterfaceImpl::handle_remote_properties(RawAddress bd_addr, tBLE_ADDR_TYPE addr_type,
663                                                        std::vector<uint8_t> advertising_data) {
664   if (!bluetooth::shim::is_gd_stack_started_up()) {
665     log::warn("Gd stack is stopped, return");
666     return;
667   }
668 
669   // skip anonymous advertisment
670   if (addr_type == BLE_ADDR_ANONYMOUS) {
671     return;
672   }
673 
674   auto device_type = bluetooth::hci::DeviceType::LE;
675   uint8_t flag_len;
676   const uint8_t* p_flag =
677           AdvertiseDataParser::GetFieldByType(advertising_data, BTM_BLE_AD_TYPE_FLAG, &flag_len);
678 
679   if (p_flag != NULL && flag_len != 0) {
680     if ((BTM_BLE_BREDR_NOT_SPT & *p_flag) == 0) {
681       device_type = bluetooth::hci::DeviceType::DUAL;
682     }
683   }
684 
685   uint8_t remote_name_len;
686   const uint8_t* p_eir_remote_name = AdvertiseDataParser::GetFieldByType(
687           advertising_data, HCI_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
688 
689   if (p_eir_remote_name == NULL) {
690     p_eir_remote_name = AdvertiseDataParser::GetFieldByType(
691             advertising_data, HCI_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
692   }
693 
694   bt_bdname_t bdname = {0};
695 
696   // update device name
697   if (p_eir_remote_name) {
698     if (!address_cache_.find(bd_addr)) {
699       address_cache_.add(bd_addr);
700 
701       if (remote_name_len > BD_NAME_LEN + 1 ||
702           (remote_name_len == BD_NAME_LEN + 1 && p_eir_remote_name[BD_NAME_LEN] != '\0')) {
703         log::info("dropping invalid packet - device name too long: {}", remote_name_len);
704         return;
705       }
706 
707       memcpy(bdname.name, p_eir_remote_name, remote_name_len);
708       if (remote_name_len < BD_NAME_LEN + 1) {
709         bdname.name[remote_name_len] = '\0';
710       }
711       btif_update_remote_properties(bd_addr, bdname.name, kDevClassEmpty, device_type);
712     }
713   }
714 
715   DEV_CLASS dev_class = btm_ble_get_appearance_as_cod(advertising_data);
716   if (dev_class != kDevClassUnclassified) {
717     btif_update_remote_properties(bd_addr, bdname.name, dev_class, device_type);
718   }
719 
720   auto* storage_module = bluetooth::shim::GetStorage();
721   bluetooth::hci::Address address = ToGdAddress(bd_addr);
722 
723   // update device type
724   auto mutation = storage_module->Modify();
725   bluetooth::storage::Device device = storage_module->GetDeviceByLegacyKey(address);
726   mutation.Add(device.SetDeviceType(device_type));
727   mutation.Commit();
728 
729   // update address type
730   auto mutation2 = storage_module->Modify();
731   bluetooth::storage::LeDevice le_device = device.Le();
732   mutation2.Add(le_device.SetAddressType((bluetooth::hci::AddressType)addr_type));
733   mutation2.Commit();
734 }
735 
add(const RawAddress & p_bda)736 void BleScannerInterfaceImpl::AddressCache::add(const RawAddress& p_bda) {
737   // Remove the oldest entries
738   while (remote_bdaddr_cache_.size() >= remote_bdaddr_cache_max_size_) {
739     const RawAddress& raw_address = remote_bdaddr_cache_ordered_.front();
740     remote_bdaddr_cache_.erase(raw_address);
741     remote_bdaddr_cache_ordered_.pop();
742   }
743   remote_bdaddr_cache_.insert(p_bda);
744   remote_bdaddr_cache_ordered_.push(p_bda);
745 }
746 
find(const RawAddress & p_bda)747 bool BleScannerInterfaceImpl::AddressCache::find(const RawAddress& p_bda) {
748   return remote_bdaddr_cache_.find(p_bda) != remote_bdaddr_cache_.end();
749 }
750 
init(void)751 void BleScannerInterfaceImpl::AddressCache::init(void) {
752   remote_bdaddr_cache_.clear();
753   remote_bdaddr_cache_ordered_ = {};
754 }
755 
756 BleScannerInterfaceImpl* bt_le_scanner_instance = nullptr;
757 
get_ble_scanner_instance()758 BleScannerInterface* bluetooth::shim::get_ble_scanner_instance() {
759   if (bt_le_scanner_instance == nullptr) {
760     bt_le_scanner_instance = new BleScannerInterfaceImpl();
761   }
762   return bt_le_scanner_instance;
763 }
764 
init_scanning_manager()765 void bluetooth::shim::init_scanning_manager() {
766   static_cast<BleScannerInterfaceImpl*>(bluetooth::shim::get_ble_scanner_instance())->Init();
767 }
768 
is_ad_type_filter_supported()769 bool bluetooth::shim::is_ad_type_filter_supported() {
770   return bluetooth::shim::GetScanning()->IsAdTypeFilterSupported();
771 }
772 
set_ad_type_rsi_filter(bool enable)773 void bluetooth::shim::set_ad_type_rsi_filter(bool enable) {
774   bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter;
775   bluetooth::shim::GetScanning()->ScanFilterParameterSetup(bluetooth::hci::ApcfAction::DELETE, 0x00,
776                                                            advertising_filter_parameter);
777   if (enable) {
778     std::vector<bluetooth::hci::AdvertisingPacketContentFilterCommand> filters = {};
779     bluetooth::hci::AdvertisingPacketContentFilterCommand filter{};
780     filter.filter_type = bluetooth::hci::ApcfFilterType::AD_TYPE;
781     filter.ad_type = BTM_BLE_AD_TYPE_RSI;
782     filters.push_back(filter);
783     bluetooth::shim::GetScanning()->ScanFilterAdd(0x00, filters);
784 
785     advertising_filter_parameter.delivery_mode = bluetooth::hci::DeliveryMode::IMMEDIATE;
786     advertising_filter_parameter.feature_selection = kAllowADTypeFilter;
787     advertising_filter_parameter.list_logic_type = kAllowADTypeFilter;
788     advertising_filter_parameter.filter_logic_type = kFilterLogicOr;
789     advertising_filter_parameter.rssi_high_thresh = kLowestRssiValue;
790     bluetooth::shim::GetScanning()->ScanFilterParameterSetup(bluetooth::hci::ApcfAction::ADD, 0x00,
791                                                              advertising_filter_parameter);
792   }
793 }
794 
set_empty_filter(bool enable)795 void bluetooth::shim::set_empty_filter(bool enable) {
796   bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter;
797   bluetooth::shim::GetScanning()->ScanFilterParameterSetup(bluetooth::hci::ApcfAction::DELETE, 0x00,
798                                                            advertising_filter_parameter);
799   if (enable) {
800     /* Add an allow-all filter on index 0 */
801     advertising_filter_parameter.delivery_mode = bluetooth::hci::DeliveryMode::IMMEDIATE;
802     advertising_filter_parameter.feature_selection = kAllowAllFilter;
803     advertising_filter_parameter.list_logic_type = kListLogicOr;
804     advertising_filter_parameter.filter_logic_type = kFilterLogicOr;
805     advertising_filter_parameter.rssi_high_thresh = kLowestRssiValue;
806     bluetooth::shim::GetScanning()->ScanFilterParameterSetup(bluetooth::hci::ApcfAction::ADD, 0x00,
807                                                              advertising_filter_parameter);
808   }
809 }
810 
set_target_announcements_filter(bool enable)811 void bluetooth::shim::set_target_announcements_filter(bool enable) {
812   uint8_t filter_index = 0x03;
813 
814   log::debug("enable {}", enable);
815 
816   bluetooth::hci::AdvertisingFilterParameter advertising_filter_parameter = {};
817   bluetooth::shim::GetScanning()->ScanFilterParameterSetup(
818           bluetooth::hci::ApcfAction::DELETE, filter_index, advertising_filter_parameter);
819 
820   if (!enable) {
821     return;
822   }
823 
824   advertising_filter_parameter.delivery_mode = bluetooth::hci::DeliveryMode::IMMEDIATE;
825   advertising_filter_parameter.feature_selection = kAllowServiceDataFilter;
826   advertising_filter_parameter.list_logic_type = kListLogicOr;
827   advertising_filter_parameter.filter_logic_type = kFilterLogicAnd;
828   advertising_filter_parameter.rssi_high_thresh = kLowestRssiValue;
829 
830   /* Add targeted announcements filter on index 4 */
831   std::vector<bluetooth::hci::AdvertisingPacketContentFilterCommand> cap_bap_filter = {};
832 
833   bluetooth::hci::AdvertisingPacketContentFilterCommand cap_filter{};
834   cap_filter.filter_type = bluetooth::hci::ApcfFilterType::SERVICE_DATA;
835   cap_filter.data = {0x53, 0x18, 0x01};
836   cap_filter.data_mask = {0x53, 0x18, 0xFF};
837   cap_bap_filter.push_back(cap_filter);
838 
839   bluetooth::hci::AdvertisingPacketContentFilterCommand bap_filter{};
840   bap_filter.filter_type = bluetooth::hci::ApcfFilterType::SERVICE_DATA;
841   bap_filter.data = {0x4e, 0x18, 0x01};
842   bap_filter.data_mask = {0x4e, 0x18, 0xFF};
843 
844   cap_bap_filter.push_back(bap_filter);
845   bluetooth::shim::GetScanning()->ScanFilterAdd(filter_index, cap_bap_filter);
846 
847   bluetooth::shim::GetScanning()->ScanFilterParameterSetup(
848           bluetooth::hci::ApcfAction::ADD, filter_index, advertising_filter_parameter);
849 }
850