It is needed to unregister PeerMembers and send PeerDisconnected signals (1 for each member) before unregistering the group and sending groupFinished. Normally this should be done when the group is being torn down, but it appears to happen too late? Signed-off-by: Johannes Berg --- wpa_supplicant/notify.c | 4 ++-- wpa_supplicant/notify.h | 2 ++ wpa_supplicant/p2p_supplicant.c | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 1febab5..314d18c 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -453,8 +453,8 @@ static void wpas_notify_p2p_peer_joined(struct wpa_supplicant *wpa_s, wpas_dbus_signal_p2p_peer_joined(wpa_s, peer); } -static void wpas_notify_p2p_peer_disconnected(struct wpa_supplicant *wpa_s, - const u8 *peer) +void wpas_notify_p2p_peer_disconnected(struct wpa_supplicant *wpa_s, + const u8 *peer) { /* Unregister a group member object corresponding to this peer. */ wpas_dbus_unregister_p2p_groupmember(wpa_s, peer); diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index 22918e9..f712b4d 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -112,4 +112,6 @@ void wpas_notify_p2p_sd_response(struct wpa_supplicant *wpa_s, void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int network_id, int self_is_go); +void wpas_notify_p2p_peer_disconnected(struct wpa_supplicant *wpa_s, + const u8 *peer); #endif /* NOTIFY_H */ diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 2910786..5e95c5d 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -205,6 +205,20 @@ static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s, } +static void wpas_p2p_group_members_disconnect(struct wpa_supplicant *wpa_s) +{ + const u8 *peer; + void *next = NULL; + + /* p2p_group is NULL on client side */ + if (!wpa_s->p2p_group) + return; + + while ((peer = p2p_iterate_group_members(wpa_s->p2p_group, &next))) + wpas_notify_p2p_peer_disconnected(wpa_s, peer); +} + + static void wpas_p2p_group_delete(struct wpa_supplicant *wpa_s) { struct wpa_ssid *ssid; @@ -262,6 +276,7 @@ static void wpas_p2p_group_delete(struct wpa_supplicant *wpa_s) wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_REMOVED "%s %s%s", wpa_s->ifname, gtype, reason); + wpas_p2p_group_members_disconnect(wpa_s); if (ssid) wpas_notify_p2p_group_removed(wpa_s, ssid, gtype); -- 1.7.2.3