1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef BLE_SCAN_FILTER_LSF_H
17 #define BLE_SCAN_FILTER_LSF_H
18 
19 #include <memory>
20 #include <mutex>
21 
22 #include "i_ble_scan_filter.h"
23 #include "bt_def.h"
24 #include "btstack.h"
25 #include "hci_vendor_if.h"
26 #include "log.h"
27 #include "securec.h"
28 #include "timer.h"
29 
30 namespace OHOS {
31 namespace bluetooth {
32 static const int HCI_OGF_OFFSET = 10;
33 static const uint16_t HCI_VENDOR_OCF_LSF = 0x601;
34 static const uint16_t HCI_VENDOR_OCF_GET_CAPABILITIES = 0x600;
35 
36 static const uint8_t LSF_OPCODE_ENABLE = 0x00;
37 static const uint8_t LSF_OPCODE_ADD = 0x01;
38 static const uint8_t LSF_OPCODE_DELETE = 0x02;
39 static const uint8_t LSF_OPCODE_CLEAR = 0x03;
40 
41 static const uint8_t LSF_PARAM_ENABLE = 0x01;
42 static const uint8_t LSF_PARAM_DISABLE = 0x00;
43 
44 static const uint8_t LSF_TAG_SET_PARAMETERS = 0x00;
45 static const uint8_t LSF_TAG_ADDRESS = 0x01;
46 static const uint8_t LSF_TAG_SERVICE_UUID = 0x02;
47 static const uint8_t LSF_TAG_SOLICIT_UUID = 0x03;
48 static const uint8_t LSF_TAG_NAME = 0x04;
49 static const uint8_t LSF_TAG_MANUFACTURER_DATA = 0x05;
50 static const uint8_t LSF_TAG_SERVICE_DATA = 0x06;
51 
52 static const uint8_t LSF_CMD_MAX_LENGTH = 29;
53 
54 static const uint8_t LSF_CMD_HEAD_LENGTH = 3;
55 
56 static const uint16_t LSF_CMD_LIST_LOGIC_TYPE = 0x007F;
57 static const uint8_t LSF_CMD_LOGIC_TYPE = 0x01;
58 
59 static const uint8_t CAP_FEATURE_TAG_BLE_SCAN_FILTER = 0x01;
60 static const uint8_t CAP_LSF_FEATURE_VALUE_LENGTH = 3;
61 
62 static const int LSF_CMD_TIMEOUT_MS = 5000;  // 5s
63 static const int CAP_CMD_TIMEOUT_S = 5;  // 5s
64 
65 #pragma pack(1)
66 struct VendorCmdParamLSFEnable {
67     uint8_t opcode;
68     uint8_t enable;
69 };
70 
71 struct VendorCmdParamLSFSetParameters {
72     uint8_t opcode;
73     uint8_t filtIndex;
74     uint8_t tag;
75     uint16_t featureSelection;
76     uint16_t listLogicType;
77     uint8_t logicType;
78 };
79 
80 struct VendorCmdParamLSFAddress {
81     uint8_t opcode;
82     uint8_t filtIndex;
83     uint8_t tag;
84     BtAddr address;
85 };
86 
87 struct VendorCmdParamLSFUuid {
88     uint8_t opcode;
89     uint8_t filtIndex;
90     uint8_t tag;
91     uint8_t uuidAndMask[Uuid::UUID128_BYTES_TYPE + Uuid::UUID128_BYTES_TYPE];
92 };
93 
94 union VendorCmdParamUuidData {
95     uint16_t uuid16;
96     uint32_t uuid32;
97     uint8_t uuid128[Uuid::UUID128_BYTES_TYPE];
98 };
99 
100 struct VendorCmdParamLSFName {
101     uint8_t opcode;
102     uint8_t filtIndex;
103     uint8_t tag;
104     uint8_t length;
105     uint8_t name[LSF_CMD_MAX_LENGTH];
106 };
107 
108 struct VendorCmdParamLSFData {
109     uint8_t opcode;
110     uint8_t filtIndex;
111     uint8_t tag;
112     uint8_t data[LSF_CMD_MAX_LENGTH + 1 + LSF_CMD_MAX_LENGTH + 1];
113 };
114 
115 struct VendorEventParamLSF {
116     uint8_t status;
117     uint8_t opcode;
118     uint8_t tag;
119 };
120 
121 struct VendorEventParamCAP {
122     uint8_t status;
123     uint8_t featureTag;
124     uint8_t featureSize;
125     uint8_t filterSupport;
126     uint8_t maxFilter;
127     uint8_t maxCondition;
128 };
129 #pragma pack()
130 
131 class BleScanFilterLsf : public IBleScanFilter {
132 public:
133     BleScanFilterLsf();
134     ~BleScanFilterLsf() override;
135     uint8_t GetMaxFilterNumber() override;
136     int AddBleScanFilter(BleScanFilterParam filter, BleScanFilterCallback callback) override;
137     int DeleteBleScanFilter(BleScanFilterParam filter, BleScanFilterCallback callback) override;
138     int StartBleScanFilter(BleScanFilterCallback callback) override;
139     int StopBleScanFilter(BleScanFilterCallback callback) override;
140 
141 private:
142     bool IsReady();
143     static void VendEventCommandCompleteCallback(
144         uint16_t opCode, const void *param, uint8_t paramLength, void *context);
145     static void HciVendorClosedCallback(void *context);
146     void BleScanFilterCommandComplete(const void *param, uint8_t paramLength);
147     void BleScanFilterCommandCompleteSuccess(VendorEventParamLSF eventParam);
148     void BleScanFilterCommandCompleteFaild(VendorEventParamLSF eventParam);
149     int ContinueBleScanFilter();
150     void FinishAddBleScanFilter(int result);
151     void FinishDeleteBleScanFilter(int result);
152     void FinishStartBleScanFilter(int result);
153     void FinishStopBleScanFilter(int result);
154     void ClearCommand();
155     int BleScanFilterEnable(uint8_t enable);
156     int BleScanFilterSetParameters(uint16_t featureSelection, uint8_t opcode);
157     int BleScanFilterAddressAdd(BtAddr address);
158     int BleScanFilterUuidAdd(Uuid uuid, Uuid uuidMask, uint8_t command);
159     int BleScanFilterNameAdd(std::string name);
160     int BleScanFilterManufacturerDataAdd(uint16_t manufacturerId, uint16_t manufacturerIdMask,
161         std::vector<uint8_t> manufacturerData, std::vector<uint8_t> manufacturerDataMask);
162     int BleScanFilterServiceDataAdd(std::vector<uint8_t> serviceData, std::vector<uint8_t> serviceDataMask);
163     static uint16_t MakeVendorOpCode(uint16_t ocf);
164     int BleScanFilterGetVendorCapabilities() const;
165     void BleScanFilterGetCapabilitiesComplete(const void *param, uint8_t paramLength);
166 
167     void CommandTimeout();
168     void HandleEnableCommandResult(uint8_t tag, uint8_t status);
169     void HandleAddCommandResult(uint8_t tag, uint8_t status);
170     void HandleDeleteCommandResult(uint8_t tag, uint8_t status);
171     void HandleClearCommandResult(uint8_t tag, uint8_t status);
172     void StartCommandTimer() const;
173     void StopCommandTimer() const;
174 
175     // Regist vendor event callback
176     static constexpr HCIVendorEventCallback VENDOR_EVENT_CALLBACK = {
177         VendEventCommandCompleteCallback,
178         HciVendorClosedCallback
179     };
180 
181     uint8_t filtIndex_ = 0;
182     BleScanFilterParam filterParam_ = {};
183     BleScanFilterCallback callback_ = {};
184     uint16_t filterFlag_ = 0;
185     bool isBleScanFilterOngoing_ = false;
186     uint8_t ongoingOpcode_ = 0;
187     uint8_t ongoingTag_ = 0;
188     bool isReady_ = false;
189     std::recursive_mutex mutex_ {};
190     std::condition_variable cvfull_;
191     std::mutex mutexWaitCallback_;
192     uint8_t maxFilterNumber_ = 0;
193     bool isSupportFilter_ = true;
194 
195     std::unique_ptr<utility::Timer> cmdTimer_ {nullptr};
196 };
197 }  // namespace bluetooth
198 }  // namespace OHOS
199 #endif  // BLE_SCAN_FILTER_LSF_H
200