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>