From: Nikolay Martynov <mar.kolya@gmail.com>
To: linville@tuxdriver.com
Cc: linux-wireless@vger.kernel.org, Nikolay Martynov <mar.kolya@gmail.com>
Subject: [PATCH] mac80211: reset addba retries after timeout
Date: Mon, 28 Nov 2011 21:27:05 -0500 [thread overview]
Message-ID: <1322533625-24641-1-git-send-email-mar.kolya@gmail.com> (raw)
Currently code allows three (HT_AGG_MAX_RETRIES) unanswered addba
requests. When this limit is reached aggregation is turned off for
given TID permanently. This doesn't seem right: three requests is
not that much, some 'blackout' can happen, but effect of it affects
whole connection indefinitely.
This patch adds a period of time (1 minute) after which counter of
sent addba requests is reset so addba requests can be sent again.
The traffic impact should be negligible, but connection will be more
stable.
Signed-off-by: Nikolay Martynov <mar.kolya@gmail.com>
---
net/mac80211/agg-tx.c | 21 ++++++++++++++++++---
net/mac80211/sta_info.h | 3 +++
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 39d72cc..521638c 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -339,6 +339,7 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid)
#endif
spin_lock_bh(&sta->lock);
+ sta->ampdu_mlme.last_addba_req_time[tid] = jiffies_to_msecs(jiffies);
sta->ampdu_mlme.addba_req_num[tid]++;
spin_unlock_bh(&sta->lock);
@@ -389,10 +390,24 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid,
spin_lock_bh(&sta->lock);
- /* we have tried too many times, receiver does not want A-MPDU */
if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) {
- ret = -EBUSY;
- goto err_unlock_sta;
+ unsigned int timestamp = jiffies_to_msecs(jiffies);
+ if (timestamp - sta->ampdu_mlme.last_addba_req_time[tid] >
+ HT_AGG_RETRIES_PERIOD) {
+ /*
+ * last addba attempt was more then
+ * HT_AGG_RETRIES_PERIOD time ago,
+ * we can start trying again now
+ */
+ sta->ampdu_mlme.addba_req_num[tid] = 0;
+ } else {
+ /*
+ * we have tried too many times,
+ * receiver does not want A-MPDU (yet)
+ */
+ ret = -EBUSY;
+ goto err_unlock_sta;
+ }
}
tid_tx = rcu_dereference_protected_tid_tx(sta, tid);
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 6280e8b..a16d60a 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -76,6 +76,7 @@ enum ieee80211_sta_info_flags {
#define STA_TID_NUM 16
#define ADDBA_RESP_INTERVAL HZ
#define HT_AGG_MAX_RETRIES 0x3
+#define HT_AGG_RETRIES_PERIOD (60*1000)
#define HT_AGG_STATE_DRV_READY 0
#define HT_AGG_STATE_RESPONSE_RECEIVED 1
@@ -169,6 +170,7 @@ struct tid_ampdu_rx {
* @tid_tx: aggregation info for Tx per TID
* @tid_start_tx: sessions where start was requested
* @addba_req_num: number of times addBA request has been sent.
+ * @last_addba_req_time: timestamp of the last addBA request.
* @dialog_token_allocator: dialog token enumerator for each new session;
* @work: work struct for starting/stopping aggregation
* @tid_rx_timer_expired: bitmap indicating on which TIDs the
@@ -188,6 +190,7 @@ struct sta_ampdu_mlme {
struct work_struct work;
struct tid_ampdu_tx __rcu *tid_tx[STA_TID_NUM];
struct tid_ampdu_tx *tid_start_tx[STA_TID_NUM];
+ unsigned int last_addba_req_time[STA_TID_NUM];
u8 addba_req_num[STA_TID_NUM];
u8 dialog_token_allocator;
};
--
1.7.4.1
next reply other threads:[~2011-11-29 2:27 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-29 2:27 Nikolay Martynov [this message]
2011-11-29 8:24 ` [PATCH] mac80211: reset addba retries after timeout Johannes Berg
2011-11-29 15:14 ` Nikolay Martynov
2011-11-29 15:19 ` Johannes Berg
2011-11-29 22:01 ` Nikolay Martynov
2011-11-29 22:14 ` Johannes Berg
2011-11-29 22:28 ` Nikolay Martynov
2011-11-29 22:35 ` Johannes Berg
2011-11-29 22:46 ` Nikolay Martynov
2011-11-30 8:32 ` Johannes Berg
2011-11-30 14:16 ` Nikolay Martynov
2011-12-06 3:03 ` Nikolay Martynov
2011-12-06 9:09 ` Johannes Berg
2011-12-09 3:43 ` [PATCH v2] mac80211: split addba retries in time Nikolay Martynov
2011-12-09 8:02 ` Helmut Schaa
[not found] ` <CALGY4fvo7DMp+_+=wU+072v7sfA6EWfd_weM-G4B3ZxVYEaWhA@mail.gmail.com>
2011-12-12 18:53 ` Helmut Schaa
2011-12-13 20:25 ` John W. Linville
2011-12-18 0:39 ` [PATCH v3] " Nikolay Martynov
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=1322533625-24641-1-git-send-email-mar.kolya@gmail.com \
--to=mar.kolya@gmail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).