diff -uNr linux-2.6.32.2/include/net/ieee80211_radiotap.h linux-2.6.32.2-wl_frag-ack/include/net/ieee80211_radiotap.h --- linux-2.6.32.2/include/net/ieee80211_radiotap.h 2009-12-18 14:27:07.000000000 -0800 +++ linux-2.6.32.2-wl_frag-ack/include/net/ieee80211_radiotap.h 2009-12-19 16:04:22.721448723 -0800 @@ -240,6 +240,9 @@ * 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 /* frame should not be ACKed */ +#define IEEE80211_RADIOTAP_F_TX_NOSEQ 0x0010 /* sequence number handled + * by userspace */ /* Ugly macro to convert literal channel numbers into their mhz equivalents * There are certianly some conditions that will break this (like feeding it '30') diff -uNr linux-2.6.32.2/net/mac80211/tx.c linux-2.6.32.2-wl_frag-ack/net/mac80211/tx.c --- linux-2.6.32.2/net/mac80211/tx.c 2009-12-18 14:27:07.000000000 -0800 +++ linux-2.6.32.2-wl_frag-ack/net/mac80211/tx.c 2009-12-19 16:12:31.782448438 -0800 @@ -678,6 +678,10 @@ u8 *qc; int tid; + if (unlikely(!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))) + return TX_CONTINUE; + info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ; + /* * Packet injection may want to control the sequence * number, if we have no matching interface then we @@ -974,6 +978,12 @@ if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) tx->flags |= IEEE80211_TX_FRAGMENTED; break; + case IEEE80211_RADIOTAP_TX_FLAGS: + if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOACK) + info->flags |= IEEE80211_TX_CTL_NO_ACK; + if (*iterator.this_arg & IEEE80211_RADIOTAP_F_TX_NOSEQ) + info->flags &= ~IEEE80211_TX_CTL_ASSIGN_SEQ; + break; /* * Please update the file @@ -1025,6 +1035,8 @@ * it will be cleared/left by radiotap as desired. */ tx->flags |= IEEE80211_TX_FRAGMENTED; + /* Same here, controlled by radiotap and the stack */ + info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; /* process and remove the injection radiotap header */ if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED)) { @@ -1088,16 +1100,10 @@ return TX_QUEUED; } - if (is_multicast_ether_addr(hdr->addr1)) { - tx->flags &= ~IEEE80211_TX_UNICAST; + if (is_multicast_ether_addr(hdr->addr1)) info->flags |= IEEE80211_TX_CTL_NO_ACK; - } else { + else 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; - } if (tx->flags & IEEE80211_TX_FRAGMENTED) { if ((tx->flags & IEEE80211_TX_UNICAST) &&