Patchwork AP: Fix inactivity STA timer trigger for non-mac80211 drivers

login
register
mail settings
Submitter Mohammed Shafi Shajakhan
Date May 16, 2013, 2:44 p.m.
Message ID <1368715471-8736-1-git-send-email-mohammed@qca.qualcomm.com>
Download mbox | patch
Permalink /patch/244347/
State Accepted
Headers show

Comments

Mohammed Shafi Shajakhan - May 16, 2013, 2:44 p.m.
From: Mohammed Shafi Shajakhan <mohammed@qca.qualcomm.com>

non-mac80211 driver such as ath6kl supports STA inactivity
timer in firmware and if does not provides connected stations
idle time to the userspace, avoid triggering this timer in
the hostapd.

Signed-hostap: Mohammed Shafi Shajakhan <mohammed@qca.qualcomm.com>
---
 src/ap/hostapd.c  |   16 +++++++++-------
 src/ap/sta_info.c |   17 ++++++++++-------
 2 files changed, 19 insertions(+), 14 deletions(-)
Jouni Malinen - Nov. 24, 2013, 11:26 a.m.
On Thu, May 16, 2013 at 08:14:31PM +0530, Mohammed Shafi Shajakhan wrote:
> non-mac80211 driver such as ath6kl supports STA inactivity
> timer in firmware and if does not provides connected stations
> idle time to the userspace, avoid triggering this timer in
> the hostapd.

Thanks, applied.

Patch

diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index a0ac38c..bd91ad1 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -1413,11 +1413,13 @@  void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
 	} else
 		wpa_auth_sta_associated(hapd->wpa_auth, sta->wpa_sm);
 
-	wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout "
-		   "for " MACSTR " (%d seconds - ap_max_inactivity)",
-		   __func__, MAC2STR(sta->addr),
-		   hapd->conf->ap_max_inactivity);
-	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
-	eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
-			       ap_handle_timer, hapd, sta);
+	if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_INACTIVITY_TIMER)) {
+		wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout "
+			   "for " MACSTR " (%d seconds - ap_max_inactivity)",
+			   __func__, MAC2STR(sta->addr),
+			   hapd->conf->ap_max_inactivity);
+		eloop_cancel_timeout(ap_handle_timer, hapd, sta);
+		eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
+				       ap_handle_timer, hapd, sta);
+	}
 }
diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c
index cbafb47..305c151 100644
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -501,13 +501,16 @@  struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
 	sta->acct_interim_interval = hapd->conf->acct_interim_interval;
 	accounting_sta_get_id(hapd, sta);
 
+	if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_INACTIVITY_TIMER)) {
+		wpa_printf(MSG_DEBUG, "%s: register ap_handle_timer timeout "
+			   "for " MACSTR " (%d seconds - ap_max_inactivity)",
+			   __func__, MAC2STR(addr),
+			   hapd->conf->ap_max_inactivity);
+		eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
+				       ap_handle_timer, hapd, sta);
+	}
+
 	/* initialize STA info data */
-	wpa_printf(MSG_DEBUG, "%s: register ap_handle_timer timeout "
-		   "for " MACSTR " (%d seconds - ap_max_inactivity)",
-		   __func__, MAC2STR(addr),
-		   hapd->conf->ap_max_inactivity);
-	eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
-			       ap_handle_timer, hapd, sta);
 	os_memcpy(sta->addr, addr, ETH_ALEN);
 	sta->next = hapd->sta_list;
 	hapd->sta_list = sta;
@@ -934,6 +937,7 @@  void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
 	wpa_auth_sm_event(sta->wpa_sm, WPA_DEAUTH);
 	ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
 	sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
+	sta->timeout_next = STA_REMOVE;
 	wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout "
 		   "for " MACSTR " (%d seconds - "
 		   "AP_MAX_INACTIVITY_AFTER_DEAUTH)",
@@ -942,7 +946,6 @@  void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
 	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
 	eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DEAUTH, 0,
 			       ap_handle_timer, hapd, sta);
-	sta->timeout_next = STA_REMOVE;
 
 	sta->deauth_reason = reason;
 	sta->flags |= WLAN_STA_PENDING_DEAUTH_CB;