These signals are sent if only the group is the GO. This will let us
know which peer successfully joined our group and thus - later - will
help to declare a peer as being connected (even though we did not
specifically asked to be connected to it).
---
gsupplicant/supplicant.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 18b144c..580f38c 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -237,6 +237,7 @@ struct _GSupplicantGroup {
GSupplicantInterface *interface;
char *path;
int role;
+ GSList *members;
};
static inline void debug(const char *format, ...)
@@ -495,6 +496,9 @@ static void remove_group(gpointer data)
{
GSupplicantGroup *group = data;
+ if (group->members)
+ g_slist_free_full(group->members, g_free);
+
g_free(group->path);
g_free(group);
}
@@ -2783,6 +2787,58 @@ static void signal_group_finished(const char *path,
DBusMessageIter *iter)
g_hash_table_remove(interface->group_table, data.group_obj_path);
}
+static void signal_group_peer_joined(const char *path, DBusMessageIter *iter)
+{
+ const char *peer_path = NULL;
+ GSupplicantInterface *interface;
+ GSupplicantGroup *group;
+ GSupplicantPeer *peer;
+
+ SUPPLICANT_DBG("");
+
+ group = g_hash_table_lookup(group_mapping, path);
+ if (!group)
+ return;
+
+ dbus_message_iter_get_basic(iter, &peer_path);
+ if (!peer_path)
+ return;
+
+ interface = g_hash_table_lookup(peer_mapping, peer_path);
+ if (!interface)
+ return;
+
+ peer = g_hash_table_lookup(interface->peer_table, peer_path);
+ if (!peer)
+ return;
+
+ group->members = g_slist_prepend(group->members, g_strdup(peer_path));
+}
+
+static void signal_group_peer_disconnected(const char *path, DBusMessageIter
*iter)
+{
+ const char *peer_path = NULL;
+ GSupplicantGroup *group;
+ GSList *elem;
+
+ SUPPLICANT_DBG("");
+
+ group = g_hash_table_lookup(group_mapping, path);
+ if (!group)
+ return;
+
+ dbus_message_iter_get_basic(iter, &peer_path);
+ if (!peer_path)
+ return;
+
+ elem = g_slist_find_custom(group->members, peer_path, g_str_equal);
+ if (!elem)
+ return;
+
+ g_free(elem->data);
+ group->members = g_slist_delete_link(group->members, elem);
+}
+
static struct {
const char *interface;
const char *member;
@@ -2817,6 +2873,9 @@ static struct {
{ SUPPLICANT_INTERFACE ".Interface.P2PDevice", "GroupStarted",
signal_group_started },
{ SUPPLICANT_INTERFACE ".Interface.P2PDevice", "GroupFinished",
signal_group_finished },
+ { SUPPLICANT_INTERFACE ".Group", "PeerJoined", signal_group_peer_joined
},
+ { SUPPLICANT_INTERFACE ".Group", "PeerDisconnected",
signal_group_peer_disconnected },
+
{ }
};
--
1.8.5.5
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman