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