1bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol/*
2bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * Copyright (C) 2017 The Android Open Source Project
3bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol *
4bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License");
5bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * you may not use this file except in compliance with the License.
6bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * You may obtain a copy of the License at
7bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol *
8bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol *      http://www.apache.org/licenses/LICENSE-2.0
9bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol *
10bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * Unless required by applicable law or agreed to in writing, software
11bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS,
12bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * See the License for the specific language governing permissions and
14bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol * limitations under the License.
15bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol */
16bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
17bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol#include "chre/platform/platform_wifi.h"
18bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
19bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol#include <cinttypes>
20bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
21d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol#include "chre/core/event_loop_manager.h"
22bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol#include "chre/platform/shared/pal_system_api.h"
23bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol#include "chre/platform/log.h"
24bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
25bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignolnamespace chre {
26bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
272ff52c6627054f8708e83eaccbcbd0db0af2899cBrian DuddiePlatformWifi::~PlatformWifi() {
282ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie  if (mWifiApi != nullptr) {
292ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie    LOGD("Platform WiFi closing");
30ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro    prePalApiCall();
312ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie    mWifiApi->close();
322ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie    LOGD("Platform WiFi closed");
332ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie  }
342ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie}
352ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddie
362ff52c6627054f8708e83eaccbcbd0db0af2899cBrian Duddievoid PlatformWifi::init() {
37ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro  prePalApiCall();
38bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  mWifiApi = chrePalWifiGetApi(CHRE_PAL_WIFI_API_CURRENT_VERSION);
39bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  if (mWifiApi != nullptr) {
40bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    mWifiCallbacks.scanMonitorStatusChangeCallback =
41bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol        PlatformWifi::scanMonitorStatusChangeCallback;
42bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    mWifiCallbacks.scanResponseCallback =
43bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol        PlatformWifiBase::scanResponseCallback;
44bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    mWifiCallbacks.scanEventCallback =
45bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol        PlatformWifiBase::scanEventCallback;
469ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    mWifiCallbacks.rangingEventCallback =
479ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie        PlatformWifiBase::rangingEventCallback;
48bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    if (!mWifiApi->open(&gChrePalSystemApi, &mWifiCallbacks)) {
49bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol      LOGE("WiFi PAL open returned false");
50bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol      mWifiApi = nullptr;
519ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    } else {
529ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie      LOGD("Opened WiFi PAL version 0x%08" PRIx32, mWifiApi->moduleVersion);
53bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    }
54bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  } else {
55bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    LOGW("Requested Wifi PAL (version %08" PRIx32 ") not found",
56bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol         CHRE_PAL_WIFI_API_CURRENT_VERSION);
57bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  }
58bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}
59bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
60bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignoluint32_t PlatformWifi::getCapabilities() {
61bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  if (mWifiApi != nullptr) {
62ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro    prePalApiCall();
63bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    return mWifiApi->getCapabilities();
64bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  } else {
65bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol    return CHRE_WIFI_CAPABILITIES_NONE;
66bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol  }
67bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}
68bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
69cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignolbool PlatformWifi::configureScanMonitor(bool enable) {
70cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol  if (mWifiApi != nullptr) {
71ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro    prePalApiCall();
72cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol    return mWifiApi->configureScanMonitor(enable);
73cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol  } else {
74cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol    return false;
75cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol  }
76cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol}
77cbff0ad0e40b03ea9972e3446f1d238796e07398Andrew Rossignol
789ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddiebool PlatformWifi::requestRanging(const struct chreWifiRangingParams *params) {
799ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  if (mWifiApi != nullptr
809ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie      && mWifiApi->moduleVersion >= CHRE_PAL_WIFI_API_V1_2) {
819ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    prePalApiCall();
829ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    return mWifiApi->requestRanging(params);
839ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  } else {
849ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    return false;
859ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  }
869ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie}
879ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie
88581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignolbool PlatformWifi::requestScan(const struct chreWifiScanParams *params) {
89581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol  if (mWifiApi != nullptr) {
90ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro    prePalApiCall();
91581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol    return mWifiApi->requestScan(params);
92581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol  } else {
93581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol    return false;
94581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol  }
95581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol}
96581737ad9fde8d45d6af693a287635f90bcc4515Andrew Rossignol
979ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddievoid PlatformWifi::releaseRangingEvent(struct chreWifiRangingEvent *event) {
989ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  prePalApiCall();
999ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  mWifiApi->releaseRangingEvent(event);
1009ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie}
1019ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie
102782122b5a995ae68a63959b78911f38286b28cfaAndrew Rossignolvoid PlatformWifi::releaseScanEvent(struct chreWifiScanEvent *event) {
1039ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  prePalApiCall();
1049ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  mWifiApi->releaseScanEvent(event);
1059ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie}
1069ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie
1079ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddievoid PlatformWifiBase::rangingEventCallback(
1089ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie    uint8_t errorCode, struct chreWifiRangingEvent *event) {
1099ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie  EventLoopManagerSingleton::get()->getWifiRequestManager()
1109ce433a1d9c0b548f83de58dd34393f7aba9ec0bBrian Duddie      .handleRangingEvent(errorCode, event);
111782122b5a995ae68a63959b78911f38286b28cfaAndrew Rossignol}
112782122b5a995ae68a63959b78911f38286b28cfaAndrew Rossignol
113bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignolvoid PlatformWifiBase::scanMonitorStatusChangeCallback(bool enabled,
114bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol                                                       uint8_t errorCode) {
115d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol  EventLoopManagerSingleton::get()->getWifiRequestManager()
116d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol      .handleScanMonitorStateChange(enabled, errorCode);
117bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}
118bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
119bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignolvoid PlatformWifiBase::scanResponseCallback(bool pending, uint8_t errorCode) {
120d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol  EventLoopManagerSingleton::get()->getWifiRequestManager()
121d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol      .handleScanResponse(pending, errorCode);
122bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}
123bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
124bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignolvoid PlatformWifiBase::scanEventCallback(struct chreWifiScanEvent *event) {
125d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol  EventLoopManagerSingleton::get()->getWifiRequestManager()
126d74b2f8991a8dfae2e24ccb0cc84264c48731d55Andrew Rossignol      .handleScanEvent(event);
127bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}
128bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol
129bdf404267034f69fc1555ef266d9dd12ba9215eeAndrew Rossignol}  // namespace chre
130