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

Submitted by Mohammed Shafi Shajakhan on May 16, 2013, 2:44 p.m.

Details

Message ID 1368715471-8736-1-git-send-email-mohammed@qca.qualcomm.com
State Accepted
Headers show

Commit Message

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(-)

Comments

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 hide | download patch | download mbox

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;