The station has to inform the offchannel status to the assiociated AP
while switching b/w oper and off-channel. The station uses pspoll to
fetch the buffered data from the AP and the pspoll frame can only be
used when the powersave is enabled. For non-PS case, the station has
to use nullfunc frame notification. Fix that.
Signed-off-by: Rajkumar Manoharan <[email protected]>
---
net/mac80211/offchannel.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c
index f054e94..f7aedfc 100644
--- a/net/mac80211/offchannel.c
+++ b/net/mac80211/offchannel.c
@@ -129,7 +129,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local,
if (sdata->vif.type != NL80211_IFTYPE_MONITOR) {
netif_tx_stop_all_queues(sdata->dev);
- if (offchannel_ps_enable &&
+ if ((offchannel_ps_enable || !sdata->u.mgd.powersave) &&
(sdata->vif.type == NL80211_IFTYPE_STATION) &&
sdata->u.mgd.associated)
ieee80211_offchannel_ps_enable(sdata, true);
@@ -152,7 +152,7 @@ void ieee80211_offchannel_return(struct ieee80211_local *local,
continue;
/* Tell AP we're back */
- if (offchannel_ps_disable &&
+ if ((offchannel_ps_disable || !sdata->u.mgd.powersave) &&
sdata->vif.type == NL80211_IFTYPE_STATION) {
if (sdata->u.mgd.associated)
ieee80211_offchannel_ps_disable(sdata);
--
1.7.9.4
At the start of scan, mac80211 stop all vif transmission and inform the
AP that the station is leaving the operating channel. But it is not
updating the leave_oper_channel timestamp. As the result, the scan
decision always set operating channel at the scan start when the listen
interval is reduced.
Signed-off-by: Rajkumar Manoharan <[email protected]>
---
net/mac80211/scan.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index 33cd169..c70e176 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -370,7 +370,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local)
*/
drv_sw_scan_start(local);
- local->leave_oper_channel_time = 0;
+ local->leave_oper_channel_time = jiffies;
local->next_scan_state = SCAN_DECISION;
local->scan_channel_idx = 0;
--
1.7.9.4