mac80211: fix rekeying in ap mode with connected powersave stations
authorFelix Fietkau <nbd@openwrt.org>
Sun, 31 Jan 2010 20:58:02 +0000 (20:58 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sun, 31 Jan 2010 20:58:02 +0000 (20:58 +0000)
SVN-Revision: 19470

package/mac80211/patches/550-radiotap_ps_buffer.patch [new file with mode: 0644]

diff --git a/package/mac80211/patches/550-radiotap_ps_buffer.patch b/package/mac80211/patches/550-radiotap_ps_buffer.patch
new file mode 100644 (file)
index 0000000..67d8f49
--- /dev/null
@@ -0,0 +1,48 @@
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -274,6 +274,8 @@ struct ieee80211_bss_conf {
+  * @IEEE80211_TX_INTFL_RETRANSMISSION: This frame is being retransmitted
+  *    after TX status because the destination was asleep, it must not
+  *    be modified again (no seqno assignment, crypto, etc.)
++ * @IEEE80211_TX_INTFL_HAS_RADIOTAP: This frame was injected and still
++ *    has a radiotap header at skb->data.
+  */
+ enum mac80211_tx_control_flags {
+       IEEE80211_TX_CTL_REQ_TX_STATUS          = BIT(0),
+@@ -295,6 +297,7 @@ enum mac80211_tx_control_flags {
+       IEEE80211_TX_CTL_PSPOLL_RESPONSE        = BIT(17),
+       IEEE80211_TX_CTL_MORE_FRAMES            = BIT(18),
+       IEEE80211_TX_INTFL_RETRANSMISSION       = BIT(19),
++      IEEE80211_TX_INTFL_HAS_RADIOTAP         = BIT(20),
+ };
+ /**
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1110,7 +1110,7 @@ ieee80211_tx_prepare(struct ieee80211_su
+       tx->flags |= IEEE80211_TX_FRAGMENTED;
+       /* process and remove the injection radiotap header */
+-      if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED)) {
++      if (unlikely(info->flags & IEEE80211_TX_INTFL_HAS_RADIOTAP)) {
+               if (!__ieee80211_parse_tx_radiotap(tx, skb))
+                       return TX_DROP;
+@@ -1119,6 +1119,7 @@ ieee80211_tx_prepare(struct ieee80211_su
+                * the radiotap header that was present and pre-filled
+                * 'tx' with tx control information.
+                */
++              info->flags &= ~IEEE80211_TX_INTFL_HAS_RADIOTAP;
+       }
+       /*
+@@ -1501,7 +1502,8 @@ static void ieee80211_xmit(struct ieee80
+               int hdrlen;
+               u16 len_rthdr;
+-              info->flags |= IEEE80211_TX_CTL_INJECTED;
++              info->flags |= IEEE80211_TX_CTL_INJECTED |
++                             IEEE80211_TX_INTFL_HAS_RADIOTAP;
+               len_rthdr = ieee80211_get_radiotap_len(skb->data);
+               hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);