| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2008 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 16 |  | 
 | 17 | #include <stdlib.h> | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 18 | #include <string.h> | 
 | 19 | #include <errno.h> | 
 | 20 |  | 
 | 21 | #define LOG_TAG "WifiController" | 
 | 22 | #include <cutils/log.h> | 
 | 23 |  | 
 | 24 | #include "Supplicant.h" | 
 | 25 | #include "WifiController.h" | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 26 | #include "NetworkManager.h" | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 27 | #include "ResponseCode.h" | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 28 | #include "WifiNetwork.h" | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 29 | #include "ISupplicantEventHandler.h" | 
 | 30 | #include "SupplicantState.h" | 
 | 31 | #include "SupplicantStatus.h" | 
 | 32 | #include "SupplicantAssociatingEvent.h" | 
 | 33 | #include "SupplicantAssociatedEvent.h" | 
 | 34 | #include "SupplicantConnectedEvent.h" | 
 | 35 | #include "SupplicantScanResultsEvent.h" | 
 | 36 | #include "SupplicantStateChangeEvent.h" | 
 | 37 | #include "SupplicantConnectionTimeoutEvent.h" | 
 | 38 | #include "SupplicantDisconnectedEvent.h" | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 39 | #include "WifiStatusPoller.h" | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 40 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 41 | WifiController::WifiController(PropertyManager *mPropMngr, | 
 | 42 |                                IControllerHandler *handlers, | 
 | 43 |                                char *modpath, char *modname, char *modargs) : | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 44 |                 Controller("wifi", mPropMngr, handlers) { | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 45 |     strncpy(mModulePath, modpath, sizeof(mModulePath)); | 
 | 46 |     strncpy(mModuleName, modname, sizeof(mModuleName)); | 
 | 47 |     strncpy(mModuleArgs, modargs, sizeof(mModuleArgs)); | 
 | 48 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 49 |     mLatestScanResults = new ScanResultCollection(); | 
 | 50 |     pthread_mutex_init(&mLatestScanResultsLock, NULL); | 
 | 51 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 52 |     pthread_mutex_init(&mLock, NULL); | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 53 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 54 |     mSupplicant = new Supplicant(this, this); | 
 | 55 |     mActiveScan = false; | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 56 |     mEnabled = false; | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 57 |     mScanOnly = false; | 
 | 58 |     mPacketFilter = false; | 
 | 59 |     mBluetoothCoexScan = false; | 
 | 60 |     mBluetoothCoexMode = 0; | 
 | 61 |     mCurrentlyConnectedNetworkId = -1; | 
 | 62 |     mStatusPoller = new WifiStatusPoller(this); | 
 | 63 |     mRssiEventThreshold = 5; | 
 | 64 |     mLastLinkSpeed = 0; | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 65 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 66 |     mSupplicantState = SupplicantState::UNKNOWN; | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 67 |  | 
 | 68 |     mStaticProperties.propEnabled = new WifiEnabledProperty(this); | 
 | 69 |     mStaticProperties.propScanOnly = new WifiScanOnlyProperty(this); | 
 | 70 |     mStaticProperties.propAllowedChannels = new WifiAllowedChannelsProperty(this); | 
 | 71 |  | 
 | 72 |     mStaticProperties.propRssiEventThreshold = | 
 | 73 |             new IntegerPropertyHelper("RssiEventThreshold", false, &mRssiEventThreshold); | 
 | 74 |  | 
 | 75 |     mDynamicProperties.propSupplicantState = new WifiSupplicantStateProperty(this); | 
 | 76 |     mDynamicProperties.propActiveScan = new WifiActiveScanProperty(this); | 
 | 77 |     mDynamicProperties.propInterface = new WifiInterfaceProperty(this); | 
 | 78 |     mDynamicProperties.propSearching = new WifiSearchingProperty(this); | 
 | 79 |     mDynamicProperties.propPacketFilter = new WifiPacketFilterProperty(this); | 
 | 80 |     mDynamicProperties.propBluetoothCoexScan = new WifiBluetoothCoexScanProperty(this); | 
 | 81 |     mDynamicProperties.propBluetoothCoexMode = new WifiBluetoothCoexModeProperty(this); | 
 | 82 |     mDynamicProperties.propCurrentNetwork = new WifiCurrentNetworkProperty(this); | 
 | 83 |  | 
 | 84 |     mDynamicProperties.propRssi = new IntegerPropertyHelper("Rssi", true, &mLastRssi); | 
 | 85 |     mDynamicProperties.propLinkSpeed = new IntegerPropertyHelper("LinkSpeed", true, &mLastLinkSpeed); | 
 | 86 |  | 
 | 87 |     mDynamicProperties.propSuspended = new WifiSuspendedProperty(this); | 
 | 88 |     mDynamicProperties.propNetCount = new WifiNetCountProperty(this); | 
 | 89 |     mDynamicProperties.propTriggerScan = new WifiTriggerScanProperty(this); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 90 | } | 
 | 91 |  | 
 | 92 | int WifiController::start() { | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 93 |     mPropMngr->attachProperty("wifi", mStaticProperties.propEnabled); | 
 | 94 |     mPropMngr->attachProperty("wifi", mStaticProperties.propScanOnly); | 
 | 95 |     mPropMngr->attachProperty("wifi", mStaticProperties.propAllowedChannels); | 
 | 96 |     mPropMngr->attachProperty("wifi", mStaticProperties.propRssiEventThreshold); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 97 |     return 0; | 
 | 98 | } | 
 | 99 |  | 
 | 100 | int WifiController::stop() { | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 101 |     mPropMngr->detachProperty("wifi", mStaticProperties.propEnabled); | 
 | 102 |     mPropMngr->detachProperty("wifi", mStaticProperties.propScanOnly); | 
 | 103 |     mPropMngr->detachProperty("wifi", mStaticProperties.propAllowedChannels); | 
 | 104 |     mPropMngr->detachProperty("wifi", mStaticProperties.propRssiEventThreshold); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 105 |     return 0; | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 106 | } | 
 | 107 |  | 
 | 108 | int WifiController::enable() { | 
| San Mehat | 0f48658 | 2009-06-16 10:50:47 -0700 | [diff] [blame] | 109 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 110 |     if (!isPoweredUp()) { | 
| Steve Block | 4163b45 | 2012-01-04 19:19:03 +0000 | [diff] [blame] | 111 |         ALOGI("Powering up"); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 112 |         sendStatusBroadcast("Powering up WiFi hardware"); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 113 |         if (powerUp()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 114 |             ALOGE("Powerup failed (%s)", strerror(errno)); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 115 |             return -1; | 
 | 116 |         } | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 117 |     } | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 118 |  | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 119 |     if (mModuleName[0] != '\0' && !isKernelModuleLoaded(mModuleName)) { | 
| Steve Block | 4163b45 | 2012-01-04 19:19:03 +0000 | [diff] [blame] | 120 |         ALOGI("Loading driver"); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 121 |         sendStatusBroadcast("Loading WiFi driver"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 122 |         if (loadKernelModule(mModulePath, mModuleArgs)) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 123 |             ALOGE("Kernel module load failed (%s)", strerror(errno)); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 124 |             goto out_powerdown; | 
 | 125 |         } | 
 | 126 |     } | 
 | 127 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 128 |     if (!isFirmwareLoaded()) { | 
| Steve Block | 4163b45 | 2012-01-04 19:19:03 +0000 | [diff] [blame] | 129 |         ALOGI("Loading firmware"); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 130 |         sendStatusBroadcast("Loading WiFI firmware"); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 131 |         if (loadFirmware()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 132 |             ALOGE("Firmware load failed (%s)", strerror(errno)); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 133 |             goto out_powerdown; | 
 | 134 |         } | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 135 |     } | 
 | 136 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 137 |     if (!mSupplicant->isStarted()) { | 
| Steve Block | 4163b45 | 2012-01-04 19:19:03 +0000 | [diff] [blame] | 138 |         ALOGI("Starting WPA Supplicant"); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 139 |         sendStatusBroadcast("Starting WPA Supplicant"); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 140 |         if (mSupplicant->start()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 141 |             ALOGE("Supplicant start failed (%s)", strerror(errno)); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 142 |             goto out_unloadmodule; | 
 | 143 |         } | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 144 |     } | 
 | 145 |  | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 146 |     if (Controller::bindInterface(mSupplicant->getInterfaceName())) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 147 |         ALOGE("Error binding interface (%s)", strerror(errno)); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 148 |         goto out_unloadmodule; | 
 | 149 |     } | 
 | 150 |  | 
 | 151 |     if (mSupplicant->refreshNetworkList()) | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 152 |         ALOGW("Error getting list of networks (%s)", strerror(errno)); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 153 |  | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 154 |     ALOGW("TODO: Set # of allowed regulatory channels!"); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 155 |  | 
 | 156 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propSupplicantState); | 
 | 157 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propActiveScan); | 
 | 158 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propInterface); | 
 | 159 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propSearching); | 
 | 160 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propPacketFilter); | 
 | 161 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propBluetoothCoexScan); | 
 | 162 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propBluetoothCoexMode); | 
 | 163 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propCurrentNetwork); | 
 | 164 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propRssi); | 
 | 165 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propLinkSpeed); | 
 | 166 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propSuspended); | 
 | 167 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propNetCount); | 
 | 168 |     mPropMngr->attachProperty("wifi", mDynamicProperties.propTriggerScan); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 169 |  | 
