1 /*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <bluetooth/log.h>
18
19 #include "ble_scanner.h"
20 #include "ble_scanner_hci_interface.h"
21 #include "stack/btm/btm_ble_int.h"
22
23 using namespace bluetooth;
24
25 std::mutex lock1;
26
27 namespace {
28
29 class BleScanningManagerImpl;
30
31 BleScanningManager* instance;
32 base::WeakPtr<BleScanningManagerImpl> instance_weakptr;
33
status_callback(uint8_t status)34 static void status_callback(uint8_t status) {
35 log::verbose("Received status_cb with status:{}", status);
36 }
37
38 class BleScanningManagerImpl : public BleScanningManager,
39 public BleScannerHciInterface::ScanEventObserver {
40 public:
BleScanningManagerImpl(BleScannerHciInterface * interface)41 BleScanningManagerImpl(BleScannerHciInterface* interface)
42 : hci_interface(interface), weak_factory_(this) {}
43
~BleScanningManagerImpl()44 ~BleScanningManagerImpl() {}
45
PeriodicScanStart(uint8_t options,uint8_t set_id,uint8_t adv_addr_type,const RawAddress & adv_addr,uint16_t skip_num,uint16_t sync_timeout,uint8_t sync_cte_type)46 void PeriodicScanStart(uint8_t options, uint8_t set_id, uint8_t adv_addr_type,
47 const RawAddress& adv_addr, uint16_t skip_num, uint16_t sync_timeout,
48 uint8_t sync_cte_type) override {
49 GetHciInterface()->PeriodicScanStart(options, set_id, adv_addr_type, adv_addr, skip_num,
50 sync_timeout, sync_cte_type);
51 }
52
PeriodicScanCancelStart()53 void PeriodicScanCancelStart() override {
54 GetHciInterface()->PeriodicScanCancelStart(base::Bind(&status_callback));
55 }
56
PeriodicScanTerminate(uint16_t sync_handle)57 void PeriodicScanTerminate(uint16_t sync_handle) override {
58 GetHciInterface()->PeriodicScanTerminate(sync_handle, base::Bind(&status_callback));
59 }
60
PeriodicAdvSyncTransfer(const RawAddress & bd_addr,uint16_t service_data,uint16_t sync_handle,BleScannerHciInterface::handle_cb command_complete)61 void PeriodicAdvSyncTransfer(const RawAddress& bd_addr, uint16_t service_data,
62 uint16_t sync_handle,
63 BleScannerHciInterface::handle_cb command_complete) override {
64 GetHciInterface()->PeriodicAdvSyncTransfer(bd_addr, service_data, sync_handle,
65 command_complete);
66 }
67
PeriodicAdvSetInfoTransfer(const RawAddress & bd_addr,uint16_t service_data,uint8_t adv_handle,handle_cb command_complete)68 void PeriodicAdvSetInfoTransfer(const RawAddress& bd_addr, uint16_t service_data,
69 uint8_t adv_handle, handle_cb command_complete) override {
70 GetHciInterface()->PeriodicAdvSetInfoTransfer(bd_addr, service_data, adv_handle,
71 command_complete);
72 }
73
SetPeriodicAdvSyncTransferParams(const RawAddress & bd_addr,uint8_t mode,uint16_t skip,uint16_t sync_timeout,uint8_t cte_type,bool set_defaults,status_cb command_complete)74 void SetPeriodicAdvSyncTransferParams(const RawAddress& bd_addr, uint8_t mode, uint16_t skip,
75 uint16_t sync_timeout, uint8_t cte_type, bool set_defaults,
76 status_cb command_complete) override {
77 GetHciInterface()->SetPeriodicAdvSyncTransferParams(bd_addr, mode, skip, sync_timeout, cte_type,
78 set_defaults, command_complete);
79 }
80
OnPeriodicScanResult(uint16_t sync_handle,uint8_t tx_power,int8_t rssi,uint8_t cte_type,uint8_t pkt_data_status,uint8_t pkt_data_len,const uint8_t * pkt_data)81 void OnPeriodicScanResult(uint16_t sync_handle, uint8_t tx_power, int8_t rssi, uint8_t cte_type,
82 uint8_t pkt_data_status, uint8_t pkt_data_len,
83 const uint8_t* pkt_data) override {
84 btm_ble_periodic_adv_report(sync_handle, tx_power, rssi, cte_type, pkt_data_status,
85 pkt_data_len, pkt_data);
86 }
87
OnPeriodicScanEstablished(uint8_t status,uint16_t sync_handle,uint8_t set_id,uint8_t adv_addr_type,const RawAddress & adv_addr,uint8_t adv_phy,uint16_t adv_interval,uint8_t adv_clock_accuracy)88 void OnPeriodicScanEstablished(uint8_t status, uint16_t sync_handle, uint8_t set_id,
89 uint8_t adv_addr_type, const RawAddress& adv_addr, uint8_t adv_phy,
90 uint16_t adv_interval, uint8_t adv_clock_accuracy) override {
91 btm_ble_periodic_adv_sync_established(status, sync_handle, set_id, adv_addr_type, adv_addr,
92 adv_phy, adv_interval, adv_clock_accuracy);
93 }
94
OnPeriodicScanLost(uint16_t sync_handle)95 void OnPeriodicScanLost(uint16_t sync_handle) override {
96 btm_ble_periodic_adv_sync_lost(sync_handle);
97 }
98
GetWeakPtr()99 base::WeakPtr<BleScanningManagerImpl> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
100
101 private:
GetHciInterface()102 BleScannerHciInterface* GetHciInterface() { return hci_interface; }
103 BleScannerHciInterface* hci_interface = nullptr;
104
105 // Member variables should appear before the WeakPtrFactory, to ensure
106 // that any WeakPtrs are invalidated before its members
107 // variable's destructors are executed, rendering them invalid.
108 base::WeakPtrFactory<BleScanningManagerImpl> weak_factory_;
109 };
110
111 } // namespace
112
Initialize(BleScannerHciInterface * interface)113 void BleScanningManager::Initialize(BleScannerHciInterface* interface) {
114 instance = new BleScanningManagerImpl(interface);
115 instance_weakptr = ((BleScanningManagerImpl*)instance)->GetWeakPtr();
116 }
117
IsInitialized()118 bool BleScanningManager::IsInitialized() { return instance; }
119
Get()120 base::WeakPtr<BleScanningManager> BleScanningManager::Get() { return instance_weakptr; }
121
CleanUp()122 void BleScanningManager::CleanUp() {
123 delete instance;
124 instance = nullptr;
125 }
126
127 /**
128 * This function initializes the scanning manager.
129 **/
btm_ble_scanner_init()130 void btm_ble_scanner_init() {
131 BleScannerHciInterface::Initialize();
132 if (BleScannerHciInterface::Get()) {
133 BleScanningManager::Initialize(BleScannerHciInterface::Get());
134 } else {
135 log::verbose("BleScannerHciInterface::Get() returns null");
136 }
137 if ((BleScannerHciInterface::Get()) && (BleScanningManager::Get())) {
138 BleScannerHciInterface::Get()->SetScanEventObserver(
139 (BleScanningManagerImpl*)BleScanningManager::Get().get());
140 } else {
141 log::verbose("BleScannerHciInterface or BleScanningManager is null");
142 }
143 }
144
145 /*******************************************************************************
146 *
147 * Function btm_ble_scanner_cleanup
148 *
149 * Description This function cleans up scanner control block.
150 *
151 * Parameters
152 * Returns void
153 *
154 ******************************************************************************/
btm_ble_scanner_cleanup(void)155 void btm_ble_scanner_cleanup(void) {
156 std::lock_guard<std::mutex> lock(lock1);
157 BleScanningManager::CleanUp();
158 BleScannerHciInterface::CleanUp();
159 }
160