xref: /aosp_15_r20/system/chre/util/nanoapp/ble.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "chre/util/nanoapp/ble.h"
18*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre.h"
19*84e33947SAndroid Build Coastguard Worker 
20*84e33947SAndroid Build Coastguard Worker namespace chre {
21*84e33947SAndroid Build Coastguard Worker 
22*84e33947SAndroid Build Coastguard Worker using ble_constants::kBroadcasterAddress;
23*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleEddystoneUuid;
24*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleManufactureData;
25*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleManufactureDataLength;
26*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleManufactureDataMask;
27*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleNearbyFastpairUuid;
28*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleUuidDataLength;
29*84e33947SAndroid Build Coastguard Worker using ble_constants::kGoogleUuidMask;
30*84e33947SAndroid Build Coastguard Worker using ble_constants::kNumBroadcasterFilters;
31*84e33947SAndroid Build Coastguard Worker using ble_constants::kNumManufacturerDataFilters;
32*84e33947SAndroid Build Coastguard Worker using ble_constants::kNumScanFilters;
33*84e33947SAndroid Build Coastguard Worker using ble_constants::kRssiThreshold;
34*84e33947SAndroid Build Coastguard Worker 
createBleGenericFilter(uint8_t type,uint8_t len,const uint8_t * data,const uint8_t * mask)35*84e33947SAndroid Build Coastguard Worker chreBleGenericFilter createBleGenericFilter(uint8_t type, uint8_t len,
36*84e33947SAndroid Build Coastguard Worker                                             const uint8_t *data,
37*84e33947SAndroid Build Coastguard Worker                                             const uint8_t *mask) {
38*84e33947SAndroid Build Coastguard Worker   chreBleGenericFilter filter;
39*84e33947SAndroid Build Coastguard Worker   memset(&filter, 0, sizeof(filter));
40*84e33947SAndroid Build Coastguard Worker   filter.type = type;
41*84e33947SAndroid Build Coastguard Worker   filter.len = len;
42*84e33947SAndroid Build Coastguard Worker   memcpy(filter.data, data, sizeof(uint8_t) * len);
43*84e33947SAndroid Build Coastguard Worker   memcpy(filter.dataMask, mask, sizeof(uint8_t) * len);
44*84e33947SAndroid Build Coastguard Worker   return filter;
45*84e33947SAndroid Build Coastguard Worker }
46*84e33947SAndroid Build Coastguard Worker 
createBleScanFilterForKnownBeacons(struct chreBleScanFilter & filter,chreBleGenericFilter * genericFilters,uint8_t numGenericFilters)47*84e33947SAndroid Build Coastguard Worker bool createBleScanFilterForKnownBeacons(struct chreBleScanFilter &filter,
48*84e33947SAndroid Build Coastguard Worker                                         chreBleGenericFilter *genericFilters,
49*84e33947SAndroid Build Coastguard Worker                                         uint8_t numGenericFilters) {
50*84e33947SAndroid Build Coastguard Worker   if (numGenericFilters < kNumScanFilters) {
51*84e33947SAndroid Build Coastguard Worker     return false;
52*84e33947SAndroid Build Coastguard Worker   }
53*84e33947SAndroid Build Coastguard Worker   memset(&filter, 0, sizeof(filter));
54*84e33947SAndroid Build Coastguard Worker 
55*84e33947SAndroid Build Coastguard Worker   genericFilters[0] = createBleGenericFilter(
56*84e33947SAndroid Build Coastguard Worker       CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
57*84e33947SAndroid Build Coastguard Worker       kGoogleEddystoneUuid, kGoogleUuidMask);
58*84e33947SAndroid Build Coastguard Worker   genericFilters[1] = createBleGenericFilter(
59*84e33947SAndroid Build Coastguard Worker       CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
60*84e33947SAndroid Build Coastguard Worker       kGoogleNearbyFastpairUuid, kGoogleUuidMask);
61*84e33947SAndroid Build Coastguard Worker 
62*84e33947SAndroid Build Coastguard Worker   filter.rssiThreshold = kRssiThreshold;
63*84e33947SAndroid Build Coastguard Worker   filter.scanFilterCount = kNumScanFilters;
64*84e33947SAndroid Build Coastguard Worker   filter.scanFilters = genericFilters;
65*84e33947SAndroid Build Coastguard Worker   return true;
66*84e33947SAndroid Build Coastguard Worker }
67*84e33947SAndroid Build Coastguard Worker 
createBleScanFilterForKnownBeaconsV1_9(struct chreBleScanFilterV1_9 & filter,chreBleGenericFilter * genericFilters,uint8_t numGenericFilters)68*84e33947SAndroid Build Coastguard Worker bool createBleScanFilterForKnownBeaconsV1_9(
69*84e33947SAndroid Build Coastguard Worker     struct chreBleScanFilterV1_9 &filter, chreBleGenericFilter *genericFilters,
70*84e33947SAndroid Build Coastguard Worker     uint8_t numGenericFilters) {
71*84e33947SAndroid Build Coastguard Worker   if (numGenericFilters < kNumScanFilters) {
72*84e33947SAndroid Build Coastguard Worker     return false;
73*84e33947SAndroid Build Coastguard Worker   }
74*84e33947SAndroid Build Coastguard Worker   memset(&filter, 0, sizeof(filter));
75*84e33947SAndroid Build Coastguard Worker 
76*84e33947SAndroid Build Coastguard Worker   genericFilters[0] = createBleGenericFilter(
77*84e33947SAndroid Build Coastguard Worker       CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
78*84e33947SAndroid Build Coastguard Worker       kGoogleEddystoneUuid, kGoogleUuidMask);
79*84e33947SAndroid Build Coastguard Worker   genericFilters[1] = createBleGenericFilter(
80*84e33947SAndroid Build Coastguard Worker       CHRE_BLE_AD_TYPE_SERVICE_DATA_WITH_UUID_16_LE, kGoogleUuidDataLength,
81*84e33947SAndroid Build Coastguard Worker       kGoogleNearbyFastpairUuid, kGoogleUuidMask);
82*84e33947SAndroid Build Coastguard Worker 
83*84e33947SAndroid Build Coastguard Worker   filter.rssiThreshold = kRssiThreshold;
84*84e33947SAndroid Build Coastguard Worker   filter.genericFilterCount = kNumScanFilters;
85*84e33947SAndroid Build Coastguard Worker   filter.genericFilters = genericFilters;
86*84e33947SAndroid Build Coastguard Worker 
87*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilterCount = 0;
88*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilters = nullptr;
89*84e33947SAndroid Build Coastguard Worker   return true;
90*84e33947SAndroid Build Coastguard Worker }
91*84e33947SAndroid Build Coastguard Worker 
createBleManufacturerDataFilter(uint8_t numGenericFilters,chreBleGenericFilter * genericFilters,struct chreBleScanFilterV1_9 & filter)92*84e33947SAndroid Build Coastguard Worker bool createBleManufacturerDataFilter(uint8_t numGenericFilters,
93*84e33947SAndroid Build Coastguard Worker                                      chreBleGenericFilter *genericFilters,
94*84e33947SAndroid Build Coastguard Worker                                      struct chreBleScanFilterV1_9 &filter) {
95*84e33947SAndroid Build Coastguard Worker   if (numGenericFilters < kNumManufacturerDataFilters) {
96*84e33947SAndroid Build Coastguard Worker     return false;
97*84e33947SAndroid Build Coastguard Worker   }
98*84e33947SAndroid Build Coastguard Worker   memset(&filter, 0, sizeof(filter));
99*84e33947SAndroid Build Coastguard Worker   filter.rssiThreshold = kRssiThreshold;
100*84e33947SAndroid Build Coastguard Worker 
101*84e33947SAndroid Build Coastguard Worker   genericFilters[0] = createBleGenericFilter(
102*84e33947SAndroid Build Coastguard Worker       CHRE_BLE_AD_TYPE_MANUFACTURER_DATA, kGoogleManufactureDataLength,
103*84e33947SAndroid Build Coastguard Worker       kGoogleManufactureData, kGoogleManufactureDataMask);
104*84e33947SAndroid Build Coastguard Worker 
105*84e33947SAndroid Build Coastguard Worker   filter.genericFilterCount = kNumManufacturerDataFilters;
106*84e33947SAndroid Build Coastguard Worker   filter.genericFilters = genericFilters;
107*84e33947SAndroid Build Coastguard Worker 
108*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilterCount = 0;
109*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilters = nullptr;
110*84e33947SAndroid Build Coastguard Worker   return true;
111*84e33947SAndroid Build Coastguard Worker }
112*84e33947SAndroid Build Coastguard Worker 
createBleScanFilterForAdvertiser(struct chreBleScanFilterV1_9 & filter,chreBleBroadcasterAddressFilter * broadcasterFilters,uint8_t numBroadcasterFilters)113*84e33947SAndroid Build Coastguard Worker bool createBleScanFilterForAdvertiser(
114*84e33947SAndroid Build Coastguard Worker     struct chreBleScanFilterV1_9 &filter,
115*84e33947SAndroid Build Coastguard Worker     chreBleBroadcasterAddressFilter *broadcasterFilters,
116*84e33947SAndroid Build Coastguard Worker     uint8_t numBroadcasterFilters) {
117*84e33947SAndroid Build Coastguard Worker   if (numBroadcasterFilters < kNumBroadcasterFilters) {
118*84e33947SAndroid Build Coastguard Worker     return false;
119*84e33947SAndroid Build Coastguard Worker   }
120*84e33947SAndroid Build Coastguard Worker 
121*84e33947SAndroid Build Coastguard Worker   memcpy(&broadcasterFilters[0], kBroadcasterAddress,
122*84e33947SAndroid Build Coastguard Worker          sizeof(broadcasterFilters[0]));
123*84e33947SAndroid Build Coastguard Worker 
124*84e33947SAndroid Build Coastguard Worker   memset(&filter, 0, sizeof(filter));
125*84e33947SAndroid Build Coastguard Worker   filter.rssiThreshold = kRssiThreshold;
126*84e33947SAndroid Build Coastguard Worker   filter.genericFilterCount = 0;
127*84e33947SAndroid Build Coastguard Worker   filter.genericFilters = nullptr;
128*84e33947SAndroid Build Coastguard Worker 
129*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilterCount = kNumBroadcasterFilters;
130*84e33947SAndroid Build Coastguard Worker   filter.broadcasterAddressFilters = broadcasterFilters;
131*84e33947SAndroid Build Coastguard Worker   return true;
132*84e33947SAndroid Build Coastguard Worker }
133*84e33947SAndroid Build Coastguard Worker 
134*84e33947SAndroid Build Coastguard Worker }  // namespace chre
135