From ef01fa7bfa04093c7c98a8b82c0fc5d43d8a1b5d Mon Sep 17 00:00:00 2001 From: Yogesh Ashok Powar Date: Sun, 25 Dec 2011 20:57:01 +0200 Subject: [PATCH] hostapd: Make inactivity polling configurable hostapd uses the poll method to check if the station is alive after the station has been inactive for ap_max_inactivity seconds. Make the poll mechanism configurable so that user can choose to disconnect idle clients. This can be especially useful when some devices/firmwares have restrictions on the number of clients that can connect to the AP and that limit is smaller than the total number of stations trying to use the AP. Signed-off-by: Yogesh Ashok Powar Signed-off-by: Nishant Sarmukadam --- hostapd/config_file.c | 2 ++ hostapd/hostapd.conf | 6 ++++++ src/ap/ap_config.h | 1 + src/ap/sta_info.c | 6 +++++- 4 files changed, 14 insertions(+), 1 deletion(-) 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