Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Feb 2025 19:31:52 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: e274a23c0d3d - main - net80211: migrate ieee80211_rate2media() to use ieee80211_node_txrate
Message-ID:  <202502261931.51QJVqb8018996@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=e274a23c0d3d3c8e9796158029f36e60edf61831

commit e274a23c0d3d3c8e9796158029f36e60edf61831
Author:     Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2025-01-17 02:35:10 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2025-02-26 19:31:27 +0000

    net80211: migrate ieee80211_rate2media() to use ieee80211_node_txrate
    
    This is one of the two obvious left-over dot11rate lookups that trigger
    a debug print.  (The other is get_sta_info()).
    
    * Change ieee80211_rate2media() to use the passed in ieee80211_node_txrate
      and use the rate type field to see if it's legacy/ht or vht.
    * .. and (I hope!) actually handle the VHT rate correctly.
    * Change the callers of ieee80211_rate2media() to use the new static
      initialisers.
    
    For the one spot in ieee80211_ht.c which uses the HT initialiser, it should
    just be a straight up mechanical change that correctly sets the HT MCS
    rate.
    
    For the rest of them in ieee80211.c, they're doing table initialisation
    for the media types / rates, and it's currently very focused on legacy
    rates.  So just leave that all as-is for now with a mechanical change.
    
    Differential Revision:  https://reviews.freebsd.org/D48615
