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