From: Johannes Berg <johannes@sipsolutions.net>
To: Sujith <Sujith.Manoharan@atheros.com>
Cc: linville@tuxdriver.com, linux-wireless@vger.kernel.org,
me@bobcopeland.com
Subject: Re: [PATCH v3] mac80211: Tear down aggregation sessions for suspend/resume
Date: Tue, 17 Mar 2009 08:46:59 +0100 [thread overview]
Message-ID: <1237276019.18086.7.camel@johannes.local> (raw)
In-Reply-To: <18879.5862.135522.858638@gargle.gargle.HOWL>
[-- Attachment #1: Type: text/plain, Size: 4482 bytes --]
On Tue, 2009-03-17 at 08:50 +0530, Sujith wrote:
> When the driver has been notified with a STA_REMOVE, it tears down
> the internal ADDBA state. On resume, trying to initiate aggregation would
> fail because mac80211 has not cleared the operational state for that <TID,STA>.
> This can be fixed by tearing down the existing sessions on a suspend.
>
> Also, the driver can initiate a new BA session when suspend is in progress.
> This is fixed by marking the station as being in suspend state and
> denying ADDBA requests for such STAs.
>
> Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
> ---
> v2:
> ---
> * Deny ADDBA requests if suspend is in progress.
>
> v3:
> ---
> * Use RCU protection when shutting down BA sessions for STAs.
Thanks for your patience :)
Acked-by: Johannes Berg <johannes@sipsolutions.net>
> net/mac80211/agg-rx.c | 8 ++++++++
> net/mac80211/agg-tx.c | 9 +++++++++
> net/mac80211/pm.c | 25 +++++++++++++++++++++++++
> net/mac80211/sta_info.h | 3 +++
> 4 files changed, 45 insertions(+), 0 deletions(-)
>
> diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
> index a95affc..07656d8 100644
> --- a/net/mac80211/agg-rx.c
> +++ b/net/mac80211/agg-rx.c
> @@ -197,6 +197,14 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
>
> status = WLAN_STATUS_REQUEST_DECLINED;
>
> + if (test_sta_flags(sta, WLAN_STA_SUSPEND)) {
> +#ifdef CONFIG_MAC80211_HT_DEBUG
> + printk(KERN_DEBUG "Suspend in progress. "
> + "Denying ADDBA request\n");
> +#endif
> + goto end_no_lock;
> + }
> +
> /* sanity check for incoming parameters:
> * check if configuration can support the BA policy
> * and if buffer size does not exceeds max value */
> diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
> index 1df116d..e5776ef 100644
> --- a/net/mac80211/agg-tx.c
> +++ b/net/mac80211/agg-tx.c
> @@ -257,6 +257,15 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
> goto unlock;
> }
>
> + if (test_sta_flags(sta, WLAN_STA_SUSPEND)) {
> +#ifdef CONFIG_MAC80211_HT_DEBUG
> + printk(KERN_DEBUG "Suspend in progress. "
> + "Denying BA session request\n");
> +#endif
> + ret = -EINVAL;
> + goto unlock;
> + }
> +
> spin_lock_bh(&sta->lock);
>
> sdata = sta->sdata;
> diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
> index f845601..0273023 100644
> --- a/net/mac80211/pm.c
> +++ b/net/mac80211/pm.c
> @@ -21,6 +21,19 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
> list_for_each_entry(sdata, &local->interfaces, list)
> ieee80211_disable_keys(sdata);
>
> + /* Tear down aggregation sessions */
> +
> + rcu_read_lock();
> +
> + if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
> + list_for_each_entry_rcu(sta, &local->sta_list, list) {
> + set_sta_flags(sta, WLAN_STA_SUSPEND);
> + ieee80211_sta_tear_down_BA_sessions(sta);
> + }
> + }
> +
> + rcu_read_unlock();
> +
> /* remove STAs */
> if (local->ops->sta_notify) {
> spin_lock_irqsave(&local->sta_lock, flags);
> @@ -102,6 +115,18 @@ int __ieee80211_resume(struct ieee80211_hw *hw)
> spin_unlock_irqrestore(&local->sta_lock, flags);
> }
>
> + /* Clear Suspend state so that ADDBA requests can be processed */
> +
> + rcu_read_lock();
> +
> + if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
> + list_for_each_entry_rcu(sta, &local->sta_list, list) {
> + clear_sta_flags(sta, WLAN_STA_SUSPEND);
> + }
> + }
> +
> + rcu_read_unlock();
> +
> /* add back keys */
> list_for_each_entry(sdata, &local->interfaces, list)
> if (netif_running(sdata->dev))
> diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
> index 1f45573..5b223b2 100644
> --- a/net/mac80211/sta_info.h
> +++ b/net/mac80211/sta_info.h
> @@ -35,6 +35,8 @@
> * IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
> * frame to this station is transmitted.
> * @WLAN_STA_MFP: Management frame protection is used with this STA.
> + * @WLAN_STA_SUSPEND: Set/cleared during a suspend/resume cycle.
> + * Used to deny ADDBA requests (both TX and RX).
> */
> enum ieee80211_sta_info_flags {
> WLAN_STA_AUTH = 1<<0,
> @@ -48,6 +50,7 @@ enum ieee80211_sta_info_flags {
> WLAN_STA_PSPOLL = 1<<8,
> WLAN_STA_CLEAR_PS_FILT = 1<<9,
> WLAN_STA_MFP = 1<<10,
> + WLAN_STA_SUSPEND = 1<<11
> };
>
> #define STA_TID_NUM 16
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2009-03-17 7:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-17 3:20 [PATCH v3] mac80211: Tear down aggregation sessions for suspend/resume Sujith
2009-03-17 7:46 ` Johannes Berg [this message]
2009-03-19 0:44 ` Bob Copeland
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1237276019.18086.7.camel@johannes.local \
--to=johannes@sipsolutions.net \
--cc=Sujith.Manoharan@atheros.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=me@bobcopeland.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.