---
 sys/net80211/ieee80211.c     | 56 ++++++++++++++++++++++++++++----------------
 sys/net80211/ieee80211_ht.c  |  5 +++-
 sys/net80211/ieee80211_var.h |  3 ++-
 3 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index eb796462d3d1..9d036f298ed3 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -1949,6 +1949,7 @@ ieee80211_media_setup(struct ieee80211com *ic,
 	enum ieee80211_phymode mode;
 	const struct ieee80211_rateset *rs;
 	struct ieee80211_rateset allrates;
+	struct ieee80211_node_txrate tn;
 
 	/*
 	 * Fill in media characteristics.
@@ -1968,7 +1969,8 @@ ieee80211_media_setup(struct ieee80211com *ic,
 		rs = &ic->ic_sup_rates[mode];
 		for (i = 0; i < rs->rs_nrates; i++) {
 			rate = rs->rs_rates[i];
-			mword = ieee80211_rate2media(ic, rate, mode);
+			tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(rate);
+			mword = ieee80211_rate2media(ic, &tn, mode);
 			if (mword == 0)
 				continue;
 			addmedia(media, caps, addsta, mode, mword);
@@ -1990,8 +1992,8 @@ ieee80211_media_setup(struct ieee80211com *ic,
 		}
 	}
 	for (i = 0; i < allrates.rs_nrates; i++) {
-		mword = ieee80211_rate2media(ic, allrates.rs_rates[i],
-				IEEE80211_MODE_AUTO);
+		tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(allrates.rs_rates[i]);
+		mword = ieee80211_rate2media(ic, &tn, IEEE80211_MODE_AUTO);
 		if (mword == 0)
 			continue;
 		/* NB: remove media options from mword */
@@ -2071,6 +2073,7 @@ ieee80211_announce(struct ieee80211com *ic)
 	int i, rate, mword;
 	enum ieee80211_phymode mode;
 	const struct ieee80211_rateset *rs;
+	struct ieee80211_node_txrate tn;
 
 	/* NB: skip AUTO since it has no rates */
 	for (mode = IEEE80211_MODE_AUTO+1; mode < IEEE80211_MODE_11NA; mode++) {
@@ -2079,7 +2082,8 @@ ieee80211_announce(struct ieee80211com *ic)
 		ic_printf(ic, "%s rates: ", ieee80211_phymode_name[mode]);
 		rs = &ic->ic_sup_rates[mode];
 		for (i = 0; i < rs->rs_nrates; i++) {
-			mword = ieee80211_rate2media(ic, rs->rs_rates[i], mode);
+			tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(rs->rs_rates[i]);
+			mword = ieee80211_rate2media(ic, &tn, mode);
 			if (mword == 0)
 				continue;
 			rate = ieee80211_media2rate(mword);
@@ -2278,6 +2282,7 @@ ieee80211_media_status(struct ifnet *ifp, struct ifmediareq *imr)
 	struct ieee80211vap *vap = ifp->if_softc;
 	struct ieee80211com *ic = vap->iv_ic;
 	enum ieee80211_phymode mode;
+	struct ieee80211_node_txrate tn;
 
 	imr->ifm_status = IFM_AVALID;
 	/*
@@ -2299,14 +2304,15 @@ ieee80211_media_status(struct ifnet *ifp, struct ifmediareq *imr)
 		/*
 		 * A fixed rate is set, report that.
 		 */
-		imr->ifm_active |= ieee80211_rate2media(ic,
-			vap->iv_txparms[mode].ucastrate, mode);
+		tn = IEEE80211_NODE_TXRATE_INIT_LEGACY(
+		    vap->iv_txparms[mode].ucastrate);
+		imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode);
 	} else if (vap->iv_opmode == IEEE80211_M_STA) {
 		/*
 		 * In station mode report the current transmit rate.
 		 */
-		imr->ifm_active |= ieee80211_rate2media(ic,
-		    ieee80211_node_get_txrate_dot11rate(vap->iv_bss), mode);
+		ieee80211_node_get_txrate(vap->iv_bss, &tn);
+		imr->ifm_active |= ieee80211_rate2media(ic, &tn, mode);
 	} else
 		imr->ifm_active |= IFM_AUTO;
 	if (imr->ifm_status & IFM_ACTIVE)
@@ -2399,7 +2405,8 @@ findmedia(const struct ratemedia rates[], int n, u_int match)
  * or an MCS index.
  */
 int
-ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode mode)
+ieee80211_rate2media(struct ieee80211com *ic,
+    const struct ieee80211_node_txrate *tr, enum ieee80211_phymode mode)
 {
 	static const struct ratemedia rates[] = {
 		{   2 | IFM_IEEE80211_FH, IFM_IEEE80211_FH1 },
@@ -2530,35 +2537,44 @@ ieee80211_rate2media(struct ieee80211com *ic, int rate, enum ieee80211_phymode m
 		{  11, IFM_IEEE80211_VHT },
 #endif
 	};
-	int m;
+	int m, rate;
 
 	/*
 	 * Check 11ac/11n rates first for match as an MCS.
 	 */
 	if (mode == IEEE80211_MODE_VHT_5GHZ) {
-		if (rate & IFM_IEEE80211_VHT) {
-			rate &= ~IFM_IEEE80211_VHT;
-			m = findmedia(vhtrates, nitems(vhtrates), rate);
+		if (tr->type == IEEE80211_NODE_TXRATE_VHT) {
+			m = findmedia(vhtrates, nitems(vhtrates), tr->mcs);
 			if (m != IFM_AUTO)
 				return (m | IFM_IEEE80211_VHT);
 		}
 	} else if (mode == IEEE80211_MODE_11NA) {
-		if (rate & IEEE80211_RATE_MCS) {
-			rate &= ~IEEE80211_RATE_MCS;
-			m = findmedia(htrates, nitems(htrates), rate);
+		/* NB: 12 is ambiguous, it will be treated as an MCS */
+		if (tr->type == IEEE80211_NODE_TXRATE_HT) {
+			m = findmedia(htrates, nitems(htrates),
+			    tr->dot11rate & ~IEEE80211_RATE_MCS);
 			if (m != IFM_AUTO)
 				return m | IFM_IEEE80211_11NA;
 		}
 	} else if (mode == IEEE80211_MODE_11NG) {
 		/* NB: 12 is ambiguous, it will be treated as an MCS */
-		if (rate & IEEE80211_RATE_MCS) {
-			rate &= ~IEEE80211_RATE_MCS;
-			m = findmedia(htrates, nitems(htrates), rate);
+		if (tr->type == IEEE80211_NODE_TXRATE_HT) {
+			m = findmedia(htrates, nitems(htrates),
+			    tr->dot11rate & ~IEEE80211_RATE_MCS);
 			if (m != IFM_AUTO)
 				return m | IFM_IEEE80211_11NG;
 		}
 	}
-	rate &= IEEE80211_RATE_VAL;
+
+	/*
+	 * At this point it needs to be a dot11rate (legacy/HT) for the
+	 * rest of the logic to work.
+	 */
+	if ((tr->type != IEEE80211_NODE_TXRATE_LEGACY) &&
+	    (tr->type != IEEE80211_NODE_TXRATE_HT))
+		return (IFM_AUTO);
+	rate = tr->dot11rate & IEEE80211_RATE_VAL;
+
 	switch (mode) {
 	case IEEE80211_MODE_11A:
 	case IEEE80211_MODE_HALF:		/* XXX good 'nuf */
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index 9e047244cc3b..08912dc8fca2 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -317,9 +317,12 @@ static int
 ht_getrate(struct ieee80211com *ic, int index, enum ieee80211_phymode mode,
     int ratetype)
 {
+	struct ieee80211_node_txrate tr;
 	int mword, rate;
 
-	mword = ieee80211_rate2media(ic, index | IEEE80211_RATE_MCS, mode);
+	tr = IEEE80211_NODE_TXRATE_INIT_HT(index);
+
+	mword = ieee80211_rate2media(ic, &tr, mode);
 	if (IFM_SUBTYPE(mword) != IFM_IEEE80211_MCS)
 		return (0);
 	switch (ratetype) {
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h
index 5a0d017bd590..4f3ed5e4a3d8 100644
--- a/sys/net80211/ieee80211_var.h
+++ b/sys/net80211/ieee80211_var.h
@@ -794,7 +794,8 @@ void	ieee80211_iterate_coms(ieee80211_com_iter_func *, void *);
 int	ieee80211_media_change(struct ifnet *);
 void	ieee80211_media_status(struct ifnet *, struct ifmediareq *);
 int	ieee80211_ioctl(struct ifnet *, u_long, caddr_t);
-int	ieee80211_rate2media(struct ieee80211com *, int,
+int	ieee80211_rate2media(struct ieee80211com *,
+		const struct ieee80211_node_txrate *,
 		enum ieee80211_phymode);
 int	ieee80211_media2rate(int);
 int	ieee80211_mhz2ieee(u_int, u_int);



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