From a25b59e44819d0ef497a891fa19350ac9fbee984 Mon Sep 17 00:00:00 2001 From: Sohani Rao Date: Mon, 3 Apr 2017 17:48:32 -0700 Subject: [PATCH] Wifi Offload HAL implementation for V1.0 interface Implements Offload HAL HIDL service for Wifi Offload v1.0 interface Bug: 32842314 Test: Unit tests and Mannual test to ensure service is running Change-Id: I9612ec28b9b042be10b7e022362124de906649ab --- device.mk | 1 + wifi_offload/Android.mk | 35 +++++++++++ wifi_offload/Offload.cpp | 60 +++++++++++++++++++ wifi_offload/Offload.h | 51 ++++++++++++++++ ...droid.hardware.wifi.offload@1.0-service.rc | 4 ++ wifi_offload/service.cpp | 49 +++++++++++++++ 6 files changed, 200 insertions(+) create mode 100644 wifi_offload/Android.mk create mode 100644 wifi_offload/Offload.cpp create mode 100644 wifi_offload/Offload.h create mode 100644 wifi_offload/android.hardware.wifi.offload@1.0-service.rc create mode 100644 wifi_offload/service.cpp diff --git a/device.mk b/device.mk index 95eaa13b..758ef006 100644 --- a/device.mk +++ b/device.mk @@ -348,6 +348,7 @@ PRODUCT_PACKAGES += $(WPA) PRODUCT_PACKAGES += \ android.hardware.wifi@1.0-service \ + android.hardware.wifi.offload@1.0-service \ wificond \ wifilogd diff --git a/wifi_offload/Android.mk b/wifi_offload/Android.mk new file mode 100644 index 00000000..95fe150a --- /dev/null +++ b/wifi_offload/Android.mk @@ -0,0 +1,35 @@ +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.wifi.offload@1.0-service +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_PROPRIETARY_MODULE := true +LOCAL_CPPFLAGS := -Wall -Werror -Wextra +LOCAL_SRC_FILES := \ + Offload.cpp \ + service.cpp +LOCAL_SHARED_LIBRARIES := \ + android.hardware.wifi.offload@1.0 \ + libbase \ + libcutils \ + libhidlbase \ + libhidltransport \ + liblog \ + libutils +LOCAL_INIT_RC := android.hardware.wifi.offload@1.0-service.rc +include $(BUILD_EXECUTABLE) + + diff --git a/wifi_offload/Offload.cpp b/wifi_offload/Offload.cpp new file mode 100644 index 00000000..5532e9eb --- /dev/null +++ b/wifi_offload/Offload.cpp @@ -0,0 +1,60 @@ +#include "Offload.h" +#include + +namespace android { +namespace hardware { +namespace wifi { +namespace offload { +namespace V1_0 { +namespace implementation { + +Offload::Offload() + : mOffloadEnabled(false), mSubscriptionTimeMs(0), mSubscriptionDelayMs(0) { + // TODO: Load Nano app + LOG(android::base::INFO) << "Wifi Offload HAL impl"; +} + +// Methods from ::android::hardware::wifi::offload::V1_0::IOffload follow. +Return Offload::configureScans(const ScanParam& param, + const ScanFilter& filter) { + mScanParam = param; + mScanFilter = filter; + // TODO: implement Wifi Nano app scan configuration + return Void(); +} + +Return Offload::getScanStats(getScanStats_cb offloadScanStatsCallback) { + ScanStats* pScanStats = new ScanStats(); + // TODO: implement getting scan stats from Wifi Nano app + offloadScanStatsCallback(*pScanStats); + return Void(); +} + +Return Offload::subscribeScanResults(uint32_t delayMs) { + mOffloadEnabled = true; + // TODO: get current system time + mSubscriptionTimeMs = 0; + mSubscriptionDelayMs = delayMs; + // TODO implement informing Wifi Nano App + return Void(); +} + +Return Offload::unsubscribeScanResults() { + mOffloadEnabled = false; + // TODO: implement updating Wifi Nano app + return Void(); +} + +Return Offload::setEventCallback(const sp& cb) { + Offload::mScanEventCallback = cb; + return Void(); +} + +// Methods from ::android::hidl::base::V1_0::IBase follow. + +} // namespace implementation +} // namespace V1_0 +} // namespace offload +} // namespace wifi +} // namespace hardware +} // namespace android diff --git a/wifi_offload/Offload.h b/wifi_offload/Offload.h new file mode 100644 index 00000000..07393f49 --- /dev/null +++ b/wifi_offload/Offload.h @@ -0,0 +1,51 @@ +#ifndef ANDROID_HARDWARE_WIFI_OFFLOAD_V1_0_OFFLOAD_H +#define ANDROID_HARDWARE_WIFI_OFFLOAD_V1_0_OFFLOAD_H + +#include + +#include +#include + +namespace android { +namespace hardware { +namespace wifi { +namespace offload { +namespace V1_0 { +namespace implementation { + +/** + * Interface object to communicate with Offload HAL + */ +class Offload : public IOffload { + public: + Offload(); + + // Methods from ::android::hardware::wifi::offload::V1_0::IOffload follow. + Return configureScans(const ScanParam& param, + const ScanFilter& filter) override; + Return getScanStats( + getScanStats_cb offloadScanStatsCallback) override; + Return subscribeScanResults(uint32_t delayMs) override; + Return unsubscribeScanResults() override; + Return setEventCallback(const sp& cb) override; + // Methods from ::android::hidl::base::V1_0::IBase follow. + + private: + bool mOffloadEnabled; + uint64_t mSubscriptionTimeMs; + uint32_t mSubscriptionDelayMs; + ScanParam mScanParam; + ScanFilter mScanFilter; + sp mScanEventCallback; + + DISALLOW_COPY_AND_ASSIGN(Offload); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace offload +} // namespace wifi +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_WIFI_OFFLOAD_V1_0_OFFLOAD_H diff --git a/wifi_offload/android.hardware.wifi.offload@1.0-service.rc b/wifi_offload/android.hardware.wifi.offload@1.0-service.rc new file mode 100644 index 00000000..f90d63ff --- /dev/null +++ b/wifi_offload/android.hardware.wifi.offload@1.0-service.rc @@ -0,0 +1,4 @@ +service offload-hal-1-0 /vendor/bin/hw/android.hardware.wifi.offload@1.0-service + class hal + user wifi + group wifi diff --git a/wifi_offload/service.cpp b/wifi_offload/service.cpp new file mode 100644 index 00000000..acec0787 --- /dev/null +++ b/wifi_offload/service.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include + +#include "Offload.h" + +// libhwbinder +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; + +using android::hardware::wifi::offload::V1_0::IOffload; +using android::hardware::wifi::offload::V1_0::implementation::Offload; + +int main(int /*argc*/, char **argv) { + android::base::InitLogging( + argv, android::base::LogdLogger(android::base::SYSTEM)); + LOG(android::base::INFO) << "Wifi Offload HAL service start "; + + // Setup hwbinder + configureRpcThreadpool(1, true /* callerWillJoin */); + + // Register service + android::sp service = new Offload(); + CHECK_EQ(service->registerAsService(), android::NO_ERROR) + << "Failed to register Wifi Offload HAL"; + + joinRpcThreadpool(); + + LOG(android::base::INFO) << "Wifi Offload HAL service exit"; + return 0; +}