3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-22 04:32:37 +01:00

network: Implement Network.KnownNetwork property

This commit is contained in:
Denis Kenzior 2018-08-14 14:10:27 -05:00
parent 1c27aa5f1d
commit 47beec30f9
2 changed files with 46 additions and 3 deletions

View File

@ -1131,6 +1131,22 @@ static bool network_property_get_type(struct l_dbus *dbus,
return true;
}
static bool network_property_get_known_network(struct l_dbus *dbus,
struct l_dbus_message *message,
struct l_dbus_message_builder *builder,
void *user_data)
{
struct network *network = user_data;
if (!network->info->is_known)
return false;
l_dbus_message_builder_append_basic(builder, 'o',
known_network_get_path(network->info));
return true;
}
static void setup_network_interface(struct l_dbus_interface *interface)
{
l_dbus_interface_method(interface, "Connect", 0,
@ -1149,6 +1165,9 @@ static void setup_network_interface(struct l_dbus_interface *interface)
l_dbus_interface_property(interface, "Type", 0, "s",
network_property_get_type, NULL);
l_dbus_interface_property(interface, "KnownNetwork", 0, "o",
network_property_get_known_network, NULL);
}
bool network_register(struct network *network, const char *path)
@ -1267,6 +1286,21 @@ void network_rank_update(struct network *network)
network->rank = rank;
}
static void emit_known_network_changed(struct device *device, void *user_data)
{
struct network_info *info = user_data;
struct network *network;
network = device_network_find(device, info->ssid, info->type);
if (!network)
return;
l_dbus_property_changed(dbus_get_bus(),
network_get_path(network),
IWD_NETWORK_INTERFACE,
"KnownNetwork");
}
struct network_info *network_info_add_known(const char *ssid,
enum security security)
{
@ -1277,17 +1311,22 @@ struct network_info *network_info_add_known(const char *ssid,
search.type = security;
network = l_queue_remove_if(networks, network_info_match, &search);
if (network)
if (network) {
/* Promote network to is_known */
network->is_known = true;
__iwd_device_foreach(emit_known_network_changed, network);
return network;
}
network = l_new(struct network_info, 1);
strcpy(network->ssid, ssid);
network->type = security;
network->is_known = true;
return network;
}
static void network_info_check_device(struct device *device, void *user_data)
static void disconnect_no_longer_known(struct device *device, void *user_data)
{
struct network_info *info = user_data;
struct network *network;
@ -1300,7 +1339,10 @@ static void network_info_check_device(struct device *device, void *user_data)
void network_info_forget_known(struct network_info *network)
{
__iwd_device_foreach(network_info_check_device, network);
network->is_known = false;
__iwd_device_foreach(emit_known_network_changed, network);
__iwd_device_foreach(disconnect_no_longer_known, network);
/*
* Network is no longer a Known Network, see if we still need to

View File

@ -73,6 +73,7 @@ struct network_info {
struct timespec connected_time; /* Time last connected */
int seen_count; /* Ref count for network.info */
bool is_hidden:1;
bool is_known:1;
};
struct network_info *network_info_add_known(const char *ssid,