mac80211: fix an endian issue in BlockAckReq handling (backport of r28190)
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 7 Sep 2011 06:07:10 +0000 (06:07 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 7 Sep 2011 06:07:10 +0000 (06:07 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@28191 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/mac80211/patches/560-mac80211_defer_bar_tx.patch

index 9bf89183e827ff3089ff68fd0101594520d33858..15f812c6faa3710aefba073b2b67a7d7236fa705 100644 (file)
  /*
   * Use a static threshold for now, best value to be determined
   * by testing ...
-@@ -254,10 +286,13 @@ void ieee80211_tx_status(struct ieee8021
+@@ -246,6 +278,8 @@ void ieee80211_tx_status(struct ieee8021
+               }
+               if (!acked && ieee80211_is_back_req(fc)) {
++                      u16 control;
++
+                       /*
+                        * BAR failed, let's tear down the BA session as a
+                        * last resort as some STAs (Intel 5100 on Windows)
+@@ -253,11 +287,15 @@ void ieee80211_tx_status(struct ieee8021
+                        * correctly.
                         */
                        bar = (struct ieee80211_bar *) skb->data;
-                       if (!(bar->control & IEEE80211_BAR_CTRL_MULTI_TID)) {
+-                      if (!(bar->control & IEEE80211_BAR_CTRL_MULTI_TID)) {
+-                              tid = (bar->control &
++                      control = le16_to_cpu(bar->control);
++                      if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) {
 +                              u16 ssn = le16_to_cpu(bar->start_seq_num);
 +
-                               tid = (bar->control &
++                              tid = (control &
                                       IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
                                      IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
 -                              ieee80211_stop_tx_ba_session(&sta->sta, tid);