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 #include <errno.h>
     18 #include <string.h>
     19 #include <stdlib.h>
     20 #include <sys/types.h>
     21 
     22 #define LOG_TAG "WifiNetwork"
     23 #include <cutils/log.h>
     24 
     25 #include "NetworkManager.h"
     26 #include "WifiNetwork.h"
     27 #include "Supplicant.h"
     28 #include "WifiController.h"
     29 
     30 WifiNetwork::WifiNetwork() {
     31    // This is private to restrict copy constructors
     32 }
     33 
     34 WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, const char *data) {
     35     mController = c;
     36     mSuppl = suppl;
     37 
     38     char *tmp = strdup(data);
     39     char *next = tmp;
     40     char *id;
     41     char *ssid;
     42     char *bssid;
     43     char *flags;
     44 
     45     if (!(id = strsep(&next, "\t")))
     46         LOGE("Failed to extract network id");
     47     if (!(ssid = strsep(&next, "\t")))
     48         LOGE("Failed to extract ssid");
     49     if (!(bssid = strsep(&next, "\t")))
     50         LOGE("Failed to extract bssid");
     51     if (!(flags = strsep(&next, "\t")))
     52         LOGE("Failed to extract flags");
     53 
     54    // LOGD("id '%s', ssid '%s', bssid '%s', flags '%s'", id, ssid, bssid,
     55    //      flags ? flags :"null");
     56 
     57     if (id)
     58         mNetid = atoi(id);
     59     if (ssid)
     60         mSsid = strdup(ssid);
     61     if (bssid)
     62         mBssid = strdup(bssid);
     63 
     64     mPsk = NULL;
     65     memset(mWepKeys, 0, sizeof(mWepKeys));
     66     mDefaultKeyIndex = -1;
     67     mPriority = -1;
     68     mHiddenSsid = NULL;
     69     mKeyManagement = KeyManagementMask::UNKNOWN;
     70     mProtocols = 0;
     71     mAuthAlgorithms = 0;
     72     mPairwiseCiphers = 0;
     73     mGroupCiphers = 0;
     74     mEnabled = true;
     75 
     76     if (flags && flags[0] != '\0') {
     77         if (!strcmp(flags, "[DISABLED]"))
     78             mEnabled = false;
     79         else
     80             LOGW("Unsupported flags '%s'", flags);
     81     }
     82 
     83     free(tmp);
     84     createProperties();
     85 }
     86 
     87 WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, int networkId) {
     88     mController = c;
     89     mSuppl = suppl;
     90     mNetid = networkId;
     91     mSsid = NULL;
     92     mBssid = NULL;
     93     mPsk = NULL;
     94     memset(mWepKeys, 0, sizeof(mWepKeys));
     95     mDefaultKeyIndex = -1;
     96     mPriority = -1;
     97     mHiddenSsid = NULL;
     98     mKeyManagement = 0;
     99     mProtocols = 0;
    100     mAuthAlgorithms = 0;
    101     mPairwiseCiphers = 0;
    102     mGroupCiphers = 0;
    103     mEnabled = false;
    104     createProperties();
    105 }
    106 
    107 WifiNetwork *WifiNetwork::clone() {
    108     WifiNetwork *r = new WifiNetwork();
    109 
    110     r->mSuppl = mSuppl;
    111     r->mNetid = mNetid;
    112 
    113     if (mSsid)
    114         r->mSsid = strdup(mSsid);
    115     if (mBssid)
    116         r->mBssid = strdup(mBssid);
    117     if (mPsk)
    118         r->mPsk = strdup(mPsk);
    119 
    120     r->mController = mController;
    121     memcpy(r->mWepKeys, mWepKeys, sizeof(mWepKeys));
    122     r->mDefaultKeyIndex = mDefaultKeyIndex;
    123     r->mPriority = mPriority;
    124     if (mHiddenSsid)
    125         r->mHiddenSsid = strdup(mHiddenSsid);
    126     r->mKeyManagement = mKeyManagement;
    127     r->mProtocols = mProtocols;
    128     r->mAuthAlgorithms = mAuthAlgorithms;
    129     r->mPairwiseCiphers = mPairwiseCiphers;
    130     r->mGroupCiphers = mGroupCiphers;
    131     return r;
    132 }
    133 
    134 void WifiNetwork::createProperties() {
    135     asprintf(&mPropNamespace, "wifi.net.%d", mNetid);
    136 
    137     mStaticProperties.propEnabled = new WifiNetworkEnabledProperty(this);
    138     mStaticProperties.propSsid = new WifiNetworkSsidProperty(this);
    139     mStaticProperties.propBssid = new WifiNetworkBssidProperty(this);
    140     mStaticProperties.propPsk = new WifiNetworkPskProperty(this);
    141     mStaticProperties.propWepKey = new WifiNetworkWepKeyProperty(this);
    142     mStaticProperties.propDefKeyIdx = new WifiNetworkDefaultKeyIndexProperty(this);
    143     mStaticProperties.propPriority = new WifiNetworkPriorityProperty(this);
    144     mStaticProperties.propKeyManagement = new WifiNetworkKeyManagementProperty(this);
    145     mStaticProperties.propProtocols = new WifiNetworkProtocolsProperty(this);
    146     mStaticProperties.propAuthAlgorithms = new WifiNetworkAuthAlgorithmsProperty(this);
    147     mStaticProperties.propPairwiseCiphers = new WifiNetworkPairwiseCiphersProperty(this);
    148     mStaticProperties.propGroupCiphers = new WifiNetworkGroupCiphersProperty(this);
    149     mStaticProperties.propHiddenSsid = new WifiNetworkHiddenSsidProperty(this);
    150 }
    151 
    152 WifiNetwork::~WifiNetwork() {
    153     if (mPropNamespace)
    154         free(mPropNamespace);
    155     if (mSsid)
    156         free(mSsid);
    157     if (mBssid)
    158         free(mBssid);
    159     if (mPsk)
    160         free(mPsk);
    161     for (int i = 0; i < 4; i++) {
    162         if (mWepKeys[i])
    163             free(mWepKeys[i]);
    164     }
    165 
    166     if (mHiddenSsid)
    167         free(mHiddenSsid);
    168 
    169     delete mStaticProperties.propEnabled;
    170     delete mStaticProperties.propSsid;
    171     delete mStaticProperties.propBssid;
    172     delete mStaticProperties.propPsk;
    173     delete mStaticProperties.propWepKey;
    174     delete mStaticProperties.propDefKeyIdx;
    175     delete mStaticProperties.propPriority;
    176     delete mStaticProperties.propKeyManagement;
    177     delete mStaticProperties.propProtocols;
    178     delete mStaticProperties.propAuthAlgorithms;
    179     delete mStaticProperties.propPairwiseCiphers;
    180     delete mStaticProperties.propGroupCiphers;
    181     delete mStaticProperties.propHiddenSsid;
    182 }
    183 
    184 int WifiNetwork::refresh() {
    185     char buffer[255];
    186     size_t len;
    187     uint32_t mask;
    188 
    189     len = sizeof(buffer);
    190     if (mSuppl->getNetworkVar(mNetid, "psk", buffer, len))
    191         mPsk = strdup(buffer);
    192 
    193     for (int i = 0; i < 4; i++) {
    194         char *name;
    195 
    196         asprintf(&name, "wep_key%d", i);
    197         len = sizeof(buffer);
    198         if (mSuppl->getNetworkVar(mNetid, name, buffer, len))
    199             mWepKeys[i] = strdup(buffer);
    200         free(name);
    201     }
    202 
    203     len = sizeof(buffer);
    204     if (mSuppl->getNetworkVar(mNetid, "wep_tx_keyidx", buffer, len))
    205         mDefaultKeyIndex = atoi(buffer);
    206 
    207     len = sizeof(buffer);
    208     if (mSuppl->getNetworkVar(mNetid, "priority", buffer, len))
    209         mPriority = atoi(buffer);
    210 
    211     len = sizeof(buffer);
    212     if (mSuppl->getNetworkVar(mNetid, "scan_ssid", buffer, len))
    213         mHiddenSsid = strdup(buffer);
    214 
    215     len = sizeof(buffer);
    216     if (mSuppl->getNetworkVar(mNetid, "key_mgmt", buffer, len)) {
    217         if (WifiNetwork::parseKeyManagementMask(buffer, &mask)) {
    218             LOGE("Error parsing key_mgmt (%s)", strerror(errno));
    219         } else {
    220            mKeyManagement = mask;
    221         }
    222     }
    223 
    224     len = sizeof(buffer);
    225     if (mSuppl->getNetworkVar(mNetid, "proto", buffer, len)) {
    226         if (WifiNetwork::parseProtocolsMask(buffer, &mask)) {
    227             LOGE("Error parsing proto (%s)", strerror(errno));
    228         } else {
    229            mProtocols = mask;
    230         }
    231     }
    232 
    233     len = sizeof(buffer);
    234     if (mSuppl->getNetworkVar(mNetid, "auth_alg", buffer, len)) {
    235         if (WifiNetwork::parseAuthAlgorithmsMask(buffer, &mask)) {
    236             LOGE("Error parsing auth_alg (%s)", strerror(errno));
    237         } else {
    238            mAuthAlgorithms = mask;
    239         }
    240     }
    241 
    242     len = sizeof(buffer);
    243     if (mSuppl->getNetworkVar(mNetid, "pairwise", buffer, len)) {
    244         if (WifiNetwork::parsePairwiseCiphersMask(buffer, &mask)) {
    245             LOGE("Error parsing pairwise (%s)", strerror(errno));
    246         } else {
    247            mPairwiseCiphers = mask;
    248         }
    249     }
    250 
    251     len = sizeof(buffer);
    252     if (mSuppl->getNetworkVar(mNetid, "group", buffer, len)) {
    253         if (WifiNetwork::parseGroupCiphersMask(buffer, &mask)) {
    254             LOGE("Error parsing group (%s)", strerror(errno));
    255         } else {
    256            mGroupCiphers = mask;
    257         }
    258     }
    259 
    260     return 0;
    261 out_err:
    262     LOGE("Refresh failed (%s)",strerror(errno));
    263     return -1;
    264 }
    265 
    266 int WifiNetwork::setSsid(const char *ssid) {
    267     char tmp[255];
    268     snprintf(tmp, sizeof(tmp), "\"%s\"", ssid);
    269     if (mSuppl->setNetworkVar(mNetid, "ssid", tmp))
    270         return -1;
    271     if (mSsid)
    272         free(mSsid);
    273     mSsid = strdup(ssid);
    274     return 0;
    275 }
    276 
    277 int WifiNetwork::setBssid(const char *bssid) {
    278     if (mSuppl->setNetworkVar(mNetid, "bssid", bssid))
    279         return -1;
    280     if (mBssid)
    281         free(mBssid);
    282     mBssid = strdup(bssid);
    283     return 0;
    284 }
    285 
    286 int WifiNetwork::setPsk(const char *psk) {
    287     char tmp[255];
    288     snprintf(tmp, sizeof(tmp), "\"%s\"", psk);
    289     if (mSuppl->setNetworkVar(mNetid, "psk", tmp))
    290         return -1;
    291 
    292     if (mPsk)
    293         free(mPsk);
    294     mPsk = strdup(psk);
    295     return 0;
    296 }
    297 
    298 int WifiNetwork::setWepKey(int idx, const char *key) {
    299     char *name;
    300 
    301     asprintf(&name, "wep_key%d", idx);
    302     int rc = mSuppl->setNetworkVar(mNetid, name, key);
    303     free(name);
    304 
    305     if (rc)
    306         return -1;
    307 
    308     if (mWepKeys[idx])
    309         free(mWepKeys[idx]);
    310     mWepKeys[idx] = strdup(key);
    311     return 0;
    312 }
    313 
    314 int WifiNetwork::setDefaultKeyIndex(int idx) {
    315     char val[16];
    316     sprintf(val, "%d", idx);
    317     if (mSuppl->setNetworkVar(mNetid, "wep_tx_keyidx", val))
    318         return -1;
    319 
    320     mDefaultKeyIndex = idx;
    321     return 0;
    322 }
    323 
    324 int WifiNetwork::setPriority(int priority) {
    325     char val[16];
    326     sprintf(val, "%d", priority);
    327     if (mSuppl->setNetworkVar(mNetid, "priority", val))
    328         return -1;
    329 
    330     mPriority = priority;
    331     return 0;
    332 }
    333 
    334 int WifiNetwork::setHiddenSsid(const char *ssid) {
    335     if (mSuppl->setNetworkVar(mNetid, "scan_ssid", ssid))
    336         return -1;
    337 
    338     if (mHiddenSsid)
    339         free(mHiddenSsid);
    340     mHiddenSsid = strdup(ssid);
    341     return 0;
    342 }
    343 
    344 int WifiNetwork::setKeyManagement(uint32_t mask) {
    345     char accum[64] = {'\0'};
    346 
    347     if (mask == KeyManagementMask::NONE)
    348         strcpy(accum, "NONE");
    349     else {
    350         if (mask & KeyManagementMask::WPA_PSK)
    351             strcat(accum, "WPA-PSK");
    352         if (mask & KeyManagementMask::WPA_EAP) {
    353             if (accum[0] != '\0')
    354                 strcat(accum, " ");
    355             strcat(accum, "WPA-EAP");
    356         }
    357         if (mask & KeyManagementMask::IEEE8021X) {
    358             if (accum[0] != '\0')
    359                 strcat(accum, " ");
    360             strcat(accum, "IEEE8021X");
    361         }
    362     }
    363 
    364     if (mSuppl->setNetworkVar(mNetid, "key_mgmt", accum))
    365         return -1;
    366     mKeyManagement = mask;
    367     return 0;
    368 }
    369 
    370 int WifiNetwork::setProtocols(uint32_t mask) {
    371     char accum[64];
    372 
    373     accum[0] = '\0';
    374 
    375     if (mask & SecurityProtocolMask::WPA)
    376         strcpy(accum, "WPA ");
    377 
    378     if (mask & SecurityProtocolMask::RSN)
    379         strcat(accum, "RSN");
    380 
    381     if (mSuppl->setNetworkVar(mNetid, "proto", accum))
    382         return -1;
    383     mProtocols = mask;
    384     return 0;
    385 }
    386 
    387 int WifiNetwork::setAuthAlgorithms(uint32_t mask) {
    388     char accum[64];
    389 
    390     accum[0] = '\0';
    391 
    392     if (mask == 0)
    393         strcpy(accum, "");
    394 
    395     if (mask & AuthenticationAlgorithmMask::OPEN)
    396         strcpy(accum, "OPEN ");
    397 
    398     if (mask & AuthenticationAlgorithmMask::SHARED)
    399         strcat(accum, "SHARED ");
    400 
    401     if (mask & AuthenticationAlgorithmMask::LEAP)
    402         strcat(accum, "LEAP ");
    403 
    404     if (mSuppl->setNetworkVar(mNetid, "auth_alg", accum))
    405         return -1;
    406 
    407     mAuthAlgorithms = mask;
    408     return 0;
    409 }
    410 
    411 int WifiNetwork::setPairwiseCiphers(uint32_t mask) {
    412     char accum[64];
    413 
    414     accum[0] = '\0';
    415 
    416     if (mask == PairwiseCiphersMask::NONE)
    417         strcpy(accum, "NONE");
    418     else {
    419         if (mask & PairwiseCiphersMask::TKIP)
    420             strcat(accum, "TKIP ");
    421         if (mask & PairwiseCiphersMask::CCMP)
    422             strcat(accum, "CCMP ");
    423     }
    424 
    425     if (mSuppl->setNetworkVar(mNetid, "pairwise", accum))
    426         return -1;
    427 
    428     mPairwiseCiphers = mask;
    429     return 0;
    430 }
    431 
    432 int WifiNetwork::setGroupCiphers(uint32_t mask) {
    433     char accum[64];
    434 
    435     accum[0] = '\0';
    436 
    437     if (mask & GroupCiphersMask::WEP40)
    438         strcat(accum, "WEP40 ");
    439     if (mask & GroupCiphersMask::WEP104)
    440         strcat(accum, "WEP104 ");
    441     if (mask & GroupCiphersMask::TKIP)
    442         strcat(accum, "TKIP ");
    443     if (mask & GroupCiphersMask::CCMP)
    444         strcat(accum, "CCMP ");
    445 
    446     if (mSuppl->setNetworkVar(mNetid, "group", accum))
    447         return -1;
    448     mGroupCiphers = mask;
    449     return 0;
    450 }
    451 
    452 int WifiNetwork::setEnabled(bool enabled) {
    453 
    454     if (enabled) {
    455         if (getPriority() == -1) {
    456             LOGE("Cannot enable network when priority is not set");
    457             errno = EAGAIN;
    458             return -1;
    459         }
    460         if (getKeyManagement() == KeyManagementMask::UNKNOWN) {
    461             LOGE("Cannot enable network when KeyManagement is not set");
    462             errno = EAGAIN;
    463             return -1;
    464         }
    465     }
    466 
    467     if (mSuppl->enableNetwork(mNetid, enabled))
    468         return -1;
    469 
    470     mEnabled = enabled;
    471     return 0;
    472 }
    473 
    474 int WifiNetwork::attachProperties(PropertyManager *pm, const char *nsName) {
    475     pm->attachProperty(nsName, mStaticProperties.propSsid);
    476     pm->attachProperty(nsName, mStaticProperties.propBssid);
    477     pm->attachProperty(nsName, mStaticProperties.propPsk);
    478     pm->attachProperty(nsName, mStaticProperties.propWepKey);
    479     pm->attachProperty(nsName, mStaticProperties.propDefKeyIdx);
    480     pm->attachProperty(nsName, mStaticProperties.propPriority);
    481     pm->attachProperty(nsName, mStaticProperties.propKeyManagement);
    482     pm->attachProperty(nsName, mStaticProperties.propProtocols);
    483     pm->attachProperty(nsName, mStaticProperties.propAuthAlgorithms);
    484     pm->attachProperty(nsName, mStaticProperties.propPairwiseCiphers);
    485     pm->attachProperty(nsName, mStaticProperties.propGroupCiphers);
    486     pm->attachProperty(nsName, mStaticProperties.propHiddenSsid);
    487     pm->attachProperty(nsName, mStaticProperties.propEnabled);
    488     return 0;
    489 }
    490 
    491 int WifiNetwork::detachProperties(PropertyManager *pm, const char *nsName) {
    492     pm->detachProperty(nsName, mStaticProperties.propEnabled);
    493     pm->detachProperty(nsName, mStaticProperties.propSsid);
    494     pm->detachProperty(nsName, mStaticProperties.propBssid);
    495     pm->detachProperty(nsName, mStaticProperties.propPsk);
    496     pm->detachProperty(nsName, mStaticProperties.propWepKey);
    497     pm->detachProperty(nsName, mStaticProperties.propDefKeyIdx);
    498     pm->detachProperty(nsName, mStaticProperties.propPriority);
    499     pm->detachProperty(nsName, mStaticProperties.propKeyManagement);
    500     pm->detachProperty(nsName, mStaticProperties.propProtocols);
    501     pm->detachProperty(nsName, mStaticProperties.propAuthAlgorithms);
    502     pm->detachProperty(nsName, mStaticProperties.propPairwiseCiphers);
    503     pm->detachProperty(nsName, mStaticProperties.propGroupCiphers);
    504     pm->detachProperty(nsName, mStaticProperties.propHiddenSsid);
    505     return 0;
    506 }
    507 
    508 int WifiNetwork::parseKeyManagementMask(const char *buffer, uint32_t *mask) {
    509     bool none = false;
    510     char *v_tmp = strdup(buffer);
    511     char *v_next = v_tmp;
    512     char *v_token;
    513 
    514 //    LOGD("parseKeyManagementMask(%s)", buffer);
    515     *mask = 0;
    516 
    517     while((v_token = strsep(&v_next, " "))) {
    518         if (!strcasecmp(v_token, "NONE")) {
    519             *mask = KeyManagementMask::NONE;
    520             none = true;
    521         } else if (!none) {
    522             if (!strcasecmp(v_token, "WPA-PSK"))
    523                 *mask |= KeyManagementMask::WPA_PSK;
    524             else if (!strcasecmp(v_token, "WPA-EAP"))
    525                 *mask |= KeyManagementMask::WPA_EAP;
    526             else if (!strcasecmp(v_token, "IEEE8021X"))
    527                 *mask |= KeyManagementMask::IEEE8021X;
    528             else {
    529                 LOGW("Invalid KeyManagementMask value '%s'", v_token);
    530                 errno = EINVAL;
    531                 free(v_tmp);
    532                 return -1;
    533             }
    534         } else {
    535             LOGW("KeyManagementMask value '%s' when NONE", v_token);
    536             errno = EINVAL;
    537             free(v_tmp);
    538             return -1;
    539         }
    540     }
    541     free(v_tmp);
    542     return 0;
    543 }
    544 
    545 int WifiNetwork::parseProtocolsMask(const char *buffer, uint32_t *mask) {
    546     bool none = false;
    547     char *v_tmp = strdup(buffer);
    548     char *v_next = v_tmp;
    549     char *v_token;
    550 
    551 //    LOGD("parseProtocolsMask(%s)", buffer);
    552     *mask = 0;
    553     while((v_token = strsep(&v_next, " "))) {
    554         if (!strcasecmp(v_token, "WPA"))
    555             *mask |= SecurityProtocolMask::WPA;
    556         else if (!strcasecmp(v_token, "RSN"))
    557             *mask |= SecurityProtocolMask::RSN;
    558         else {
    559             LOGW("Invalid ProtocolsMask value '%s'", v_token);
    560             errno = EINVAL;
    561             free(v_tmp);
    562             return -1;
    563         }
    564     }
    565 
    566     free(v_tmp);
    567     return 0;
    568 }
    569 
    570 int WifiNetwork::parseAuthAlgorithmsMask(const char *buffer, uint32_t *mask) {
    571     bool none = false;
    572     char *v_tmp = strdup(buffer);
    573     char *v_next = v_tmp;
    574     char *v_token;
    575 
    576 //    LOGD("parseAuthAlgorithmsMask(%s)", buffer);
    577 
    578     *mask = 0;
    579     if (buffer[0] == '\0')
    580         return 0;
    581 
    582     while((v_token = strsep(&v_next, " "))) {
    583         if (!strcasecmp(v_token, "OPEN"))
    584             *mask |= AuthenticationAlgorithmMask::OPEN;
    585         else if (!strcasecmp(v_token, "SHARED"))
    586             *mask |= AuthenticationAlgorithmMask::SHARED;
    587         else if (!strcasecmp(v_token, "LEAP"))
    588             *mask |= AuthenticationAlgorithmMask::LEAP;
    589         else {
    590             LOGW("Invalid AuthAlgorithmsMask value '%s'", v_token);
    591             errno = EINVAL;
    592             free(v_tmp);
    593             return -1;
    594         }
    595     }
    596     free(v_tmp);
    597     return 0;
    598 }
    599 
    600 int WifiNetwork::parsePairwiseCiphersMask(const char *buffer, uint32_t *mask) {
    601     bool none = false;
    602     char *v_tmp = strdup(buffer);
    603     char *v_next = v_tmp;
    604     char *v_token;
    605 
    606 //    LOGD("parsePairwiseCiphersMask(%s)", buffer);
    607 
    608     *mask = 0;
    609     while((v_token = strsep(&v_next, " "))) {
    610         if (!strcasecmp(v_token, "NONE")) {
    611             *mask = PairwiseCiphersMask::NONE;
    612             none = true;
    613         } else if (!none) {
    614             if (!strcasecmp(v_token, "TKIP"))
    615                 *mask |= PairwiseCiphersMask::TKIP;
    616             else if (!strcasecmp(v_token, "CCMP"))
    617                 *mask |= PairwiseCiphersMask::CCMP;
    618         else {
    619                 LOGW("PairwiseCiphersMask value '%s' when NONE", v_token);
    620                 errno = EINVAL;
    621                 free(v_tmp);
    622                 return -1;
    623             }
    624         } else {
    625             LOGW("Invalid PairwiseCiphersMask value '%s'", v_token);
    626             errno = EINVAL;
    627             free(v_tmp);
    628             return -1;
    629         }
    630     }
    631     free(v_tmp);
    632     return 0;
    633 }
    634 
    635 int WifiNetwork::parseGroupCiphersMask(const char *buffer, uint32_t *mask) {
    636     bool none = false;
    637     char *v_tmp = strdup(buffer);
    638     char *v_next = v_tmp;
    639     char *v_token;
    640 
    641 //    LOGD("parseGroupCiphersMask(%s)", buffer);
    642 
    643     *mask = 0;
    644     while((v_token = strsep(&v_next, " "))) {
    645         if (!strcasecmp(v_token, "WEP40"))
    646             *mask |= GroupCiphersMask::WEP40;
    647         else if (!strcasecmp(v_token, "WEP104"))
    648             *mask |= GroupCiphersMask::WEP104;
    649         else if (!strcasecmp(v_token, "TKIP"))
    650             *mask |= GroupCiphersMask::TKIP;
    651         else if (!strcasecmp(v_token, "CCMP"))
    652             *mask |= GroupCiphersMask::CCMP;
    653         else {
    654             LOGW("Invalid GroupCiphersMask value '%s'", v_token);
    655             errno = EINVAL;
    656             free(v_tmp);
    657             return -1;
    658         }
    659     }
    660     free(v_tmp);
    661     return 0;
    662 }
    663 
    664 WifiNetwork::WifiNetworkIntegerProperty::WifiNetworkIntegerProperty(WifiNetwork *wn,
    665                                                       const char *name,
    666                                                       bool ro,
    667                                                       int elements) :
    668              IntegerProperty(name, ro, elements) {
    669     mWn = wn;
    670 }
    671 
    672 WifiNetwork::WifiNetworkStringProperty::WifiNetworkStringProperty(WifiNetwork *wn,
    673                                                                   const char *name,
    674                                                               bool ro, int elements) :
    675              StringProperty(name, ro, elements) {
    676     mWn = wn;
    677 }
    678 
    679 WifiNetwork::WifiNetworkEnabledProperty::WifiNetworkEnabledProperty(WifiNetwork *wn) :
    680                 WifiNetworkIntegerProperty(wn, "Enabled", false, 1) {
    681 }
    682 
    683 int WifiNetwork::WifiNetworkEnabledProperty::get(int idx, int *buffer) {
    684     *buffer = mWn->mEnabled;
    685     return 0;
    686 }
    687 int WifiNetwork::WifiNetworkEnabledProperty::set(int idx, int value) {
    688     return mWn->setEnabled(value == 1);
    689 }
    690 
    691 WifiNetwork::WifiNetworkSsidProperty::WifiNetworkSsidProperty(WifiNetwork *wn) :
    692                 WifiNetworkStringProperty(wn, "Ssid", false, 1) {
    693 }
    694 
    695 int WifiNetwork::WifiNetworkSsidProperty::get(int idx, char *buffer, size_t max) {
    696     strncpy(buffer,
    697             mWn->getSsid() ? mWn->getSsid() : "none",
    698             max);
    699     return 0;
    700 }
    701 int WifiNetwork::WifiNetworkSsidProperty::set(int idx, const char *value) {
    702     return mWn->setSsid(value);
    703 }
    704 
    705 WifiNetwork::WifiNetworkBssidProperty::WifiNetworkBssidProperty(WifiNetwork *wn) :
    706                 WifiNetworkStringProperty(wn, "Bssid", false, 1) {
    707 }
    708 int WifiNetwork::WifiNetworkBssidProperty::get(int idx, char *buffer, size_t max) {
    709     strncpy(buffer,
    710             mWn->getBssid() ? mWn->getBssid() : "none",
    711             max);
    712     return 0;
    713 }
    714 int WifiNetwork::WifiNetworkBssidProperty::set(int idx, const char *value) {
    715     return mWn->setBssid(value);
    716 }
    717 
    718 WifiNetwork::WifiNetworkPskProperty::WifiNetworkPskProperty(WifiNetwork *wn) :
    719                 WifiNetworkStringProperty(wn, "Psk", false, 1) {
    720 }
    721 int WifiNetwork::WifiNetworkPskProperty::get(int idx, char *buffer, size_t max) {
    722     strncpy(buffer,
    723             mWn->getPsk() ? mWn->getPsk() : "none",
    724             max);
    725     return 0;
    726 }
    727 int WifiNetwork::WifiNetworkPskProperty::set(int idx, const char *value) {
    728     return mWn->setPsk(value);
    729 }
    730 
    731 WifiNetwork::WifiNetworkWepKeyProperty::WifiNetworkWepKeyProperty(WifiNetwork *wn) :
    732                 WifiNetworkStringProperty(wn, "WepKey", false, 4) {
    733 }
    734 
    735 int WifiNetwork::WifiNetworkWepKeyProperty::get(int idx, char *buffer, size_t max) {
    736     const char *key = mWn->getWepKey(idx);
    737 
    738     strncpy(buffer, (key ? key : "none"), max);
    739     return 0;
    740 }
    741 int WifiNetwork::WifiNetworkWepKeyProperty::set(int idx, const char *value) {
    742     return mWn->setWepKey(idx, value);
    743 }
    744 
    745 WifiNetwork::WifiNetworkDefaultKeyIndexProperty::WifiNetworkDefaultKeyIndexProperty(WifiNetwork *wn) :
    746                 WifiNetworkIntegerProperty(wn, "DefaultKeyIndex", false,  1) {
    747 }
    748 int WifiNetwork::WifiNetworkDefaultKeyIndexProperty::get(int idx, int *buffer) {
    749     *buffer = mWn->getDefaultKeyIndex();
    750     return 0;
    751 }
    752 int WifiNetwork::WifiNetworkDefaultKeyIndexProperty::set(int idx, int value) {
    753     return mWn->setDefaultKeyIndex(value);
    754 }
    755 
    756 WifiNetwork::WifiNetworkPriorityProperty::WifiNetworkPriorityProperty(WifiNetwork *wn) :
    757                 WifiNetworkIntegerProperty(wn, "Priority", false, 1) {
    758 }
    759 int WifiNetwork::WifiNetworkPriorityProperty::get(int idx, int *buffer) {
    760     *buffer = mWn->getPriority();
    761     return 0;
    762 }
    763 int WifiNetwork::WifiNetworkPriorityProperty::set(int idx, int value) {
    764     return mWn->setPriority(value);
    765 }
    766 
    767 WifiNetwork::WifiNetworkKeyManagementProperty::WifiNetworkKeyManagementProperty(WifiNetwork *wn) :
    768                 WifiNetworkStringProperty(wn, "KeyManagement", false, 1) {
    769 }
    770 int WifiNetwork::WifiNetworkKeyManagementProperty::get(int idx, char *buffer, size_t max) {
    771 
    772     if (mWn->getKeyManagement() == KeyManagementMask::NONE)
    773         strncpy(buffer, "NONE", max);
    774     else {
    775         char tmp[80] = { '\0' };
    776 
    777         if (mWn->getKeyManagement() & KeyManagementMask::WPA_PSK)
    778             strcat(tmp, "WPA-PSK");
    779         if (mWn->getKeyManagement() & KeyManagementMask::WPA_EAP) {
    780             if (tmp[0] != '\0')
    781                 strcat(tmp, " ");
    782             strcat(tmp, "WPA-EAP");
    783         }
    784         if (mWn->getKeyManagement() & KeyManagementMask::IEEE8021X) {
    785             if (tmp[0] != '\0')
    786                 strcat(tmp, " ");
    787             strcat(tmp, "IEEE8021X");
    788         }
    789         if (tmp[0] == '\0') {
    790             strncpy(buffer, "(internal error)", max);
    791             errno = ENOENT;
    792             return -1;
    793         }
    794         if (tmp[strlen(tmp)] == ' ')
    795             tmp[strlen(tmp)] = '\0';
    796 
    797         strncpy(buffer, tmp, max);
    798     }
    799     return 0;
    800 }
    801 int WifiNetwork::WifiNetworkKeyManagementProperty::set(int idx, const char *value) {
    802     uint32_t mask;
    803     if (mWn->parseKeyManagementMask(value, &mask))
    804         return -1;
    805     return mWn->setKeyManagement(mask);
    806 }
    807 
    808 WifiNetwork::WifiNetworkProtocolsProperty::WifiNetworkProtocolsProperty(WifiNetwork *wn) :
    809                 WifiNetworkStringProperty(wn, "Protocols", false, 1) {
    810 }
    811 int WifiNetwork::WifiNetworkProtocolsProperty::get(int idx, char *buffer, size_t max) {
    812     char tmp[80] = { '\0' };
    813 
    814     if (mWn->getProtocols() & SecurityProtocolMask::WPA)
    815         strcat(tmp, "WPA");
    816     if (mWn->getProtocols() & SecurityProtocolMask::RSN) {
    817         if (tmp[0] != '\0')
    818             strcat(tmp, " ");
    819         strcat(tmp, "RSN");
    820     }
    821 
    822     if (tmp[0] == '\0') {
    823         strncpy(buffer, "(internal error)", max);
    824         errno = ENOENT;
    825         return NULL;
    826     }
    827     if (tmp[strlen(tmp)] == ' ')
    828         tmp[strlen(tmp)] = '\0';
    829 
    830     strncpy(buffer, tmp, max);
    831     return 0;
    832 }
    833 int WifiNetwork::WifiNetworkProtocolsProperty::set(int idx, const char *value) {
    834     uint32_t mask;
    835     if (mWn->parseProtocolsMask(value, &mask))
    836         return -1;
    837     return mWn->setProtocols(mask);
    838 }
    839 
    840 WifiNetwork::WifiNetworkAuthAlgorithmsProperty::WifiNetworkAuthAlgorithmsProperty(WifiNetwork *wn) :
    841                 WifiNetworkStringProperty(wn, "AuthAlgorithms", false, 1) {
    842 }
    843 int WifiNetwork::WifiNetworkAuthAlgorithmsProperty::get(int idx, char *buffer, size_t max) {
    844     char tmp[80] = { '\0' };
    845 
    846     if (mWn->getAuthAlgorithms() == 0) {
    847         strncpy(buffer, "NONE", max);
    848         return 0;
    849     }
    850 
    851     if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::OPEN)
    852         strcat(tmp, "OPEN");
    853     if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::SHARED) {
    854         if (tmp[0] != '\0')
    855             strcat(tmp, " ");
    856         strcat(tmp, "SHARED");
    857     }
    858     if (mWn->getAuthAlgorithms() & AuthenticationAlgorithmMask::LEAP) {
    859         if (tmp[0] != '\0')
    860             strcat(tmp, " ");
    861         strcat(tmp, "LEAP");
    862     }
    863 
    864     if (tmp[0] == '\0') {
    865         strncpy(buffer, "(internal error)", max);
    866         errno = ENOENT;
    867         return NULL;
    868     }
    869     if (tmp[strlen(tmp)] == ' ')
    870         tmp[strlen(tmp)] = '\0';
    871 
    872     strncpy(buffer, tmp, max);
    873     return 0;
    874 }
    875 int WifiNetwork::WifiNetworkAuthAlgorithmsProperty::set(int idx, const char *value) {
    876     uint32_t mask;
    877     if (mWn->parseAuthAlgorithmsMask(value, &mask))
    878         return -1;
    879     return mWn->setAuthAlgorithms(mask);
    880 }
    881 
    882 WifiNetwork::WifiNetworkPairwiseCiphersProperty::WifiNetworkPairwiseCiphersProperty(WifiNetwork *wn) :
    883                 WifiNetworkStringProperty(wn, "PairwiseCiphers", false, 1) {
    884 }
    885 int WifiNetwork::WifiNetworkPairwiseCiphersProperty::get(int idx, char *buffer, size_t max) {
    886     if (mWn->getPairwiseCiphers() == PairwiseCiphersMask::NONE)
    887         strncpy(buffer, "NONE", max);
    888     else {
    889         char tmp[80] = { '\0' };
    890 
    891         if (mWn->getPairwiseCiphers() & PairwiseCiphersMask::TKIP)
    892             strcat(tmp, "TKIP");
    893         if (mWn->getPairwiseCiphers() & PairwiseCiphersMask::CCMP) {
    894             if (tmp[0] != '\0')
    895                 strcat(tmp, " ");
    896             strcat(tmp, "CCMP");
    897         }
    898         if (tmp[0] == '\0') {
    899             strncpy(buffer, "(internal error)", max);
    900             errno = ENOENT;
    901             return NULL;
    902         }
    903         if (tmp[strlen(tmp)] == ' ')
    904             tmp[strlen(tmp)] = '\0';
    905 
    906         strncpy(buffer, tmp, max);
    907     }
    908     return 0;
    909 }
    910 int WifiNetwork::WifiNetworkPairwiseCiphersProperty::set(int idx, const char *value) {
    911     uint32_t mask;
    912     if (mWn->parsePairwiseCiphersMask(value, &mask))
    913         return -1;
    914     return mWn->setPairwiseCiphers(mask);
    915 }
    916 
    917 WifiNetwork::WifiNetworkGroupCiphersProperty::WifiNetworkGroupCiphersProperty(WifiNetwork *wn) :
    918                 WifiNetworkStringProperty(wn, "GroupCiphers", false, 1) {
    919 }
    920 int WifiNetwork::WifiNetworkGroupCiphersProperty::get(int idx, char *buffer, size_t max) {
    921    char tmp[80] = { '\0' };
    922 
    923     if (mWn->getGroupCiphers() & GroupCiphersMask::WEP40)
    924         strcat(tmp, "WEP40");
    925     if (mWn->getGroupCiphers() & GroupCiphersMask::WEP104) {
    926         if (tmp[0] != '\0')
    927             strcat(tmp, " ");
    928         strcat(tmp, "WEP104");
    929     }
    930     if (mWn->getGroupCiphers() & GroupCiphersMask::TKIP) {
    931         if (tmp[0] != '\0')
    932             strcat(tmp, " ");
    933         strcat(tmp, "TKIP");
    934     }
    935     if (mWn->getGroupCiphers() & GroupCiphersMask::CCMP) {
    936         if (tmp[0] != '\0')
    937             strcat(tmp, " ");
    938         strcat(tmp, "CCMP");
    939     }
    940 
    941     if (tmp[0] == '\0') {
    942         strncpy(buffer, "(internal error)", max);
    943         errno = ENOENT;
    944         return -1;
    945     }
    946     if (tmp[strlen(tmp)] == ' ')
    947         tmp[strlen(tmp)] = '\0';
    948 
    949     strncpy(buffer, tmp, max);
    950     return 0;
    951 }
    952 int WifiNetwork::WifiNetworkGroupCiphersProperty::set(int idx, const char *value) {
    953     uint32_t mask;
    954     if (mWn->parseGroupCiphersMask(value, &mask))
    955         return -1;
    956     return mWn->setGroupCiphers(mask);
    957 }
    958 
    959 WifiNetwork::WifiNetworkHiddenSsidProperty::WifiNetworkHiddenSsidProperty(WifiNetwork *wn) :
    960                 WifiNetworkStringProperty(wn, "HiddenSsid", false, 1) {
    961 }
    962 int WifiNetwork::WifiNetworkHiddenSsidProperty::get(int idx, char *buffer, size_t max) {
    963     const char *scan_ssid = mWn->getHiddenSsid();
    964 
    965     strncpy(buffer, (scan_ssid ? scan_ssid : "none"), max);
    966     return 0;
    967 }
    968 int WifiNetwork::WifiNetworkHiddenSsidProperty::set(int idx, const char *value) {
    969     return mWn->setHiddenSsid(value);
    970 }
    971