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