aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorAntonio Quartulli <antonio@open-mesh.com>2013-07-26 15:15:02 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-08-01 04:49:02 -0400
commitdad9defd28912dc408763d461b9a6b1a762c07ea (patch)
tree4276213b0ff6c35878d68bb54e709563cb377140 /net/mac80211
parente47f2509e5f182f4df144406de6f2bc78179d57e (diff)
mac80211: ibss - remove not authorized station earlier
A station which is not authorized has to be purged earlier to give it a chance to re-try to establish an IBSS/RSN session soon. Set the timeout to 10 seconds. Some refactoring has also been done to allow the IBSS submodule to have its own expiring function. Reported-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/ibss.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 5e6836c3aa4c..e08387cdc8fd 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -30,6 +30,7 @@
30 30
31#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ) 31#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
32#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ) 32#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ)
33#define IEEE80211_IBSS_RSN_INACTIVITY_LIMIT (10 * HZ)
33 34
34#define IEEE80211_IBSS_MAX_STA_ENTRIES 128 35#define IEEE80211_IBSS_MAX_STA_ENTRIES 128
35 36
@@ -740,6 +741,33 @@ static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
740 return active; 741 return active;
741} 742}
742 743
744static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data *sdata)
745{
746 struct ieee80211_local *local = sdata->local;
747 struct sta_info *sta, *tmp;
748 unsigned long exp_time = IEEE80211_IBSS_INACTIVITY_LIMIT;
749 unsigned long exp_rsn_time = IEEE80211_IBSS_RSN_INACTIVITY_LIMIT;
750
751 mutex_lock(&local->sta_mtx);
752
753 list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
754 if (sdata != sta->sdata)
755 continue;
756
757 if (time_after(jiffies, sta->last_rx + exp_time) ||
758 (time_after(jiffies, sta->last_rx + exp_rsn_time) &&
759 sta->sta_state != IEEE80211_STA_AUTHORIZED)) {
760 sta_dbg(sta->sdata, "expiring inactive %sSTA %pM\n",
761 sta->sta_state != IEEE80211_STA_AUTHORIZED ?
762 "not authorized " : "", sta->sta.addr);
763
764 WARN_ON(__sta_info_destroy(sta));
765 }
766 }
767
768 mutex_unlock(&local->sta_mtx);
769}
770
743/* 771/*
744 * This function is called with state == IEEE80211_IBSS_MLME_JOINED 772 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
745 */ 773 */
@@ -754,7 +782,7 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
754 mod_timer(&ifibss->timer, 782 mod_timer(&ifibss->timer,
755 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL)); 783 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
756 784
757 ieee80211_sta_expire(sdata, IEEE80211_IBSS_INACTIVITY_LIMIT); 785 ieee80211_ibss_sta_expire(sdata);
758 786
759 if (time_before(jiffies, ifibss->last_scan_completed + 787 if (time_before(jiffies, ifibss->last_scan_completed +
760 IEEE80211_IBSS_MERGE_INTERVAL)) 788 IEEE80211_IBSS_MERGE_INTERVAL))