diff --git a/hostapd/config_file.c b/hostapd/config_file.c index ca7969537..467d39fc9 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -1334,6 +1334,8 @@ struct hostapd_config * hostapd_config_read(const char *fname) bss->isolate = atoi(pos); } else if (os_strcmp(buf, "ap_max_inactivity") == 0) { bss->ap_max_inactivity = atoi(pos); + } else if (os_strcmp(buf, "skip_inactivity_poll") == 0) { + bss->skip_inactivity_poll = atoi(pos); } else if (os_strcmp(buf, "country_code") == 0) { os_memcpy(conf->country, pos, 2); /* FIX: make this configurable */ diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf index 5272d5850..4e6202b2e 100644 --- a/hostapd/hostapd.conf +++ b/hostapd/hostapd.conf @@ -339,6 +339,12 @@ wmm_ac_vo_acm=0 # the STA with a data frame. # default: 300 (i.e., 5 minutes) #ap_max_inactivity=300 +# +# The inactivity polling can be disabled to disconnect stations based on +# inactivity timeout so that idle stations are more likely to be disconnected +# even if they are still in range of the AP. This can be done by setting +# skip_inactivity_poll to 1 (default 0). +#skip_inactivity_poll=0 # Disassociate stations based on excessive transmission failures or other # indications of connection loss. This depends on the driver capabilities and diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index cc7122c20..485092d9a 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -340,6 +340,7 @@ struct hostapd_bss_config { int p2p; int disassoc_low_ack; + int skip_inactivity_poll; #define TDLS_PROHIBIT BIT(0) #define TDLS_PROHIBIT_CHAN_SWITCH BIT(1) diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c index 27ab25856..972a72367 100644 --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c @@ -301,12 +301,16 @@ void ap_handle_timer(void *eloop_ctx, void *timeout_ctx) "inactive too long: %d sec, max allowed: %d", MAC2STR(sta->addr), inactive_sec, hapd->conf->ap_max_inactivity); + + if (hapd->conf->skip_inactivity_poll) + sta->timeout_next = STA_DISASSOC; } } if ((sta->flags & WLAN_STA_ASSOC) && sta->timeout_next == STA_DISASSOC && - !(sta->flags & WLAN_STA_PENDING_POLL)) { + !(sta->flags & WLAN_STA_PENDING_POLL) && + !hapd->conf->skip_inactivity_poll) { wpa_msg(hapd->msg_ctx, MSG_DEBUG, "Station " MACSTR " has ACKed data poll", MAC2STR(sta->addr)); /* data nullfunc frame poll did not produce TX errors; assume