The branch main has been updated by adrian:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=e274a23c0d3d3c8e9796158029f36e60edf61831

commit e274a23c0d3d3c8e9796158029f36e60edf61831
Author:     Adrian Chadd <adr...@freebsd.org>
AuthorDate: 2025-01-17 02:35:10 +0000
Commit:     Adrian Chadd <adr...@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);

Reply via email to