diff --git a/include/iface.h b/include/iface.h index 3530f23..24f0a9a 100644 --- a/include/iface.h +++ b/include/iface.h @@ -161,7 +161,7 @@ extern void connman_iface_indicate_carrier_off(struct connman_iface *iface); extern void connman_iface_indicate_configured(struct connman_iface *iface); extern void connman_iface_indicate_station(struct connman_iface *iface, - const char *name, int strength, int security); + const char *bssid, const char *name, int strength, int security); extern int connman_iface_get_ipv4(struct connman_iface *iface, struct connman_ipv4 *ipv4); diff --git a/plugins/supplicant.c b/plugins/supplicant.c index cba93cd..a8a46ed 100644 --- a/plugins/supplicant.c +++ b/plugins/supplicant.c @@ -66,7 +66,9 @@ static GSList *tasks = NULL; struct supplicant_ap { gchar *identifier; + gchar *bssid; GByteArray *ssid; + guint quality; guint capabilities; gboolean has_wep; gboolean has_wpa; @@ -618,6 +620,24 @@ static void extract_ssid(struct supplicant_ap *ap, DBusMessageIter *value) ap->identifier = g_strdup((char *) ssid); } +static void extract_bssid(struct supplicant_ap *ap, DBusMessageIter *value) +{ + DBusMessageIter array; + unsigned char *bssid; + int bssid_len; + char buf[20]; + + dbus_message_iter_recurse(value, &array); + dbus_message_iter_get_fixed_array(&array, &bssid, &bssid_len); + if (bssid_len >= 6) { + g_snprintf((char *)buf, sizeof(buf), + "%02x:%02x:%02x:%02x:%02x:%02x", + (int)bssid[0], (int)bssid[1], (int)bssid[2], + (int)bssid[3], (int)bssid[4], (int)bssid[5]); + ap->bssid = g_strdup((char *) buf); + } +} + static void extract_wpaie(struct supplicant_ap *ap, DBusMessageIter *value) { DBusMessageIter array; @@ -657,6 +677,16 @@ static void extract_capabilites(struct supplicant_ap *ap, ap->has_wep = TRUE; } +static void extract_quality(struct supplicant_ap *ap, + DBusMessageIter *value) +{ + guint quality; + + dbus_message_iter_get_basic(value, &quality); + + ap->quality = quality; +} + static int parse_network_properties(struct supplicant_task *task, DBusMessage *message) { @@ -688,12 +718,16 @@ static int parse_network_properties(struct supplicant_task *task, if (g_str_equal(key, "ssid") == TRUE) extract_ssid(ap, &value); + else if (g_str_equal(key, "bssid") == TRUE) + extract_bssid(ap, &value); else if (g_str_equal(key, "wpaie") == TRUE) extract_wpaie(ap, &value); else if (g_str_equal(key, "rsnie") == TRUE) extract_rsnie(ap, &value); else if (g_str_equal(key, "capabilities") == TRUE) extract_capabilites(ap, &value); + else if (g_str_equal(key, "quality") == TRUE) + extract_quality(ap, &value); dbus_message_iter_next(&dict); } @@ -706,7 +740,8 @@ static int parse_network_properties(struct supplicant_task *task, security |= 0x04; connman_iface_indicate_station(task->iface, - ap->identifier, 25, security); + ap->bssid, ap->identifier, ap->quality, + security); g_free(ap); diff --git a/src/iface-inet.c b/src/iface-inet.c index 82a1e8c..f780452 100644 --- a/src/iface-inet.c +++ b/src/iface-inet.c @@ -275,6 +275,10 @@ int __connman_iface_connect(struct connman_iface *iface, iface->flags |= CONNMAN_IFACE_FLAG_RUNNING; + /* This actually makes it do a dhcp request properly when connections + * are estabished - it doesnt seem to otherwise */ + iface->state = CONNMAN_IFACE_STATE_ENABLED; + return 0; } diff --git a/src/iface.c b/src/iface.c index b2fd6d1..c70b25c 100644 --- a/src/iface.c +++ b/src/iface.c @@ -332,11 +332,13 @@ void connman_iface_indicate_configured(struct connman_iface *iface) } } -static void append_station(DBusMessage *reply, const char *name, +static void append_station(DBusMessage *reply, const char *bssid, const char *name, int signal, int security) { DBusMessageIter array, dict; + const char *wep = "WEP"; const char *wpa = "WPA"; + const char *rsn = "RSN"; dbus_message_iter_init_append(reply, &array); @@ -345,25 +347,36 @@ static void append_station(DBusMessage *reply, const char *name, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); - append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name); + if (bssid) append_entry(&dict, "BSSID", DBUS_TYPE_STRING, &bssid); + if (name) append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name); append_entry(&dict, "Signal", DBUS_TYPE_UINT16, &signal); - if (security > 0) - append_entry(&dict, "Security", DBUS_TYPE_STRING, &wpa); + if (security > 0) { + const char *sec = NULL; + + if (security & 0x4) + sec = rsn; + else if (security & 0x2) + sec = wpa; + else if (security & 0x1) + sec = wep; + if (sec) + append_entry(&dict, "Security", DBUS_TYPE_STRING, &sec); + } dbus_message_iter_close_container(&array, &dict); } void connman_iface_indicate_station(struct connman_iface *iface, - const char *name, int strength, int security) + const char *bssid, const char *name, int strength, int security) { DBusMessage *signal; - char *ssid, *passphrase; + char *ssid = NULL, *passphrase; int len; - DBG("iface %p security %d name %s", iface, security, name); + DBG("iface %p security %d name %s bssid %s", iface, security, name, bssid); - if (name == NULL || strlen(name) == 0) + if (bssid == NULL || strlen(bssid) == 0) return; signal = dbus_message_new_signal(iface->path, @@ -371,7 +384,7 @@ void connman_iface_indicate_station(struct connman_iface *iface, if (signal == NULL) return; - append_station(signal, name, strength, security); + append_station(signal, bssid, name, strength, security); dbus_connection_send(connection, signal, NULL); dbus_message_unref(signal); @@ -386,17 +399,21 @@ void connman_iface_indicate_station(struct connman_iface *iface, default: break; } - - len = strlen(name); - ssid = strdup(name); - if (ssid == NULL) + + passphrase = __connman_iface_find_passphrase(iface, bssid); + + if (!passphrase && name) { + len = strlen(name); + ssid = strdup(name); + /* The D-Link access points return a 0x05 at the end of the SSID */ + if (len > 0 && ssid[len - 1] == '\05') + ssid[len - 1] = '\0'; + } + + if (!passphrase && ssid == NULL) return; - - /* The D-Link access points return a 0x05 at the end of the SSID */ - if (ssid[len - 1] == '\05') - ssid[len - 1] = '\0'; - - passphrase = __connman_iface_find_passphrase(iface, ssid); + if (!passphrase) + passphrase = __connman_iface_find_passphrase(iface, ssid); if (passphrase != NULL) { DBG("network %s passphrase %s", ssid, passphrase); @@ -1154,7 +1171,7 @@ static GDBusMethodTable iface_methods[] = { { "GetNetwork", "", "a{sv}", get_network }, { "SetNetwork", "a{sv}", "", set_network }, { "ListNetworks", "", "ao", list_networks }, - { "CreateNetwork", "a{av}", "o", create_network }, + { "CreateNetwork", "a{sv}", "o", create_network }, { "RemoveNetwork", "o", "", remove_network }, { "SelectNetwork", "o", "", select_network }, { "GetIPv4", "", "a{sv}", get_ipv4 }, @@ -1301,7 +1318,7 @@ static int probe_device(LibHalContext *ctx, conn = libhal_ctx_get_dbus_connection(ctx); - g_dbus_register_object(conn, iface->path, iface, device_free); + g_dbus_register_object(conn, iface->path); interfaces = g_slist_append(interfaces, iface); @@ -1313,7 +1330,7 @@ static int probe_device(LibHalContext *ctx, g_dbus_register_interface(conn, iface->path, CONNMAN_IFACE_INTERFACE, - iface_methods, iface_signals, NULL); + iface_methods, iface_signals, NULL, iface, device_free); DBG("iface %p identifier %s", iface, iface->identifier); diff --git a/src/manager.c b/src/manager.c index 9d14cd7..78b017f 100644 --- a/src/manager.c +++ b/src/manager.c @@ -218,18 +218,18 @@ int __connman_manager_init(DBusConnection *conn, gboolean compat) if (connection == NULL) return -1; - g_dbus_register_object(connection, CONNMAN_MANAGER_PATH, NULL, NULL); + g_dbus_register_object(connection, CONNMAN_MANAGER_PATH); g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, manager_methods, - manager_signals, NULL); + manager_signals, NULL, NULL, NULL); if (compat == TRUE) { - g_dbus_register_object(connection, NM_PATH, NULL, NULL); + g_dbus_register_object(connection, NM_PATH); g_dbus_register_interface(connection, NM_PATH, NM_INTERFACE, - nm_methods, NULL, NULL); + nm_methods, NULL, NULL, NULL, NULL); nm_compat = TRUE; } diff --git a/src/network.c b/src/network.c index 9da8fea..a5ec2b9 100644 --- a/src/network.c +++ b/src/network.c @@ -157,10 +157,10 @@ const char *__connman_iface_add_network(struct connman_iface *iface, networks = g_slist_append(networks, network); - g_dbus_register_object(connection, path, network, network_free); + g_dbus_register_object(connection, path); g_dbus_register_interface(connection, path, CONNMAN_NETWORK_INTERFACE, - network_methods, NULL, NULL); + network_methods, NULL, NULL, network, network_free); return path; }