Home | History | Annotate | Download | only in nexus
      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_NETWORK_H
     18 #define _WIFI_NETWORK_H
     19 
     20 #include <sys/types.h>
     21 
     22 #include <utils/List.h>
     23 
     24 #include "Property.h"
     25 
     26 class PropertyManager;
     27 
     28 class KeyManagementMask {
     29 public:
     30     static const uint32_t UNKNOWN   = 0;
     31     static const uint32_t NONE      = 0x01;
     32     static const uint32_t WPA_PSK   = 0x02;
     33     static const uint32_t WPA_EAP   = 0x04;
     34     static const uint32_t IEEE8021X = 0x08;
     35     static const uint32_t ALL       = WPA_PSK | WPA_EAP | IEEE8021X;
     36 };
     37 
     38 class SecurityProtocolMask {
     39 public:
     40     static const uint32_t WPA = 0x01;
     41     static const uint32_t RSN = 0x02;
     42 };
     43 
     44 class AuthenticationAlgorithmMask {
     45 public:
     46     static const uint32_t OPEN   = 0x01;
     47     static const uint32_t SHARED = 0x02;
     48     static const uint32_t LEAP   = 0x04;
     49 };
     50 
     51 class PairwiseCiphersMask {
     52 public:
     53     static const uint32_t NONE = 0x00;
     54     static const uint32_t TKIP = 0x01;
     55     static const uint32_t CCMP = 0x02;
     56 };
     57 
     58 class GroupCiphersMask {
     59 public:
     60     static const uint32_t WEP40  = 0x01;
     61     static const uint32_t WEP104 = 0x02;
     62     static const uint32_t TKIP   = 0x04;
     63     static const uint32_t CCMP   = 0x08;
     64 };
     65 
     66 class Supplicant;
     67 class Controller;
     68 class WifiController;
     69 
     70 class WifiNetwork {
     71     class WifiNetworkIntegerProperty : public IntegerProperty {
     72     protected:
     73         WifiNetwork *mWn;
     74     public:
     75         WifiNetworkIntegerProperty(WifiNetwork *wn, const char *name, bool ro,
     76                                    int elements);
     77         virtual ~WifiNetworkIntegerProperty() {}
     78         virtual int set(int idx, int value) = 0;
     79         virtual int get(int idx, int *buffer) = 0;
     80     };
     81     friend class WifiNetwork::WifiNetworkIntegerProperty;
     82 
     83     class WifiNetworkStringProperty : public StringProperty {
     84     protected:
     85         WifiNetwork *mWn;
     86     public:
     87         WifiNetworkStringProperty(WifiNetwork *wn, const char *name, bool ro,
     88                                  int elements);
     89         virtual ~WifiNetworkStringProperty() {}
     90         virtual int set(int idx, const char *value) = 0;
     91         virtual int get(int idx, char *buffer, size_t max) = 0;
     92     };
     93     friend class WifiNetwork::WifiNetworkStringProperty;
     94 
     95     class WifiNetworkEnabledProperty : public WifiNetworkIntegerProperty {
     96     public:
     97         WifiNetworkEnabledProperty(WifiNetwork *wn);
     98         virtual ~WifiNetworkEnabledProperty() {};
     99         int set(int idx, int value);
    100         int get(int idx, int *buffer);
    101     };
    102 
    103     class WifiNetworkPriorityProperty : public WifiNetworkIntegerProperty {
    104     public:
    105         WifiNetworkPriorityProperty(WifiNetwork *wn);
    106         virtual ~WifiNetworkPriorityProperty() {};
    107         int set(int idx, int value);
    108         int get(int idx, int *buffer);
    109     };
    110 
    111     class WifiNetworkDefaultKeyIndexProperty : public WifiNetworkIntegerProperty {
    112     public:
    113         WifiNetworkDefaultKeyIndexProperty(WifiNetwork *wn);
    114         virtual ~WifiNetworkDefaultKeyIndexProperty() {};
    115         int set(int idx, int value);
    116         int get(int idx, int *buffer);
    117     };
    118 
    119     class WifiNetworkSsidProperty : public WifiNetworkStringProperty {
    120     public:
    121         WifiNetworkSsidProperty(WifiNetwork *wn);
    122         virtual ~WifiNetworkSsidProperty() {};
    123         int set(int idx, const char *value);
    124         int get(int idx, char *buffer, size_t max);
    125     };
    126 
    127     class WifiNetworkBssidProperty : public WifiNetworkStringProperty {
    128     public:
    129         WifiNetworkBssidProperty(WifiNetwork *wn);
    130         virtual ~WifiNetworkBssidProperty() {};
    131         int set(int idx, const char *value);
    132         int get(int idx, char *buffer, size_t max);
    133     };
    134 
    135     class WifiNetworkPskProperty : public WifiNetworkStringProperty {
    136     public:
    137         WifiNetworkPskProperty(WifiNetwork *wn);
    138         virtual ~WifiNetworkPskProperty() {};
    139         int set(int idx, const char *value);
    140         int get(int idx, char *buffer, size_t max);
    141     };
    142 
    143     class WifiNetworkKeyManagementProperty : public WifiNetworkStringProperty {
    144     public:
    145         WifiNetworkKeyManagementProperty(WifiNetwork *wn);
    146         virtual ~WifiNetworkKeyManagementProperty() {};
    147         int set(int idx, const char *value);
    148         int get(int idx, char *buffer, size_t max);
    149     };
    150 
    151     class WifiNetworkAuthAlgorithmsProperty : public WifiNetworkStringProperty {
    152     public:
    153         WifiNetworkAuthAlgorithmsProperty(WifiNetwork *wn);
    154         virtual ~WifiNetworkAuthAlgorithmsProperty() {};
    155         int set(int idx, const char *value);
    156         int get(int idx, char *buffer, size_t max);
    157     };
    158 
    159     class WifiNetworkProtocolsProperty : public WifiNetworkStringProperty {
    160     public:
    161         WifiNetworkProtocolsProperty(WifiNetwork *wn);
    162         virtual ~WifiNetworkProtocolsProperty() {};
    163         int set(int idx, const char *value);
    164         int get(int idx, char *buffer, size_t max);
    165     };
    166 
    167     class WifiNetworkWepKeyProperty : public WifiNetworkStringProperty {
    168     public:
    169         WifiNetworkWepKeyProperty(WifiNetwork *wn);
    170         virtual ~WifiNetworkWepKeyProperty() {};
    171         int set(int idx, const char *value);
    172         int get(int idx, char *buffer, size_t max);
    173     };
    174 
    175     class WifiNetworkPairwiseCiphersProperty : public WifiNetworkStringProperty {
    176     public:
    177         WifiNetworkPairwiseCiphersProperty(WifiNetwork *wn);
    178         virtual ~WifiNetworkPairwiseCiphersProperty() {};
    179         int set(int idx, const char *value);
    180         int get(int idx, char *buffer, size_t max);
    181     };
    182 
    183     class WifiNetworkGroupCiphersProperty : public WifiNetworkStringProperty {
    184     public:
    185         WifiNetworkGroupCiphersProperty(WifiNetwork *wn);
    186         virtual ~WifiNetworkGroupCiphersProperty() {};
    187         int set(int idx, const char *value);
    188         int get(int idx, char *buffer, size_t max);
    189     };
    190 
    191     class WifiNetworkHiddenSsidProperty : public WifiNetworkStringProperty {
    192     public:
    193         WifiNetworkHiddenSsidProperty(WifiNetwork *wn);
    194         virtual ~WifiNetworkHiddenSsidProperty() {};
    195         int set(int idx, const char *value);
    196         int get(int idx, char *buffer, size_t max);
    197     };
    198 
    199 private:
    200     Supplicant *mSuppl;
    201     WifiController *mController;
    202 
    203     /*
    204      * Unique network id - normally provided by supplicant
    205      */
    206     int mNetid;
    207 
    208     /*
    209      * The networks' SSID. Can either be an ASCII string,
    210      * which must be enclosed in double quotation marks
    211      * (ie: "MyNetwork"), or a string of hex digits which
    212      * are not enclosed in quotes (ie: 01ab7893)
    213      */
    214     char *mSsid;
    215 
    216     /*
    217      * When set, this entry should only be used
    218      * when associating with the AP having the specified
    219      * BSSID. The value is a string in the format of an
    220      * Ethernet MAC address
    221      */
    222     char *mBssid;
    223 
    224     /*
    225      *  Pre-shared key for use with WPA-PSK
    226      */
    227     char *mPsk;
    228 
    229     /*
    230      * Up to four WEP keys. Either in ASCII string enclosed in
    231      * double quotes, or a string of hex digits
    232      */
    233     char *mWepKeys[4];
    234 
    235     /*
    236      * Default WEP key index, ranging from 0 -> NUM_WEP_KEYS -1
    237      */
    238     int mDefaultKeyIndex;
    239 
    240     /*
    241      * Priority determines the preference given to a network by
    242      * supplicant when choosing an access point with which
    243      * to associate
    244      */
    245     int mPriority;
    246 
    247     /*
    248      * This is a network that does not broadcast it's SSID, so an
    249      * SSID-specific probe request must be used for scans.
    250      */
    251     char *mHiddenSsid;
    252 
    253     /*
    254      * The set of key management protocols supported by this configuration.
    255      */
    256     uint32_t mKeyManagement;
    257 
    258     /*
    259      * The set of security protocols supported by this configuration.
    260      */
    261     uint32_t mProtocols;
    262 
    263     /*
    264      * The set of authentication protocols supported by this configuration.
    265      */
    266     uint32_t mAuthAlgorithms;
    267 
    268     /*
    269      * The set of pairwise ciphers for WPA supported by this configuration.
    270      */
    271     uint32_t mPairwiseCiphers;
    272 
    273     /*
    274      * The set of group ciphers for WPA supported by this configuration.
    275      */
    276     uint32_t mGroupCiphers;
    277 
    278     /*
    279      * Set if this Network is enabled
    280      */
    281     bool mEnabled;
    282 
    283     char *mPropNamespace;
    284     struct {
    285         WifiNetworkEnabledProperty               *propEnabled;
    286         WifiNetworkSsidProperty                  *propSsid;
    287         WifiNetworkBssidProperty                 *propBssid;
    288         WifiNetworkPskProperty                   *propPsk;
    289         WifiNetworkWepKeyProperty                *propWepKey;
    290         WifiNetworkDefaultKeyIndexProperty       *propDefKeyIdx;
    291         WifiNetworkPriorityProperty              *propPriority;
    292         WifiNetworkKeyManagementProperty  *propKeyManagement;
    293         WifiNetworkProtocolsProperty      *propProtocols;
    294         WifiNetworkAuthAlgorithmsProperty *propAuthAlgorithms;
    295         WifiNetworkPairwiseCiphersProperty       *propPairwiseCiphers;
    296         WifiNetworkGroupCiphersProperty          *propGroupCiphers;
    297         WifiNetworkHiddenSsidProperty            *propHiddenSsid;
    298     } mStaticProperties;
    299 private:
    300     WifiNetwork();
    301 
    302 public:
    303     WifiNetwork(WifiController *c, Supplicant *suppl, int networkId);
    304     WifiNetwork(WifiController *c, Supplicant *suppl, const char *data);
    305 
    306     virtual ~WifiNetwork();
    307 
    308     WifiNetwork *clone();
    309     int attachProperties(PropertyManager *pm, const char *nsName);
    310     int detachProperties(PropertyManager *pm, const char *nsName);
    311 
    312     int getNetworkId() { return mNetid; }
    313     const char *getSsid() { return mSsid; }
    314     const char *getBssid() { return mBssid; }
    315     const char *getPsk() { return mPsk; }
    316     const char *getWepKey(int idx) { return mWepKeys[idx]; }
    317     int getDefaultKeyIndex() { return mDefaultKeyIndex; }
    318     int getPriority() { return mPriority; }
    319     const char *getHiddenSsid() { return mHiddenSsid; }
    320     uint32_t getKeyManagement() { return mKeyManagement; }
    321     uint32_t getProtocols() { return mProtocols; }
    322     uint32_t getAuthAlgorithms() { return mAuthAlgorithms; }
    323     uint32_t getPairwiseCiphers() { return mPairwiseCiphers; }
    324     uint32_t getGroupCiphers() { return mGroupCiphers; }
    325     bool getEnabled() { return mEnabled; }
    326     Controller *getController() { return (Controller *) mController; }
    327 
    328     int setEnabled(bool enabled);
    329     int setSsid(const char *ssid);
    330     int setBssid(const char *bssid);
    331     int setPsk(const char *psk);
    332     int setWepKey(int idx, const char *key);
    333     int setDefaultKeyIndex(int idx);
    334     int setPriority(int pri);
    335     int setHiddenSsid(const char *ssid);
    336     int setKeyManagement(uint32_t mask);
    337     int setProtocols(uint32_t mask);
    338     int setAuthAlgorithms(uint32_t mask);
    339     int setPairwiseCiphers(uint32_t mask);
    340     int setGroupCiphers(uint32_t mask);
    341 
    342     // XXX:Should this really be exposed?.. meh
    343     int refresh();
    344 
    345 private:
    346     int parseKeyManagementMask(const char *buffer, uint32_t *mask);
    347     int parseProtocolsMask(const char *buffer, uint32_t *mask);
    348     int parseAuthAlgorithmsMask(const char *buffer, uint32_t *mask);
    349     int parsePairwiseCiphersMask(const char *buffer, uint32_t *mask);
    350     int parseGroupCiphersMask(const char *buffer, uint32_t *mask);
    351     void createProperties();
    352 };
    353 
    354 typedef android::List<WifiNetwork *> WifiNetworkCollection;
    355 
    356 #endif
    357