diff options
author | Thomas Haller <thaller@redhat.com> | 2017-01-04 14:05:38 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-01-04 14:05:38 +0100 |
commit | 9473943ef30005b3bcfba0be51254b1e2932174d (patch) | |
tree | b6183852acc0ae644393e85ee8114294a4cba920 | |
parent | 44ab504cf77963f0d246bdf695b9a2d5ec0b1603 (diff) | |
parent | d9efe73fed8b33dace17b0ebed180beb0eae78c6 (diff) | |
download | NetworkManager-9473943ef30005b3bcfba0be51254b1e2932174d.tar.gz |
wifi: merge refactor tracking of APs
-rw-r--r-- | src/devices/wifi/nm-device-wifi.c | 129 | ||||
-rw-r--r-- | src/devices/wifi/nm-wifi-ap.c | 16 | ||||
-rw-r--r-- | src/devices/wifi/nm-wifi-ap.h | 2 | ||||
-rw-r--r-- | src/dns/nm-dns-manager.c | 41 |
4 files changed, 110 insertions, 78 deletions
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c index 5645ad3c7a..9556adfc2d 100644 --- a/src/devices/wifi/nm-device-wifi.c +++ b/src/devices/wifi/nm-device-wifi.c @@ -997,66 +997,92 @@ can_auto_connect (NMDevice *device, return FALSE; } -static gint -ap_id_compare (NMWifiAP *a, NMWifiAP *b) +static int +ap_id_compare (gconstpointer p_a, gconstpointer p_b, gpointer user_data) { - guint32 a_id = nm_wifi_ap_get_id (a); - guint32 b_id = nm_wifi_ap_get_id (b); + guint64 a_id = nm_wifi_ap_get_id (*((NMWifiAP **) p_a)); + guint64 b_id = nm_wifi_ap_get_id (*((NMWifiAP **) p_b)); return a_id < b_id ? -1 : (a_id == b_id ? 0 : 1); } -static GSList * -get_sorted_ap_list (NMDeviceWifi *self) +static NMWifiAP ** +ap_list_get_sorted (NMDeviceWifi *self, gboolean include_without_ssid) { - GSList *sorted = NULL; + NMDeviceWifiPrivate *priv; + NMWifiAP **list; GHashTableIter iter; NMWifiAP *ap; + gsize i, n; - g_hash_table_iter_init (&iter, NM_DEVICE_WIFI_GET_PRIVATE (self)->aps); - while (g_hash_table_iter_next (&iter, NULL, (gpointer) &ap)) - sorted = g_slist_prepend (sorted, ap); - return g_slist_sort (sorted, (GCompareFunc) ap_id_compare); + priv = NM_DEVICE_WIFI_GET_PRIVATE (self); + + n = g_hash_table_size (priv->aps); + list = g_new (NMWifiAP *, n + 1); + + i = 0; + if (n > 0) { + g_hash_table_iter_init (&iter, priv->aps); + while (g_hash_table_iter_next (&iter, NULL, (gpointer) &ap)) { + nm_assert (i < n); + if ( include_without_ssid + || nm_wifi_ap_get_ssid (ap)) + list[i++] = ap; + } + nm_assert (i <= n); + nm_assert (!include_without_ssid || i == n); + + g_qsort_with_data (list, + i, + sizeof (gpointer), + ap_id_compare, + NULL); + } + list[i] = NULL; + return list; } -static void -impl_device_wifi_get_access_points (NMDeviceWifi *self, - GDBusMethodInvocation *context) +static const char ** +ap_list_get_sorted_paths (NMDeviceWifi *self, gboolean include_without_ssid) { - GSList *sorted, *iter; - GPtrArray *paths; + gpointer *list; + gsize i, j; - paths = g_ptr_array_new (); - sorted = get_sorted_ap_list (self); - for (iter = sorted; iter; iter = iter->next) { - NMWifiAP *ap = NM_WIFI_AP (iter->data); + list = (gpointer *) ap_list_get_sorted (self, include_without_ssid); + for (i = 0, j = 0; list[i]; i++) { + NMWifiAP *ap = list[i]; + const char *path; - if (nm_wifi_ap_get_ssid (ap)) - g_ptr_array_add (paths, g_strdup (nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap)))); + /* update @list inplace to hold instead the export-path. */ + path = nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap)); + nm_assert (path); + list[j++] = (gpointer) path; } - g_ptr_array_add (paths, NULL); - g_slist_free (sorted); + return (const char **) list; +} - g_dbus_method_invocation_return_value (context, g_variant_new ("(^ao)", (char **) paths->pdata)); - g_ptr_array_unref (paths); +static void +impl_device_wifi_get_access_points (NMDeviceWifi *self, + GDBusMethodInvocation *context) +{ + gs_free const char **list = NULL; + GVariant *v; + + list = ap_list_get_sorted_paths (self, FALSE); + v = g_variant_new_objv (list, -1); + g_dbus_method_invocation_return_value (context, g_variant_new_tuple (&v, 1)); } static void impl_device_wifi_get_all_access_points (NMDeviceWifi *self, GDBusMethodInvocation *context) { - GSList *sorted, *iter; - GPtrArray *paths; - - paths = g_ptr_array_new (); - sorted = get_sorted_ap_list (self); - for (iter = sorted; iter; iter = iter->next) - g_ptr_array_add (paths, g_strdup (nm_exported_object_get_path (NM_EXPORTED_OBJECT (iter->data)))); - g_ptr_array_add (paths, NULL); - g_slist_free (sorted); + gs_free const char **list = NULL; + GVariant *v; - g_dbus_method_invocation_return_value (context, g_variant_new ("(^ao)", (char **) paths->pdata)); - g_ptr_array_unref (paths); + list = ap_list_get_sorted_paths (self, TRUE); + v = g_variant_new_objv (list, -1); + g_dbus_method_invocation_return_value (context, g_variant_new_tuple (&v, 1)); } static void @@ -1523,17 +1549,17 @@ ap_list_dump (gpointer user_data) { NMDeviceWifi *self = NM_DEVICE_WIFI (user_data); NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); - GSList *sorted, *iter; + gs_free NMWifiAP **list = NULL; + gsize i; priv->ap_dump_id = 0; _LOGD (LOGD_WIFI_SCAN, "APs: [now:%u last:%u next:%u]", nm_utils_get_monotonic_timestamp_s (), priv->last_scan, priv->scheduled_scan_time); - sorted = get_sorted_ap_list (self); - for (iter = sorted; iter; iter = iter->next) - nm_wifi_ap_dump (NM_WIFI_AP (iter->data), "dump ", nm_device_get_iface (NM_DEVICE (self))); - g_slist_free (sorted); + list = ap_list_get_sorted (self, TRUE); + for (i = 0; list[i]; i++) + nm_wifi_ap_dump (list[i], "dump ", nm_device_get_iface (NM_DEVICE (self))); return G_SOURCE_REMOVE; } @@ -3113,11 +3139,10 @@ static void get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - NMDeviceWifi *device = NM_DEVICE_WIFI (object); - NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (device); - GHashTableIter iter; - const char *dbus_path; - GPtrArray *array; + NMDeviceWifi *self = NM_DEVICE_WIFI (object); + NMDeviceWifiPrivate *priv = NM_DEVICE_WIFI_GET_PRIVATE (self); + gsize i; + char **list; switch (prop_id) { case PROP_MODE: @@ -3130,12 +3155,10 @@ get_property (GObject *object, guint prop_id, g_value_set_uint (value, priv->capabilities); break; case PROP_ACCESS_POINTS: - array = g_ptr_array_sized_new (g_hash_table_size (priv->aps) + 1); - g_hash_table_iter_init (&iter, priv->aps); - while (g_hash_table_iter_next (&iter, (gpointer) &dbus_path, NULL)) - g_ptr_array_add (array, g_strdup (dbus_path)); - g_ptr_array_add (array, NULL); - g_value_take_boxed (value, (char **) g_ptr_array_free (array, FALSE)); + list = (char **) ap_list_get_sorted_paths (self, TRUE); + for (i = 0; list[i]; i++) + list[i] = g_strdup (list[i]); + g_value_take_boxed (value, list); break; case PROP_ACTIVE_ACCESS_POINT: nm_utils_g_value_set_object_path (value, priv->current_ap); diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index c5d8af25ba..9d8ba42c61 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -96,13 +96,23 @@ nm_wifi_ap_get_supplicant_path (NMWifiAP *ap) return NM_WIFI_AP_GET_PRIVATE (ap)->supplicant_path; } -guint32 +guint64 nm_wifi_ap_get_id (NMWifiAP *ap) { + const char *path; + guint64 i; + g_return_val_if_fail (NM_IS_WIFI_AP (ap), 0); - g_return_val_if_fail (nm_exported_object_is_exported (NM_EXPORTED_OBJECT (ap)), 0); - return atoi (strrchr (nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap)), '/') + 1); + path = nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap)); + g_return_val_if_fail (path, 0); + + nm_assert (g_str_has_prefix (path, NM_DBUS_PATH_ACCESS_POINT"/")); + + i = _nm_utils_ascii_str_to_int64 (&path[NM_STRLEN (NM_DBUS_PATH_ACCESS_POINT"/")], 10, 1, G_MAXINT64, 0); + + nm_assert (i); + return i; } const GByteArray * nm_wifi_ap_get_ssid (const NMWifiAP *ap) diff --git a/src/devices/wifi/nm-wifi-ap.h b/src/devices/wifi/nm-wifi-ap.h index f0edcc9436..5a2a2e58b5 100644 --- a/src/devices/wifi/nm-wifi-ap.h +++ b/src/devices/wifi/nm-wifi-ap.h @@ -66,7 +66,7 @@ gboolean nm_wifi_ap_complete_connection (NMWifiAP *self, GError **error); const char * nm_wifi_ap_get_supplicant_path (NMWifiAP *ap); -guint32 nm_wifi_ap_get_id (NMWifiAP *ap); +guint64 nm_wifi_ap_get_id (NMWifiAP *ap); const GByteArray *nm_wifi_ap_get_ssid (const NMWifiAP *ap); void nm_wifi_ap_set_ssid (NMWifiAP *ap, const guint8 *ssid, diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 0f4e098e61..dfd2fce19e 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -1860,9 +1860,6 @@ _get_config_variant (NMDnsManager *self) gboolean v4 = NM_IS_IP4_CONFIG (current->config); gint priority; - g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}")); - g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); - if (v4) { NMIP4Config *config = NM_IP4_CONFIG (current->config); guint num = nm_ip4_config_get_num_nameservers (config); @@ -1871,29 +1868,30 @@ _get_config_variant (NMDnsManager *self) if (!num) continue; + g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}")); + /* Add nameservers */ + g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); for (j = 0; j < num; j++) { ns = nm_ip4_config_get_nameserver (config, j); g_variant_builder_add (&strv_builder, "s", nm_utils_inet4_ntop (ns, NULL)); } - g_variant_builder_add (&entry_builder, "{sv}", "nameservers", g_variant_builder_end (&strv_builder)); /* Add domains */ - g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); num = nm_ip4_config_get_num_domains (config); - for (j = 0; j < num; j++) { - g_variant_builder_add (&strv_builder, - "s", - nm_ip4_config_get_domain (config, j)); - } - - if (num) { + if (num > 0) { + g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); + for (j = 0; j < num; j++) { + g_variant_builder_add (&strv_builder, + "s", + nm_ip4_config_get_domain (config, j)); + } g_variant_builder_add (&entry_builder, "{sv}", "domains", @@ -1909,29 +1907,30 @@ _get_config_variant (NMDnsManager *self) if (!num) continue; + g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}")); + /* Add nameservers */ + g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); for (j = 0; j < num; j++) { ns = nm_ip6_config_get_nameserver (config, j); g_variant_builder_add (&strv_builder, "s", nm_utils_inet6_ntop (ns, NULL)); } - g_variant_builder_add (&entry_builder, "{sv}", "nameservers", g_variant_builder_end (&strv_builder)); /* Add domains */ - g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); num = nm_ip6_config_get_num_domains (config); - for (j = 0; j < num; j++) { - g_variant_builder_add (&strv_builder, - "s", - nm_ip6_config_get_domain (config, j)); - } - - if (num) { + if (num > 0) { + g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as")); + for (j = 0; j < num; j++) { + g_variant_builder_add (&strv_builder, + "s", + nm_ip6_config_get_domain (config, j)); + } g_variant_builder_add (&entry_builder, "{sv}", "domains", |