gboolean has_wpa;
gboolean has_rsn;
gboolean has_wps;
+ dbus_int32_t frequency;
dbus_int32_t quality;
dbus_int32_t noise;
dbus_int32_t level;
connman_device_unref(task->device);
+ inet_ifdown(task->ifindex);
+
free_task(task);
dbus_message_unref(reply);
DBUS_TYPE_BYTE, &network, len);
if (g_ascii_strcasecmp(security, "wpa") == 0 ||
- g_ascii_strcasecmp(security, "wpa2") == 0) {
+ g_ascii_strcasecmp(security, "rsn") == 0) {
const char *key_mgmt = "WPA-PSK";
connman_dbus_dict_append_variant(&dict, "key_mgmt",
DBUS_TYPE_STRING, &key_mgmt);
return 0;
}
-static char *build_group(const unsigned char *ssid, unsigned int ssid_len,
+static struct {
+ char *name;
+ char *value;
+} special_ssid[] = {
+ { "<hidden>", "hidden" },
+ { "default", "linksys" },
+ { "wireless" },
+ { "linksys" },
+ { "netgear" },
+ { "dlink" },
+ { "2wire" },
+ { "compaq" },
+ { "tsunami" },
+ { "comcomcom" },
+ { "Symbol", "symbol" },
+ { "Wireless" , "wireless" },
+ { "WLAN", "wlan" },
+ { }
+};
+
+static char *build_group(const char *addr, const char *name,
+ const unsigned char *ssid, unsigned int ssid_len,
const char *mode, const char *security)
{
GString *str;
unsigned int i;
- if (ssid_len < 1)
+ if (addr == NULL)
return NULL;
str = g_string_sized_new((ssid_len * 2) + 24);
if (str == NULL)
return NULL;
- for (i = 0; i < ssid_len; i++)
- g_string_append_printf(str, "%02x", ssid[i]);
+ for (i = 0; special_ssid[i].name; i++) {
+ if (g_strcmp0(special_ssid[i].name, name) == 0) {
+ if (special_ssid[i].value == NULL)
+ g_string_append_printf(str, "%s_%s",
+ name, addr);
+ else
+ g_string_append_printf(str, "%s_%s",
+ special_ssid[i].value, addr);
+ goto done;
+ }
+ }
+
+ if (ssid_len > 0 && ssid[0] != '\0') {
+ for (i = 0; i < ssid_len; i++)
+ g_string_append_printf(str, "%02x", ssid[i]);
+ } else
+ g_string_append_printf(str, "hidden_%s", addr);
+done:
g_string_append_printf(str, "_%s_%s", mode, security);
return g_string_free(str, FALSE);
if (result->path == NULL)
return;
- snprintf(result->path, 18, "%02X_%02X_%02X_%02X_%02X_%02X",
+ snprintf(result->path, 18, "%02x%02x%02x%02x%02x%02x",
eth->ether_addr_octet[0],
eth->ether_addr_octet[1],
eth->ether_addr_octet[2],
if (ssid_len < 1)
return;
- if (ssid[0] == '\0')
- return;
-
result->ssid = g_try_malloc(ssid_len);
if (result->ssid == NULL)
return;
DBusMessage *reply;
DBusMessageIter array, dict;
unsigned char strength;
+ unsigned short frequency;
const char *mode, *security;
char *group;
extract_wpsie(&value, &result);
else if (g_str_equal(key, "capabilities") == TRUE)
extract_capabilites(&value, &result);
+ else if (g_str_equal(key, "frequency") == TRUE)
+ dbus_message_iter_get_basic(&value, &result.frequency);
else if (g_str_equal(key, "quality") == TRUE)
dbus_message_iter_get_basic(&value, &result.quality);
else if (g_str_equal(key, "noise") == TRUE)
if (result.path[0] == '\0')
goto done;
- strength = result.quality;
+ strength = result.quality;
+ frequency = result.frequency;
if (result.has_rsn == TRUE)
- security = "wpa2";
+ security = "rsn";
else if (result.has_wpa == TRUE)
security = "wpa";
else if (result.has_wep == TRUE)
mode = (result.adhoc == TRUE) ? "adhoc" : "managed";
- group = build_group(result.ssid, result.ssid_len, mode, security);
+ group = build_group(result.path, result.name,
+ result.ssid, result.ssid_len,
+ mode, security);
network = connman_device_get_network(task->device, result.path);
if (network == NULL) {
connman_network_set_string(network, "Address", result.addr);
- connman_network_set_group(network, group);
-
- if (result.name != NULL && result.name[0] != '\0')
- connman_network_set_string(network, "Name", result.name);
-
- connman_network_set_uint8(network, "Strength", strength);
-
- connman_network_set_string(network, "WiFi.Mode", mode);
- connman_network_set_string(network, "WiFi.Security", security);
-
if (connman_device_add_network(task->device, network) < 0) {
connman_network_unref(network);
goto done;
}
}
- connman_network_set_group(network, group);
-
- g_free(group);
-
if (result.name != NULL && result.name[0] != '\0')
connman_network_set_string(network, "Name", result.name);
connman_network_set_available(network, TRUE);
connman_network_set_uint8(network, "Strength", strength);
+ connman_network_set_uint16(network, "Frequency", frequency);
connman_network_set_string(network, "WiFi.Security", security);
+ connman_network_set_group(network, group);
+
+ g_free(group);
+
done:
g_free(result.path);
g_free(result.addr);
connman_network_set_connected(task->network, FALSE);
connman_device_set_scanning(task->device, FALSE);
break;
+ case WPA_ASSOCIATING:
+ connman_network_set_associating(task->network, TRUE);
+ break;
default:
+ connman_network_set_associating(task->network, FALSE);
break;
}
}
enable_network(task);
+ connman_network_set_associating(task->network, TRUE);
+
return 0;
}