diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2013-09-23 17:34:38 +0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-10-01 14:22:03 +0400 |
commit | 0cfcefef1945c6d3f24bce1c22937cfeae07eae8 (patch) | |
tree | 9fc8c7953e38b65832f831114df5fc0df7b83d97 /net/mac80211 | |
parent | 15e230abaaa5a79feb25d1ef29b380e8b63aea0c (diff) | |
download | linux-0cfcefef1945c6d3f24bce1c22937cfeae07eae8.tar.xz |
mac80211: support reporting A-MSDU subframes individually
Some devices may not be able to report A-MSDUs in
single buffers. Drivers for such devices were
forced to re-assemble A-MSDUs which would then
be eventually disassembled by mac80211. This could
lead to CPU cache thrashing and poor performance.
Since A-MSDU has a single sequence number all
subframes share it. This was in conflict with
retransmission/duplication recovery
(IEEE802.11-2012: 9.3.2.10).
Patch introduces a new flag that is meant to be
set for all individually reported A-MSDU subframes
except the last one. This ensures the
last_seq_ctrl is updated after the last subframe
is processed. If an A-MSDU is actually a duplicate
transmission all reported subframes will be
properly discarded.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
[johannes: add braces that were missing even before]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/rx.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 8e908e17e248..f0247a43a75c 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -995,8 +995,9 @@ ieee80211_rx_h_check(struct ieee80211_rx_data *rx) rx->sta->num_duplicates++; } return RX_DROP_UNUSABLE; - } else + } else if (!(status->flag & RX_FLAG_AMSDU_MORE)) { rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl; + } } if (unlikely(rx->skb->len < 16)) { |