xref: /aosp_15_r20/system/chre/platform/linux/pal_wifi.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 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/platform/linux/pal_wifi.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <atomic>
20*84e33947SAndroid Build Coastguard Worker #include <chrono>
21*84e33947SAndroid Build Coastguard Worker #include <cinttypes>
22*84e33947SAndroid Build Coastguard Worker #include <optional>
23*84e33947SAndroid Build Coastguard Worker 
24*84e33947SAndroid Build Coastguard Worker #include "chre/pal/wifi.h"
25*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/pal_nan.h"
26*84e33947SAndroid Build Coastguard Worker #include "chre/platform/linux/task_util/task_manager.h"
27*84e33947SAndroid Build Coastguard Worker #include "chre/util/enum.h"
28*84e33947SAndroid Build Coastguard Worker #include "chre/util/memory.h"
29*84e33947SAndroid Build Coastguard Worker #include "chre/util/time.h"
30*84e33947SAndroid Build Coastguard Worker #include "chre/util/unique_ptr.h"
31*84e33947SAndroid Build Coastguard Worker 
32*84e33947SAndroid Build Coastguard Worker /**
33*84e33947SAndroid Build Coastguard Worker  * A simulated implementation of the WiFi PAL for the linux platform.
34*84e33947SAndroid Build Coastguard Worker  */
35*84e33947SAndroid Build Coastguard Worker namespace {
36*84e33947SAndroid Build Coastguard Worker 
37*84e33947SAndroid Build Coastguard Worker using ::chre::TaskManagerSingleton;
38*84e33947SAndroid Build Coastguard Worker 
39*84e33947SAndroid Build Coastguard Worker const struct chrePalSystemApi *gSystemApi = nullptr;
40*84e33947SAndroid Build Coastguard Worker const struct chrePalWifiCallbacks *gCallbacks = nullptr;
41*84e33947SAndroid Build Coastguard Worker 
42*84e33947SAndroid Build Coastguard Worker //! Whether scan monitoring is active.
43*84e33947SAndroid Build Coastguard Worker std::atomic_bool gScanMonitoringActive(false);
44*84e33947SAndroid Build Coastguard Worker 
45*84e33947SAndroid Build Coastguard Worker //! Whether PAL should respond to RRT ranging request.
46*84e33947SAndroid Build Coastguard Worker std::atomic_bool gEnableRangingResponse(true);
47*84e33947SAndroid Build Coastguard Worker 
48*84e33947SAndroid Build Coastguard Worker //! Whether PAL should respond to configure scan monitor request.
49*84e33947SAndroid Build Coastguard Worker std::atomic_bool gEnableScanMonitorResponse(true);
50*84e33947SAndroid Build Coastguard Worker 
51*84e33947SAndroid Build Coastguard Worker //! Whether PAL should respond to scan request.
52*84e33947SAndroid Build Coastguard Worker std::atomic_bool gEnableScanResponse(true);
53*84e33947SAndroid Build Coastguard Worker 
54*84e33947SAndroid Build Coastguard Worker //! Thread sync variable for TaskIds.
55*84e33947SAndroid Build Coastguard Worker std::mutex gRequestScanMutex;
56*84e33947SAndroid Build Coastguard Worker 
57*84e33947SAndroid Build Coastguard Worker //! Task IDs for the scanning tasks
58*84e33947SAndroid Build Coastguard Worker std::optional<uint32_t> gScanMonitorTaskId;
59*84e33947SAndroid Build Coastguard Worker std::optional<uint32_t> gRequestScanTaskId;
60*84e33947SAndroid Build Coastguard Worker std::optional<uint32_t> gRequestRangingTaskId;
61*84e33947SAndroid Build Coastguard Worker 
62*84e33947SAndroid Build Coastguard Worker //! How long should each the PAL hold before response.
63*84e33947SAndroid Build Coastguard Worker //! Use to mimic real world hardware process time.
64*84e33947SAndroid Build Coastguard Worker std::chrono::nanoseconds gAsyncRequestDelayResponseTime[chre::asBaseType(
65*84e33947SAndroid Build Coastguard Worker     PalWifiAsyncRequestTypes::NUM_WIFI_REQUEST_TYPE)];
66*84e33947SAndroid Build Coastguard Worker 
sendScanResponse()67*84e33947SAndroid Build Coastguard Worker void sendScanResponse() {
68*84e33947SAndroid Build Coastguard Worker   {
69*84e33947SAndroid Build Coastguard Worker     std::lock_guard<std::mutex> lock(gRequestScanMutex);
70*84e33947SAndroid Build Coastguard Worker     if (!gRequestScanTaskId.has_value()) {
71*84e33947SAndroid Build Coastguard Worker       LOGE("Sending scan response with no pending task");
72*84e33947SAndroid Build Coastguard Worker       return;
73*84e33947SAndroid Build Coastguard Worker     }
74*84e33947SAndroid Build Coastguard Worker     gRequestScanTaskId.reset();
75*84e33947SAndroid Build Coastguard Worker   }
76*84e33947SAndroid Build Coastguard Worker 
77*84e33947SAndroid Build Coastguard Worker   if (gEnableScanResponse) {
78*84e33947SAndroid Build Coastguard Worker     auto event = chre::MakeUniqueZeroFill<struct chreWifiScanEvent>();
79*84e33947SAndroid Build Coastguard Worker     auto result = chre::MakeUniqueZeroFill<struct chreWifiScanResult>();
80*84e33947SAndroid Build Coastguard Worker     event->resultCount = 1;
81*84e33947SAndroid Build Coastguard Worker     event->resultTotal = 1;
82*84e33947SAndroid Build Coastguard Worker     event->referenceTime = gSystemApi->getCurrentTime();
83*84e33947SAndroid Build Coastguard Worker     event->results = result.release();
84*84e33947SAndroid Build Coastguard Worker     gCallbacks->scanEventCallback(event.release());
85*84e33947SAndroid Build Coastguard Worker   }
86*84e33947SAndroid Build Coastguard Worker }
87*84e33947SAndroid Build Coastguard Worker 
sendScanMonitorResponse(bool enable)88*84e33947SAndroid Build Coastguard Worker void sendScanMonitorResponse(bool enable) {
89*84e33947SAndroid Build Coastguard Worker   if (gEnableScanMonitorResponse) {
90*84e33947SAndroid Build Coastguard Worker     gCallbacks->scanMonitorStatusChangeCallback(enable, CHRE_ERROR_NONE);
91*84e33947SAndroid Build Coastguard Worker   }
92*84e33947SAndroid Build Coastguard Worker }
93*84e33947SAndroid Build Coastguard Worker 
sendRangingResponse()94*84e33947SAndroid Build Coastguard Worker void sendRangingResponse() {
95*84e33947SAndroid Build Coastguard Worker   if (gEnableRangingResponse) {
96*84e33947SAndroid Build Coastguard Worker     auto event = chre::MakeUniqueZeroFill<struct chreWifiRangingEvent>();
97*84e33947SAndroid Build Coastguard Worker     auto result = chre::MakeUniqueZeroFill<struct chreWifiRangingResult>();
98*84e33947SAndroid Build Coastguard Worker     event->resultCount = 1;
99*84e33947SAndroid Build Coastguard Worker     event->results = result.release();
100*84e33947SAndroid Build Coastguard Worker     gCallbacks->rangingEventCallback(CHRE_ERROR_NONE, event.release());
101*84e33947SAndroid Build Coastguard Worker   }
102*84e33947SAndroid Build Coastguard Worker }
103*84e33947SAndroid Build Coastguard Worker 
stopScanMonitorTask()104*84e33947SAndroid Build Coastguard Worker void stopScanMonitorTask() {
105*84e33947SAndroid Build Coastguard Worker   if (gScanMonitorTaskId.has_value()) {
106*84e33947SAndroid Build Coastguard Worker     TaskManagerSingleton::get()->cancelTask(gScanMonitorTaskId.value());
107*84e33947SAndroid Build Coastguard Worker     gScanMonitorTaskId.reset();
108*84e33947SAndroid Build Coastguard Worker   }
109*84e33947SAndroid Build Coastguard Worker }
110*84e33947SAndroid Build Coastguard Worker 
stopRequestScanTask()111*84e33947SAndroid Build Coastguard Worker void stopRequestScanTask() {
112*84e33947SAndroid Build Coastguard Worker   if (gRequestScanTaskId.has_value()) {
113*84e33947SAndroid Build Coastguard Worker     TaskManagerSingleton::get()->cancelTask(gRequestScanTaskId.value());
114*84e33947SAndroid Build Coastguard Worker     gRequestScanTaskId.reset();
115*84e33947SAndroid Build Coastguard Worker   }
116*84e33947SAndroid Build Coastguard Worker }
117*84e33947SAndroid Build Coastguard Worker 
stopRequestRangingTask()118*84e33947SAndroid Build Coastguard Worker void stopRequestRangingTask() {
119*84e33947SAndroid Build Coastguard Worker   if (gRequestRangingTaskId.has_value()) {
120*84e33947SAndroid Build Coastguard Worker     TaskManagerSingleton::get()->cancelTask(gRequestRangingTaskId.value());
121*84e33947SAndroid Build Coastguard Worker     gRequestRangingTaskId.reset();
122*84e33947SAndroid Build Coastguard Worker   }
123*84e33947SAndroid Build Coastguard Worker }
124*84e33947SAndroid Build Coastguard Worker 
chrePalWifiGetCapabilities()125*84e33947SAndroid Build Coastguard Worker uint32_t chrePalWifiGetCapabilities() {
126*84e33947SAndroid Build Coastguard Worker   return CHRE_WIFI_CAPABILITIES_SCAN_MONITORING |
127*84e33947SAndroid Build Coastguard Worker          CHRE_WIFI_CAPABILITIES_ON_DEMAND_SCAN | CHRE_WIFI_CAPABILITIES_NAN_SUB;
128*84e33947SAndroid Build Coastguard Worker }
129*84e33947SAndroid Build Coastguard Worker 
chrePalWifiConfigureScanMonitor(bool enable)130*84e33947SAndroid Build Coastguard Worker bool chrePalWifiConfigureScanMonitor(bool enable) {
131*84e33947SAndroid Build Coastguard Worker   stopScanMonitorTask();
132*84e33947SAndroid Build Coastguard Worker 
133*84e33947SAndroid Build Coastguard Worker   gScanMonitorTaskId = TaskManagerSingleton::get()->addTask(
134*84e33947SAndroid Build Coastguard Worker       [enable]() { sendScanMonitorResponse(enable); });
135*84e33947SAndroid Build Coastguard Worker   gScanMonitoringActive = enable;
136*84e33947SAndroid Build Coastguard Worker   return gScanMonitorTaskId.has_value();
137*84e33947SAndroid Build Coastguard Worker }
138*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiRequestScan(const struct chreWifiScanParams *)139*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiRequestScan(const struct chreWifiScanParams * /* params */) {
140*84e33947SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> lock(gRequestScanMutex);
141*84e33947SAndroid Build Coastguard Worker   if (gRequestScanTaskId.has_value()) {
142*84e33947SAndroid Build Coastguard Worker     LOGE("Requesting scan when existing scan request still in process");
143*84e33947SAndroid Build Coastguard Worker     return false;
144*84e33947SAndroid Build Coastguard Worker   }
145*84e33947SAndroid Build Coastguard Worker 
146*84e33947SAndroid Build Coastguard Worker   std::optional<uint32_t> requestScanTaskCallbackId =
147*84e33947SAndroid Build Coastguard Worker       TaskManagerSingleton::get()->addTask([]() {
148*84e33947SAndroid Build Coastguard Worker         if (gEnableScanResponse) {
149*84e33947SAndroid Build Coastguard Worker           gCallbacks->scanResponseCallback(true, CHRE_ERROR_NONE);
150*84e33947SAndroid Build Coastguard Worker         }
151*84e33947SAndroid Build Coastguard Worker       });
152*84e33947SAndroid Build Coastguard Worker   if (requestScanTaskCallbackId.has_value()) {
153*84e33947SAndroid Build Coastguard Worker     gRequestScanTaskId = TaskManagerSingleton::get()->addTask(
154*84e33947SAndroid Build Coastguard Worker         sendScanResponse,
155*84e33947SAndroid Build Coastguard Worker         gAsyncRequestDelayResponseTime[chre::asBaseType(
156*84e33947SAndroid Build Coastguard Worker             PalWifiAsyncRequestTypes::SCAN)],
157*84e33947SAndroid Build Coastguard Worker         /* isOneShot= */ true);
158*84e33947SAndroid Build Coastguard Worker     return gRequestScanTaskId.has_value();
159*84e33947SAndroid Build Coastguard Worker   }
160*84e33947SAndroid Build Coastguard Worker   return false;
161*84e33947SAndroid Build Coastguard Worker }
162*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiRequestRanging(const struct chreWifiRangingParams *)163*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiRequestRanging(
164*84e33947SAndroid Build Coastguard Worker     const struct chreWifiRangingParams * /* params */) {
165*84e33947SAndroid Build Coastguard Worker   stopRequestRangingTask();
166*84e33947SAndroid Build Coastguard Worker 
167*84e33947SAndroid Build Coastguard Worker   gRequestRangingTaskId =
168*84e33947SAndroid Build Coastguard Worker       TaskManagerSingleton::get()->addTask(sendRangingResponse);
169*84e33947SAndroid Build Coastguard Worker   return gRequestRangingTaskId.has_value();
170*84e33947SAndroid Build Coastguard Worker }
171*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiReleaseScanEvent(struct chreWifiScanEvent * event)172*84e33947SAndroid Build Coastguard Worker void chrePalWifiApiReleaseScanEvent(struct chreWifiScanEvent *event) {
173*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(const_cast<uint32_t *>(event->scannedFreqList));
174*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(const_cast<struct chreWifiScanResult *>(event->results));
175*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(event);
176*84e33947SAndroid Build Coastguard Worker }
177*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiReleaseRangingEvent(struct chreWifiRangingEvent * event)178*84e33947SAndroid Build Coastguard Worker void chrePalWifiApiReleaseRangingEvent(struct chreWifiRangingEvent *event) {
179*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(const_cast<struct chreWifiRangingResult *>(event->results));
180*84e33947SAndroid Build Coastguard Worker   chre::memoryFree(event);
181*84e33947SAndroid Build Coastguard Worker }
182*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiNanSubscribe(const struct chreWifiNanSubscribeConfig * config)183*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiNanSubscribe(
184*84e33947SAndroid Build Coastguard Worker     const struct chreWifiNanSubscribeConfig *config) {
185*84e33947SAndroid Build Coastguard Worker   uint32_t subscriptionId = 0;
186*84e33947SAndroid Build Coastguard Worker   uint8_t errorCode =
187*84e33947SAndroid Build Coastguard Worker       chre::PalNanEngineSingleton::get()->subscribe(config, &subscriptionId);
188*84e33947SAndroid Build Coastguard Worker 
189*84e33947SAndroid Build Coastguard Worker   gCallbacks->nanServiceIdentifierCallback(errorCode, subscriptionId);
190*84e33947SAndroid Build Coastguard Worker 
191*84e33947SAndroid Build Coastguard Worker   return true;
192*84e33947SAndroid Build Coastguard Worker }
193*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiNanSubscribeCancel(const uint32_t subscriptionId)194*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiNanSubscribeCancel(const uint32_t subscriptionId) {
195*84e33947SAndroid Build Coastguard Worker   gCallbacks->nanSubscriptionCanceledCallback(CHRE_ERROR_NONE, subscriptionId);
196*84e33947SAndroid Build Coastguard Worker   return chre::PalNanEngineSingleton::get()->subscribeCancel(subscriptionId);
197*84e33947SAndroid Build Coastguard Worker }
198*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiNanReleaseDiscoveryEvent(struct chreWifiNanDiscoveryEvent * event)199*84e33947SAndroid Build Coastguard Worker void chrePalWifiApiNanReleaseDiscoveryEvent(
200*84e33947SAndroid Build Coastguard Worker     struct chreWifiNanDiscoveryEvent *event) {
201*84e33947SAndroid Build Coastguard Worker   chre::PalNanEngineSingleton::get()->destroyDiscoveryEvent(event);
202*84e33947SAndroid Build Coastguard Worker }
203*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiRequestNanRanging(const struct chreWifiNanRangingParams * params)204*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiRequestNanRanging(
205*84e33947SAndroid Build Coastguard Worker     const struct chreWifiNanRangingParams *params) {
206*84e33947SAndroid Build Coastguard Worker   constexpr uint32_t kFakeRangeMeasurementMm = 1000;
207*84e33947SAndroid Build Coastguard Worker 
208*84e33947SAndroid Build Coastguard Worker   auto *event = chre::memoryAlloc<struct chreWifiRangingEvent>();
209*84e33947SAndroid Build Coastguard Worker   CHRE_ASSERT_NOT_NULL(event);
210*84e33947SAndroid Build Coastguard Worker 
211*84e33947SAndroid Build Coastguard Worker   auto *result = chre::memoryAlloc<struct chreWifiRangingResult>();
212*84e33947SAndroid Build Coastguard Worker   CHRE_ASSERT_NOT_NULL(result);
213*84e33947SAndroid Build Coastguard Worker 
214*84e33947SAndroid Build Coastguard Worker   std::memcpy(result->macAddress, params->macAddress, CHRE_WIFI_BSSID_LEN);
215*84e33947SAndroid Build Coastguard Worker   result->status = CHRE_WIFI_RANGING_STATUS_SUCCESS;
216*84e33947SAndroid Build Coastguard Worker   result->distance = kFakeRangeMeasurementMm;
217*84e33947SAndroid Build Coastguard Worker   event->resultCount = 1;
218*84e33947SAndroid Build Coastguard Worker   event->results = result;
219*84e33947SAndroid Build Coastguard Worker 
220*84e33947SAndroid Build Coastguard Worker   gCallbacks->rangingEventCallback(CHRE_ERROR_NONE, event);
221*84e33947SAndroid Build Coastguard Worker 
222*84e33947SAndroid Build Coastguard Worker   return true;
223*84e33947SAndroid Build Coastguard Worker }
224*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiClose()225*84e33947SAndroid Build Coastguard Worker void chrePalWifiApiClose() {
226*84e33947SAndroid Build Coastguard Worker   stopScanMonitorTask();
227*84e33947SAndroid Build Coastguard Worker   stopRequestScanTask();
228*84e33947SAndroid Build Coastguard Worker   stopRequestRangingTask();
229*84e33947SAndroid Build Coastguard Worker }
230*84e33947SAndroid Build Coastguard Worker 
chrePalWifiApiOpen(const struct chrePalSystemApi * systemApi,const struct chrePalWifiCallbacks * callbacks)231*84e33947SAndroid Build Coastguard Worker bool chrePalWifiApiOpen(const struct chrePalSystemApi *systemApi,
232*84e33947SAndroid Build Coastguard Worker                         const struct chrePalWifiCallbacks *callbacks) {
233*84e33947SAndroid Build Coastguard Worker   chrePalWifiApiClose();
234*84e33947SAndroid Build Coastguard Worker 
235*84e33947SAndroid Build Coastguard Worker   bool success = false;
236*84e33947SAndroid Build Coastguard Worker   if (systemApi != nullptr && callbacks != nullptr) {
237*84e33947SAndroid Build Coastguard Worker     gSystemApi = systemApi;
238*84e33947SAndroid Build Coastguard Worker     gCallbacks = callbacks;
239*84e33947SAndroid Build Coastguard Worker 
240*84e33947SAndroid Build Coastguard Worker     chre::PalNanEngineSingleton::get()->setPlatformWifiCallbacks(callbacks);
241*84e33947SAndroid Build Coastguard Worker 
242*84e33947SAndroid Build Coastguard Worker     success = true;
243*84e33947SAndroid Build Coastguard Worker   }
244*84e33947SAndroid Build Coastguard Worker 
245*84e33947SAndroid Build Coastguard Worker   return success;
246*84e33947SAndroid Build Coastguard Worker }
247*84e33947SAndroid Build Coastguard Worker 
chrePalWifiNanGetCapabilities(struct chreWifiNanCapabilities *)248*84e33947SAndroid Build Coastguard Worker bool chrePalWifiNanGetCapabilities(
249*84e33947SAndroid Build Coastguard Worker     struct chreWifiNanCapabilities * /* capabilities */) {
250*84e33947SAndroid Build Coastguard Worker   return false;
251*84e33947SAndroid Build Coastguard Worker }
252*84e33947SAndroid Build Coastguard Worker 
253*84e33947SAndroid Build Coastguard Worker }  // anonymous namespace
254*84e33947SAndroid Build Coastguard Worker 
chrePalWifiEnableResponse(PalWifiAsyncRequestTypes requestType,bool enableResponse)255*84e33947SAndroid Build Coastguard Worker void chrePalWifiEnableResponse(PalWifiAsyncRequestTypes requestType,
256*84e33947SAndroid Build Coastguard Worker                                bool enableResponse) {
257*84e33947SAndroid Build Coastguard Worker   switch (requestType) {
258*84e33947SAndroid Build Coastguard Worker     case PalWifiAsyncRequestTypes::RANGING:
259*84e33947SAndroid Build Coastguard Worker       gEnableRangingResponse = enableResponse;
260*84e33947SAndroid Build Coastguard Worker       break;
261*84e33947SAndroid Build Coastguard Worker 
262*84e33947SAndroid Build Coastguard Worker     case PalWifiAsyncRequestTypes::SCAN_MONITORING:
263*84e33947SAndroid Build Coastguard Worker       gEnableScanMonitorResponse = enableResponse;
264*84e33947SAndroid Build Coastguard Worker       break;
265*84e33947SAndroid Build Coastguard Worker 
266*84e33947SAndroid Build Coastguard Worker     case PalWifiAsyncRequestTypes::SCAN:
267*84e33947SAndroid Build Coastguard Worker       gEnableScanResponse = enableResponse;
268*84e33947SAndroid Build Coastguard Worker       break;
269*84e33947SAndroid Build Coastguard Worker 
270*84e33947SAndroid Build Coastguard Worker     default:
271*84e33947SAndroid Build Coastguard Worker       LOGE("Cannot enable/disable request type: %" PRIu8,
272*84e33947SAndroid Build Coastguard Worker            static_cast<uint8_t>(requestType));
273*84e33947SAndroid Build Coastguard Worker   }
274*84e33947SAndroid Build Coastguard Worker }
275*84e33947SAndroid Build Coastguard Worker 
chrePalWifiIsScanMonitoringActive()276*84e33947SAndroid Build Coastguard Worker bool chrePalWifiIsScanMonitoringActive() {
277*84e33947SAndroid Build Coastguard Worker   return gScanMonitoringActive;
278*84e33947SAndroid Build Coastguard Worker }
279*84e33947SAndroid Build Coastguard Worker 
chrePalWifiDelayResponse(PalWifiAsyncRequestTypes requestType,std::chrono::milliseconds milliseconds)280*84e33947SAndroid Build Coastguard Worker void chrePalWifiDelayResponse(PalWifiAsyncRequestTypes requestType,
281*84e33947SAndroid Build Coastguard Worker                               std::chrono::milliseconds milliseconds) {
282*84e33947SAndroid Build Coastguard Worker   gAsyncRequestDelayResponseTime[chre::asBaseType(requestType)] =
283*84e33947SAndroid Build Coastguard Worker       std::chrono::duration_cast<std::chrono::nanoseconds>(milliseconds);
284*84e33947SAndroid Build Coastguard Worker   ;
285*84e33947SAndroid Build Coastguard Worker }
286*84e33947SAndroid Build Coastguard Worker 
chrePalWifiGetApi(uint32_t requestedApiVersion)287*84e33947SAndroid Build Coastguard Worker const struct chrePalWifiApi *chrePalWifiGetApi(uint32_t requestedApiVersion) {
288*84e33947SAndroid Build Coastguard Worker   static const struct chrePalWifiApi kApi = {
289*84e33947SAndroid Build Coastguard Worker       .moduleVersion = CHRE_PAL_WIFI_API_CURRENT_VERSION,
290*84e33947SAndroid Build Coastguard Worker       .open = chrePalWifiApiOpen,
291*84e33947SAndroid Build Coastguard Worker       .close = chrePalWifiApiClose,
292*84e33947SAndroid Build Coastguard Worker       .getCapabilities = chrePalWifiGetCapabilities,
293*84e33947SAndroid Build Coastguard Worker       .configureScanMonitor = chrePalWifiConfigureScanMonitor,
294*84e33947SAndroid Build Coastguard Worker       .requestScan = chrePalWifiApiRequestScan,
295*84e33947SAndroid Build Coastguard Worker       .releaseScanEvent = chrePalWifiApiReleaseScanEvent,
296*84e33947SAndroid Build Coastguard Worker       .requestRanging = chrePalWifiApiRequestRanging,
297*84e33947SAndroid Build Coastguard Worker       .releaseRangingEvent = chrePalWifiApiReleaseRangingEvent,
298*84e33947SAndroid Build Coastguard Worker       .nanSubscribe = chrePalWifiApiNanSubscribe,
299*84e33947SAndroid Build Coastguard Worker       .nanSubscribeCancel = chrePalWifiApiNanSubscribeCancel,
300*84e33947SAndroid Build Coastguard Worker       .releaseNanDiscoveryEvent = chrePalWifiApiNanReleaseDiscoveryEvent,
301*84e33947SAndroid Build Coastguard Worker       .requestNanRanging = chrePalWifiApiRequestNanRanging,
302*84e33947SAndroid Build Coastguard Worker       .getNanCapabilities = chrePalWifiNanGetCapabilities,
303*84e33947SAndroid Build Coastguard Worker   };
304*84e33947SAndroid Build Coastguard Worker 
305*84e33947SAndroid Build Coastguard Worker   if (!CHRE_PAL_VERSIONS_ARE_COMPATIBLE(kApi.moduleVersion,
306*84e33947SAndroid Build Coastguard Worker                                         requestedApiVersion)) {
307*84e33947SAndroid Build Coastguard Worker     return nullptr;
308*84e33947SAndroid Build Coastguard Worker   } else {
309*84e33947SAndroid Build Coastguard Worker     chre::PalNanEngineSingleton::init();
310*84e33947SAndroid Build Coastguard Worker     return &kApi;
311*84e33947SAndroid Build Coastguard Worker   }
312*84e33947SAndroid Build Coastguard Worker }
313