diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-05-07 07:21:15 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-05-07 07:21:15 -0700 |
commit | 902905682da7247aac3a73a71057e87f9758f0b1 (patch) | |
tree | 49bc54a6f8cf4fa222a40172e1105590853e505b /nexus/WifiController.cpp | |
parent | 747baadddb37737b0ecf83f6147a5e3252a34b12 (diff) | |
parent | 269946c09faaff88403289bcfa2519e994f75c21 (diff) | |
download | system_core-902905682da7247aac3a73a71057e87f9758f0b1.zip system_core-902905682da7247aac3a73a71057e87f9758f0b1.tar.gz system_core-902905682da7247aac3a73a71057e87f9758f0b1.tar.bz2 |
Merge changes 1093,1094 into donut
* changes:
init.rc: Add Nexus to services (disabled for now)
nexus: Initial checkin of Nexus - android native network management daemon.
Diffstat (limited to 'nexus/WifiController.cpp')
-rw-r--r-- | nexus/WifiController.cpp | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/nexus/WifiController.cpp b/nexus/WifiController.cpp new file mode 100644 index 0000000..8a7e33f --- /dev/null +++ b/nexus/WifiController.cpp @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2008 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 <string.h> +#include <errno.h> + +#define LOG_TAG "WifiController" +#include <cutils/log.h> + +#include "Supplicant.h" +#include "WifiController.h" + +WifiController::WifiController(char *modpath, char *modname, char *modargs) : + Controller("WIFI") { + strncpy(mModulePath, modpath, sizeof(mModulePath)); + strncpy(mModuleName, modname, sizeof(mModuleName)); + strncpy(mModuleArgs, modargs, sizeof(mModuleArgs)); + + mSupplicant = new Supplicant(); + mCurrentScanMode = 0; +} + +int WifiController::start() { + return 0; +} + +int WifiController::stop() { + errno = ENOSYS; + return -1; +} + +int WifiController::enable() { + if (!isPoweredUp() && powerUp()) { + LOGE("Powerup failed (%s)", strerror(errno)); + return -1; + } + + if (mModuleName[0] != '\0' && !isKernelModuleLoaded(mModuleName)) { + if (loadKernelModule(mModulePath, mModuleArgs)) { + LOGE("Kernel module load failed (%s)", strerror(errno)); + goto out_powerdown; + } + } + + if (loadFirmware()) { + LOGE("Firmware load failed (%s)", strerror(errno)); + goto out_powerdown; + } + + if (!mSupplicant->isStarted() && mSupplicant->start()) { + LOGE("Supplicant start failed (%s)", strerror(errno)); + goto out_unloadmodule; + } + + return 0; + +out_unloadmodule: + if (mModuleName[0] != '\0' && !isKernelModuleLoaded(mModuleName)) { + if (unloadKernelModule(mModuleName)) { + LOGE("Unable to unload module after failure!"); + } + } + +out_powerdown: + if (powerDown()) { + LOGE("Unable to powerdown after failure!"); + } + return -1; +} + +int WifiController::disable() { + LOGD("disable()"); + + if (mSupplicant->isStarted() && mSupplicant->stop()) { + LOGE("Supplicant stop failed (%s)", strerror(errno)); + return -1; + } + + if (mModuleName[0] != '\0' && isKernelModuleLoaded(mModuleName)) { + if (unloadKernelModule(mModuleName)) { + LOGE("Unable to unload module (%s)", strerror(errno)); + return -1; + } + } + + if (isPoweredUp() && powerDown()) { + LOGE("Powerdown failed (%s)", strerror(errno)); + return -1; + } + return 0; +} + +int WifiController::loadFirmware() { + return 0; +} + +int WifiController::setScanMode(int mode) { + int rc = 0; + + if (mCurrentScanMode == mode) + return 0; + + if (!(mode & SCAN_ENABLE_MASK)) { + if (mCurrentScanMode & SCAN_REPEAT_MASK) + stopPeriodicScan(); + } else if (mode & SCAN_REPEAT_MASK) + rc = startPeriodicScan(); + else + rc = mSupplicant->triggerScan(mode & SCAN_ACTIVE_MASK); + + return rc; +} + +int WifiController::startPeriodicScan() { + errno = -ENOSYS; + return -1; +} + +int WifiController::stopPeriodicScan() { + errno = -ENOSYS; + return -1; +} |