diff options
-rw-r--r-- | package/mac80211/patches/550-radiotap_ps_buffer.patch | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/package/mac80211/patches/550-radiotap_ps_buffer.patch b/package/mac80211/patches/550-radiotap_ps_buffer.patch new file mode 100644 index 0000000000..67d8f49a3d --- /dev/null +++ b/package/mac80211/patches/550-radiotap_ps_buffer.patch @@ -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); |