mac80211: Allow noack flag overwrite for injected frames
authorHelmut Schaa <helmut.schaa@googlemail.com>
Thu, 29 Sep 2011 11:42:25 +0000 (13:42 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 3 Oct 2011 19:19:17 +0000 (15:19 -0400)
Allow injected unicast frames to be sent without having to wait
for an ACK.

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/ieee80211_radiotap.h
net/mac80211/tx.c

index b0be5fb..7e2c4d4 100644 (file)
@@ -251,6 +251,7 @@ enum ieee80211_radiotap_type {
                                                 * retries */
 #define IEEE80211_RADIOTAP_F_TX_CTS    0x0002  /* used cts 'protection' */
 #define IEEE80211_RADIOTAP_F_TX_RTS    0x0004  /* used rts/cts handshake */
+#define IEEE80211_RADIOTAP_F_TX_NOACK  0x0008  /* don't expect an ack */
 
 
 /* For IEEE80211_RADIOTAP_MCS */
index ae5dd85..ad2ee4a 100644 (file)
@@ -1054,6 +1054,7 @@ static bool __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len,
                                                   NULL);
+       u16 txflags;
 
        info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
        tx->flags &= ~IEEE80211_TX_FRAGMENTED;
@@ -1102,6 +1103,13 @@ static bool __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx,
                                tx->flags |= IEEE80211_TX_FRAGMENTED;
                        break;
 
+               case IEEE80211_RADIOTAP_TX_FLAGS:
+                       txflags = le16_to_cpu(get_unaligned((__le16*)
+                                               iterator.this_arg));
+                       if (txflags & IEEE80211_RADIOTAP_F_TX_NOACK)
+                               info->flags |= IEEE80211_TX_CTL_NO_ACK;
+                       break;
+
                /*
                 * Please update the file
                 * Documentation/networking/mac80211-injection.txt
@@ -1266,8 +1274,11 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
                tx->flags |= IEEE80211_TX_UNICAST;
                if (unlikely(local->wifi_wme_noack_test))
                        info->flags |= IEEE80211_TX_CTL_NO_ACK;
-               else
-                       info->flags &= ~IEEE80211_TX_CTL_NO_ACK;
+               /*
+                * Flags are initialized to 0. Hence, no need to
+                * explicitly unset IEEE80211_TX_CTL_NO_ACK since
+                * it might already be set for injected frames.
+                */
        }
 
        if (tx->flags & IEEE80211_TX_FRAGMENTED) {