diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index 9bdc29e22..968f14bfb 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -526,9 +526,12 @@ struct wpa_config { * state indefinitely until explicitly removed. As a P2P client, the * maximum idle time of P2P_MAX_CLIENT_IDLE seconds is enforced, i.e., * this parameter is mainly meant for GO use and for P2P client, it can - * only be used to reduce the default timeout to smaller value. + * only be used to reduce the default timeout to smaller value. A + * special value -1 can be used to configure immediate removal of the + * group for P2P client role on any disconnection after the data + * connection has been established. */ - unsigned int p2p_group_idle; + int p2p_group_idle; /** * bss_max_count - Maximum number of BSS entries to keep in memory diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 0b1801eb3..b2b72ddc5 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -4124,7 +4124,7 @@ static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx) static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s) { - unsigned int timeout; + int timeout; if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0) wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout"); @@ -4140,6 +4140,13 @@ static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s) if (timeout == 0) return; + if (timeout < 0) { + if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA) + timeout = 0; /* special client mode no-timeout */ + else + return; + } + if (wpa_s->p2p_in_provisioning) { /* * Use the normal group formation timeout during the