git: 078acac88264 - main - net80211: refactor amrr_node_init() into HT and legacy paths
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 26 Feb 2025 19:31:47 UTC
The branch main has been updated by adrian:
URL: https://cgit.FreeBSD.org/src/commit/?id=078acac882642ac5c88409d2f3e9d04acdcc63cc
commit 078acac882642ac5c88409d2f3e9d04acdcc63cc
Author: Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2025-01-04 02:53:01 +0000
Commit: Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2025-02-26 19:31:24 +0000
net80211: refactor amrr_node_init() into HT and legacy paths
Refactor amrr_node_init() into HT and legacy paths, clean up the
printing to be a bit clearer about the selected rates.
This is precursor work to setting VHT rates in ni->ni_txrate .
Differential Revision: https://reviews.freebsd.org/D48429
---
sys/net80211/ieee80211_amrr.c | 121 +++++++++++++++++++++++++-----------------
1 file changed, 73 insertions(+), 48 deletions(-)
diff --git a/sys/net80211/ieee80211_amrr.c b/sys/net80211/ieee80211_amrr.c
index 20e90026bfe9..352f8df3a03e 100644
--- a/sys/net80211/ieee80211_amrr.c
+++ b/sys/net80211/ieee80211_amrr.c
@@ -138,14 +138,79 @@ amrr_deinit(struct ieee80211vap *vap)
nrefs--; /* XXX locking */
}
+static void
+amrr_node_init_ht(struct ieee80211_node *ni)
+{
+ const struct ieee80211_rateset *rs;
+ struct ieee80211_amrr_node *amn = ni->ni_rctls;
+ uint8_t rate; /* dot11rate */
+
+ rs = (struct ieee80211_rateset *) &ni->ni_htrates;
+ /* Initial rate - lowest */
+ rate = rs->rs_rates[0];
+
+ /* Pick something low that's likely to succeed */
+ for (amn->amn_rix = rs->rs_nrates - 1; amn->amn_rix > 0;
+ amn->amn_rix--) {
+ /* 11n - stop at MCS4 */
+ if ((rs->rs_rates[amn->amn_rix] & 0x1f) < 4)
+ break;
+ }
+ rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL;
+
+ /* Ensure the MCS bit is set */
+ rate |= IEEE80211_RATE_MCS;
+
+ /* Assign initial rate from the rateset */
+ ieee80211_node_set_txrate_dot11rate(ni, rate);
+
+ /* XXX TODO: we really need a rate-to-string method */
+ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
+ "AMRR: nrates=%d, initial rate MCS %d",
+ rs->rs_nrates,
+ (rate & IEEE80211_RATE_VAL));
+}
+
+static void
+amrr_node_init_legacy(struct ieee80211_node *ni)
+{
+ const struct ieee80211_rateset *rs;
+ struct ieee80211_amrr_node *amn = ni->ni_rctls;
+ uint8_t rate; /* dot11rate */
+
+ rs = &ni->ni_rates;
+ /* Initial rate - lowest */
+ rate = rs->rs_rates[0];
+
+ /* Clear the basic rate flag if it's not 11n */
+ rate &= IEEE80211_RATE_VAL;
+
+ /* Pick something low that's likely to succeed */
+ for (amn->amn_rix = rs->rs_nrates - 1; amn->amn_rix > 0;
+ amn->amn_rix--) {
+ /* legacy - anything < 36mbit, stop searching */
+ if ((rs->rs_rates[amn->amn_rix] &
+ IEEE80211_RATE_VAL) <= 72)
+ break;
+ }
+ rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL;
+
+ /* Assign initial rate from the rateset */
+ ieee80211_node_set_txrate_dot11rate(ni, rate);
+
+ /* XXX TODO: we really need a rate-to-string method */
+ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
+ "AMRR: nrates=%d, initial rate %d Mb",
+ rs->rs_nrates,
+ (rate & IEEE80211_RATE_VAL) / 2);
+}
+
static void
amrr_node_init(struct ieee80211_node *ni)
{
- const struct ieee80211_rateset *rs = NULL;
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211_amrr *amrr = vap->iv_rs;
struct ieee80211_amrr_node *amn;
- uint8_t rate;
if (!amrr) {
if_printf(vap->iv_ifp, "ratectl structure was not allocated, "
@@ -163,60 +228,20 @@ amrr_node_init(struct ieee80211_node *ni)
}
} else
amn = ni->ni_rctls;
+
+ /* Common state */
amn->amn_amrr = amrr;
amn->amn_success = 0;
amn->amn_recovery = 0;
amn->amn_txcnt = amn->amn_retrycnt = 0;
amn->amn_success_threshold = amrr->amrr_min_success_threshold;
+ amn->amn_ticks = ticks;
/* 11n or not? Pick the right rateset */
- if (ieee80211_ht_check_tx_ht(ni)) {
- /* XXX ew */
- IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
- "%s: 11n node", __func__);
- rs = (struct ieee80211_rateset *) &ni->ni_htrates;
- } else {
- IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
- "%s: non-11n node", __func__);
- rs = &ni->ni_rates;
- }
-
- /* Initial rate - lowest */
- rate = rs->rs_rates[0];
-
- /* XXX clear the basic rate flag if it's not 11n */
- if (! ieee80211_ht_check_tx_ht(ni))
- rate &= IEEE80211_RATE_VAL;
-
- /* pick initial rate from the rateset - HT or otherwise */
- /* Pick something low that's likely to succeed */
- for (amn->amn_rix = rs->rs_nrates - 1; amn->amn_rix > 0;
- amn->amn_rix--) {
- /* legacy - anything < 36mbit, stop searching */
- /* 11n - stop at MCS4 */
- if (ieee80211_ht_check_tx_ht(ni)) {
- if ((rs->rs_rates[amn->amn_rix] & 0x1f) < 4)
- break;
- } else if ((rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL) <= 72)
- break;
- }
- rate = rs->rs_rates[amn->amn_rix] & IEEE80211_RATE_VAL;
-
- /* if the rate is an 11n rate, ensure the MCS bit is set */
if (ieee80211_ht_check_tx_ht(ni))
- rate |= IEEE80211_RATE_MCS;
-
- /* Assign initial rate from the rateset */
- ieee80211_node_set_txrate_dot11rate(ni, rate);
- amn->amn_ticks = ticks;
-
- /* XXX TODO: we really need a rate-to-string method */
- /* XXX TODO: non-11n rate should be divided by two.. */
- IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni,
- "AMRR: nrates=%d, initial rate %s%d",
- rs->rs_nrates,
- ieee80211_ht_check_tx_ht(ni) ? "MCS " : "",
- rate & IEEE80211_RATE_VAL);
+ amrr_node_init_ht(ni);
+ else
+ amrr_node_init_legacy(ni);
}
static void