| Steve Block | 4163b45 | 2012-01-04 19:19:03 +0000 | [diff] [blame] | 170 |     ALOGI("Enabled successfully"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 171 |     return 0; | 
 | 172 |  | 
 | 173 | out_unloadmodule: | 
 | 174 |     if (mModuleName[0] != '\0' && !isKernelModuleLoaded(mModuleName)) { | 
 | 175 |         if (unloadKernelModule(mModuleName)) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 176 |             ALOGE("Unable to unload module after failure!"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 177 |         } | 
 | 178 |     } | 
 | 179 |  | 
 | 180 | out_powerdown: | 
 | 181 |     if (powerDown()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 182 |         ALOGE("Unable to powerdown after failure!"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 183 |     } | 
 | 184 |     return -1; | 
 | 185 | } | 
 | 186 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 187 | bool WifiController::getSuspended() { | 
 | 188 |     pthread_mutex_lock(&mLock); | 
 | 189 |     bool r = mSuspended; | 
 | 190 |     pthread_mutex_unlock(&mLock); | 
 | 191 |     return r; | 
 | 192 | } | 
 | 193 |  | 
 | 194 | int WifiController::setSuspend(bool suspend) { | 
 | 195 |  | 
 | 196 |     pthread_mutex_lock(&mLock); | 
 | 197 |     if (suspend == mSuspended) { | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 198 |         ALOGW("Suspended state already = %d", suspend); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 199 |         pthread_mutex_unlock(&mLock); | 
 | 200 |         return 0; | 
 | 201 |     } | 
 | 202 |  | 
 | 203 |     if (suspend) { | 
 | 204 |         mHandlers->onControllerSuspending(this); | 
 | 205 |  | 
 | 206 |         char tmp[80]; | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 207 |         ALOGD("Suspending from supplicant state %s", | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 208 |              SupplicantState::toString(mSupplicantState, | 
 | 209 |                                        tmp, | 
 | 210 |                                        sizeof(tmp))); | 
 | 211 |  | 
 | 212 |         if (mSupplicantState != SupplicantState::IDLE) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 213 |             ALOGD("Forcing Supplicant disconnect"); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 214 |             if (mSupplicant->disconnect()) { | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 215 |                 ALOGW("Error disconnecting (%s)", strerror(errno)); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 216 |             } | 
 | 217 |         } | 
 | 218 |  | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 219 |         ALOGD("Stopping Supplicant driver"); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 220 |         if (mSupplicant->stopDriver()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 221 |             ALOGE("Error stopping driver (%s)", strerror(errno)); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 222 |             pthread_mutex_unlock(&mLock); | 
 | 223 |             return -1; | 
 | 224 |         } | 
 | 225 |     } else { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 226 |         ALOGD("Resuming"); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 227 |  | 
 | 228 |         if (mSupplicant->startDriver()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 229 |             ALOGE("Error resuming driver (%s)", strerror(errno)); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 230 |             pthread_mutex_unlock(&mLock); | 
 | 231 |             return -1; | 
 | 232 |         } | 
 | 233 |         // XXX: set regulatory max channels  | 
 | 234 |         if (mScanOnly) | 
 | 235 |             mSupplicant->triggerScan(); | 
 | 236 |         else | 
 | 237 |             mSupplicant->reconnect(); | 
 | 238 |  | 
 | 239 |         mHandlers->onControllerResumed(this); | 
 | 240 |     } | 
 | 241 |  | 
 | 242 |     mSuspended = suspend; | 
 | 243 |     pthread_mutex_unlock(&mLock); | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 244 |     ALOGD("Suspend / Resume completed"); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 245 |     return 0; | 
 | 246 | } | 
 | 247 |  | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 248 | void WifiController::sendStatusBroadcast(const char *msg) { | 
| San Mehat | 8d3fc3f | 2009-05-12 14:36:32 -0700 | [diff] [blame] | 249 |     NetworkManager::Instance()-> | 
 | 250 |                     getBroadcaster()-> | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 251 |                     sendBroadcast(ResponseCode::UnsolicitedInformational, msg, false); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 252 | } | 
 | 253 |  | 
 | 254 | int WifiController::disable() { | 
 | 255 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 256 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propSupplicantState); | 
 | 257 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propActiveScan); | 
 | 258 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propInterface); | 
 | 259 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propSearching); | 
 | 260 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propPacketFilter); | 
 | 261 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propBluetoothCoexScan); | 
 | 262 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propBluetoothCoexMode); | 
 | 263 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propCurrentNetwork); | 
 | 264 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propRssi); | 
 | 265 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propLinkSpeed); | 
 | 266 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propSuspended); | 
 | 267 |     mPropMngr->detachProperty("wifi", mDynamicProperties.propNetCount); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 268 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 269 |     if (mSupplicant->isStarted()) { | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 270 |         sendStatusBroadcast("Stopping WPA Supplicant"); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 271 |         if (mSupplicant->stop()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 272 |             ALOGE("Supplicant stop failed (%s)", strerror(errno)); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 273 |             return -1; | 
 | 274 |         } | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 275 |     } else | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 276 |         ALOGW("disable(): Supplicant not running?"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 277 |  | 
 | 278 |     if (mModuleName[0] != '\0' && isKernelModuleLoaded(mModuleName)) { | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 279 |         sendStatusBroadcast("Unloading WiFi driver"); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 280 |         if (unloadKernelModule(mModuleName)) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 281 |             ALOGE("Unable to unload module (%s)", strerror(errno)); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 282 |             return -1; | 
 | 283 |         } | 
 | 284 |     } | 
 | 285 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 286 |     if (isPoweredUp()) { | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 287 |         sendStatusBroadcast("Powering down WiFi hardware"); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 288 |         if (powerDown()) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 289 |             ALOGE("Powerdown failed (%s)", strerror(errno)); | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 290 |             return -1; | 
 | 291 |         } | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 292 |     } | 
 | 293 |     return 0; | 
 | 294 | } | 
 | 295 |  | 
 | 296 | int WifiController::loadFirmware() { | 
 | 297 |     return 0; | 
 | 298 | } | 
 | 299 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 300 | int WifiController::triggerScan() { | 
 | 301 |     pthread_mutex_lock(&mLock); | 
 | 302 |     if (verifyNotSuspended()) { | 
 | 303 |         pthread_mutex_unlock(&mLock); | 
 | 304 |         return -1; | 
 | 305 |     } | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 306 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 307 |     switch (mSupplicantState) { | 
 | 308 |         case SupplicantState::DISCONNECTED: | 
 | 309 |         case SupplicantState::INACTIVE: | 
 | 310 |         case SupplicantState::SCANNING: | 
 | 311 |         case SupplicantState::IDLE: | 
 | 312 |             break; | 
 | 313 |         default: | 
 | 314 |             // Switch to scan only mode | 
 | 315 |             mSupplicant->setApScanMode(2); | 
 | 316 |             break; | 
 | 317 |     } | 
 | 318 |  | 
 | 319 |     int rc = mSupplicant->triggerScan(); | 
 | 320 |     pthread_mutex_unlock(&mLock); | 
 | 321 |     return rc; | 
 | 322 | } | 
 | 323 |  | 
 | 324 | int WifiController::setActiveScan(bool active) { | 
 | 325 |     pthread_mutex_lock(&mLock); | 
 | 326 |     if (mActiveScan == active) { | 
 | 327 |         pthread_mutex_unlock(&mLock); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 328 |         return 0; | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 329 |     } | 
 | 330 |     mActiveScan = active; | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 331 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 332 |     int rc = mSupplicant->setScanMode(active); | 
 | 333 |     pthread_mutex_unlock(&mLock); | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 334 |     return rc; | 
 | 335 | } | 
 | 336 |  | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 337 | WifiNetwork *WifiController::createNetwork() { | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 338 |     pthread_mutex_lock(&mLock); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 339 |     WifiNetwork *wn = mSupplicant->createNetwork(); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 340 |     pthread_mutex_unlock(&mLock); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 341 |     return wn; | 
| San Mehat | 82a2116 | 2009-05-12 17:26:28 -0700 | [diff] [blame] | 342 | } | 
 | 343 |  | 
 | 344 | int WifiController::removeNetwork(int networkId) { | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 345 |     pthread_mutex_lock(&mLock); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 346 |     WifiNetwork *wn = mSupplicant->lookupNetwork(networkId); | 
 | 347 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 348 |     if (!wn) { | 
 | 349 |         pthread_mutex_unlock(&mLock); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 350 |         return -1; | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 351 |     } | 
 | 352 |     int rc = mSupplicant->removeNetwork(wn); | 
 | 353 |     pthread_mutex_unlock(&mLock); | 
 | 354 |     return rc; | 
| San Mehat | 82a2116 | 2009-05-12 17:26:28 -0700 | [diff] [blame] | 355 | } | 
 | 356 |  | 
