mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-05 00:38:07 +02:00
wifi: merge refactor tracking of APs
This commit is contained in:
commit
9473943ef3
4 changed files with 111 additions and 79 deletions
|
|
@ -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 const char **
|
||||
ap_list_get_sorted_paths (NMDeviceWifi *self, gboolean include_without_ssid)
|
||||
{
|
||||
gpointer *list;
|
||||
gsize i, j;
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
return (const char **) list;
|
||||
}
|
||||
|
||||
static void
|
||||
impl_device_wifi_get_access_points (NMDeviceWifi *self,
|
||||
GDBusMethodInvocation *context)
|
||||
{
|
||||
GSList *sorted, *iter;
|
||||
GPtrArray *paths;
|
||||
gs_free const char **list = NULL;
|
||||
GVariant *v;
|
||||
|
||||
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);
|
||||
|
||||
if (nm_wifi_ap_get_ssid (ap))
|
||||
g_ptr_array_add (paths, g_strdup (nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap))));
|
||||
}
|
||||
g_ptr_array_add (paths, NULL);
|
||||
g_slist_free (sorted);
|
||||
|
||||
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, 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;
|
||||
gs_free const char **list = NULL;
|
||||
GVariant *v;
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
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);
|
||||
const char *path;
|
||||
guint64 i;
|
||||
|
||||
return atoi (strrchr (nm_exported_object_get_path (NM_EXPORTED_OBJECT (ap)), '/') + 1);
|
||||
g_return_val_if_fail (NM_IS_WIFI_AP (ap), 0);
|
||||
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue