I've noticed that wireless interfaces in 11n mode show a "media:" line
in ifconfig such as this while a background scan is in progress:

 media: IEEE802.11 autoselect (OFDM6)

What is expected is a line showing active 11n mode, such as:

 media: IEEE802.11 autoselect (HT-MCS0 mode 11n)

This happens because ieee80211_media_status() sees ic->ic_curmode as
AUTO during background scans. Also, because net80211 forgets to reset
ic_curmode back to MODE_11N when the background scan has finished, the
displayed mode remains "autoselect (OFDM6)" until the interface is reset.

This is just a cosmetic issue.
Internally, the interface operates in 11n mode regardless.

ok?

diff 5e4be56314753be1a3ad288aa6b16bcb5257b37c /usr/src
blob - 410c33358e72c4063f9f71bf69f6c72ecfc558d9
file + sys/net80211/ieee80211.c
--- sys/net80211/ieee80211.c
+++ sys/net80211/ieee80211.c
@@ -728,6 +728,9 @@ ieee80211_media_status(struct ifnet *ifp, struct ifmed
                    ic->ic_curmode == IEEE80211_MODE_11AC)
                        imr->ifm_active |= ieee80211_mcs2media(ic,
                                ni->ni_txmcs, ic->ic_curmode);
+               else if (ni->ni_flags & IEEE80211_NODE_HT) /* in MODE_AUTO */
+                       imr->ifm_active |= ieee80211_mcs2media(ic,
+                               ni->ni_txmcs, IEEE80211_MODE_11N);
                else
                        /* calculate rate subtype */
                        imr->ifm_active |= ieee80211_rate2media(ic,
blob - 6656d29d160c26dce86fb44e3f5e715e42b7c42c
file + sys/net80211/ieee80211_node.c
--- sys/net80211/ieee80211_node.c
+++ sys/net80211/ieee80211_node.c
@@ -1441,6 +1441,19 @@ ieee80211_end_scan(struct ifnet *ifp)
                                        ic->ic_bgscan_fail *= 2;
                        }
                        ic->ic_flags &= ~IEEE80211_F_BGSCAN;
+
+                       /*
+                        * HT is negotiated during association so we must use
+                        * ic_bss to check HT. The nodes tree was re-populated
+                        * during background scan and therefore selbs and curbs
+                        * may not carry HT information.
+                        */
+                       ni = ic->ic_bss;
+                       if (ni->ni_flags & IEEE80211_NODE_HT)
+                               ieee80211_setmode(ic, IEEE80211_MODE_11N);
+                       else
+                               ieee80211_setmode(ic,
+                                   ieee80211_chan2mode(ic, ni->ni_chan));
                        return;
                }
        

Reply via email to