Index: sbin/ifconfig/ifieee80211.c =================================================================== --- sbin/ifconfig/ifieee80211.c +++ sbin/ifconfig/ifieee80211.c @@ -2167,8 +2167,6 @@ /* * VHT first - HT is a subset. - * - * XXX TODO: VHT80P80, VHT160 is not yet done. */ if (flags & IEEE80211_CHAN_VHT) { if ((chanFlags & IEEE80211_CHAN_VHT20) && @@ -2192,7 +2190,20 @@ "VHT80 channel\n", freq); continue; } - + if ((chanFlags & IEEE80211_CHAN_VHT160) && + (flags & IEEE80211_CHAN_VHT160) == 0) { + if (verbose) + printf("%u: skip, not a " + "VHT160 channel\n", freq); + continue; + } + if ((chanFlags & IEEE80211_CHAN_VHT80P80) && + (flags & IEEE80211_CHAN_VHT80P80) == 0) { + if (verbose) + printf("%u: skip, not a " + "VHT80+80 channel\n", freq); + continue; + } flags &= ~IEEE80211_CHAN_VHT; flags |= chanFlags & IEEE80211_CHAN_VHT; } @@ -3949,8 +3960,11 @@ if (IEEE80211_IS_CHAN_TURBO(c)) strlcat(buf, " Turbo", bsize); if (precise) { - /* XXX should make VHT80U, VHT80D */ - if (IEEE80211_IS_CHAN_VHT80(c) && + if (IEEE80211_IS_CHAN_VHT80_80(c)) + strlcat(buf, " vht/80p80", bsize); + else if (IEEE80211_IS_CHAN_VHT160(c)) + strlcat(buf, " vht/160", bsize); + else if (IEEE80211_IS_CHAN_VHT80(c) && IEEE80211_IS_CHAN_HT40D(c)) strlcat(buf, " vht/80-", bsize); else if (IEEE80211_IS_CHAN_VHT80(c) && @@ -4004,10 +4018,11 @@ static int chanpref(const struct ieee80211_channel *c) { + + if (IEEE80211_IS_CHAN_VHT80P80(c)) + return 90; if (IEEE80211_IS_CHAN_VHT160(c)) return 80; - if (IEEE80211_IS_CHAN_VHT80P80(c)) - return 75; if (IEEE80211_IS_CHAN_VHT80(c)) return 70; if (IEEE80211_IS_CHAN_VHT40(c)) Index: sys/net80211/_ieee80211.h =================================================================== --- sys/net80211/_ieee80211.h +++ sys/net80211/_ieee80211.h @@ -157,7 +157,7 @@ /* * Note: for VHT operation we will need significantly more than * IEEE80211_CHAN_MAX channels because of the combinations of - * VHT20, VHT40, VHT80, VHT80+80 and VHT160. + * VHT20, VHT40, VHT80, VHT160, and VHT80+80. */ #define IEEE80211_CHAN_MAX 1024 #define IEEE80211_CHAN_BYTES howmany(IEEE80211_CHAN_MAX, NBBY) @@ -194,8 +194,8 @@ #define IEEE80211_CHAN_VHT40U 0x02000000 /* VHT40 channel, ext above */ #define IEEE80211_CHAN_VHT40D 0x04000000 /* VHT40 channel, ext below */ #define IEEE80211_CHAN_VHT80 0x08000000 /* VHT80 channel */ -#define IEEE80211_CHAN_VHT80P80 0x10000000 /* VHT80+80 channel */ -#define IEEE80211_CHAN_VHT160 0x20000000 /* VHT160 channel */ +#define IEEE80211_CHAN_VHT160 0x10000000 /* VHT160 channel */ +#define IEEE80211_CHAN_VHT80P80 0x20000000 /* VHT80+80 channel */ /* XXX note: 0x80000000 is used in src/sbin/ifconfig/ifieee80211.c :( */ #define IEEE80211_CHAN_HT40 (IEEE80211_CHAN_HT40U | IEEE80211_CHAN_HT40D) @@ -203,14 +203,14 @@ #define IEEE80211_CHAN_VHT40 (IEEE80211_CHAN_VHT40U | IEEE80211_CHAN_VHT40D) #define IEEE80211_CHAN_VHT (IEEE80211_CHAN_VHT20 | IEEE80211_CHAN_VHT40 \ - | IEEE80211_CHAN_VHT80 | IEEE80211_CHAN_VHT80P80 \ - | IEEE80211_CHAN_VHT160) + | IEEE80211_CHAN_VHT80 | IEEE80211_CHAN_VHT160 \ + | IEEE80211_CHAN_VHT80P80) #define IEEE80211_CHAN_BITS \ "\20\1PRIV0\2PRIV2\3PRIV3\4PRIV4\5TURBO\6CCK\7OFDM\0102GHZ\0115GHZ" \ "\12PASSIVE\13DYN\14GFSK\15GSM\16STURBO\17HALF\20QUARTER\21HT20" \ "\22HT40U\23HT40D\24DFS\0254MSXMIT\26NOADHOC\27NOHOSTAP\03011D" \ - "\031VHT20\032VHT40U\033VHT40D\034VHT80\035VHT80P80\036VHT160" + "\031VHT20\032VHT40U\033VHT40D\034VHT80\035VHT160\036VHT80P80" /* * Useful combinations of channel characteristics. @@ -337,10 +337,10 @@ ((_c)->ic_flags & IEEE80211_CHAN_VHT) != 0) #define IEEE80211_IS_CHAN_VHT80(_c) \ (((_c)->ic_flags & IEEE80211_CHAN_VHT80) != 0) -#define IEEE80211_IS_CHAN_VHT80P80(_c) \ - (((_c)->ic_flags & IEEE80211_CHAN_VHT80P80) != 0) #define IEEE80211_IS_CHAN_VHT160(_c) \ (((_c)->ic_flags & IEEE80211_CHAN_VHT160) != 0) +#define IEEE80211_IS_CHAN_VHT80P80(_c) \ + (((_c)->ic_flags & IEEE80211_CHAN_VHT80P80) != 0) #define IEEE80211_CHAN2IEEE(_c) (_c)->ic_ieee Index: sys/net80211/ieee80211.c =================================================================== --- sys/net80211/ieee80211.c +++ sys/net80211/ieee80211.c @@ -1367,8 +1367,8 @@ IEEE80211_CHAN_HT40D | IEEE80211_CHAN_VHT80; } - /* XXX VHT80+80 */ /* XXX VHT160 */ + /* XXX VHT80+80 */ flags[nmodes] = 0; } @@ -1556,6 +1556,9 @@ */ is_vht = !! (flags[j] & IEEE80211_CHAN_VHT); + /* XXX TODO FIXME VHT80P80. */ + /* XXX TODO FIXME VHT160. */ + /* * Test for VHT80. * XXX This is all very broken right now. Index: sys/net80211/ieee80211_var.h =================================================================== --- sys/net80211/ieee80211_var.h +++ sys/net80211/ieee80211_var.h @@ -920,10 +920,10 @@ ieee80211_vhtchanflags(const struct ieee80211_channel *c) { - if (IEEE80211_IS_CHAN_VHT160(c)) - return IEEE80211_FVHT_USEVHT160; if (IEEE80211_IS_CHAN_VHT80P80(c)) return IEEE80211_FVHT_USEVHT80P80; + if (IEEE80211_IS_CHAN_VHT160(c)) + return IEEE80211_FVHT_USEVHT160; if (IEEE80211_IS_CHAN_VHT80(c)) return IEEE80211_FVHT_USEVHT80; if (IEEE80211_IS_CHAN_VHT40(c)) Index: sys/net80211/ieee80211_vht.c =================================================================== --- sys/net80211/ieee80211_vht.c +++ sys/net80211/ieee80211_vht.c @@ -205,10 +205,10 @@ /* Channel width */ ic_printf(ic, "[VHT] Channel Widths: 20MHz, 40MHz, 80MHz"); - if (MS(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == 2) - printf(" 80+80MHz"); if (MS(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) >= 1) printf(" 160MHz"); + if (MS(ic->ic_vhtcaps, IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK) == 2) + printf(" 80+80MHz"); printf("\n"); /* Features */