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 */ 16 17 #ifndef _WIFI_CONTROLLER_H 18 #define _WIFI_CONTROLLER_H 19 20 #include <sys/types.h> 21 22 #include "Controller.h" 23 #include "ScanResult.h" 24 #include "WifiNetwork.h" 25 #include "ISupplicantEventHandler.h" 26 #include "IWifiStatusPollerHandler.h" 27 28 class NetInterface; 29 class Supplicant; 30 class SupplicantAssociatingEvent; 31 class SupplicantAssociatedEvent; 32 class SupplicantConnectedEvent; 33 class SupplicantScanResultsEvent; 34 class SupplicantStateChangeEvent; 35 class SupplicantDisconnectedEvent; 36 class WifiStatusPoller; 37 38 class WifiController : public Controller, 39 public ISupplicantEventHandler, 40 public IWifiStatusPollerHandler { 41 42 class WifiIntegerProperty : public IntegerProperty { 43 protected: 44 WifiController *mWc; 45 public: 46 WifiIntegerProperty(WifiController *c, const char *name, bool ro, 47 int elements); 48 virtual ~WifiIntegerProperty() {} 49 virtual int set(int idx, int value) = 0; 50 virtual int get(int idx, int *buffer) = 0; 51 }; 52 friend class WifiController::WifiIntegerProperty; 53 54 class WifiStringProperty : public StringProperty { 55 protected: 56 WifiController *mWc; 57 public: 58 WifiStringProperty(WifiController *c, const char *name, bool ro, 59 int elements); 60 virtual ~WifiStringProperty() {} 61 virtual int set(int idx, const char *value) = 0; 62 virtual int get(int idx, char *buffer, size_t max) = 0; 63 }; 64 friend class WifiController::WifiStringProperty; 65 66 class WifiEnabledProperty : public WifiIntegerProperty { 67 public: 68 WifiEnabledProperty(WifiController *c); 69 virtual ~WifiEnabledProperty() {} 70 int set(int idx, int value); 71 int get(int idx, int *buffer); 72 }; 73 74 class WifiScanOnlyProperty : public WifiIntegerProperty { 75 public: 76 WifiScanOnlyProperty(WifiController *c); 77 virtual ~WifiScanOnlyProperty() {} 78 int set(int idx, int value); 79 int get(int idx, int *buffer); 80 }; 81 82 class WifiAllowedChannelsProperty : public WifiIntegerProperty { 83 public: 84 WifiAllowedChannelsProperty(WifiController *c); 85 virtual ~WifiAllowedChannelsProperty() {} 86 int set(int idx, int value); 87 int get(int idx, int *buffer); 88 }; 89 90 class WifiActiveScanProperty : public WifiIntegerProperty { 91 public: 92 WifiActiveScanProperty(WifiController *c); 93 virtual ~WifiActiveScanProperty() {} 94 int set(int idx, int value); 95 int get(int idx, int *buffer); 96 }; 97 98 class WifiSearchingProperty : public WifiIntegerProperty { 99 public: 100 WifiSearchingProperty(WifiController *c); 101 virtual ~WifiSearchingProperty() {} 102 int set(int idx, int value) { return -1; } 103 int get(int idx, int *buffer); 104 }; 105 106 class WifiPacketFilterProperty : public WifiIntegerProperty { 107 public: 108 WifiPacketFilterProperty(WifiController *c); 109 virtual ~WifiPacketFilterProperty() {} 110 int set(int idx, int value); 111 int get(int idx, int *buffer); 112 }; 113 114 class WifiBluetoothCoexScanProperty : public WifiIntegerProperty { 115 public: 116 WifiBluetoothCoexScanProperty(WifiController *c); 117 virtual ~WifiBluetoothCoexScanProperty() {} 118 int set(int idx, int value); 119 int get(int idx, int *buffer); 120 }; 121 122 class WifiBluetoothCoexModeProperty : public WifiIntegerProperty { 123 public: 124 WifiBluetoothCoexModeProperty(WifiController *c); 125 virtual ~WifiBluetoothCoexModeProperty() {} 126 int set(int idx, int value); 127 int get(int idx, int *buffer); 128 }; 129 130 class WifiCurrentNetworkProperty : public WifiIntegerProperty { 131 public: 132 WifiCurrentNetworkProperty(WifiController *c); 133 virtual ~WifiCurrentNetworkProperty() {} 134 int set(int idx, int value) { return -1; } 135 int get(int idx, int *buffer); 136 }; 137 138 class WifiSuspendedProperty : public WifiIntegerProperty { 139 public: 140 WifiSuspendedProperty(WifiController *c); 141 virtual ~WifiSuspendedProperty() {} 142 int set(int idx, int value); 143 int get(int idx, int *buffer); 144 }; 145 146 class WifiNetCountProperty : public WifiIntegerProperty { 147 public: 148 WifiNetCountProperty(WifiController *c); 149 virtual ~WifiNetCountProperty() {} 150 int set(int idx, int value) { return -1; } 151 int get(int idx, int *buffer); 152 }; 153 154 class WifiTriggerScanProperty : public WifiIntegerProperty { 155 public: 156 WifiTriggerScanProperty(WifiController *c); 157 virtual ~WifiTriggerScanProperty() {} 158 int set(int idx, int value); 159 int get(int idx, int *buffer); 160 }; 161 162 class WifiSupplicantStateProperty : public WifiStringProperty { 163 public: 164 WifiSupplicantStateProperty(WifiController *c); 165 virtual ~WifiSupplicantStateProperty() {} 166 int set(int idx, const char *value) { return -1; } 167 int get(int idx, char *buffer, size_t max); 168 }; 169 170 class WifiInterfaceProperty : public WifiStringProperty { 171 public: 172 WifiInterfaceProperty(WifiController *c); 173 virtual ~WifiInterfaceProperty() {} 174 int set(int idx, const char *value) { return -1; } 175 int get(int idx, char *buffer, size_t max); 176 }; 177 178 Supplicant *mSupplicant; 179 char mModulePath[255]; 180 char mModuleName[64]; 181 char mModuleArgs[255]; 182 183 int mSupplicantState; 184 bool mActiveScan; 185 bool mScanOnly; 186 bool mPacketFilter; 187 bool mBluetoothCoexScan; 188 int mBluetoothCoexMode; 189 int mCurrentlyConnectedNetworkId; 190 bool mSuspended; 191 int mLastRssi; 192 int mRssiEventThreshold; 193 int mLastLinkSpeed; 194 int mNumAllowedChannels; 195 196 ScanResultCollection *mLatestScanResults; 197 pthread_mutex_t mLatestScanResultsLock; 198 pthread_mutex_t mLock; 199 WifiStatusPoller *mStatusPoller; 200 201 struct { 202 WifiEnabledProperty *propEnabled; 203 WifiScanOnlyProperty *propScanOnly; 204 WifiAllowedChannelsProperty *propAllowedChannels; 205 IntegerPropertyHelper *propRssiEventThreshold; 206 } mStaticProperties; 207 208 struct { 209 WifiActiveScanProperty *propActiveScan; 210 WifiSearchingProperty *propSearching; 211 WifiPacketFilterProperty *propPacketFilter; 212 WifiBluetoothCoexScanProperty *propBluetoothCoexScan; 213 WifiBluetoothCoexModeProperty *propBluetoothCoexMode; 214 WifiCurrentNetworkProperty *propCurrentNetwork; 215 IntegerPropertyHelper *propRssi; 216 IntegerPropertyHelper *propLinkSpeed; 217 WifiSuspendedProperty *propSuspended; 218 WifiNetCountProperty *propNetCount; 219 WifiSupplicantStateProperty *propSupplicantState; 220 WifiInterfaceProperty *propInterface; 221 WifiTriggerScanProperty *propTriggerScan; 222 } mDynamicProperties; 223 224 // True if supplicant is currently searching for a network 225 bool mIsSupplicantSearching; 226 int mNumScanResultsSinceLastStateChange; 227 228 bool mEnabled; 229 230 public: 231 WifiController(PropertyManager *propmngr, IControllerHandler *handlers, char *modpath, char *modname, char *modargs); 232 virtual ~WifiController() {} 233 234 int start(); 235 int stop(); 236 237 WifiNetwork *createNetwork(); 238 int removeNetwork(int networkId); 239 WifiNetworkCollection *createNetworkList(); 240 241 ScanResultCollection *createScanResults(); 242 243 char *getModulePath() { return mModulePath; } 244 char *getModuleName() { return mModuleName; } 245 char *getModuleArgs() { return mModuleArgs; } 246 247 Supplicant *getSupplicant() { return mSupplicant; } 248 249 protected: 250 // Move this crap into a 'driver' 251 virtual int powerUp() = 0; 252 virtual int powerDown() = 0; 253 virtual int loadFirmware(); 254 255 virtual bool isFirmwareLoaded() = 0; 256 virtual bool isPoweredUp() = 0; 257 258 private: 259 void sendStatusBroadcast(const char *msg); 260 int setActiveScan(bool active); 261 int triggerScan(); 262 int enable(); 263 int disable(); 264 int setSuspend(bool suspend); 265 bool getSuspended(); 266 int setBluetoothCoexistenceScan(bool enable); 267 int setBluetoothCoexistenceMode(int mode); 268 int setPacketFilter(bool enable); 269 int setScanOnly(bool scanOnly); 270 271 // ISupplicantEventHandler methods 272 void onAssociatingEvent(SupplicantAssociatingEvent *evt); 273 void onAssociatedEvent(SupplicantAssociatedEvent *evt); 274 void onConnectedEvent(SupplicantConnectedEvent *evt); 275 void onScanResultsEvent(SupplicantScanResultsEvent *evt); 276 void onStateChangeEvent(SupplicantStateChangeEvent *evt); 277 void onConnectionTimeoutEvent(SupplicantConnectionTimeoutEvent *evt); 278 void onDisconnectedEvent(SupplicantDisconnectedEvent *evt); 279 #if 0 280 virtual void onTerminatingEvent(SupplicantEvent *evt); 281 virtual void onPasswordChangedEvent(SupplicantEvent *evt); 282 virtual void onEapNotificationEvent(SupplicantEvent *evt); 283 virtual void onEapStartedEvent(SupplicantEvent *evt); 284 virtual void onEapMethodEvent(SupplicantEvent *evt); 285 virtual void onEapSuccessEvent(SupplicantEvent *evt); 286 virtual void onEapFailureEvent(SupplicantEvent *evt); 287 virtual void onLinkSpeedEvent(SupplicantEvent *evt); 288 virtual void onDriverStateEvent(SupplicantEvent *evt); 289 #endif 290 291 void onStatusPollInterval(); 292 293 int verifyNotSuspended(); 294 }; 295 296 #endif 297