summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-01-04 14:05:38 +0100
committerThomas Haller <thaller@redhat.com>2017-01-04 14:05:38 +0100
commit9473943ef30005b3bcfba0be51254b1e2932174d (patch)
treeb6183852acc0ae644393e85ee8114294a4cba920
parent44ab504cf77963f0d246bdf695b9a2d5ec0b1603 (diff)
parentd9efe73fed8b33dace17b0ebed180beb0eae78c6 (diff)
downloadNetworkManager-9473943ef30005b3bcfba0be51254b1e2932174d.tar.gz
wifi: merge refactor tracking of APs
-rw-r--r--src/devices/wifi/nm-device-wifi.c129
-rw-r--r--src/devices/wifi/nm-wifi-ap.c16
-rw-r--r--src/devices/wifi/nm-wifi-ap.h2
-rw-r--r--src/dns/nm-dns-manager.c41
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",