When a p2p group has finished, update corresponding peers
group interface.
---
 gsupplicant/supplicant.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 049a5b2..903def7 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -2873,6 +2873,31 @@ static void signal_group_started(const char *path, 
DBusMessageIter *iter)
        callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_STARTED);
 }
 
+static void remove_peer_group_interface(GHashTable *group_table,
+                               const char* path)
+{
+       GSupplicantGroup *group;
+       GHashTableIter iter;
+       gpointer value, key;
+
+       if (!group_table)
+               return;
+
+       group = g_hash_table_lookup(group_table, path);
+
+       if (!group || !group->orig_interface)
+               return;
+
+       g_hash_table_iter_init(&iter, group->orig_interface->peer_table);
+
+       while (g_hash_table_iter_next(&iter, &key, &value)) {
+               GSupplicantPeer *peer = value;
+
+               if (peer->current_group_iface == group->interface)
+                       peer->current_group_iface = NULL;
+       }
+}
+
 static void signal_group_finished(const char *path, DBusMessageIter *iter)
 {
        GSupplicantInterface *interface;
@@ -2888,6 +2913,8 @@ static void signal_group_finished(const char *path, 
DBusMessageIter *iter)
        if (!data.interface_obj_path || !data.group_obj_path)
                return;
 
+       remove_peer_group_interface(interface->group_table, 
data.group_obj_path);
+
        g_hash_table_remove(interface->group_table, data.group_obj_path);
 }
 
-- 
1.9.1

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to