From: Johannes Berg <johannes@sipsolutions.net>
To: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Cc: linville@tuxdriver.com, linux-wireless@vger.kernel.org
Subject: Re: [PATCH V2] mac80211: Fix bug in getting rx status for frames pending in reorder buffer
Date: Wed, 25 Mar 2009 13:16:48 +0100 [thread overview]
Message-ID: <1237983408.4320.159.camel@johannes.local> (raw)
In-Reply-To: <1237982651-6761-1-git-send-email-vasanth@atheros.com>
[-- Attachment #1: Type: text/plain, Size: 3890 bytes --]
On Wed, 2009-03-25 at 17:34 +0530, Vasanthakumar Thiagarajan wrote:
> Currently rx status for frames which are completed from reorder buffer
> is taken from it's cb area which is not always right, cb is not holding
> the rx status when driver uses mac80211's non-irq rx handler to pass it's
> received frames. This results in dropping almost all frames from reorder
> buffer when security is enabled by doing double decryption (first in hw,
> second in sw because of wrong rx status). This patch copies rx status into
> cb area before the frame is put into reorder buffer. After this patch,
> there is a significant improvement in throughput with ath9k + WPA2(AES).
>
> Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
I'll look at putting it there in the drivers right away for .31, this
should probably get a Cc: stable@kernel.org too.
johannes
> ---
> v2
> ---
> As issue lies only in non-irq rx handler path, change
> the commit log accordingly.
>
> net/mac80211/rx.c | 13 +++++++++----
> 1 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
> index 64ebe66..5fa7aed 100644
> --- a/net/mac80211/rx.c
> +++ b/net/mac80211/rx.c
> @@ -29,6 +29,7 @@
> static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
> struct tid_ampdu_rx *tid_agg_rx,
> struct sk_buff *skb,
> + struct ieee80211_rx_status *status,
> u16 mpdu_seq_num,
> int bar_req);
> /*
> @@ -1688,7 +1689,7 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_data *rx)
> /* manage reordering buffer according to requested */
> /* sequence number */
> rcu_read_lock();
> - ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, NULL,
> + ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, NULL, NULL,
> start_seq_num, 1);
> rcu_read_unlock();
> return RX_DROP_UNUSABLE;
> @@ -2293,6 +2294,7 @@ static inline u16 seq_sub(u16 sq1, u16 sq2)
> static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
> struct tid_ampdu_rx *tid_agg_rx,
> struct sk_buff *skb,
> + struct ieee80211_rx_status *rxstatus,
> u16 mpdu_seq_num,
> int bar_req)
> {
> @@ -2374,6 +2376,8 @@ static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
>
> /* put the frame in the reordering buffer */
> tid_agg_rx->reorder_buf[index] = skb;
> + memcpy(tid_agg_rx->reorder_buf[index]->cb, rxstatus,
> + sizeof(*rxstatus));
> tid_agg_rx->stored_mpdu_num++;
> /* release the buffer until next missing frame */
> index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn)
> @@ -2399,7 +2403,8 @@ static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
> }
>
> static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
> - struct sk_buff *skb)
> + struct sk_buff *skb,
> + struct ieee80211_rx_status *status)
> {
> struct ieee80211_hw *hw = &local->hw;
> struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
> @@ -2448,7 +2453,7 @@ static u8 ieee80211_rx_reorder_ampdu(struct ieee80211_local *local,
>
> /* according to mpdu sequence number deal with reordering buffer */
> mpdu_seq_num = (sc & IEEE80211_SCTL_SEQ) >> 4;
> - ret = ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, skb,
> + ret = ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, skb, status,
> mpdu_seq_num, 0);
> end_reorder:
> return ret;
> @@ -2512,7 +2517,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
> return;
> }
>
> - if (!ieee80211_rx_reorder_ampdu(local, skb))
> + if (!ieee80211_rx_reorder_ampdu(local, skb, status))
> __ieee80211_rx_handle_packet(hw, skb, status, rate);
>
> rcu_read_unlock();
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2009-03-25 12:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-25 12:04 [PATCH V2] mac80211: Fix bug in getting rx status for frames pending in reorder buffer Vasanthakumar Thiagarajan
2009-03-25 12:16 ` Johannes Berg [this message]
2009-03-25 12:31 ` Vasanthakumar Thiagarajan
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=1237983408.4320.159.camel@johannes.local \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=vasanth@atheros.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).