git: e274a23c0d3d - main - net80211: migrate ieee80211_rate2media() to use ieee80211_node_txrate
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 26 Feb 2025 19:31:52 UTC
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);