In associated state, when bringing an interface down, existing
BA sessions are torn down. When this is in progress, nothing
prevents mac80211 from accepting another BA session start request.
Use a new station flag to fix this.
Signed-off-by: Sujith <[email protected]>
---
net/mac80211/agg-tx.c | 8 ++++++++
net/mac80211/mlme.c | 4 +++-
net/mac80211/sta_info.h | 4 ++++
3 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 718fbcf..5538e1b 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -237,6 +237,14 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
sdata->vif.type != NL80211_IFTYPE_AP)
return -EINVAL;
+ if (test_sta_flags(sta, WLAN_STA_DISASSOC)) {
+#ifdef CONFIG_MAC80211_HT_DEBUG
+ printk(KERN_DEBUG "Disassociation is in progress. "
+ "Denying BA session request\n");
+#endif
+ return -EINVAL;
+ }
+
if (test_sta_flags(sta, WLAN_STA_SUSPEND)) {
#ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "Suspend in progress. "
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index ee9443d..bfc4a50 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -797,8 +797,10 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata)
rcu_read_lock();
sta = sta_info_get(sdata, bssid);
- if (sta)
+ if (sta) {
+ set_sta_flags(sta, WLAN_STA_DISASSOC);
ieee80211_sta_tear_down_BA_sessions(sta);
+ }
rcu_read_unlock();
changed |= ieee80211_reset_erp_info(sdata);
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 5ff611a..822d845 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -42,6 +42,9 @@
* be in the queues
* @WLAN_STA_PSPOLL: Station sent PS-poll while driver was keeping
* station in power-save mode, reply when the driver unblocks.
+ * @WLAN_STA_DISASSOC: Disassociation in progress.
+ * This is used to reject TX BA session requests when disassociation
+ * is in progress.
*/
enum ieee80211_sta_info_flags {
WLAN_STA_AUTH = 1<<0,
@@ -57,6 +60,7 @@ enum ieee80211_sta_info_flags {
WLAN_STA_SUSPEND = 1<<11,
WLAN_STA_PS_DRIVER = 1<<12,
WLAN_STA_PSPOLL = 1<<13,
+ WLAN_STA_DISASSOC = 1<<14,
};
#define STA_TID_NUM 16
--
1.6.6.1
On Wed, 2010-02-10 at 14:52 +0530, Sujith wrote:
> In associated state, when bringing an interface down, existing
> BA sessions are torn down. When this is in progress, nothing
> prevents mac80211 from accepting another BA session start request.
>
> Use a new station flag to fix this.
Good catch! Thanks.
Acked-by: Johannes Berg <[email protected]>
johannes
> Signed-off-by: Sujith <[email protected]>
> ---
> net/mac80211/agg-tx.c | 8 ++++++++
> net/mac80211/mlme.c | 4 +++-
> net/mac80211/sta_info.h | 4 ++++
> 3 files changed, 15 insertions(+), 1 deletions(-)
>
> diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
> index 718fbcf..5538e1b 100644
> --- a/net/mac80211/agg-tx.c
> +++ b/net/mac80211/agg-tx.c
> @@ -237,6 +237,14 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid)
> sdata->vif.type != NL80211_IFTYPE_AP)
> return -EINVAL;
>
> + if (test_sta_flags(sta, WLAN_STA_DISASSOC)) {
> +#ifdef CONFIG_MAC80211_HT_DEBUG
> + printk(KERN_DEBUG "Disassociation is in progress. "
> + "Denying BA session request\n");
> +#endif
> + return -EINVAL;
> + }
> +
> if (test_sta_flags(sta, WLAN_STA_SUSPEND)) {
> #ifdef CONFIG_MAC80211_HT_DEBUG
> printk(KERN_DEBUG "Suspend in progress. "
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index ee9443d..bfc4a50 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -797,8 +797,10 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata)
>
> rcu_read_lock();
> sta = sta_info_get(sdata, bssid);
> - if (sta)
> + if (sta) {
> + set_sta_flags(sta, WLAN_STA_DISASSOC);
> ieee80211_sta_tear_down_BA_sessions(sta);
> + }
> rcu_read_unlock();
>
> changed |= ieee80211_reset_erp_info(sdata);
> diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
> index 5ff611a..822d845 100644
> --- a/net/mac80211/sta_info.h
> +++ b/net/mac80211/sta_info.h
> @@ -42,6 +42,9 @@
> * be in the queues
> * @WLAN_STA_PSPOLL: Station sent PS-poll while driver was keeping
> * station in power-save mode, reply when the driver unblocks.
> + * @WLAN_STA_DISASSOC: Disassociation in progress.
> + * This is used to reject TX BA session requests when disassociation
> + * is in progress.
> */
> enum ieee80211_sta_info_flags {
> WLAN_STA_AUTH = 1<<0,
> @@ -57,6 +60,7 @@ enum ieee80211_sta_info_flags {
> WLAN_STA_SUSPEND = 1<<11,
> WLAN_STA_PS_DRIVER = 1<<12,
> WLAN_STA_PSPOLL = 1<<13,
> + WLAN_STA_DISASSOC = 1<<14,
> };
>
> #define STA_TID_NUM 16