1 /*
2 * Copyright (C) 2022 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 "chre/util/nanoapp/ble.h"
18 #include "chre_api/chre.h"
19
20 namespace chre {
21
22 using ble_constants::kBroadcasterAddress;
23 using ble_constants::kGoogleEddystoneUuid;
24 using ble_constants::kGoogleManufactureData;
25 using ble_constants::kGoogleManufactureDataLength;
26 using ble_constants::kGoogleManufactureDataMask;
27 using ble_constants::kGoogleNearbyFastpairUuid;
28 using ble_constants::kGoogleUuidDataLength;
29 using ble_constants::kGoogleUuidMask;
30 using ble_constants::kNumBroadcasterFilters;
31 using ble_constants::kNumManufacturerDataFilters;
32 using ble_constants::kNumScanFilters;
33 using ble_constants::kRssiThreshold;
34
createBleGenericFilter(uint8_t type,uint8_t len,const uint8_t * data,const uint8_t * mask)35 chreBleGenericFilter createBleGenericFilter(uint8_t type, uint8_t len,
36 const uint8_t *data,
37 const uint8_t *mask) {
38 chreBleGenericFilter filter;
39 memset(&filter, 0, sizeof(filter));
40 filter.type = type;
41 filter.len = len;
42 memcpy(filter.data, data, sizeof(uint8_t) * len);
43 memcpy(filter.dataMask, mask, sizeof(uint8_t) * len);
44 return filter;
45 }
46
createBleScanFilterForKnownBeacons(struct chreBleScanFilter & filter,chreBleGenericFilter * genericFilters,uint8_t numGenericFilters)47 bool createBleScanFilterForKnownBeacons(struct chreBleScanFilter &filter,
48 chreBleGenericFilter *genericFilters,
49 uint8_t numGenericFilters) {
50 if (numGenericFilters < kNumScanFilters) {
51 return false;
52 }
53 memset(&filter, 0, sizeof(filter));
54
55 genericFilters[0] = createBleGenericFilter(
56 CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
57 kGoogleEddystoneUuid, kGoogleUuidMask);
58 genericFilters[1] = createBleGenericFilter(
59 CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
60 kGoogleNearbyFastpairUuid, kGoogleUuidMask);
61
62 filter.rssiThreshold = kRssiThreshold;
63 filter.scanFilterCount = kNumScanFilters;
64 filter.scanFilters = genericFilters;
65 return true;
66 }
67
createBleScanFilterForKnownBeaconsV1_9(struct chreBleScanFilterV1_9 & filter,chreBleGenericFilter * genericFilters,uint8_t numGenericFilters)68 bool createBleScanFilterForKnownBeaconsV1_9(
69 struct chreBleScanFilterV1_9 &filter, chreBleGenericFilter *genericFilters,
70 uint8_t numGenericFilters) {
71 if (numGenericFilters < kNumScanFilters) {
72 return false;
73 }
74 memset(&filter, 0, sizeof(filter));
75
76 genericFilters[0] = createBleGenericFilter(
77 CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
78 kGoogleEddystoneUuid, kGoogleUuidMask);
79 genericFilters[1] = createBleGenericFilter(
80 CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
81 kGoogleNearbyFastpairUuid, kGoogleUuidMask);
82
83 filter.rssiThreshold = kRssiThreshold;
84 filter.genericFilterCount = kNumScanFilters;
85 filter.genericFilters = genericFilters;
86
87 filter.broadcasterAddressFilterCount = 0;
88 filter.broadcasterAddressFilters = nullptr;
89 return true;
90 }
91
createBleManufacturerDataFilter(uint8_t numGenericFilters,chreBleGenericFilter * genericFilters,struct chreBleScanFilterV1_9 & filter)92 bool createBleManufacturerDataFilter(uint8_t numGenericFilters,
93 chreBleGenericFilter *genericFilters,
94 struct chreBleScanFilterV1_9 &filter) {
95 if (numGenericFilters < kNumManufacturerDataFilters) {
96 return false;
97 }
98 memset(&filter, 0, sizeof(filter));
99 filter.rssiThreshold = kRssiThreshold;
100
101 genericFilters[0] = createBleGenericFilter(
102 CHRE_BLE_AD_TYPE_MANUFACTURER_DATA, kGoogleManufactureDataLength,
103 kGoogleManufactureData, kGoogleManufactureDataMask);
104
105 filter.genericFilterCount = kNumManufacturerDataFilters;
106 filter.genericFilters = genericFilters;
107
108 filter.broadcasterAddressFilterCount = 0;
109 filter.broadcasterAddressFilters = nullptr;
110 return true;
111 }
112
createBleScanFilterForAdvertiser(struct chreBleScanFilterV1_9 & filter,chreBleBroadcasterAddressFilter * broadcasterFilters,uint8_t numBroadcasterFilters)113 bool createBleScanFilterForAdvertiser(
114 struct chreBleScanFilterV1_9 &filter,
115 chreBleBroadcasterAddressFilter *broadcasterFilters,
116 uint8_t numBroadcasterFilters) {
117 if (numBroadcasterFilters < kNumBroadcasterFilters) {
118 return false;
119 }
120
121 memcpy(&broadcasterFilters[0], kBroadcasterAddress,
122 sizeof(broadcasterFilters[0]));
123
124 memset(&filter, 0, sizeof(filter));
125 filter.rssiThreshold = kRssiThreshold;
126 filter.genericFilterCount = 0;
127 filter.genericFilters = nullptr;
128
129 filter.broadcasterAddressFilterCount = kNumBroadcasterFilters;
130 filter.broadcasterAddressFilters = broadcasterFilters;
131 return true;
132 }
133
134 } // namespace chre
135