From 6f72577f2963759898f18e86294c275aaed9de9a Mon Sep 17 00:00:00 2001 From: Ilan Peer Date: Mon, 2 Sep 2013 15:40:59 +0300 Subject: [PATCH] P2P: Handle INTERFACE_DISABLED event on a P2P GO interface An INTERFACE_DISABLED event received on an interface that is currently operating a P2P GO means that the group session ended. In such a case, if the interface was dynamically added remove it, and if not, remove all the network blocks that are temporary, assuming that if needed a new session will be started by an external entity. The use case was triggering rfkill (both SW and HW). This case popped up as part of a testing cycle, where after a toggle in the rfkill state, the result was that the interface was not deleted, but on the other hand the wpa_supplicant did not configure the kernel to re-start the AP functionality again. Signed-hostap: Ilan Peer --- wpa_supplicant/events.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 2894af5d2..7452e3eba 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -3196,6 +3196,20 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, break; case EVENT_INTERFACE_DISABLED: wpa_dbg(wpa_s, MSG_DEBUG, "Interface was disabled"); +#ifdef CONFIG_P2P + if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO || + (wpa_s->current_ssid && wpa_s->current_ssid->p2p_group && + wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO)) { + /* + * The interface was externally disabled. Remove + * it assuming an external entity will start a + * new session if needed. + */ + wpas_p2p_disconnect(wpa_s); + break; + } +#endif /* CONFIG_P2P */ + wpa_supplicant_mark_disassoc(wpa_s); wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED); break;