Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Feb 2025 19:31:47 GMT
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 078acac88264 - main - net80211: refactor amrr_node_init() into HT and legacy paths
Message-ID:  <202502261931.51QJVl8d018818@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202502261931.51QJVl8d018818>