diff options
Diffstat (limited to 'packages/connman/files/connman-build-and-work.patch')
-rw-r--r-- | packages/connman/files/connman-build-and-work.patch | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/packages/connman/files/connman-build-and-work.patch b/packages/connman/files/connman-build-and-work.patch new file mode 100644 index 0000000000..482e7a5e1b --- /dev/null +++ b/packages/connman/files/connman-build-and-work.patch @@ -0,0 +1,286 @@ +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; + } |