Search Linux Wireless

[RFC] mac80211: deauthenticate STAs before suspend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The STA is not deauthenticated before the system goes to sleep,
when the vif was configured by iw/iwconfig. This holds the AP
resources unnecessarily, till the STA entry got expired in AP.
So before going to sleep ensure that all stations
got deauthenticated.

Signed-off-by: Rajkumar Manoharan <rmanoharan@xxxxxxxxxxx>
---
 include/net/cfg80211.h |    2 ++
 net/mac80211/cfg.c     |   21 +++++++++++++++++++++
 net/wireless/sysfs.c   |    6 ++++++
 3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 679a049..c50345f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1056,6 +1056,7 @@ struct cfg80211_pmksa {
  * wireless extensions but this is subject to reevaluation as soon as this
  * code is used more widely and we have a first user without wext.
  *
+ * @pre_suspend: dissociate STAs before suspending the wiphy device
  * @suspend: wiphy device needs to be suspended
  * @resume: wiphy device needs to be resumed
  *
@@ -1196,6 +1197,7 @@ struct cfg80211_pmksa {
  * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
  */
 struct cfg80211_ops {
+	int	(*pre_suspend)(struct wiphy *wiphy);
 	int	(*suspend)(struct wiphy *wiphy);
 	int	(*resume)(struct wiphy *wiphy);
 
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 4bc8a92..2daadf1 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1245,6 +1245,25 @@ static int ieee80211_set_channel(struct wiphy *wiphy,
 }
 
 #ifdef CONFIG_PM
+static int ieee80211_pre_suspend(struct wiphy *wiphy)
+{
+	struct ieee80211_local *local = wiphy_priv(wiphy);
+	struct ieee80211_sub_if_data *sdata = NULL;
+	struct ieee80211_if_managed *ifmgd = NULL;
+	struct cfg80211_deauth_request req;
+
+	list_for_each_entry(sdata, &local->interfaces, list) {
+		ifmgd = &sdata->u.mgd;
+		if (ifmgd->associated) {
+			req.bss = ifmgd->associated;
+			req.reason_code = WLAN_REASON_DEAUTH_LEAVING;
+			req.local_state_change = false;
+			ieee80211_mgd_deauth(sdata, &req, NULL);
+		}
+	}
+	return 0;
+}
+
 static int ieee80211_suspend(struct wiphy *wiphy)
 {
 	return __ieee80211_suspend(wiphy_priv(wiphy));
@@ -1255,6 +1274,7 @@ static int ieee80211_resume(struct wiphy *wiphy)
 	return __ieee80211_resume(wiphy_priv(wiphy));
 }
 #else
+#define ieee80211_pre_suspend NULL
 #define ieee80211_suspend NULL
 #define ieee80211_resume NULL
 #endif
@@ -1969,6 +1989,7 @@ struct cfg80211_ops mac80211_config_ops = {
 	.change_bss = ieee80211_change_bss,
 	.set_txq_params = ieee80211_set_txq_params,
 	.set_channel = ieee80211_set_channel,
+	.pre_suspend = ieee80211_pre_suspend,
 	.suspend = ieee80211_suspend,
 	.resume = ieee80211_resume,
 	.scan = ieee80211_scan,
diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c
index 4294fa2..944d589 100644
--- a/net/wireless/sysfs.c
+++ b/net/wireless/sysfs.c
@@ -91,6 +91,12 @@ static int wiphy_suspend(struct device *dev, pm_message_t state)
 
 	rdev->suspend_at = get_seconds();
 
+	if (rdev->ops->pre_suspend) {
+		rtnl_lock();
+		ret = rdev->ops->pre_suspend(&rdev->wiphy);
+		rtnl_unlock();
+	}
+
 	if (rdev->ops->suspend) {
 		rtnl_lock();
 		ret = rdev->ops->suspend(&rdev->wiphy);
-- 
1.7.3.5

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux