2010-12-26 08:27:40

by Eliad Peller

[permalink] [raw]
Subject: [PATCH] wl12xx: don't join upon disassociation

wl12xx "rejoins" upon every BSS_CHANGED_BSSID notification.
However, there is no need to rejoin after disassociation, so just
filter out the case when the new bssid is 00:00:00:00:00:00.

Signed-off-by: Eliad Peller <[email protected]>
---
drivers/net/wireless/wl12xx/main.c | 24 ++++++++++++++----------
1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
index 062247e..7aa783c 100644
--- a/drivers/net/wireless/wl12xx/main.c
+++ b/drivers/net/wireless/wl12xx/main.c
@@ -1944,19 +1944,23 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);

- ret = wl1271_cmd_build_null_data(wl);
- if (ret < 0)
- goto out_sleep;
+ if (!is_zero_ether_addr(wl->bssid)) {
+ ret = wl1271_cmd_build_null_data(wl);
+ if (ret < 0)
+ goto out_sleep;

- ret = wl1271_build_qos_null_data(wl);
- if (ret < 0)
- goto out_sleep;
+ ret = wl1271_build_qos_null_data(wl);
+ if (ret < 0)
+ goto out_sleep;

- /* filter out all packets not from this BSSID */
- wl1271_configure_filters(wl, 0);
+ /* filter out all packets not from this BSSID */
+ wl1271_configure_filters(wl, 0);

- /* Need to update the BSSID (for filtering etc) */
- do_join = true;
+ /*
+ * Need to update the BSSID (for filtering etc)
+ */
+ do_join = true;
+ }
}

if (changed & BSS_CHANGED_ASSOC) {
--
1.7.0.4



2011-01-04 13:13:45

by Eliad Peller

[permalink] [raw]
Subject: Re: [PATCH] wl12xx: don't join upon disassociation

On Tue, Jan 4, 2011 at 2:53 PM, Juuso Oikarinen
<[email protected]> wrote:
> On Sun, 2010-12-26 at 10:27 +0200, ext Eliad Peller wrote:
>> wl12xx "rejoins" upon every BSS_CHANGED_BSSID notification.
>> However, there is no need to rejoin after disassociation, so just
>> filter out the case when the new bssid is 00:00:00:00:00:00.
>>
>> Signed-off-by: Eliad Peller <[email protected]>
>> ---
>> ?drivers/net/wireless/wl12xx/main.c | ? 24 ++++++++++++++----------
>> ?1 files changed, 14 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
>> index 062247e..7aa783c 100644
>> --- a/drivers/net/wireless/wl12xx/main.c
>> +++ b/drivers/net/wireless/wl12xx/main.c
>> @@ -1944,19 +1944,23 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
>> ? ? ? ? ? memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
>> ? ? ? ? ? ? ? ? ? ? ? memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
>>
>> - ? ? ? ? ? ? ? ? ? ? ret = wl1271_cmd_build_null_data(wl);
>> - ? ? ? ? ? ? ? ? ? ? if (ret < 0)
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto out_sleep;
>> + ? ? ? ? ? ? ? ? ? ? if (!is_zero_ether_addr(wl->bssid)) {
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret = wl1271_cmd_build_null_data(wl);
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (ret < 0)
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto out_sleep;
>>
>> - ? ? ? ? ? ? ? ? ? ? ret = wl1271_build_qos_null_data(wl);
>> - ? ? ? ? ? ? ? ? ? ? if (ret < 0)
>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto out_sleep;
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ret = wl1271_build_qos_null_data(wl);
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (ret < 0)
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? goto out_sleep;
>>
>> - ? ? ? ? ? ? ? ? ? ? /* filter out all packets not from this BSSID */
>> - ? ? ? ? ? ? ? ? ? ? wl1271_configure_filters(wl, 0);
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* filter out all packets not from this BSSID */
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? wl1271_configure_filters(wl, 0);
>>
>> - ? ? ? ? ? ? ? ? ? ? /* Need to update the BSSID (for filtering etc) */
>> - ? ? ? ? ? ? ? ? ? ? do_join = true;
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* Need to update the BSSID (for filtering etc)
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? do_join = true;
>> + ? ? ? ? ? ? ? ? ? ? }
>> ? ? ? }
>>
>> ? ? ? if (changed & BSS_CHANGED_ASSOC) {
>
> The device still stays joined after disassoc, right? I guess the device
> should be receiving/transmitting frames while not idle.
>
> That is why we did have a specific dummy-join in disassoc, and also the
> BSSID filters etc are cleared!
>
the patch doesn't unjoin, it just prevents rejoining (and some other
configurations) to an "empty" bssid, so it shouldn't affect the
current join state.
the actual unjoin will only be only executed when the device goes idle.

2011-01-04 12:54:00

by Juuso Oikarinen

[permalink] [raw]
Subject: Re: [PATCH] wl12xx: don't join upon disassociation

On Sun, 2010-12-26 at 10:27 +0200, ext Eliad Peller wrote:
> wl12xx "rejoins" upon every BSS_CHANGED_BSSID notification.
> However, there is no need to rejoin after disassociation, so just
> filter out the case when the new bssid is 00:00:00:00:00:00.
>
> Signed-off-by: Eliad Peller <[email protected]>
> ---
> drivers/net/wireless/wl12xx/main.c | 24 ++++++++++++++----------
> 1 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c
> index 062247e..7aa783c 100644
> --- a/drivers/net/wireless/wl12xx/main.c
> +++ b/drivers/net/wireless/wl12xx/main.c
> @@ -1944,19 +1944,23 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
> memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
> memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
>
> - ret = wl1271_cmd_build_null_data(wl);
> - if (ret < 0)
> - goto out_sleep;
> + if (!is_zero_ether_addr(wl->bssid)) {
> + ret = wl1271_cmd_build_null_data(wl);
> + if (ret < 0)
> + goto out_sleep;
>
> - ret = wl1271_build_qos_null_data(wl);
> - if (ret < 0)
> - goto out_sleep;
> + ret = wl1271_build_qos_null_data(wl);
> + if (ret < 0)
> + goto out_sleep;
>
> - /* filter out all packets not from this BSSID */
> - wl1271_configure_filters(wl, 0);
> + /* filter out all packets not from this BSSID */
> + wl1271_configure_filters(wl, 0);
>
> - /* Need to update the BSSID (for filtering etc) */
> - do_join = true;
> + /*
> + * Need to update the BSSID (for filtering etc)
> + */
> + do_join = true;
> + }
> }
>
> if (changed & BSS_CHANGED_ASSOC) {

The device still stays joined after disassoc, right? I guess the device
should be receiving/transmitting frames while not idle.

That is why we did have a specific dummy-join in disassoc, and also the
BSSID filters etc are cleared!

-Juuso


2011-01-13 11:32:57

by Luciano Coelho

[permalink] [raw]
Subject: Re: [PATCH] wl12xx: don't join upon disassociation

On Sun, 2010-12-26 at 09:27 +0100, Eliad Peller wrote:
> wl12xx "rejoins" upon every BSS_CHANGED_BSSID notification.
> However, there is no need to rejoin after disassociation, so just
> filter out the case when the new bssid is 00:00:00:00:00:00.
>
> Signed-off-by: Eliad Peller <[email protected]>
> ---

Rebased to the latest tree and applied. Thank you!

--
Cheers,
Luca.