summaryrefslogtreecommitdiffstats
path: root/nexus/WifiNetwork.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'nexus/WifiNetwork.cpp')
-rw-r--r--nexus/WifiNetwork.cpp54
1 files changed, 45 insertions, 9 deletions
diff --git a/nexus/WifiNetwork.cpp b/nexus/WifiNetwork.cpp
index 818b91d..7059bd0 100644
--- a/nexus/WifiNetwork.cpp
+++ b/nexus/WifiNetwork.cpp
@@ -76,7 +76,7 @@ WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, const char *data)
mDefaultKeyIndex = -1;
mPriority = -1;
mHiddenSsid = NULL;
- mAllowedKeyManagement = 0;
+ mAllowedKeyManagement = KeyManagementMask::UNKNOWN;
mAllowedProtocols = 0;
mAllowedAuthAlgorithms = 0;
mAllowedPairwiseCiphers = 0;
@@ -94,8 +94,6 @@ WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, const char *data)
asprintf(&tmp2, "wifi.net.%d", mNetid);
mIfaceCfg = new InterfaceConfig(tmp2);
free(tmp2);
-
- registerProperties();
free(tmp);
}
@@ -121,8 +119,6 @@ WifiNetwork::WifiNetwork(WifiController *c, Supplicant *suppl, int networkId) {
asprintf(&tmp2, "wifi.net.%d", mNetid);
mIfaceCfg = new InterfaceConfig(tmp2);
free(tmp2);
-
- registerProperties();
}
WifiNetwork *WifiNetwork::clone() {
@@ -153,7 +149,6 @@ WifiNetwork *WifiNetwork::clone() {
}
WifiNetwork::~WifiNetwork() {
- unregisterProperties();
if (mSsid)
free(mSsid);
if (mBssid)
@@ -203,7 +198,26 @@ int WifiNetwork::refresh() {
len = sizeof(buffer);
if (mSuppl->getNetworkVar(mNetid, "key_mgmt", buffer, len)) {
- // TODO
+ if (!strcmp(buffer, "NONE"))
+ setAllowedKeyManagement(KeyManagementMask::NONE);
+ else if (index(buffer, ' ')) {
+ char *next = buffer;
+ char *token;
+ uint32_t mask = 0;
+
+ while((token = strsep(&next, " "))) {
+ if (!strcmp(token, "WPA-PSK"))
+ mask |= KeyManagementMask::WPA_PSK;
+ else if (!strcmp(token, "WPA-EAP"))
+ mask |= KeyManagementMask::WPA_EAP;
+ else if (!strcmp(token, "IEE8021X"))
+ mask |= KeyManagementMask::IEEE8021X;
+ else
+ LOGW("Unsupported key management scheme '%s'" , token);
+ }
+ setAllowedKeyManagement(mask);
+ } else
+ LOGE("Unsupported key management '%s'", buffer);
}
len = sizeof(buffer);
@@ -273,7 +287,7 @@ int WifiNetwork::set(const char *name, const char *value) {
while((v_token = strsep(&v_next, " "))) {
if (!strcasecmp(v_token, "NONE")) {
- mask = 0;
+ mask = KeyManagementMask::NONE;
none = true;
} else if (!none) {
if (!strcasecmp(v_token, "WPA_PSK"))
@@ -363,7 +377,29 @@ const char *WifiNetwork::get(const char *name, char *buffer, size_t maxsize) {
snprintf(buffer, maxsize, "%d", getDefaultKeyIndex());
else if (!strcasecmp(fc, "pri"))
snprintf(buffer, maxsize, "%d", getPriority());
- else if (!strcasecmp(fc, "hiddenssid")) {
+ else if (!strcasecmp(fc, "AllowedKeyManagement")) {
+ if (getAllowedKeyManagement() == KeyManagementMask::NONE)
+ strncpy(buffer, "NONE", maxsize);
+ else {
+ char tmp[80] = { '\0' };
+
+ if (getAllowedKeyManagement() & KeyManagementMask::WPA_PSK)
+ strcat(tmp, "WPA_PSK ");
+ if (getAllowedKeyManagement() & KeyManagementMask::WPA_EAP)
+ strcat(tmp, "WPA_EAP ");
+ if (getAllowedKeyManagement() & KeyManagementMask::IEEE8021X)
+ strcat(tmp, "IEEE8021X");
+ if (tmp[0] == '\0') {
+ strncpy(buffer, "(internal error)", maxsize);
+ errno = ENOENT;
+ return NULL;
+ }
+ if (tmp[strlen(tmp)] == ' ')
+ tmp[strlen(tmp)] = '\0';
+
+ strncpy(buffer, tmp, maxsize);
+ }
+ } else if (!strcasecmp(fc, "hiddenssid")) {
strncpy(buffer,
getHiddenSsid() ? getHiddenSsid() : "none",
maxsize);