summaryrefslogtreecommitdiffstats
path: root/nexus/WifiController.cpp
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-05-07 07:21:15 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-05-07 07:21:15 -0700
commit902905682da7247aac3a73a71057e87f9758f0b1 (patch)
tree49bc54a6f8cf4fa222a40172e1105590853e505b /nexus/WifiController.cpp
parent747baadddb37737b0ecf83f6147a5e3252a34b12 (diff)
parent269946c09faaff88403289bcfa2519e994f75c21 (diff)
downloadsystem_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.cpp134
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;
+}