summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Halperin <dhalperi@cs.washington.edu>2011-03-24 16:01:48 -0700
committerJohn W. Linville <linville@tuxdriver.com>2011-03-28 15:42:02 -0400
commit499fe9a419d43410be576bcc825658997b6ce822 (patch)
tree6a47ff6d40fd98f1cb373565a620beec921451e0
parent2b78ac9bfc7483ba4bda9ad3d10dd4afcf88337c (diff)
downloadlinux-3.10-499fe9a419d43410be576bcc825658997b6ce822.tar.gz
linux-3.10-499fe9a419d43410be576bcc825658997b6ce822.tar.bz2
linux-3.10-499fe9a419d43410be576bcc825658997b6ce822.zip
mac80211: fix aggregation frame release during timeout
Suppose the aggregation reorder buffer looks like this: x-T-R1-y-R2, where x and y are frames that have not been received, T is a received frame that has timed out, and R1,R2 are received frames that have not yet timed out. The proper behavior in this scenario is to move the window past x (skipping it), release T and R1, and leave the window at y until y is received or R2 times out. As written, this code will instead leave the window at R1, because it has not yet timed out. Fix this by exiting the reorder loop only when the frame that has not timed out AND there are skipped frames earlier in the current valid window. Signed-off-by: Daniel Halperin <dhalperi@cs.washington.edu> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/rx.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 5c1930ba8eb..aa5cc37b492 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -612,7 +612,8 @@ static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw,
skipped++;
continue;
}
- if (!time_after(jiffies, tid_agg_rx->reorder_time[j] +
+ if (skipped &&
+ !time_after(jiffies, tid_agg_rx->reorder_time[j] +
HT_RX_REORDER_BUF_TIMEOUT))
goto set_release_timer;