Lines Matching +full:rates +full:- +full:mcs
3 /*-
22 /*-
27 * INRIA Sophia - Projet Planete
28 * http://www-sop.inria.fr/rapports/sophia/RR-5208.html
56 ((amn)->amn_retrycnt < (amn)->amn_txcnt / 10)
58 ((amn)->amn_retrycnt > (amn)->amn_txcnt / 3)
60 ((amn)->amn_txcnt > 10)
102 struct ieee80211_amrr *amrr = vap->iv_rs; in amrr_setinterval()
109 amrr->amrr_interval = msecs_to_ticks(msecs); in amrr_setinterval()
117 KASSERT(vap->iv_rs == NULL, ("%s called multiple times", __func__)); in amrr_init()
120 amrr = vap->iv_rs = IEEE80211_MALLOC(sizeof(struct ieee80211_amrr), in amrr_init()
123 if_printf(vap->iv_ifp, "couldn't alloc ratectl structure\n"); in amrr_init()
126 amrr->amrr_min_success_threshold = IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD; in amrr_init()
127 amrr->amrr_max_success_threshold = IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD; in amrr_init()
129 amrr_sysctlattach(vap, vap->iv_sysctl, vap->iv_oid); in amrr_init()
136 IEEE80211_FREE(vap->iv_rs, M_80211_RATECTL); in amrr_deinit()
137 vap->iv_rs = NULL; /* guard */ in amrr_deinit()
138 nrefs--; /* XXX locking */ in amrr_deinit()
145 struct ieee80211vap *vap = ni->ni_vap; in amrr_node_init()
146 struct ieee80211_amrr *amrr = vap->iv_rs; in amrr_node_init()
151 if_printf(vap->iv_ifp, "ratectl structure was not allocated, " in amrr_node_init()
152 "per-node structure allocation skipped\n"); in amrr_node_init()
156 if (ni->ni_rctls == NULL) { in amrr_node_init()
157 ni->ni_rctls = amn = IEEE80211_MALLOC(sizeof(struct ieee80211_amrr_node), in amrr_node_init()
160 if_printf(vap->iv_ifp, "couldn't alloc per-node ratectl " in amrr_node_init()
165 amn = ni->ni_rctls; in amrr_node_init()
166 amn->amn_amrr = amrr; in amrr_node_init()
167 amn->amn_success = 0; in amrr_node_init()
168 amn->amn_recovery = 0; in amrr_node_init()
169 amn->amn_txcnt = amn->amn_retrycnt = 0; in amrr_node_init()
170 amn->amn_success_threshold = amrr->amrr_min_success_threshold; in amrr_node_init()
175 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_node_init()
177 rs = (struct ieee80211_rateset *) &ni->ni_htrates; in amrr_node_init()
179 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_node_init()
180 "%s: non-11n node", __func__); in amrr_node_init()
181 rs = &ni->ni_rates; in amrr_node_init()
184 /* Initial rate - lowest */ in amrr_node_init()
185 rate = rs->rs_rates[0]; in amrr_node_init()
191 /* pick initial rate from the rateset - HT or otherwise */ in amrr_node_init()
193 for (amn->amn_rix = rs->rs_nrates - 1; amn->amn_rix > 0; in amrr_node_init()
194 amn->amn_rix--) { in amrr_node_init()
195 /* legacy - anything < 36mbit, stop searching */ in amrr_node_init()
196 /* 11n - stop at MCS4 */ in amrr_node_init()
198 if ((rs->rs_rates[amn->amn_rix] & 0x1f) < 4) in amrr_node_init()
200 } else if ((rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL) <= 72) in amrr_node_init()
203 rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL; in amrr_node_init()
205 /* if the rate is an 11n rate, ensure the MCS bit is set */ in amrr_node_init()
210 ni->ni_txrate = rate; in amrr_node_init()
211 amn->amn_ticks = ticks; in amrr_node_init()
213 /* XXX TODO: we really need a rate-to-string method */ in amrr_node_init()
214 /* XXX TODO: non-11n rate should be divided by two.. */ in amrr_node_init()
215 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_node_init()
217 rs->rs_nrates, in amrr_node_init()
218 ieee80211_ht_check_tx_ht(ni) ? "MCS " : "", in amrr_node_init()
225 IEEE80211_FREE(ni->ni_rctls, M_80211_RATECTL); in amrr_node_deinit()
232 int rix = amn->amn_rix; in amrr_update()
235 KASSERT(is_enough(amn), ("txcnt %d", amn->amn_txcnt)); in amrr_update()
240 rs = (struct ieee80211_rateset *) &ni->ni_htrates; in amrr_update()
242 rs = &ni->ni_rates; in amrr_update()
245 /* XXX TODO: we really need a rate-to-string method */ in amrr_update()
246 /* XXX TODO: non-11n rate should be divided by two.. */ in amrr_update()
247 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_update()
249 rs->rs_rates[rix] & IEEE80211_RATE_VAL, in amrr_update()
250 amn->amn_txcnt, in amrr_update()
251 amn->amn_retrycnt); in amrr_update()
254 * XXX This is totally bogus for 11n, as although high MCS in amrr_update()
255 * rates for each stream may be failing, the next stream in amrr_update()
262 amn->amn_success++; in amrr_update()
263 if (amn->amn_success >= amn->amn_success_threshold && in amrr_update()
264 rix + 1 < rs->rs_nrates) { in amrr_update()
265 amn->amn_recovery = 1; in amrr_update()
266 amn->amn_success = 0; in amrr_update()
268 /* XXX TODO: we really need a rate-to-string method */ in amrr_update()
269 /* XXX TODO: non-11n rate should be divided by two.. */ in amrr_update()
270 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_update()
272 rs->rs_rates[rix] & IEEE80211_RATE_VAL, in amrr_update()
273 amn->amn_txcnt, amn->amn_retrycnt); in amrr_update()
275 amn->amn_recovery = 0; in amrr_update()
278 amn->amn_success = 0; in amrr_update()
280 if (amn->amn_recovery) { in amrr_update()
281 amn->amn_success_threshold *= 2; in amrr_update()
282 if (amn->amn_success_threshold > in amrr_update()
283 amrr->amrr_max_success_threshold) in amrr_update()
284 amn->amn_success_threshold = in amrr_update()
285 amrr->amrr_max_success_threshold; in amrr_update()
287 amn->amn_success_threshold = in amrr_update()
288 amrr->amrr_min_success_threshold; in amrr_update()
290 rix--; in amrr_update()
291 /* XXX TODO: we really need a rate-to-string method */ in amrr_update()
292 /* XXX TODO: non-11n rate should be divided by two.. */ in amrr_update()
293 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, in amrr_update()
295 rs->rs_rates[rix] & IEEE80211_RATE_VAL, in amrr_update()
296 amn->amn_txcnt, amn->amn_retrycnt); in amrr_update()
298 amn->amn_recovery = 0; in amrr_update()
302 amn->amn_txcnt = 0; in amrr_update()
303 amn->amn_retrycnt = 0; in amrr_update()
316 struct ieee80211_amrr_node *amn = ni->ni_rctls; in amrr_rate()
321 /* XXX should return -1 here, but drivers may not expect this... */ in amrr_rate()
324 ni->ni_txrate = ni->ni_rates.rs_rates[0]; in amrr_rate()
328 amrr = amn->amn_amrr; in amrr_rate()
333 rs = (struct ieee80211_rateset *) &ni->ni_htrates; in amrr_rate()
335 rs = &ni->ni_rates; in amrr_rate()
338 if (is_enough(amn) && (ticks - amn->amn_ticks) > amrr->amrr_interval) { in amrr_rate()
340 if (rix != amn->amn_rix) { in amrr_rate()
342 ni->ni_txrate = rs->rs_rates[rix]; in amrr_rate()
343 /* XXX strip basic rate flag from txrate, if non-11n */ in amrr_rate()
345 ni->ni_txrate |= IEEE80211_RATE_MCS; in amrr_rate()
347 ni->ni_txrate &= IEEE80211_RATE_VAL; in amrr_rate()
348 amn->amn_rix = rix; in amrr_rate()
350 amn->amn_ticks = ticks; in amrr_rate()
352 rix = amn->amn_rix; in amrr_rate()
357 * Update statistics with tx complete status. Ok is non-zero
359 * retransmissions (i.e. xmit attempts - 1).
365 struct ieee80211_amrr_node *amn = ni->ni_rctls; in amrr_tx_complete()
372 if (status->flags & IEEE80211_RATECTL_STATUS_LONG_RETRY) in amrr_tx_complete()
373 retries = status->long_retries; in amrr_tx_complete()
375 amn->amn_txcnt++; in amrr_tx_complete()
376 if (status->status == IEEE80211_RATECTL_TX_SUCCESS) in amrr_tx_complete()
377 amn->amn_success++; in amrr_tx_complete()
378 amn->amn_retrycnt += retries; in amrr_tx_complete()
385 struct ieee80211_amrr_node *amn = ni->ni_rctls; in amrr_tx_update_cb()
391 txcnt = stats->nframes; in amrr_tx_update_cb()
392 success = stats->nsuccess; in amrr_tx_update_cb()
394 if (stats->flags & IEEE80211_RATECTL_TX_STATS_RETRIES) in amrr_tx_update_cb()
395 retrycnt = stats->nretries; in amrr_tx_update_cb()
397 amn->amn_txcnt += txcnt; in amrr_tx_update_cb()
398 amn->amn_success += success; in amrr_tx_update_cb()
399 amn->amn_retrycnt += retrycnt; in amrr_tx_update_cb()
412 if (stats->flags & IEEE80211_RATECTL_TX_STATS_NODE) in amrr_tx_update()
413 amrr_tx_update_cb(stats, stats->ni); in amrr_tx_update()
415 ieee80211_iterate_nodes_vap(&vap->iv_ic->ic_sta, vap, in amrr_tx_update()
424 struct ieee80211_amrr *amrr = vap->iv_rs; in amrr_sysctl_interval()
430 msecs = ticks_to_msecs(amrr->amrr_interval); in amrr_sysctl_interval()
432 if (error || !req->newptr) in amrr_sysctl_interval()
442 struct ieee80211_amrr *amrr = vap->iv_rs; in amrr_sysctlattach()
453 &amrr->amrr_max_success_threshold, 0, ""); in amrr_sysctlattach()
456 &amrr->amrr_min_success_threshold, 0, ""); in amrr_sysctlattach()
467 rs = (struct ieee80211_rateset *) &ni->ni_htrates; in amrr_print_node_rate()
468 rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL; in amrr_print_node_rate()
469 sbuf_printf(s, "rate: MCS %d\n", rate); in amrr_print_node_rate()
471 rs = &ni->ni_rates; in amrr_print_node_rate()
472 rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL; in amrr_print_node_rate()
480 struct ieee80211_amrr_node *amn = ni->ni_rctls; in amrr_node_stats()
488 sbuf_printf(s, "ticks: %d\n", amn->amn_ticks); in amrr_node_stats()
489 sbuf_printf(s, "txcnt: %u\n", amn->amn_txcnt); in amrr_node_stats()
490 sbuf_printf(s, "success: %u\n", amn->amn_success); in amrr_node_stats()
491 sbuf_printf(s, "success_threshold: %u\n", amn->amn_success_threshold); in amrr_node_stats()
492 sbuf_printf(s, "recovery: %u\n", amn->amn_recovery); in amrr_node_stats()
493 sbuf_printf(s, "retry_cnt: %u\n", amn->amn_retrycnt); in amrr_node_stats()