Index: sys/net80211/ieee80211.h =================================================================== --- sys/net80211/ieee80211.h +++ sys/net80211/ieee80211.h @@ -1009,10 +1009,16 @@ IEEE80211_ELEMID_MESHPXUC = 138, IEEE80211_ELEMID_MESHAH = 60, /* XXX: remove */ - /* 802.11ac */ + /* 802.11ac-2013, Table 8-54-Element IDs */ IEEE80211_ELEMID_VHT_CAP = 191, IEEE80211_ELEMID_VHT_OPMODE = 192, + IEEE80211_ELEMID_EXTENDED_BSS_LOAD = 193, + IEEE80211_ELEMID_WIDE_BW_CHANNEL_SWITCH = 194, IEEE80211_ELEMID_VHT_PWR_ENV = 195, + IEEE80211_ELEMID_CHANNEL_SWITCH_WRAPPER = 196, + IEEE80211_ELEMID_AID = 197, + IEEE80211_ELEMID_QUIET_CHANNEL = 198, + IEEE80211_ELEMID_OPMODE_NOTIF = 199, }; struct ieee80211_tim_ie { Index: sys/net80211/ieee80211.c =================================================================== --- sys/net80211/ieee80211.c +++ sys/net80211/ieee80211.c @@ -2204,7 +2204,11 @@ status |= IFM_IEEE80211_MBSS; break; } - if (IEEE80211_IS_CHAN_HTA(chan)) { + if (IEEE80211_IS_CHAN_VHT_5GHZ(chan)) { + status |= IFM_IEEE80211_VHT5G; + } else if (IEEE80211_IS_CHAN_VHT_2GHZ(chan)) { + status |= IFM_IEEE80211_VHT2G; + } else if (IEEE80211_IS_CHAN_HTA(chan)) { status |= IFM_IEEE80211_11NA; } else if (IEEE80211_IS_CHAN_HTG(chan)) { status |= IFM_IEEE80211_11NG; Index: sys/net80211/ieee80211_ddb.c =================================================================== --- sys/net80211/ieee80211_ddb.c +++ sys/net80211/ieee80211_ddb.c @@ -236,7 +236,7 @@ { int i; - db_printf("%p: mac %s refcnt %d\n", ni, + db_printf("STA: %p: mac %s refcnt %d\n", ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)); db_printf("\tvap %p wdsvap %p ic %p table %p\n", ni->ni_vap, ni->ni_wdsvap, ni->ni_ic, ni->ni_table); @@ -254,6 +254,9 @@ ni->ni_ies.ath_ie); db_printf("\t htcap_ie %p htinfo_ie %p]\n", ni->ni_ies.htcap_ie, ni->ni_ies.htinfo_ie); + db_printf("\t vhtcap_ie %p vhtopmode_ie %p vhtpwrenv_ie %p]\n", + ni->ni_ies.vhtcap_ie, ni->ni_ies.vhtopmode_ie, + ni->ni_ies.vhtpwrenv_ie); if (ni->ni_flags & IEEE80211_NODE_QOS) { for (i = 0; i < WME_NUM_TID; i++) { if (ni->ni_txseqs[i] || ni->ni_rxseqs[i]) @@ -263,6 +266,7 @@ ni->ni_rxseqs[i] & IEEE80211_SEQ_FRAG_MASK); } } + db_printf("\ttxseq %u rxseq %u fragno %u rxfragstamp %u\n", ni->ni_txseqs[IEEE80211_NONQOS_TID], ni->ni_rxseqs[IEEE80211_NONQOS_TID] >> IEEE80211_SEQ_SEQ_SHIFT, @@ -307,6 +311,21 @@ ni->ni_mlstate, IEEE80211_MESH_MLSTATE_BITS, ni->ni_mllid, ni->ni_mlpid, ni->ni_mlrcnt, ni->ni_mltval); #endif + + /* VHT state */ + db_printf("\tvhtcap %b vht_basicmcs %#06x vht_pad2 %#06x\n", + ni->ni_vhtcap, IEEE80211_VHTCAP_BITS, + ni->ni_vht_basicmcs, ni->ni_vht_pad2); + db_printf("\tvht_mcsinfo: { rx_mcs_map %#06x rx_highest %#06x " + "tx_mcs_map %#06x tx_highest %#06x }\n", + ni->ni_vht_mcsinfo.rx_mcs_map, ni->ni_vht_mcsinfo.rx_highest, + ni->ni_vht_mcsinfo.tx_mcs_map, ni->ni_vht_mcsinfo.tx_highest); + db_printf("\tvht_chan1/chan2 %u/%u vht_chanwidth %#04x\n", + ni->ni_vht_chan1, ni->ni_vht_chan2, ni->ni_vht_chanwidth); + db_printf("\tvht_pad1 %#04x vht_spare { %#x %#x %#x %#x %#x %#x %#x %#x }\n", + ni->ni_vht_pad1, ni->ni_vht_spare[0], ni->ni_vht_spare[1], + ni->ni_vht_spare[2], ni->ni_vht_spare[3], ni->ni_vht_spare[4], + ni->ni_vht_spare[5], ni->ni_vht_spare[6], ni->ni_vht_spare[7]); } #ifdef IEEE80211_SUPPORT_TDMA @@ -334,7 +353,7 @@ const struct ieee80211com *ic = vap->iv_ic; int i; - db_printf("%p:", vap); + db_printf("VAP %p:", vap); db_printf(" bss %p", vap->iv_bss); db_printf(" myaddr %s", ether_sprintf(vap->iv_myaddr)); db_printf("\n"); @@ -364,6 +383,7 @@ db_printf("\tflags_ven=%b\n", vap->iv_flags_ven, IEEE80211_FVEN_BITS); db_printf("\tcaps=%b\n", vap->iv_caps, IEEE80211_C_BITS); db_printf("\thtcaps=%b\n", vap->iv_htcaps, IEEE80211_C_HTCAP_BITS); + db_printf("\tvhtcaps=%b\n", vap->iv_vhtcaps, IEEE80211_VHTCAP_BITS); _db_show_stats(&vap->iv_stats); @@ -518,7 +538,7 @@ { struct ieee80211vap *vap; - db_printf("%p:", ic); + db_printf("COM: %p:", ic); TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) db_printf(" %s(%p)", vap->iv_ifp->if_xname, vap); db_printf("\n"); @@ -543,6 +563,7 @@ db_printf("\tcryptocaps=%b\n", ic->ic_cryptocaps, IEEE80211_CRYPTO_BITS); db_printf("\thtcaps=%b\n", ic->ic_htcaps, IEEE80211_HTCAP_BITS); + db_printf("\tvhtcaps=%b\n", ic->ic_vhtcaps, IEEE80211_VHTCAP_BITS); #if 0 uint8_t ic_modecaps[2]; /* set of mode capabilities */ Index: sys/net80211/ieee80211_radiotap.h =================================================================== --- sys/net80211/ieee80211_radiotap.h +++ sys/net80211/ieee80211_radiotap.h @@ -427,6 +427,7 @@ /* #define IEEE80211_RADIOTAP_HE_DATA3_STBC 0x8000 */ #define IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE 0x000F +#define IEEE80211_RADIOTAP_HE_DATA4_MU_STA_ID 0x7FF0 #define IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE1 0x000F #define IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE2 0x00F0 #define IEEE80211_RADIOTAP_HE_DATA4_TB_SPTL_REUSE3 0x0F00 Index: sys/net80211/ieee80211_var.h =================================================================== --- sys/net80211/ieee80211_var.h +++ sys/net80211/ieee80211_var.h @@ -695,7 +695,8 @@ "\20\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \ "\0114ADDR\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\16STATEWAIT\17REINIT" \ "\20BPF\21WDSLEGACY\22PROBECHAN\23UNIQMAC\24SCAN_OFFLOAD\25SEQNO_OFFLOAD" \ - "\26VHT\27QUIET_IE" + "\26FRAG_OFFLOAD\27VHT" \ + "\30QUIET_IE\31UAPSD" /* ic_flags_ht/iv_flags_ht */ #define IEEE80211_FHT_NONHT_PR 0x00000001 /* STATUS: non-HT sta present */ @@ -933,10 +934,10 @@ ieee80211_vhtchanflags(const struct ieee80211_channel *c) { - if (IEEE80211_IS_CHAN_VHT80P80(c)) - return IEEE80211_FVHT_USEVHT80P80; if (IEEE80211_IS_CHAN_VHT160(c)) return IEEE80211_FVHT_USEVHT160; + if (IEEE80211_IS_CHAN_VHT80P80(c)) + return IEEE80211_FVHT_USEVHT80P80; 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 @@ -797,7 +797,7 @@ struct ieee80211_channel *c; /* First case - handle channel demotion - if VHT isn't set */ - if ((flags & IEEE80211_FVHT_VHT) == 0) { + if ((flags & IEEE80211_FVHT_MASK) == 0) { #if 0 printf("%s: demoting channel %d/0x%08x\n", __func__, chan->ic_ieee, chan->ic_flags); @@ -822,7 +822,7 @@ /* Start with VHT80 */ c = NULL; if ((c == NULL) && (flags & IEEE80211_FVHT_USEVHT160)) - c = findvhtchan(ic, chan, IEEE80211_CHAN_VHT80); + c = findvhtchan(ic, chan, IEEE80211_CHAN_VHT160); if ((c == NULL) && (flags & IEEE80211_FVHT_USEVHT80P80)) c = findvhtchan(ic, chan, IEEE80211_CHAN_VHT80P80);