| San Mehat | 1441e76 | 2009-05-07 11:37:10 -0700 | [diff] [blame] | 357 | ScanResultCollection *WifiController::createScanResults() { | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 358 |     ScanResultCollection *d = new ScanResultCollection(); | 
 | 359 |     ScanResultCollection::iterator i; | 
 | 360 |  | 
 | 361 |     pthread_mutex_lock(&mLatestScanResultsLock); | 
 | 362 |     for (i = mLatestScanResults->begin(); i != mLatestScanResults->end(); ++i) | 
 | 363 |         d->push_back((*i)->clone()); | 
 | 364 |  | 
 | 365 |     pthread_mutex_unlock(&mLatestScanResultsLock); | 
 | 366 |     return d; | 
| San Mehat | dc26607 | 2009-05-06 11:16:52 -0700 | [diff] [blame] | 367 | } | 
| San Mehat | 82a2116 | 2009-05-12 17:26:28 -0700 | [diff] [blame] | 368 |  | 
| San Mehat | 82a2116 | 2009-05-12 17:26:28 -0700 | [diff] [blame] | 369 | WifiNetworkCollection *WifiController::createNetworkList() { | 
 | 370 |     return mSupplicant->createNetworkList(); | 
 | 371 | } | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 372 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 373 | int WifiController::setPacketFilter(bool enable) { | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 374 |     int rc; | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 375 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 376 |     pthread_mutex_lock(&mLock); | 
 | 377 |     if (enable) | 
 | 378 |         rc = mSupplicant->enablePacketFilter(); | 
 | 379 |     else | 
 | 380 |         rc = mSupplicant->disablePacketFilter(); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 381 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 382 |     if (!rc) | 
 | 383 |         mPacketFilter = enable; | 
 | 384 |     pthread_mutex_unlock(&mLock); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 385 |     return rc; | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 386 | } | 
 | 387 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 388 | int WifiController::setBluetoothCoexistenceScan(bool enable) { | 
 | 389 |     int rc; | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 390 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 391 |     pthread_mutex_lock(&mLock); | 
 | 392 |  | 
 | 393 |     if (enable) | 
 | 394 |         rc = mSupplicant->enableBluetoothCoexistenceScan(); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 395 |     else | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 396 |         rc = mSupplicant->disableBluetoothCoexistenceScan(); | 
| San Mehat | 3c5a6f0 | 2009-05-22 15:36:13 -0700 | [diff] [blame] | 397 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 398 |     if (!rc) | 
 | 399 |         mBluetoothCoexScan = enable; | 
 | 400 |     pthread_mutex_unlock(&mLock); | 
 | 401 |     return rc; | 
 | 402 | } | 
 | 403 |  | 
 | 404 | int WifiController::setScanOnly(bool scanOnly) { | 
 | 405 |     pthread_mutex_lock(&mLock); | 
 | 406 |     int rc = mSupplicant->setApScanMode((scanOnly ? 2 : 1)); | 
 | 407 |     if (!rc) | 
 | 408 |         mScanOnly = scanOnly; | 
 | 409 |     if (!mSuspended) { | 
 | 410 |         if (scanOnly) | 
 | 411 |             mSupplicant->disconnect(); | 
 | 412 |         else | 
 | 413 |             mSupplicant->reconnect(); | 
 | 414 |     } | 
 | 415 |     pthread_mutex_unlock(&mLock); | 
 | 416 |     return rc; | 
 | 417 | } | 
 | 418 |  | 
 | 419 | int WifiController::setBluetoothCoexistenceMode(int mode) { | 
 | 420 |     pthread_mutex_lock(&mLock); | 
 | 421 |     int rc = mSupplicant->setBluetoothCoexistenceMode(mode); | 
 | 422 |     if (!rc) | 
 | 423 |         mBluetoothCoexMode = mode; | 
 | 424 |     pthread_mutex_unlock(&mLock); | 
 | 425 |     return rc; | 
| San Mehat | 4876567 | 2009-05-20 15:28:43 -0700 | [diff] [blame] | 426 | } | 
 | 427 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 428 | void WifiController::onAssociatingEvent(SupplicantAssociatingEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 429 |     ALOGD("onAssociatingEvent(%s, %s, %d)", | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 430 |          (evt->getBssid() ? evt->getBssid() : "n/a"), | 
 | 431 |          (evt->getSsid() ? evt->getSsid() : "n/a"), | 
 | 432 |          evt->getFreq()); | 
 | 433 | } | 
 | 434 |  | 
 | 435 | void WifiController::onAssociatedEvent(SupplicantAssociatedEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 436 |     ALOGD("onAssociatedEvent(%s)", evt->getBssid()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 437 | } | 
 | 438 |  | 
 | 439 | void WifiController::onConnectedEvent(SupplicantConnectedEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 440 |     ALOGD("onConnectedEvent(%s, %d)", evt->getBssid(), evt->getReassociated()); | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 441 |     SupplicantStatus *ss = mSupplicant->getStatus(); | 
 | 442 |     WifiNetwork *wn; | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 443 |  | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 444 |     if (ss->getWpaState() != SupplicantState::COMPLETED) { | 
 | 445 |         char tmp[32]; | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 446 |  | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 447 |         ALOGW("onConnected() with SupplicantState = %s!", | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 448 |              SupplicantState::toString(ss->getWpaState(), tmp, | 
 | 449 |              sizeof(tmp))); | 
 | 450 |         return; | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 451 |     } | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 452 |  | 
 | 453 |     if (ss->getId() == -1) { | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 454 |         ALOGW("onConnected() with id = -1!"); | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 455 |         return; | 
 | 456 |     } | 
 | 457 |      | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 458 |     mCurrentlyConnectedNetworkId = ss->getId(); | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 459 |     if (!(wn = mSupplicant->lookupNetwork(ss->getId()))) { | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 460 |         ALOGW("Error looking up connected network id %d (%s)", | 
| San Mehat | d6c6796 | 2009-06-22 10:39:36 -0700 | [diff] [blame] | 461 |              ss->getId(), strerror(errno)); | 
 | 462 |         return; | 
 | 463 |     } | 
 | 464 |    | 
 | 465 |     delete ss; | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 466 |     mHandlers->onInterfaceConnected(this); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 467 | } | 
 | 468 |  | 
 | 469 | void WifiController::onScanResultsEvent(SupplicantScanResultsEvent *evt) { | 
 | 470 |     char *reply; | 
 | 471 |  | 
 | 472 |     if (!(reply = (char *) malloc(4096))) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 473 |         ALOGE("Out of memory"); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 474 |         return; | 
 | 475 |     } | 
 | 476 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 477 |     mNumScanResultsSinceLastStateChange++; | 
 | 478 |     if (mNumScanResultsSinceLastStateChange >= 3) | 
 | 479 |         mIsSupplicantSearching = false; | 
 | 480 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 481 |     size_t len = 4096; | 
 | 482 |  | 
 | 483 |     if (mSupplicant->sendCommand("SCAN_RESULTS", reply, &len)) { | 
| Steve Block | 4f07a1f | 2012-01-05 22:25:38 +0000 | [diff] [blame] | 484 |         ALOGW("onScanResultsEvent: Error getting scan results (%s)", | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 485 |              strerror(errno)); | 
 | 486 |         free(reply); | 
 | 487 |         return; | 
 | 488 |     } | 
 | 489 |  | 
 | 490 |     pthread_mutex_lock(&mLatestScanResultsLock); | 
 | 491 |     if (!mLatestScanResults->empty()) { | 
 | 492 |         ScanResultCollection::iterator i; | 
 | 493 |  | 
 | 494 |         for (i = mLatestScanResults->begin(); | 
 | 495 |              i !=mLatestScanResults->end(); ++i) { | 
 | 496 |             delete *i; | 
 | 497 |         } | 
 | 498 |         mLatestScanResults->clear(); | 
 | 499 |     } | 
 | 500 |  | 
 | 501 |     char *linep; | 
 | 502 |     char *linep_next = NULL; | 
 | 503 |  | 
 | 504 |     if (!strtok_r(reply, "\n", &linep_next)) { | 
 | 505 |         free(reply); | 
 | 506 |         pthread_mutex_unlock(&mLatestScanResultsLock); | 
 | 507 |         return; | 
 | 508 |     } | 
 | 509 |  | 
 | 510 |     while((linep = strtok_r(NULL, "\n", &linep_next))) | 
 | 511 |         mLatestScanResults->push_back(new ScanResult(linep)); | 
 | 512 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 513 |     // Switch handling of scan results back to normal mode | 
 | 514 |     mSupplicant->setApScanMode(1); | 
 | 515 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 516 |     char *tmp; | 
 | 517 |     asprintf(&tmp, "Scan results ready (%d)", mLatestScanResults->size()); | 
 | 518 |     NetworkManager::Instance()->getBroadcaster()-> | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 519 |                                 sendBroadcast(ResponseCode::ScanResultsReady, | 
 | 520 |                                               tmp, false); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 521 |     free(tmp); | 
 | 522 |     pthread_mutex_unlock(&mLatestScanResultsLock); | 
 | 523 |     free(reply); | 
 | 524 | } | 
 | 525 |  | 
 | 526 | void WifiController::onStateChangeEvent(SupplicantStateChangeEvent *evt) { | 
 | 527 |     char tmp[32]; | 
 | 528 |     char tmp2[32]; | 
 | 529 |      | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 530 |     if (evt->getState() == mSupplicantState) | 
 | 531 |         return; | 
 | 532 |  | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 533 |     ALOGD("onStateChangeEvent(%s -> %s)", | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 534 |          SupplicantState::toString(mSupplicantState, tmp, sizeof(tmp)), | 
 | 535 |          SupplicantState::toString(evt->getState(), tmp2, sizeof(tmp2))); | 
 | 536 |  | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 537 |     if (evt->getState() != SupplicantState::SCANNING) { | 
 | 538 |         mIsSupplicantSearching = true; | 
 | 539 |         mNumScanResultsSinceLastStateChange = 0; | 
 | 540 |     } | 
 | 541 |  | 
 | 542 |     char *tmp3; | 
 | 543 |     asprintf(&tmp3, | 
 | 544 |              "Supplicant state changed from %d (%s) -> %d (%s)", | 
 | 545 |              mSupplicantState, tmp, evt->getState(), tmp2); | 
 | 546 |  | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 547 |     mSupplicantState = evt->getState(); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 548 |  | 
 | 549 |     if (mSupplicantState == SupplicantState::COMPLETED) { | 
 | 550 |         mStatusPoller->start(); | 
 | 551 |     } else if (mStatusPoller->isStarted()) { | 
 | 552 |         mStatusPoller->stop(); | 
 | 553 |     } | 
 | 554 |  | 
 | 555 |     NetworkManager::Instance()->getBroadcaster()-> | 
 | 556 |                                 sendBroadcast(ResponseCode::SupplicantStateChange, | 
 | 557 |                                               tmp3, false); | 
 | 558 |     free(tmp3); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 559 | } | 
 | 560 |  | 
 | 561 | void WifiController::onConnectionTimeoutEvent(SupplicantConnectionTimeoutEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 562 |     ALOGD("onConnectionTimeoutEvent(%s)", evt->getBssid()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 563 | } | 
 | 564 |  | 
 | 565 | void WifiController::onDisconnectedEvent(SupplicantDisconnectedEvent *evt) { | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 566 |     mCurrentlyConnectedNetworkId = -1; | 
 | 567 |     mHandlers->onInterfaceDisconnected(this); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 568 | } | 
 | 569 |  | 
 | 570 | #if 0 | 
 | 571 | void WifiController::onTerminatingEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 572 |     ALOGD("onTerminatingEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 573 | } | 
 | 574 |  | 
 | 575 | void WifiController::onPasswordChangedEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 576 |     ALOGD("onPasswordChangedEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 577 | } | 
 | 578 |  | 
 | 579 | void WifiController::onEapNotificationEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 580 |     ALOGD("onEapNotificationEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 581 | } | 
 | 582 |  | 
 | 583 | void WifiController::onEapStartedEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 584 |     ALOGD("onEapStartedEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 585 | } | 
 | 586 |  | 
 | 587 | void WifiController::onEapMethodEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 588 |     ALOGD("onEapMethodEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 589 | } | 
 | 590 |  | 
 | 591 | void WifiController::onEapSuccessEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 592 |     ALOGD("onEapSuccessEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 593 | } | 
 | 594 |  | 
 | 595 | void WifiController::onEapFailureEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 596 |     ALOGD("onEapFailureEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 597 | } | 
 | 598 |  | 
 | 599 | void WifiController::onLinkSpeedEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 600 |     ALOGD("onLinkSpeedEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 601 | } | 
 | 602 |  | 
 | 603 | void WifiController::onDriverStateEvent(SupplicantEvent *evt) { | 
| Steve Block | 9786ec4 | 2011-12-20 16:07:45 +0000 | [diff] [blame] | 604 |     ALOGD("onDriverStateEvent(%s)", evt->getEvent()); | 
| San Mehat | 3aff2d1 | 2009-06-15 14:10:44 -0700 | [diff] [blame] | 605 | } | 
 | 606 | #endif | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 607 |  | 
 | 608 | void WifiController::onStatusPollInterval() { | 
 | 609 |     pthread_mutex_lock(&mLock); | 
 | 610 |     int rssi; | 
 | 611 |     if (mSupplicant->getRssi(&rssi)) { | 
| Steve Block | 8aeb6e2 | 2012-01-06 14:13:42 +0000 | [diff] [blame] | 612 |         ALOGE("Failed to get rssi (%s)", strerror(errno)); | 
| San Mehat | c4a895b | 2009-06-23 21:10:57 -0700 | [diff] [blame] | 613 |         pthread_mutex_unlock(&mLock); | 
 | 614 |         return; | 
 | 615 |     } | 
 | 616 |  | 
 | 617 |     if (abs(mLastRssi - rssi) > mRssiEventThreshold) { | 
 | 618 |         char *tmp3; | 
 | 619 |         asprintf(&tmp3, "RSSI changed from %d -> %d", | 
 | 620 |                  mLastRssi, rssi); | 
 | 621 |         mLastRssi = rssi; | 
 | 622 |         NetworkManager::Instance()->getBroadcaster()-> | 
 | 623 |                                sendBroadcast(ResponseCode::RssiChange, | 
 | 624 |                                              tmp3, false); | 
 | 625 |         free(tmp3); | 
 | 626 |     } | 
 | 627 |  | 
 | 628 |     int linkspeed = mSupplicant->getLinkSpeed(); | 
 | 629 |     if (linkspeed != mLastLinkSpeed) { | 
 | 630 |         char *tmp3; | 
 | 631 |         asprintf(&tmp3, "Link speed changed from %d -> %d", | 
 | 632 |                  mLastLinkSpeed, linkspeed); | 
 | 633 |         mLastLinkSpeed = linkspeed; | 
 | 634 |         NetworkManager::Instance()->getBroadcaster()-> | 
 | 635 |                                sendBroadcast(ResponseCode::LinkSpeedChange, | 
 | 636 |                                              tmp3, false); | 
 | 637 |         free(tmp3); | 
 | 638 |          | 
 | 639 |     } | 
 | 640 |     pthread_mutex_unlock(&mLock); | 
 | 641 | } | 
 | 642 |  | 
 | 643 | int WifiController::verifyNotSuspended() { | 
 | 644 |     if (mSuspended) { | 
 | 645 |         errno = ESHUTDOWN; | 
 | 646 |         return -1; | 
 | 647 |     } | 
 | 648 |     return 0; | 
 | 649 | } | 
 | 650 |  | 
 | 651 | /* | 
 | 652 |  * Property inner classes | 
 | 653 |  */ | 
 | 654 |  | 
 | 655 | WifiController::WifiIntegerProperty::WifiIntegerProperty(WifiController *c,  | 
 | 656 |                                                          const char *name, | 
 | 657 |                                                          bool ro, | 
 | 658 |                                                          int elements) : | 
 | 659 |                 IntegerProperty(name, ro, elements) { | 
 | 660 |     mWc = c; | 
 | 661 | } | 
 | 662 |  | 
 | 663 | WifiController::WifiStringProperty::WifiStringProperty(WifiController *c,  | 
 | 664 |                                                        const char *name, | 
 | 665 |                                                        bool ro, int elements) : | 
 | 666 |                 StringProperty(name, ro, elements) { | 
 | 667 |     mWc = c; | 
 | 668 | } | 
 | 669 |  | 
 | 670 | WifiController::WifiEnabledProperty::WifiEnabledProperty(WifiController *c) : | 
 | 671 |                 WifiIntegerProperty(c, "Enabled", false, 1) { | 
 | 672 | } | 
 | 673 |  | 
 | 674 | int WifiController::WifiEnabledProperty::get(int idx, int *buffer) { | 
 | 675 |     *buffer = mWc->mEnabled; | 
 | 676 |     return 0; | 
 | 677 | } | 
 | 678 | int WifiController::WifiEnabledProperty::set(int idx, int value) { | 
 | 679 |     int rc = (value ? mWc->enable() : mWc->disable()); | 
 | 680 |     if (!rc) | 
 | 681 |         mWc->mEnabled = value; | 
 | 682 |     return rc; | 
 | 683 | } | 
 | 684 |  | 
 | 685 | WifiController::WifiScanOnlyProperty::WifiScanOnlyProperty(WifiController *c) : | 
 | 686 |                 WifiIntegerProperty(c, "ScanOnly", false, 1) { | 
 | 687 | } | 
 | 688 | int WifiController::WifiScanOnlyProperty::get(int idx, int *buffer) { | 
 | 689 |     *buffer = mWc->mScanOnly; | 
 | 690 |     return 0; | 
 | 691 | } | 
 | 692 | int WifiController::WifiScanOnlyProperty::set(int idx, int value) { | 
 | 693 |     return mWc->setScanOnly(value == 1); | 
 | 694 | } | 
 | 695 |  | 
 | 696 | WifiController::WifiAllowedChannelsProperty::WifiAllowedChannelsProperty(WifiController *c) : | 
 | 697 |                 WifiIntegerProperty(c, "AllowedChannels", false, 1) { | 
 | 698 | } | 
 | 699 | int WifiController::WifiAllowedChannelsProperty::get(int idx, int *buffer) { | 
 | 700 |     *buffer = mWc->mNumAllowedChannels; | 
 | 701 |     return 0; | 
 | 702 | } | 
 | 703 | int WifiController::WifiAllowedChannelsProperty::set(int idx, int value) { | 
 | 704 |     // XXX: IMPL | 
 | 705 |     errno = ENOSYS; | 
 | 706 |     return -1; | 
 | 707 | } | 
 | 708 |  | 
 | 709 | WifiController::WifiSupplicantStateProperty::WifiSupplicantStateProperty(WifiController *c) : | 
 | 710 |                 WifiStringProperty(c, "SupplicantState", true, 1) { | 
 | 711 | } | 
 | 712 | int WifiController::WifiSupplicantStateProperty::get(int idx, char *buffer, size_t max) { | 
 | 713 |     if (!SupplicantState::toString(mWc->mSupplicantState, buffer, max)) | 
 | 714 |         return -1; | 
 | 715 |     return 0; | 
 | 716 | } | 
 | 717 |  | 
 | 718 | WifiController::WifiActiveScanProperty::WifiActiveScanProperty(WifiController *c) : | 
 | 719 |                 WifiIntegerProperty(c, "ActiveScan", false, 1) { | 
 | 720 | } | 
 | 721 | int WifiController::WifiActiveScanProperty::get(int idx, int *buffer) { | 
 | 722 |     *buffer = mWc->mActiveScan; | 
 | 723 |     return 0; | 
 | 724 | } | 
 | 725 | int WifiController::WifiActiveScanProperty::set(int idx, int value) { | 
 | 726 |     return mWc->setActiveScan(value); | 
 | 727 | } | 
 | 728 |  | 
 | 729 | WifiController::WifiInterfaceProperty::WifiInterfaceProperty(WifiController *c) : | 
 | 730 |                 WifiStringProperty(c, "Interface", true, 1) { | 
 | 731 | } | 
 | 732 | int WifiController::WifiInterfaceProperty::get(int idx, char *buffer, size_t max) { | 
 | 733 |     strncpy(buffer, (mWc->getBoundInterface() ? mWc->getBoundInterface() : "none"), max); | 
 | 734 |     return 0; | 
 | 735 | } | 
 | 736 |  | 
 | 737 | WifiController::WifiSearchingProperty::WifiSearchingProperty(WifiController *c) : | 
 | 738 |                 WifiIntegerProperty(c, "Searching", true, 1) { | 
 | 739 | } | 
 | 740 | int WifiController::WifiSearchingProperty::get(int idx, int *buffer) { | 
 | 741 |     *buffer = mWc->mIsSupplicantSearching; | 
 | 742 |     return 0; | 
 | 743 | } | 
 | 744 |  | 
 | 745 | WifiController::WifiPacketFilterProperty::WifiPacketFilterProperty(WifiController *c) : | 
 | 746 |                 WifiIntegerProperty(c, "PacketFilter", false, 1) { | 
 | 747 | } | 
 | 748 | int WifiController::WifiPacketFilterProperty::get(int idx, int *buffer) { | 
 | 749 |     *buffer = mWc->mPacketFilter; | 
 | 750 |     return 0; | 
 | 751 | } | 
 | 752 | int WifiController::WifiPacketFilterProperty::set(int idx, int value) { | 
 | 753 |     return mWc->setPacketFilter(value); | 
 | 754 | } | 
 | 755 |  | 
 | 756 | WifiController::WifiBluetoothCoexScanProperty::WifiBluetoothCoexScanProperty(WifiController *c) : | 
 | 757 |                 WifiIntegerProperty(c, "BluetoothCoexScan", false, 1) { | 
 | 758 | } | 
 | 759 | int WifiController::WifiBluetoothCoexScanProperty::get(int idx, int *buffer) { | 
 | 760 |     *buffer = mWc->mBluetoothCoexScan; | 
 | 761 |     return 0; | 
 | 762 | } | 
 | 763 | int WifiController::WifiBluetoothCoexScanProperty::set(int idx, int value) { | 
 | 764 |     return mWc->setBluetoothCoexistenceScan(value == 1); | 
 | 765 | } | 
 | 766 |  | 
 | 767 | WifiController::WifiBluetoothCoexModeProperty::WifiBluetoothCoexModeProperty(WifiController *c) : | 
 | 768 |                 WifiIntegerProperty(c, "BluetoothCoexMode", false, 1) { | 
 | 769 | } | 
 | 770 | int WifiController::WifiBluetoothCoexModeProperty::get(int idx, int *buffer) { | 
 | 771 |     *buffer = mWc->mBluetoothCoexMode; | 
 | 772 |     return 0; | 
 | 773 | } | 
 | 774 | int WifiController::WifiBluetoothCoexModeProperty::set(int idx, int value) { | 
 | 775 |     return mWc->setBluetoothCoexistenceMode(value); | 
 | 776 | } | 
 | 777 |  | 
 | 778 | WifiController::WifiCurrentNetworkProperty::WifiCurrentNetworkProperty(WifiController *c) : | 
 | 779 |                 WifiIntegerProperty(c, "CurrentlyConnectedNetworkId", true, 1) { | 
 | 780 | } | 
 | 781 | int WifiController::WifiCurrentNetworkProperty::get(int idx, int *buffer) { | 
 | 782 |     *buffer = mWc->mCurrentlyConnectedNetworkId; | 
 | 783 |     return 0; | 
 | 784 | } | 
 | 785 |  | 
 | 786 | WifiController::WifiSuspendedProperty::WifiSuspendedProperty(WifiController *c) : | 
 | 787 |                 WifiIntegerProperty(c, "Suspended", false, 1) { | 
 | 788 | } | 
 | 789 | int WifiController::WifiSuspendedProperty::get(int idx, int *buffer) { | 
 | 790 |     *buffer = mWc->getSuspended(); | 
 | 791 |     return 0; | 
 | 792 | } | 
 | 793 | int WifiController::WifiSuspendedProperty::set(int idx, int value) { | 
 | 794 |     return mWc->setSuspend(value == 1); | 
 | 795 | } | 
 | 796 |  | 
 | 797 | WifiController::WifiNetCountProperty::WifiNetCountProperty(WifiController *c) : | 
 | 798 |                 WifiIntegerProperty(c, "NetCount", true, 1) { | 
 | 799 | } | 
 | 800 | int WifiController::WifiNetCountProperty::get(int idx, int *buffer) { | 
 | 801 |     pthread_mutex_lock(&mWc->mLock); | 
 | 802 |     *buffer = mWc->mSupplicant->getNetworkCount(); | 
 | 803 |     pthread_mutex_unlock(&mWc->mLock); | 
 | 804 |     return 0; | 
 | 805 | } | 
 | 806 |  | 
 | 807 | WifiController::WifiTriggerScanProperty::WifiTriggerScanProperty(WifiController *c) : | 
 | 808 |                 WifiIntegerProperty(c, "TriggerScan", false, 1) { | 
 | 809 | } | 
 | 810 | int WifiController::WifiTriggerScanProperty::get(int idx, int *buffer) { | 
 | 811 |     // XXX: Need action type | 
 | 812 |     *buffer = 0; | 
 | 813 |     return 0; | 
 | 814 | } | 
 | 815 |  | 
 | 816 | int WifiController::WifiTriggerScanProperty::set(int idx, int value) { | 
 | 817 |     return mWc->triggerScan(); | 
 | 818 | } | 
 | 819 |  |