diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-10-21 06:40:02 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-10-31 19:00:23 -0400 |
commit | e6a9854b05c1a6af1308fe2b8c68f35abf28a3ee (patch) | |
tree | 241f611f8194586ccabf61bacb060508773b9d05 /include | |
parent | cb121bad67a32cde37adc2729b7e18aa4fd3063e (diff) |
mac80211/drivers: rewrite the rate control API
So after the previous changes we were still unhappy with how
convoluted the API is and decided to make things simpler for
everybody. This completely changes the rate control API, now
taking into account 802.11n with MCS rates and more control,
most drivers don't support that though.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/mac80211.h | 254 |
1 files changed, 156 insertions, 98 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9801afb62545..3741c0a7978a 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -214,29 +214,24 @@ struct ieee80211_bss_conf { | |||
214 | * These flags are used with the @flags member of &ieee80211_tx_info. | 214 | * These flags are used with the @flags member of &ieee80211_tx_info. |
215 | * | 215 | * |
216 | * @IEEE80211_TX_CTL_REQ_TX_STATUS: request TX status callback for this frame. | 216 | * @IEEE80211_TX_CTL_REQ_TX_STATUS: request TX status callback for this frame. |
217 | * @IEEE80211_TX_CTL_USE_RTS_CTS: use RTS-CTS before sending frame | 217 | * @IEEE80211_TX_CTL_ASSIGN_SEQ: The driver has to assign a sequence |
218 | * @IEEE80211_TX_CTL_USE_CTS_PROTECT: use CTS protection for the frame (e.g., | 218 | * number to this frame, taking care of not overwriting the fragment |
219 | * for combined 802.11g / 802.11b networks) | 219 | * number and increasing the sequence number only when the |
220 | * IEEE80211_TX_CTL_FIRST_FRAGMENT flag is set. mac80211 will properly | ||
221 | * assign sequence numbers to QoS-data frames but cannot do so correctly | ||
222 | * for non-QoS-data and management frames because beacons need them from | ||
223 | * that counter as well and mac80211 cannot guarantee proper sequencing. | ||
224 | * If this flag is set, the driver should instruct the hardware to | ||
225 | * assign a sequence number to the frame or assign one itself. Cf. IEEE | ||
226 | * 802.11-2007 7.1.3.4.1 paragraph 3. This flag will always be set for | ||
227 | * beacons and always be clear for frames without a sequence number field. | ||
220 | * @IEEE80211_TX_CTL_NO_ACK: tell the low level not to wait for an ack | 228 | * @IEEE80211_TX_CTL_NO_ACK: tell the low level not to wait for an ack |
221 | * @IEEE80211_TX_CTL_RATE_CTRL_PROBE: TBD | ||
222 | * @IEEE80211_TX_CTL_CLEAR_PS_FILT: clear powersave filter for destination | 229 | * @IEEE80211_TX_CTL_CLEAR_PS_FILT: clear powersave filter for destination |
223 | * station | 230 | * station |
224 | * @IEEE80211_TX_CTL_REQUEUE: TBD | ||
225 | * @IEEE80211_TX_CTL_FIRST_FRAGMENT: this is a first fragment of the frame | 231 | * @IEEE80211_TX_CTL_FIRST_FRAGMENT: this is a first fragment of the frame |
226 | * @IEEE80211_TX_CTL_SHORT_PREAMBLE: TBD | ||
227 | * @IEEE80211_TX_CTL_LONG_RETRY_LIMIT: this frame should be send using the | ||
228 | * through set_retry_limit configured long retry value | ||
229 | * @IEEE80211_TX_CTL_SEND_AFTER_DTIM: send this frame after DTIM beacon | 232 | * @IEEE80211_TX_CTL_SEND_AFTER_DTIM: send this frame after DTIM beacon |
230 | * @IEEE80211_TX_CTL_AMPDU: this frame should be sent as part of an A-MPDU | 233 | * @IEEE80211_TX_CTL_AMPDU: this frame should be sent as part of an A-MPDU |
231 | * @IEEE80211_TX_CTL_OFDM_HT: this frame can be sent in HT OFDM rates. number | 234 | * @IEEE80211_TX_CTL_INJECTED: Frame was injected, internal to mac80211. |
232 | * of streams when this flag is on can be extracted from antenna_sel_tx, | ||
233 | * so if 1 antenna is marked use SISO, 2 antennas marked use MIMO, n | ||
234 | * antennas marked use MIMO_n. | ||
235 | * @IEEE80211_TX_CTL_GREEN_FIELD: use green field protection for this frame | ||
236 | * @IEEE80211_TX_CTL_40_MHZ_WIDTH: send this frame using 40 Mhz channel width | ||
237 | * @IEEE80211_TX_CTL_DUP_DATA: duplicate data frame on both 20 Mhz channels | ||
238 | * @IEEE80211_TX_CTL_SHORT_GI: send this frame using short guard interval | ||
239 | * @IEEE80211_TX_CTL_INJECTED: TBD | ||
240 | * @IEEE80211_TX_STAT_TX_FILTERED: The frame was not transmitted | 235 | * @IEEE80211_TX_STAT_TX_FILTERED: The frame was not transmitted |
241 | * because the destination STA was in powersave mode. | 236 | * because the destination STA was in powersave mode. |
242 | * @IEEE80211_TX_STAT_ACK: Frame was acknowledged | 237 | * @IEEE80211_TX_STAT_ACK: Frame was acknowledged |
@@ -244,62 +239,70 @@ struct ieee80211_bss_conf { | |||
244 | * is for the whole aggregation. | 239 | * is for the whole aggregation. |
245 | * @IEEE80211_TX_STAT_AMPDU_NO_BACK: no block ack was returned, | 240 | * @IEEE80211_TX_STAT_AMPDU_NO_BACK: no block ack was returned, |
246 | * so consider using block ack request (BAR). | 241 | * so consider using block ack request (BAR). |
247 | * @IEEE80211_TX_CTL_ASSIGN_SEQ: The driver has to assign a sequence | 242 | * @IEEE80211_TX_CTL_RATE_CTRL_PROBE: internal to mac80211, can be |
248 | * number to this frame, taking care of not overwriting the fragment | 243 | * set by rate control algorithms to indicate probe rate, will |
249 | * number and increasing the sequence number only when the | 244 | * be cleared for fragmented frames (except on the last fragment) |
250 | * IEEE80211_TX_CTL_FIRST_FRAGMENT flags is set. mac80211 will properly | 245 | * @IEEE80211_TX_CTL_REQUEUE: REMOVE THIS |
251 | * assign sequence numbers to QoS-data frames but cannot do so correctly | ||
252 | * for non-QoS-data and management frames because beacons need them from | ||
253 | * that counter as well and mac80211 cannot guarantee proper sequencing. | ||
254 | * If this flag is set, the driver should instruct the hardware to | ||
255 | * assign a sequence number to the frame or assign one itself. Cf. IEEE | ||
256 | * 802.11-2007 7.1.3.4.1 paragraph 3. This flag will always be set for | ||
257 | * beacons always be clear for frames without a sequence number field. | ||
258 | */ | 246 | */ |
259 | enum mac80211_tx_control_flags { | 247 | enum mac80211_tx_control_flags { |
260 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), | 248 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), |
261 | IEEE80211_TX_CTL_USE_RTS_CTS = BIT(2), | 249 | IEEE80211_TX_CTL_ASSIGN_SEQ = BIT(1), |
262 | IEEE80211_TX_CTL_USE_CTS_PROTECT = BIT(3), | 250 | IEEE80211_TX_CTL_NO_ACK = BIT(2), |
263 | IEEE80211_TX_CTL_NO_ACK = BIT(4), | 251 | IEEE80211_TX_CTL_CLEAR_PS_FILT = BIT(3), |
264 | IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(5), | 252 | IEEE80211_TX_CTL_FIRST_FRAGMENT = BIT(4), |
265 | IEEE80211_TX_CTL_CLEAR_PS_FILT = BIT(6), | 253 | IEEE80211_TX_CTL_SEND_AFTER_DTIM = BIT(5), |
266 | IEEE80211_TX_CTL_REQUEUE = BIT(7), | 254 | IEEE80211_TX_CTL_AMPDU = BIT(6), |
267 | IEEE80211_TX_CTL_FIRST_FRAGMENT = BIT(8), | 255 | IEEE80211_TX_CTL_INJECTED = BIT(7), |
268 | IEEE80211_TX_CTL_SHORT_PREAMBLE = BIT(9), | 256 | IEEE80211_TX_STAT_TX_FILTERED = BIT(8), |
269 | IEEE80211_TX_CTL_LONG_RETRY_LIMIT = BIT(10), | 257 | IEEE80211_TX_STAT_ACK = BIT(9), |
270 | IEEE80211_TX_CTL_SEND_AFTER_DTIM = BIT(12), | 258 | IEEE80211_TX_STAT_AMPDU = BIT(10), |
271 | IEEE80211_TX_CTL_AMPDU = BIT(13), | 259 | IEEE80211_TX_STAT_AMPDU_NO_BACK = BIT(11), |
272 | IEEE80211_TX_CTL_OFDM_HT = BIT(14), | 260 | IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(12), |
273 | IEEE80211_TX_CTL_GREEN_FIELD = BIT(15), | 261 | |
274 | IEEE80211_TX_CTL_40_MHZ_WIDTH = BIT(16), | 262 | /* XXX: remove this */ |
275 | IEEE80211_TX_CTL_DUP_DATA = BIT(17), | 263 | IEEE80211_TX_CTL_REQUEUE = BIT(13), |
276 | IEEE80211_TX_CTL_SHORT_GI = BIT(18), | ||
277 | IEEE80211_TX_CTL_INJECTED = BIT(19), | ||
278 | IEEE80211_TX_STAT_TX_FILTERED = BIT(20), | ||
279 | IEEE80211_TX_STAT_ACK = BIT(21), | ||
280 | IEEE80211_TX_STAT_AMPDU = BIT(22), | ||
281 | IEEE80211_TX_STAT_AMPDU_NO_BACK = BIT(23), | ||
282 | IEEE80211_TX_CTL_ASSIGN_SEQ = BIT(24), | ||
283 | }; | 264 | }; |
284 | 265 | ||
266 | enum mac80211_rate_control_flags { | ||
267 | IEEE80211_TX_RC_USE_RTS_CTS = BIT(0), | ||
268 | IEEE80211_TX_RC_USE_CTS_PROTECT = BIT(1), | ||
269 | IEEE80211_TX_RC_USE_SHORT_PREAMBLE = BIT(2), | ||
270 | |||
271 | /* rate index is an MCS rate number instead of an index */ | ||
272 | IEEE80211_TX_RC_MCS = BIT(3), | ||
273 | IEEE80211_TX_RC_GREEN_FIELD = BIT(4), | ||
274 | IEEE80211_TX_RC_40_MHZ_WIDTH = BIT(5), | ||
275 | IEEE80211_TX_RC_DUP_DATA = BIT(6), | ||
276 | IEEE80211_TX_RC_SHORT_GI = BIT(7), | ||
277 | }; | ||
278 | |||
279 | |||
280 | /* there are 40 bytes if you don't need the rateset to be kept */ | ||
281 | #define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40 | ||
285 | 282 | ||
286 | #define IEEE80211_TX_INFO_DRIVER_DATA_SIZE \ | 283 | /* if you do need the rateset, then you have less space */ |
287 | (sizeof(((struct sk_buff *)0)->cb) - 8) | 284 | #define IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE 24 |
288 | #define IEEE80211_TX_INFO_DRIVER_DATA_PTRS \ | ||
289 | (IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)) | ||
290 | 285 | ||
291 | /* maximum number of alternate rate retry stages */ | 286 | /* maximum number of rate stages */ |
292 | #define IEEE80211_TX_MAX_ALTRATE 3 | 287 | #define IEEE80211_TX_MAX_RATES 5 |
293 | 288 | ||
294 | /** | 289 | /** |
295 | * struct ieee80211_tx_altrate - alternate rate selection/status | 290 | * struct ieee80211_tx_rate - rate selection/status |
296 | * | 291 | * |
297 | * @rate_idx: rate index to attempt to send with | 292 | * @idx: rate index to attempt to send with |
293 | * @flags: rate control flags (&enum mac80211_rate_control_flags) | ||
298 | * @limit: number of retries before fallback | 294 | * @limit: number of retries before fallback |
295 | * | ||
296 | * A value of -1 for @idx indicates an invalid rate and, if used | ||
297 | * in an array of retry rates, that no more rates should be tried. | ||
298 | * | ||
299 | * When used for transmit status reporting, the driver should | ||
300 | * always report the rate along with the flags it used. | ||
299 | */ | 301 | */ |
300 | struct ieee80211_tx_altrate { | 302 | struct ieee80211_tx_rate { |
301 | s8 rate_idx; | 303 | s8 idx; |
302 | u8 limit; | 304 | u8 count; |
305 | u8 flags; | ||
303 | }; | 306 | }; |
304 | 307 | ||
305 | /** | 308 | /** |
@@ -314,15 +317,12 @@ struct ieee80211_tx_altrate { | |||
314 | * it may be NULL. | 317 | * it may be NULL. |
315 | * | 318 | * |
316 | * @flags: transmit info flags, defined above | 319 | * @flags: transmit info flags, defined above |
317 | * @band: TBD | 320 | * @band: the band to transmit on (use for checking for races) |
318 | * @tx_rate_idx: TBD | ||
319 | * @antenna_sel_tx: antenna to use, 0 for automatic diversity | 321 | * @antenna_sel_tx: antenna to use, 0 for automatic diversity |
320 | * @control: union for control data | 322 | * @control: union for control data |
321 | * @status: union for status data | 323 | * @status: union for status data |
322 | * @driver_data: array of driver_data pointers | 324 | * @driver_data: array of driver_data pointers |
323 | * @retry_count: number of retries | 325 | * @retry_count: number of retries |
324 | * @excessive_retries: set to 1 if the frame was retried many times | ||
325 | * but not acknowledged | ||
326 | * @ampdu_ack_len: number of aggregated frames. | 326 | * @ampdu_ack_len: number of aggregated frames. |
327 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 327 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. |
328 | * @ampdu_ack_map: block ack bit map for the aggregation. | 328 | * @ampdu_ack_map: block ack bit map for the aggregation. |
@@ -333,31 +333,43 @@ struct ieee80211_tx_info { | |||
333 | /* common information */ | 333 | /* common information */ |
334 | u32 flags; | 334 | u32 flags; |
335 | u8 band; | 335 | u8 band; |
336 | s8 tx_rate_idx; | 336 | |
337 | u8 antenna_sel_tx; | 337 | u8 antenna_sel_tx; |
338 | 338 | ||
339 | /* 1 byte hole */ | 339 | /* 2 byte hole */ |
340 | 340 | ||
341 | union { | 341 | union { |
342 | struct { | 342 | struct { |
343 | union { | ||
344 | /* rate control */ | ||
345 | struct { | ||
346 | struct ieee80211_tx_rate rates[ | ||
347 | IEEE80211_TX_MAX_RATES]; | ||
348 | s8 rts_cts_rate_idx; | ||
349 | }; | ||
350 | /* only needed before rate control */ | ||
351 | unsigned long jiffies; | ||
352 | }; | ||
343 | /* NB: vif can be NULL for injected frames */ | 353 | /* NB: vif can be NULL for injected frames */ |
344 | struct ieee80211_vif *vif; | 354 | struct ieee80211_vif *vif; |
345 | struct ieee80211_key_conf *hw_key; | 355 | struct ieee80211_key_conf *hw_key; |
346 | struct ieee80211_sta *sta; | 356 | struct ieee80211_sta *sta; |
347 | unsigned long jiffies; | ||
348 | s8 rts_cts_rate_idx; | ||
349 | u8 retry_limit; | ||
350 | struct ieee80211_tx_altrate retries[IEEE80211_TX_MAX_ALTRATE]; | ||
351 | } control; | 357 | } control; |
352 | struct { | 358 | struct { |
359 | struct ieee80211_tx_rate rates[IEEE80211_TX_MAX_RATES]; | ||
360 | u8 ampdu_ack_len; | ||
353 | u64 ampdu_ack_map; | 361 | u64 ampdu_ack_map; |
354 | int ack_signal; | 362 | int ack_signal; |
355 | struct ieee80211_tx_altrate retries[IEEE80211_TX_MAX_ALTRATE + 1]; | 363 | /* 8 bytes free */ |
356 | u8 retry_count; | ||
357 | bool excessive_retries; | ||
358 | u8 ampdu_ack_len; | ||
359 | } status; | 364 | } status; |
360 | void *driver_data[IEEE80211_TX_INFO_DRIVER_DATA_PTRS]; | 365 | struct { |
366 | struct ieee80211_tx_rate driver_rates[ | ||
367 | IEEE80211_TX_MAX_RATES]; | ||
368 | void *rate_driver_data[ | ||
369 | IEEE80211_TX_INFO_RATE_DRIVER_DATA_SIZE / sizeof(void *)]; | ||
370 | }; | ||
371 | void *driver_data[ | ||
372 | IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)]; | ||
361 | }; | 373 | }; |
362 | }; | 374 | }; |
363 | 375 | ||
@@ -366,6 +378,41 @@ static inline struct ieee80211_tx_info *IEEE80211_SKB_CB(struct sk_buff *skb) | |||
366 | return (struct ieee80211_tx_info *)skb->cb; | 378 | return (struct ieee80211_tx_info *)skb->cb; |
367 | } | 379 | } |
368 | 380 | ||
381 | /** | ||
382 | * ieee80211_tx_info_clear_status - clear TX status | ||
383 | * | ||
384 | * @info: The &struct ieee80211_tx_info to be cleared. | ||
385 | * | ||
386 | * When the driver passes an skb back to mac80211, it must report | ||
387 | * a number of things in TX status. This function clears everything | ||
388 | * in the TX status but the rate control information (it does clear | ||
389 | * the count since you need to fill that in anyway). | ||
390 | * | ||
391 | * NOTE: You can only use this function if you do NOT use | ||
392 | * info->driver_data! Use info->rate_driver_data | ||
393 | * instead if you need only the less space that allows. | ||
394 | */ | ||
395 | static inline void | ||
396 | ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) | ||
397 | { | ||
398 | int i; | ||
399 | |||
400 | BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) != | ||
401 | offsetof(struct ieee80211_tx_info, control.rates)); | ||
402 | BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) != | ||
403 | offsetof(struct ieee80211_tx_info, driver_rates)); | ||
404 | BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) != 8); | ||
405 | /* clear the rate counts */ | ||
406 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) | ||
407 | info->status.rates[i].count = 0; | ||
408 | |||
409 | BUILD_BUG_ON( | ||
410 | offsetof(struct ieee80211_tx_info, status.ampdu_ack_len) != 23); | ||
411 | memset(&info->status.ampdu_ack_len, 0, | ||
412 | sizeof(struct ieee80211_tx_info) - | ||
413 | offsetof(struct ieee80211_tx_info, status.ampdu_ack_len)); | ||
414 | } | ||
415 | |||
369 | 416 | ||
370 | /** | 417 | /** |
371 | * enum mac80211_rx_flags - receive flags | 418 | * enum mac80211_rx_flags - receive flags |
@@ -869,8 +916,8 @@ enum ieee80211_hw_flags { | |||
869 | * @sta_data_size: size (in bytes) of the drv_priv data area | 916 | * @sta_data_size: size (in bytes) of the drv_priv data area |
870 | * within &struct ieee80211_sta. | 917 | * within &struct ieee80211_sta. |
871 | * | 918 | * |
872 | * @max_altrates: maximum number of alternate rate retry stages | 919 | * @max_rates: maximum number of alternate rate retry stages |
873 | * @max_altrate_tries: maximum number of tries for each stage | 920 | * @max_rate_tries: maximum number of tries for each stage |
874 | */ | 921 | */ |
875 | struct ieee80211_hw { | 922 | struct ieee80211_hw { |
876 | struct ieee80211_conf conf; | 923 | struct ieee80211_conf conf; |
@@ -887,8 +934,8 @@ struct ieee80211_hw { | |||
887 | u16 ampdu_queues; | 934 | u16 ampdu_queues; |
888 | u16 max_listen_interval; | 935 | u16 max_listen_interval; |
889 | s8 max_signal; | 936 | s8 max_signal; |
890 | u8 max_altrates; | 937 | u8 max_rates; |
891 | u8 max_altrate_tries; | 938 | u8 max_rate_tries; |
892 | }; | 939 | }; |
893 | 940 | ||
894 | /** | 941 | /** |
@@ -927,9 +974,9 @@ static inline struct ieee80211_rate * | |||
927 | ieee80211_get_tx_rate(const struct ieee80211_hw *hw, | 974 | ieee80211_get_tx_rate(const struct ieee80211_hw *hw, |
928 | const struct ieee80211_tx_info *c) | 975 | const struct ieee80211_tx_info *c) |
929 | { | 976 | { |
930 | if (WARN_ON(c->tx_rate_idx < 0)) | 977 | if (WARN_ON(c->control.rates[0].idx < 0)) |
931 | return NULL; | 978 | return NULL; |
932 | return &hw->wiphy->bands[c->band]->bitrates[c->tx_rate_idx]; | 979 | return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx]; |
933 | } | 980 | } |
934 | 981 | ||
935 | static inline struct ieee80211_rate * | 982 | static inline struct ieee80211_rate * |
@@ -945,9 +992,9 @@ static inline struct ieee80211_rate * | |||
945 | ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, | 992 | ieee80211_get_alt_retry_rate(const struct ieee80211_hw *hw, |
946 | const struct ieee80211_tx_info *c, int idx) | 993 | const struct ieee80211_tx_info *c, int idx) |
947 | { | 994 | { |
948 | if (c->control.retries[idx].rate_idx < 0) | 995 | if (c->control.rates[idx + 1].idx < 0) |
949 | return NULL; | 996 | return NULL; |
950 | return &hw->wiphy->bands[c->band]->bitrates[c->control.retries[idx].rate_idx]; | 997 | return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[idx + 1].idx]; |
951 | } | 998 | } |
952 | 999 | ||
953 | /** | 1000 | /** |
@@ -1840,17 +1887,30 @@ struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_hw *hw, | |||
1840 | 1887 | ||
1841 | 1888 | ||
1842 | /* Rate control API */ | 1889 | /* Rate control API */ |
1890 | |||
1843 | /** | 1891 | /** |
1844 | * struct rate_selection - rate information for/from rate control algorithms | 1892 | * struct ieee80211_tx_rate_control - rate control information for/from RC algo |
1845 | * | 1893 | * |
1846 | * @rate_idx: selected transmission rate index | 1894 | * @hw: The hardware the algorithm is invoked for. |
1847 | * @nonerp_idx: Non-ERP rate to use instead if ERP cannot be used | 1895 | * @sband: The band this frame is being transmitted on. |
1848 | * @probe_idx: rate for probing (or -1) | 1896 | * @bss_conf: the current BSS configuration |
1849 | * @max_rate_idx: maximum rate index that can be used, this is | 1897 | * @reported_rate: The rate control algorithm can fill this in to indicate |
1850 | * input to the algorithm and will be enforced | 1898 | * which rate should be reported to userspace as the current rate and |
1851 | */ | 1899 | * used for rate calculations in the mesh network. |
1852 | struct rate_selection { | 1900 | * @rts: whether RTS will be used for this frame because it is longer than the |
1853 | s8 rate_idx, nonerp_idx, probe_idx, max_rate_idx; | 1901 | * RTS threshold |
1902 | * @short_preamble: whether mac80211 will request short-preamble transmission | ||
1903 | * if the selected rate supports it | ||
1904 | * @max_rate_idx: user-requested maximum rate (not MCS for now) | ||
1905 | */ | ||
1906 | struct ieee80211_tx_rate_control { | ||
1907 | struct ieee80211_hw *hw; | ||
1908 | struct ieee80211_supported_band *sband; | ||
1909 | struct ieee80211_bss_conf *bss_conf; | ||
1910 | struct sk_buff *skb; | ||
1911 | struct ieee80211_tx_rate reported_rate; | ||
1912 | bool rts, short_preamble; | ||
1913 | u8 max_rate_idx; | ||
1854 | }; | 1914 | }; |
1855 | 1915 | ||
1856 | struct rate_control_ops { | 1916 | struct rate_control_ops { |
@@ -1869,10 +1929,8 @@ struct rate_control_ops { | |||
1869 | void (*tx_status)(void *priv, struct ieee80211_supported_band *sband, | 1929 | void (*tx_status)(void *priv, struct ieee80211_supported_band *sband, |
1870 | struct ieee80211_sta *sta, void *priv_sta, | 1930 | struct ieee80211_sta *sta, void *priv_sta, |
1871 | struct sk_buff *skb); | 1931 | struct sk_buff *skb); |
1872 | void (*get_rate)(void *priv, struct ieee80211_supported_band *sband, | 1932 | void (*get_rate)(void *priv, struct ieee80211_sta *sta, void *priv_sta, |
1873 | struct ieee80211_sta *sta, void *priv_sta, | 1933 | struct ieee80211_tx_rate_control *txrc); |
1874 | struct sk_buff *skb, | ||
1875 | struct rate_selection *sel); | ||
1876 | 1934 | ||
1877 | void (*add_sta_debugfs)(void *priv, void *priv_sta, | 1935 | void (*add_sta_debugfs)(void *priv, void *priv_sta, |
1878 | struct dentry *dir); | 1936 | struct dentry *dir); |