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