xref: /aosp_15_r20/system/chre/util/nanoapp/ble.cc (revision 84e339476a462649f82315436d70fd732297a399)
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