wifi: Move legacy HAL implementation am: 3c4e8a358c
am: 2e5f1858e4
Change-Id: I0d1192a37b1ec7a9328cff5e73b2abd031f1f3e3
This commit is contained in:
commit
092f22ac3d
11 changed files with 830 additions and 0 deletions
55
wifi/1.0/default/Android.mk
Normal file
55
wifi/1.0/default/Android.mk
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# 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@1.0-impl
|
||||||
|
LOCAL_MODULE_RELATIVE_PATH := hw
|
||||||
|
LOCAL_CPPFLAGS := -std=c++11 -Wall -Wno-unused-parameter -Werror -Wextra
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
failure_reason_util.cpp \
|
||||||
|
wifi_chip.cpp \
|
||||||
|
wifi.cpp \
|
||||||
|
wifi_hal_state.cpp
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
android.hardware.wifi@1.0 \
|
||||||
|
libbase \
|
||||||
|
libcutils \
|
||||||
|
libhidl \
|
||||||
|
libhwbinder \
|
||||||
|
liblog \
|
||||||
|
libnl \
|
||||||
|
libutils
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES := $(LIB_WIFI_HAL)
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := android.hardware.wifi@1.0-service
|
||||||
|
LOCAL_MODULE_RELATIVE_PATH := hw
|
||||||
|
LOCAL_CPPFLAGS := -std=c++11 -Wall -Wno-unused-parameter -Werror -Wextra
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
service.cpp
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
android.hardware.wifi@1.0 \
|
||||||
|
android.hardware.wifi@1.0-impl \
|
||||||
|
libbase \
|
||||||
|
libcutils \
|
||||||
|
libhidl \
|
||||||
|
libhwbinder \
|
||||||
|
liblog \
|
||||||
|
libnl \
|
||||||
|
libutils
|
||||||
|
LOCAL_WHOLE_STATIC_LIBRARIES := $(LIB_WIFI_HAL)
|
||||||
|
LOCAL_INIT_RC := android.hardware.wifi@1.0-service.rc
|
||||||
|
include $(BUILD_EXECUTABLE)
|
4
wifi/1.0/default/android.hardware.wifi@1.0-service.rc
Normal file
4
wifi/1.0/default/android.hardware.wifi@1.0-service.rc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
service wifi_hal_legacy /system/bin/hw/android.hardware.wifi@1.0-service
|
||||||
|
class hal
|
||||||
|
user wifi
|
||||||
|
group wifi
|
94
wifi/1.0/default/failure_reason_util.cpp
Normal file
94
wifi/1.0/default/failure_reason_util.cpp
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* 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 "failure_reason_util.h"
|
||||||
|
|
||||||
|
using ::android::hardware::wifi::V1_0::CommandFailureReason;
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
std::string LegacyErrorToString(wifi_error error) {
|
||||||
|
switch(error) {
|
||||||
|
case WIFI_SUCCESS:
|
||||||
|
return "SUCCESS";
|
||||||
|
case WIFI_ERROR_UNINITIALIZED:
|
||||||
|
return "UNINITIALIZED";
|
||||||
|
case WIFI_ERROR_NOT_AVAILABLE:
|
||||||
|
return "NOT_AVAILABLE";
|
||||||
|
case WIFI_ERROR_NOT_SUPPORTED:
|
||||||
|
return "NOT_SUPPORTED";
|
||||||
|
case WIFI_ERROR_INVALID_ARGS:
|
||||||
|
return "INVALID_ARGS";
|
||||||
|
case WIFI_ERROR_INVALID_REQUEST_ID:
|
||||||
|
return "INVALID_REQUEST_ID";
|
||||||
|
case WIFI_ERROR_TIMED_OUT:
|
||||||
|
return "TIMED_OUT";
|
||||||
|
case WIFI_ERROR_TOO_MANY_REQUESTS:
|
||||||
|
return "TOO_MANY_REQUESTS";
|
||||||
|
case WIFI_ERROR_OUT_OF_MEMORY:
|
||||||
|
return "OUT_OF_MEMORY";
|
||||||
|
case WIFI_ERROR_UNKNOWN:
|
||||||
|
default:
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
V1_0::FailureReason CreateFailureReason(
|
||||||
|
CommandFailureReason reason, const std::string& description) {
|
||||||
|
V1_0::FailureReason result;
|
||||||
|
result.reason = reason;
|
||||||
|
result.description = description.data();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
V1_0::FailureReason CreateFailureReasonLegacyError(
|
||||||
|
wifi_error error, const std::string& desc) {
|
||||||
|
switch(error) {
|
||||||
|
case WIFI_ERROR_UNINITIALIZED:
|
||||||
|
case WIFI_ERROR_NOT_AVAILABLE:
|
||||||
|
return CreateFailureReason(CommandFailureReason::NOT_AVAILABLE, desc);
|
||||||
|
|
||||||
|
case WIFI_ERROR_NOT_SUPPORTED:
|
||||||
|
return CreateFailureReason(CommandFailureReason::NOT_SUPPORTED, desc);
|
||||||
|
|
||||||
|
case WIFI_ERROR_INVALID_ARGS:
|
||||||
|
case WIFI_ERROR_INVALID_REQUEST_ID:
|
||||||
|
return CreateFailureReason(CommandFailureReason::INVALID_ARGS, desc);
|
||||||
|
|
||||||
|
case WIFI_ERROR_TIMED_OUT:
|
||||||
|
return CreateFailureReason(
|
||||||
|
CommandFailureReason::UNKNOWN, desc + ", timed out");
|
||||||
|
|
||||||
|
case WIFI_ERROR_TOO_MANY_REQUESTS:
|
||||||
|
return CreateFailureReason(
|
||||||
|
CommandFailureReason::UNKNOWN, desc + ", too many requests");
|
||||||
|
|
||||||
|
case WIFI_ERROR_OUT_OF_MEMORY:
|
||||||
|
return CreateFailureReason(
|
||||||
|
CommandFailureReason::UNKNOWN, desc + ", out of memory");
|
||||||
|
|
||||||
|
case WIFI_ERROR_NONE:
|
||||||
|
case WIFI_ERROR_UNKNOWN:
|
||||||
|
default:
|
||||||
|
return CreateFailureReason(CommandFailureReason::UNKNOWN, "unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
38
wifi/1.0/default/failure_reason_util.h
Normal file
38
wifi/1.0/default/failure_reason_util.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FAILURE_REASON_UTIL_H_
|
||||||
|
#define FAILURE_REASON_UTIL_H_
|
||||||
|
|
||||||
|
#include <android/hardware/wifi/1.0/IWifi.h>
|
||||||
|
#include <hardware_legacy/wifi_hal.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
std::string LegacyErrorToString(wifi_error error);
|
||||||
|
|
||||||
|
V1_0::FailureReason CreateFailureReason(
|
||||||
|
V1_0::CommandFailureReason reason, const std::string& description);
|
||||||
|
V1_0::FailureReason CreateFailureReasonLegacyError(
|
||||||
|
wifi_error error, const std::string& description);
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
||||||
|
|
||||||
|
#endif // FAILURE_REASON_UTIL_H_
|
67
wifi/1.0/default/service.cpp
Normal file
67
wifi/1.0/default/service.cpp
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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 <android-base/logging.h>
|
||||||
|
#include <hidl/IServiceManager.h>
|
||||||
|
#include <hwbinder/IPCThreadState.h>
|
||||||
|
#include <hwbinder/ProcessState.h>
|
||||||
|
#include <utils/Looper.h>
|
||||||
|
#include <utils/StrongPointer.h>
|
||||||
|
|
||||||
|
#include "wifi.h"
|
||||||
|
|
||||||
|
using android::hardware::hidl_version;
|
||||||
|
using android::hardware::IPCThreadState;
|
||||||
|
using android::hardware::ProcessState;
|
||||||
|
using android::Looper;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int OnBinderReadReady(int /*fd*/, int /*events*/, void* /*data*/) {
|
||||||
|
IPCThreadState::self()->handlePolledCommands();
|
||||||
|
return 1; // continue receiving events
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int /*argc*/, char** argv) {
|
||||||
|
android::base::InitLogging(
|
||||||
|
argv, android::base::LogdLogger(android::base::SYSTEM));
|
||||||
|
LOG(INFO) << "wifi_hal_legacy is starting up...";
|
||||||
|
|
||||||
|
// Setup binder
|
||||||
|
int binder_fd = -1;
|
||||||
|
ProcessState::self()->setThreadPoolMaxThreadCount(0);
|
||||||
|
CHECK_EQ(IPCThreadState::self()->setupPolling(&binder_fd),
|
||||||
|
android::NO_ERROR) << "Failed to initialize binder polling";
|
||||||
|
CHECK_GE(binder_fd, 0) << "Invalid binder FD: " << binder_fd;
|
||||||
|
|
||||||
|
// Setup looper
|
||||||
|
android::sp<Looper> looper = Looper::prepare(0 /* no options */);
|
||||||
|
CHECK(looper->addFd(
|
||||||
|
binder_fd, 0, Looper::EVENT_INPUT, OnBinderReadReady, nullptr))
|
||||||
|
<< "Failed to watch binder FD";
|
||||||
|
|
||||||
|
// Setup hwbinder service
|
||||||
|
android::sp<android::hardware::wifi::Wifi> service =
|
||||||
|
new android::hardware::wifi::Wifi(looper);
|
||||||
|
CHECK_EQ(service->registerAsService("wifi"),
|
||||||
|
android::NO_ERROR) << "Failed to register wifi HAL";
|
||||||
|
|
||||||
|
// Loop
|
||||||
|
while (looper->pollAll(-1) != Looper::POLL_ERROR);
|
||||||
|
|
||||||
|
LOG(INFO) << "wifi_hal_legacy is terminating...";
|
||||||
|
return 0;
|
||||||
|
}
|
187
wifi/1.0/default/wifi.cpp
Normal file
187
wifi/1.0/default/wifi.cpp
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
/*
|
||||||
|
* 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 "wifi.h"
|
||||||
|
|
||||||
|
#include <android-base/logging.h>
|
||||||
|
#include <cutils/properties.h>
|
||||||
|
|
||||||
|
#include "failure_reason_util.h"
|
||||||
|
#include "wifi_chip.h"
|
||||||
|
|
||||||
|
using ::android::hardware::wifi::V1_0::CommandFailureReason;
|
||||||
|
using RunState = ::android::hardware::wifi::WifiHalState::RunState;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
std::string GetWlanInterfaceName() {
|
||||||
|
char buffer[PROPERTY_VALUE_MAX];
|
||||||
|
property_get("wifi.interface", buffer, "wlan0");
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
Wifi::Wifi(sp<Looper>& looper) : state_(looper) {
|
||||||
|
CHECK_EQ(init_wifi_vendor_hal_func_table(&state_.func_table_), WIFI_SUCCESS)
|
||||||
|
<< "Failed to initialize hal func table";
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> Wifi::registerEventCallback(
|
||||||
|
const sp<V1_0::IWifiEventCallback>& callback) {
|
||||||
|
// TODO(b/31632518): remove the callback when the client is destroyed
|
||||||
|
callbacks_.insert(callback);
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<bool> Wifi::isStarted() {
|
||||||
|
return state_.run_state_ != RunState::STOPPED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> Wifi::start() {
|
||||||
|
if (state_.run_state_ == RunState::STARTED) {
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStart();
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
} else if (state_.run_state_ == RunState::STOPPING) {
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStartFailure(CreateFailureReason(
|
||||||
|
CommandFailureReason::NOT_AVAILABLE, "HAL is stopping"));
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(INFO) << "Initializing HAL";
|
||||||
|
wifi_error status = state_.func_table_.wifi_initialize(&state_.hal_handle_);
|
||||||
|
if (status != WIFI_SUCCESS) {
|
||||||
|
LOG(ERROR) << "Failed to initialize Wifi HAL";
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStartFailure(CreateFailureReasonLegacyError(
|
||||||
|
status, "Failed to initialize HAL"));
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
event_loop_thread_ = std::thread(&Wifi::DoHalEventLoop, this);
|
||||||
|
|
||||||
|
wifi_interface_handle iface_handle =
|
||||||
|
FindInterfaceHandle(GetWlanInterfaceName());
|
||||||
|
if (iface_handle != kInterfaceNotFoundHandle) {
|
||||||
|
chip_ = new WifiChip(&state_, iface_handle);
|
||||||
|
} else {
|
||||||
|
// TODO fail to init?
|
||||||
|
}
|
||||||
|
|
||||||
|
state_.run_state_ = RunState::STARTED;
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStart();
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
wifi_interface_handle Wifi::FindInterfaceHandle(
|
||||||
|
const std::string& ifname) {
|
||||||
|
int num_iface_handles = 0;
|
||||||
|
wifi_interface_handle* iface_handles = nullptr;
|
||||||
|
wifi_error ret = state_.func_table_.wifi_get_ifaces(
|
||||||
|
state_.hal_handle_, &num_iface_handles, &iface_handles);
|
||||||
|
if (ret != WIFI_SUCCESS) {
|
||||||
|
LOG(ERROR) << "Failed to enumerate interface handles: "
|
||||||
|
<< LegacyErrorToString(ret);
|
||||||
|
return kInterfaceNotFoundHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buffer[IFNAMSIZ];
|
||||||
|
for (int i = 0; i < num_iface_handles; ++i) {
|
||||||
|
bzero(buffer, sizeof(buffer));
|
||||||
|
ret = state_.func_table_.wifi_get_iface_name(
|
||||||
|
iface_handles[i], buffer, sizeof(buffer));
|
||||||
|
if (ret != WIFI_SUCCESS) {
|
||||||
|
LOG(WARNING) << "Failed to get interface handle name: "
|
||||||
|
<< LegacyErrorToString(ret);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ifname == buffer) {
|
||||||
|
return iface_handles[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kInterfaceNotFoundHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NoopHalCleanupHandler(wifi_handle) {}
|
||||||
|
|
||||||
|
Return<void> Wifi::stop() {
|
||||||
|
if (state_.run_state_ == RunState::STOPPED) {
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStop();
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
} else if (state_.run_state_ == RunState::STOPPING) {
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(INFO) << "Cleaning up HAL";
|
||||||
|
awaiting_hal_cleanup_command_ = true;
|
||||||
|
awaiting_hal_event_loop_termination_ = true;
|
||||||
|
state_.run_state_ = RunState::STOPPING;
|
||||||
|
|
||||||
|
if (chip_.get()) chip_->Invalidate();
|
||||||
|
chip_.clear();
|
||||||
|
|
||||||
|
state_.func_table_.wifi_cleanup(state_.hal_handle_, NoopHalCleanupHandler);
|
||||||
|
awaiting_hal_cleanup_command_ = false;
|
||||||
|
LOG(VERBOSE) << "HAL cleanup command complete";
|
||||||
|
FinishHalCleanup();
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Wifi::DoHalEventLoop() {
|
||||||
|
LOG(VERBOSE) << "Starting HAL event loop";
|
||||||
|
state_.func_table_.wifi_event_loop(state_.hal_handle_);
|
||||||
|
if (state_.run_state_ != RunState::STOPPING) {
|
||||||
|
LOG(FATAL) << "HAL event loop terminated, but HAL was not stopping";
|
||||||
|
}
|
||||||
|
LOG(VERBOSE) << "HAL Event loop terminated";
|
||||||
|
event_loop_thread_.detach();
|
||||||
|
state_.PostTask([this](){
|
||||||
|
awaiting_hal_event_loop_termination_ = false;
|
||||||
|
FinishHalCleanup();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void Wifi::FinishHalCleanup() {
|
||||||
|
if (!awaiting_hal_cleanup_command_ && !awaiting_hal_event_loop_termination_) {
|
||||||
|
state_.run_state_ = RunState::STOPPED;
|
||||||
|
LOG(INFO) << "HAL cleanup complete";
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onStop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Return<void> Wifi::getChip(getChip_cb cb) {
|
||||||
|
cb(chip_);
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
83
wifi/1.0/default/wifi.h
Normal file
83
wifi/1.0/default/wifi.h
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WIFI_H_
|
||||||
|
#define WIFI_H_
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
#include <set>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include <android/hardware/wifi/1.0/IWifi.h>
|
||||||
|
#include <android-base/macros.h>
|
||||||
|
#include <hardware_legacy/wifi_hal.h>
|
||||||
|
#include <utils/Looper.h>
|
||||||
|
|
||||||
|
#include "wifi_hal_state.h"
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
class WifiChip;
|
||||||
|
|
||||||
|
class Wifi : public V1_0::IWifi {
|
||||||
|
public:
|
||||||
|
Wifi(sp<Looper>& looper);
|
||||||
|
|
||||||
|
Return<void> registerEventCallback(
|
||||||
|
const sp<V1_0::IWifiEventCallback>& callback) override;
|
||||||
|
|
||||||
|
Return<bool> isStarted() override;
|
||||||
|
Return<void> start() override;
|
||||||
|
Return<void> stop() override;
|
||||||
|
|
||||||
|
Return<void> getChip(getChip_cb cb) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const wifi_interface_handle kInterfaceNotFoundHandle = nullptr;
|
||||||
|
/** Get a HAL interface handle by name */
|
||||||
|
wifi_interface_handle FindInterfaceHandle(const std::string& ifname);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to indicate that the HAL implementation cleanup may be complete and
|
||||||
|
* the rest of HAL cleanup should be performed.
|
||||||
|
*/
|
||||||
|
void FinishHalCleanup();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entry point for HAL event loop thread. Handles cleanup when terminating.
|
||||||
|
*/
|
||||||
|
void DoHalEventLoop();
|
||||||
|
|
||||||
|
std::set<sp<V1_0::IWifiEventCallback>> callbacks_;
|
||||||
|
sp<WifiChip> chip_;
|
||||||
|
|
||||||
|
WifiHalState state_;
|
||||||
|
std::thread event_loop_thread_;
|
||||||
|
|
||||||
|
// Variables to hold state while stopping the HAL
|
||||||
|
bool awaiting_hal_cleanup_command_;
|
||||||
|
bool awaiting_hal_event_loop_termination_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(Wifi);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
||||||
|
|
||||||
|
#endif // WIFI_H_
|
116
wifi/1.0/default/wifi_chip.cpp
Normal file
116
wifi/1.0/default/wifi_chip.cpp
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* 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 "wifi_chip.h"
|
||||||
|
|
||||||
|
#include <android-base/logging.h>
|
||||||
|
|
||||||
|
#include "failure_reason_util.h"
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
WifiChip::WifiChip(
|
||||||
|
WifiHalState* hal_state, wifi_interface_handle interface_handle)
|
||||||
|
: hal_state_(hal_state), interface_handle_(interface_handle) {}
|
||||||
|
|
||||||
|
void WifiChip::Invalidate() {
|
||||||
|
hal_state_ = nullptr;
|
||||||
|
callbacks_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::registerEventCallback(
|
||||||
|
const sp<V1_0::IWifiChipEventCallback>& callback) {
|
||||||
|
if (!hal_state_) return Void();
|
||||||
|
// TODO(b/31632518): remove the callback when the client is destroyed
|
||||||
|
callbacks_.insert(callback);
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::getAvailableModes(getAvailableModes_cb cb) {
|
||||||
|
if (!hal_state_) {
|
||||||
|
cb(hidl_vec<ChipMode>());
|
||||||
|
return Void();
|
||||||
|
} else {
|
||||||
|
// TODO add implementation
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::configureChip(uint32_t /*mode_id*/) {
|
||||||
|
if (!hal_state_) return Void();
|
||||||
|
// TODO add implementation
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<uint32_t> WifiChip::getMode() {
|
||||||
|
if (!hal_state_) return 0;
|
||||||
|
// TODO add implementation
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::requestChipDebugInfo() {
|
||||||
|
if (!hal_state_) return Void();
|
||||||
|
|
||||||
|
V1_0::IWifiChipEventCallback::ChipDebugInfo result;
|
||||||
|
result.driverDescription = "<unknown>";
|
||||||
|
result.firmwareDescription = "<unknown>";
|
||||||
|
char buffer[256];
|
||||||
|
|
||||||
|
// get driver version
|
||||||
|
bzero(buffer, sizeof(buffer));
|
||||||
|
wifi_error ret = hal_state_->func_table_.wifi_get_driver_version(
|
||||||
|
interface_handle_, buffer, sizeof(buffer));
|
||||||
|
if (ret == WIFI_SUCCESS) {
|
||||||
|
result.driverDescription = buffer;
|
||||||
|
} else {
|
||||||
|
LOG(WARNING) << "Failed to get driver version: "
|
||||||
|
<< LegacyErrorToString(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get firmware version
|
||||||
|
bzero(buffer, sizeof(buffer));
|
||||||
|
ret = hal_state_->func_table_.wifi_get_firmware_version(
|
||||||
|
interface_handle_, buffer, sizeof(buffer));
|
||||||
|
if (ret == WIFI_SUCCESS) {
|
||||||
|
result.firmwareDescription = buffer;
|
||||||
|
} else {
|
||||||
|
LOG(WARNING) << "Failed to get firmware version: "
|
||||||
|
<< LegacyErrorToString(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// send callback
|
||||||
|
for (auto& callback : callbacks_) {
|
||||||
|
callback->onChipDebugInfoAvailable(result);
|
||||||
|
}
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::requestDriverDebugDump() {
|
||||||
|
// TODO implement
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
Return<void> WifiChip::requestFirmwareDebugDump() {
|
||||||
|
// TODO implement
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
66
wifi/1.0/default/wifi_chip.h
Normal file
66
wifi/1.0/default/wifi_chip.h
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WIFI_CHIP_H_
|
||||||
|
#define WIFI_CHIP_H_
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <android/hardware/wifi/1.0/IWifiChip.h>
|
||||||
|
#include <android-base/macros.h>
|
||||||
|
#include <hardware_legacy/wifi_hal.h>
|
||||||
|
|
||||||
|
#include "wifi_hal_state.h"
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
class WifiChip : public V1_0::IWifiChip {
|
||||||
|
public:
|
||||||
|
WifiChip(
|
||||||
|
WifiHalState* hal_state, wifi_interface_handle interface_handle);
|
||||||
|
|
||||||
|
void Invalidate();
|
||||||
|
|
||||||
|
Return<void> registerEventCallback(
|
||||||
|
const sp<V1_0::IWifiChipEventCallback>& callback) override;
|
||||||
|
|
||||||
|
Return<void> getAvailableModes(getAvailableModes_cb cb) override;
|
||||||
|
|
||||||
|
Return<void> configureChip(uint32_t mode_id) override;
|
||||||
|
|
||||||
|
Return<uint32_t> getMode() override;
|
||||||
|
|
||||||
|
Return<void> requestChipDebugInfo() override;
|
||||||
|
|
||||||
|
Return<void> requestDriverDebugDump() override;
|
||||||
|
|
||||||
|
Return<void> requestFirmwareDebugDump() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
WifiHalState* hal_state_;
|
||||||
|
wifi_interface_handle interface_handle_;
|
||||||
|
std::set<sp<V1_0::IWifiChipEventCallback>> callbacks_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(WifiChip);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
||||||
|
|
||||||
|
#endif // WIFI_CHIP_H_
|
58
wifi/1.0/default/wifi_hal_state.cpp
Normal file
58
wifi/1.0/default/wifi_hal_state.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* 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 "wifi_hal_state.h"
|
||||||
|
|
||||||
|
#include <android-base/logging.h>
|
||||||
|
#include <hardware_legacy/wifi_hal.h>
|
||||||
|
#include <utils/Looper.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
class FunctionMessageHandler : public android::MessageHandler {
|
||||||
|
public:
|
||||||
|
explicit FunctionMessageHandler(const std::function<void()>& callback)
|
||||||
|
: callback_(callback) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~FunctionMessageHandler() override = default;
|
||||||
|
|
||||||
|
virtual void handleMessage(const android::Message& /*message*/) {
|
||||||
|
callback_();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const std::function<void()> callback_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(FunctionMessageHandler);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
WifiHalState::WifiHalState(sp<Looper>& looper)
|
||||||
|
: run_state_(RunState::STOPPED), looper_(looper) {}
|
||||||
|
|
||||||
|
void WifiHalState::PostTask(const std::function<void()>& callback) {
|
||||||
|
sp<MessageHandler> message_handler =
|
||||||
|
new FunctionMessageHandler(callback);
|
||||||
|
looper_->sendMessage(message_handler, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
62
wifi/1.0/default/wifi_hal_state.h
Normal file
62
wifi/1.0/default/wifi_hal_state.h
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WIFI_HAL_LEGACY_WIFI_HAL_STATE_H_
|
||||||
|
#define WIFI_HAL_LEGACY_WIFI_HAL_STATE_H_
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include <android-base/macros.h>
|
||||||
|
#include <hardware_legacy/wifi_hal.h>
|
||||||
|
#include <utils/Looper.h>
|
||||||
|
|
||||||
|
namespace android {
|
||||||
|
namespace hardware {
|
||||||
|
namespace wifi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class that stores common state and functionality shared between HAL services.
|
||||||
|
*/
|
||||||
|
class WifiHalState {
|
||||||
|
public:
|
||||||
|
WifiHalState(sp<Looper>& looper);
|
||||||
|
|
||||||
|
/** Post a task to be executed on the main thread */
|
||||||
|
void PostTask(const std::function<void()>& callback);
|
||||||
|
|
||||||
|
wifi_hal_fn func_table_;
|
||||||
|
/** opaque handle from vendor for use while HAL is running */
|
||||||
|
wifi_handle hal_handle_;
|
||||||
|
|
||||||
|
enum class RunState {
|
||||||
|
STOPPED,
|
||||||
|
STARTED,
|
||||||
|
STOPPING
|
||||||
|
};
|
||||||
|
|
||||||
|
RunState run_state_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
sp<Looper> looper_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(WifiHalState);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace wifi
|
||||||
|
} // namespace hardware
|
||||||
|
} // namespace android
|
||||||
|
|
||||||
|
#endif // WIFI_HAL_LEGACY_WIFI_HAL_STATE_H_
|
Loading…
Reference in a new issue