This patch was posted by Pavel Roskin on the linuxwireless ML. I've tested
it against the latest trunk version of openwrt and it works fine (at
least for
packet injection). Is it suitable for merging with openwrt?
--
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -277,6 +277,7 @@
* @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame
* @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this
* frame and selects the maximum number of streams that it can use.
+ * @IEEE80211_TX_CTL_RC_BYPASS: Don't use rate control on the frame.
*/
enum mac80211_tx_control_flags {
IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0),
@@ -302,6 +303,7 @@
IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21),
IEEE80211_TX_CTL_LDPC = BIT(22),
IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24),
+ IEEE80211_TX_CTL_RC_BYPASS = BIT(25),
#define IEEE80211_TX_CTL_STBC_SHIFT 23
};
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1058,6 +1058,39 @@ static bool __ieee80211_parse_tx_radiotap(struct
ieee80211_tx_data *tx,
tx->flags |= IEEE80211_TX_FRAGMENTED;
break;
+ case IEEE80211_RADIOTAP_RATE: {
+ int i, idx = -1;
+ int rate = *iterator.this_arg * 5;
+
+ for (i = 0; i< sband->n_bitrates; i++)
+ if (sband->bitrates[i].bitrate == rate) {
+ idx = i;
+ break;
+ }
+
+ /* Rate not available - rejecting */
+ if (idx< 0)
+ return false;
+
+ info->flags |= IEEE80211_TX_CTL_RC_BYPASS;
+ info->control.rates[0].idx = idx;
+ info->control.rates[0].count = 1;
+ for (i = 1; i< IEEE80211_TX_MAX_RATES; i++)
+ info->control.rates[i].idx = -1;
+ break;
+ }
+
+ case IEEE80211_RADIOTAP_DATA_RETRIES:
+ /*
+ * Only allow setting the number of retries in
+ * conjunction with the rates, when the rate control
+ * is bypassed.
+ */
+ if (info->flags& IEEE80211_TX_CTL_RC_BYPASS)
+ info->control.rates[0].count =
+ *iterator.this_arg;
+ break;
+
/*
* Please update the file
* Documentation/networking/mac80211-injection.txt
@@ -1305,7 +1338,8 @@ static int invoke_tx_handlers(struct ieee80211_tx_data
*tx)
CALL_TXH(ieee80211_tx_h_ps_buf);
CALL_TXH(ieee80211_tx_h_select_key);
CALL_TXH(ieee80211_tx_h_sta);
- if (!(tx->local->hw.flags& IEEE80211_HW_HAS_RATE_CONTROL))
+ if (!(tx->local->hw.flags& IEEE80211_HW_HAS_RATE_CONTROL)&&
+ !(info->flags& IEEE80211_TX_CTL_RC_BYPASS))
CALL_TXH(ieee80211_tx_h_rate_ctrl);
if (unlikely(info->flags& IEEE80211_TX_INTFL_RETRANSMISSION))
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel