diff options
Diffstat (limited to 'src/devices/wifi/nm-wifi-ap.c')
-rw-r--r-- | src/devices/wifi/nm-wifi-ap.c | 119 |
1 files changed, 61 insertions, 58 deletions
diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index 0c252218fa..020b44ff53 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -32,7 +32,7 @@ #include "nm-setting-wireless.h" #include "nm-glib-compat.h" -#include "nm-access-point-glue.h" +#include "nmdbus-access-point.h" /* * Encapsulates Access Point information @@ -387,104 +387,107 @@ security_from_dict (GHashTable *security) return flags; } -static void -foreach_property_cb (gpointer key, gpointer value, gpointer user_data) +NMAccessPoint * +nm_ap_new_from_properties (const char *supplicant_path, GVariant *properties) { - GValue *variant = (GValue *) value; - NMAccessPoint *ap = (NMAccessPoint *) user_data; + NMAccessPoint *ap; + const char *addr; + const char bad_bssid1[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + const char bad_bssid2[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + GVariantIter iter; + GVariant *variant; - if (G_VALUE_HOLDS_BOXED (variant)) { - GArray *array = g_value_get_boxed (variant); + g_return_val_if_fail (properties != NULL, NULL); + ap = nm_ap_new (); + + g_object_freeze_notify (G_OBJECT (ap)); + + g_variant_iter_new (&iter, properties); + while (g_variant_iter_next (&iter, "{&sv}", &key, &variant)) { if (!strcmp (key, "SSID")) { - guint32 len = MIN (32, array->len); + const guint8 *array; + gsize length; + + array = g_variant_get_fixed_array (variant, &length, 1); + length = MIN (32, length); /* Stupid ieee80211 layer uses <hidden> */ - if (((len == 8) || (len == 9)) - && (memcmp (array->data, "<hidden>", 8) == 0)) - return; + if ( ((length == 8) || (length == 9)) + && (memcmp (array, "<hidden>", 8) == 0)) + goto next; + + if (nm_utils_is_empty_ssid (array, length)) + goto next; - if (nm_utils_is_empty_ssid ((const guint8 *) array->data, len)) - return; + nm_ap_set_ssid (ap, array, length); - nm_ap_set_ssid (ap, (const guint8 *) array->data, len); } else if (!strcmp (key, "BSSID")) { + const guint8 *array; + gsize length; char *addr; - if (array->len != ETH_ALEN) - return; - addr = nm_utils_hwaddr_ntoa (array->data, array->len); + array = g_variant_get_fixed_array (variant, &length, 1); + if (length != ETH_ALEN) + goto next; + + addr = nm_utils_hwaddr_ntoa (array, length); nm_ap_set_address (ap, addr); g_free (addr); + } else if (!strcmp (key, "Rates")) { + const guint32 *rates; + gsize length; guint32 maxrate = 0; int i; - /* Find the max AP rate */ - for (i = 0; i < array->len; i++) { - guint32 r = g_array_index (array, guint32, i); + rates = g_variant_get_fixed_array (variant, &length, sizeof (guint32)); - if (r > maxrate) { - maxrate = r; - nm_ap_set_max_bitrate (ap, r / 1000); + /* Find the max AP rate */ + for (i = 0; i < length; i++) { + if (rates[i] > maxrate) { + maxrate = rates[i]; + nm_ap_set_max_bitrate (ap, rates[i] / 1000); } } + } else if (!strcmp (key, "WPA")) { NM80211ApSecurityFlags flags = nm_ap_get_wpa_flags (ap); - flags |= security_from_dict (g_value_get_boxed (variant)); + flags |= security_from_dict (variant); nm_ap_set_wpa_flags (ap, flags); + } else if (!strcmp (key, "RSN")) { NM80211ApSecurityFlags flags = nm_ap_get_rsn_flags (ap); - flags |= security_from_dict (g_value_get_boxed (variant)); + flags |= security_from_dict (variant); nm_ap_set_rsn_flags (ap, flags); - } - } else if (G_VALUE_HOLDS_UINT (variant)) { - guint32 val = g_value_get_uint (variant); - if (!strcmp (key, "Frequency")) - nm_ap_set_freq (ap, val); - } else if (G_VALUE_HOLDS_INT (variant)) { - gint val = g_value_get_int (variant); + } else if (!strcmp (key, "Frequency")) { + nm_ap_set_freq (ap, g_variant_get_uint (variant)); + + } else if (!strcmp (key, "Signal")) { + nm_ap_set_strength (ap, g_variant_get_int (variant)); - if (!strcmp (key, "Signal")) - nm_ap_set_strength (ap, nm_ap_utils_level_to_quality (val)); - } else if (G_VALUE_HOLDS_STRING (variant)) { - const char *val = g_value_get_string (variant); + } else if (!strcmp (key, "Mode")) { + const char *val = g_variant_get_string (variant); - if (val && !strcmp (key, "Mode")) { if (strcmp (val, "infrastructure") == 0) nm_ap_set_mode (ap, NM_802_11_MODE_INFRA); else if (strcmp (val, "ad-hoc") == 0) nm_ap_set_mode (ap, NM_802_11_MODE_ADHOC); - } - } else if (G_VALUE_HOLDS_BOOLEAN (variant)) { - gboolean val = g_value_get_boolean (variant); - - if (strcmp (key, "Privacy") == 0) { + } else if (strcmp (key, "Privacy") == 0) { + gboolean val = g_variant_get_boolean (variant); + if (val) { NM80211ApFlags flags = nm_ap_get_flags (ap); nm_ap_set_flags (ap, flags | NM_802_11_AP_FLAGS_PRIVACY); } } - } -} -NMAccessPoint * -nm_ap_new_from_properties (const char *supplicant_path, GHashTable *properties) -{ - NMAccessPoint *ap; - const char *addr; - const char bad_bssid1[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - const char bad_bssid2[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - - g_return_val_if_fail (properties != NULL, NULL); - - ap = nm_ap_new (); - - g_object_freeze_notify (G_OBJECT (ap)); - g_hash_table_foreach (properties, foreach_property_cb, ap); + next: + g_variant_unref (variant); + } nm_ap_set_supplicant_path (ap, supplicant_path); |