2012-03-26 15:23:00

by Rajkumar Manoharan

[permalink] [raw]
Subject: [PATCH 1/2] mac80211: inform the offchannel status to AP if no powersave

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



2012-03-26 15:23:11

by Rajkumar Manoharan

[permalink] [raw]
Subject: [PATCH 2/2] mac80211: fix oper channel timestamp updation

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


2012-03-26 16:09:17

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH 1/2] mac80211: inform the offchannel status to AP if no powersave

On Mon, 2012-03-26 at 20:53 +0530, Rajkumar Manoharan wrote:
> 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

Gee, ok, I thought you meant "bandwidth", not "between". Might be worth
not being so lazy in the commit log ...

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

I'm not sure I like evaluating u.mgd.powersave before we even know it's
a managed interface ... not a huge issue though.

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


Overall though I don't get it. u.mgd.powersave has nothing to do with
the current powersave state at all, it's just whether cfg80211 requested
powersave mode or not -- so NACK.

johannes


2012-03-26 21:39:02

by Helmut Schaa

[permalink] [raw]
Subject: Re: Re: [PATCH 2/2] mac80211: fix oper channel timestamp updation

On Monday, March 26, 2012 06:09:37 PM Johannes Berg wrote:
> On Mon, 2012-03-26 at 20:53 +0530, Rajkumar Manoharan wrote:
> > 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.
>
> Could use a better description, but seems OK, Helmut?

Yep, the recent restructuring in the scan code changed some parts. Hence,
this change makes sense to me. However, as Johannes already pointed out the
description could be a bit more precise.

Thanks,
Helmut

> johannes
>
> > 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;
> >
>
>

2012-03-26 16:09:41

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH 2/2] mac80211: fix oper channel timestamp updation

On Mon, 2012-03-26 at 20:53 +0530, Rajkumar Manoharan wrote:
> 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.

Could use a better description, but seems OK, Helmut?

johannes

> 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;
>