P2P: Use hardcoded idle timeout of 10 seconds in P2P client role
The p2p_group_idle configuration parameter is much more useful for GO role, so use a separate hardcoded value of 10 seconds in P2P client role. In practice, this means that the P2P client role will automatically tear down the group when the GO tears down the group. The 10 second timeout is enough to recover from temporary disconnections without unnecessary tearing down the group if the GO is still present and allows the client to connect. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
4c2c675173
commit
c81066153c
2 changed files with 34 additions and 8 deletions
|
@ -377,7 +377,10 @@ struct wpa_config {
|
|||
* stations in the group. As a P2P client, this means no GO seen in
|
||||
* scan results. The maximum idle time is specified in seconds with 0
|
||||
* indicating no time limit, i.e., the P2P group remains in active
|
||||
* state indefinitely until explicitly removed.
|
||||
* 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.
|
||||
*/
|
||||
unsigned int p2p_group_idle;
|
||||
|
||||
|
|
|
@ -45,6 +45,14 @@
|
|||
*/
|
||||
#define P2P_MAX_JOIN_SCAN_ATTEMPTS 10
|
||||
|
||||
#ifndef P2P_MAX_CLIENT_IDLE
|
||||
/*
|
||||
* How many seconds to try to reconnect to the GO when connection in P2P client
|
||||
* role has been lost.
|
||||
*/
|
||||
#define P2P_MAX_CLIENT_IDLE 10
|
||||
#endif /* P2P_MAX_CLIENT_IDLE */
|
||||
|
||||
|
||||
static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
|
||||
static struct wpa_supplicant *
|
||||
|
@ -3743,11 +3751,19 @@ int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
|
|||
}
|
||||
|
||||
|
||||
static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
|
||||
{
|
||||
return wpa_s->current_ssid != NULL &&
|
||||
wpa_s->current_ssid->p2p_group &&
|
||||
wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
|
||||
}
|
||||
|
||||
|
||||
static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx)
|
||||
{
|
||||
struct wpa_supplicant *wpa_s = eloop_ctx;
|
||||
|
||||
if (wpa_s->conf->p2p_group_idle == 0) {
|
||||
if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) {
|
||||
wpa_printf(MSG_DEBUG, "P2P: Ignore group idle timeout - "
|
||||
"disabled");
|
||||
return;
|
||||
|
@ -3762,17 +3778,24 @@ 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)
|
||||
{
|
||||
eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
|
||||
if (wpa_s->conf->p2p_group_idle == 0)
|
||||
return;
|
||||
unsigned int timeout;
|
||||
|
||||
eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
|
||||
if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
|
||||
return;
|
||||
|
||||
timeout = wpa_s->conf->p2p_group_idle;
|
||||
if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
|
||||
(timeout == 0 || timeout > P2P_MAX_CLIENT_IDLE))
|
||||
timeout = P2P_MAX_CLIENT_IDLE;
|
||||
|
||||
if (timeout == 0)
|
||||
return;
|
||||
|
||||
wpa_printf(MSG_DEBUG, "P2P: Set P2P group idle timeout to %u seconds",
|
||||
wpa_s->conf->p2p_group_idle);
|
||||
eloop_register_timeout(wpa_s->conf->p2p_group_idle, 0,
|
||||
wpas_p2p_group_idle_timeout, wpa_s, NULL);
|
||||
timeout);
|
||||
eloop_register_timeout(timeout, 0, wpas_p2p_group_idle_timeout,
|
||||
wpa_s, NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue