Lines Matching +full:mode +full:- +full:capable

1 /*-
27 * IEEE 802.11ac-2013 protocol support.
86 ieee80211_note(ni->ni_vap, "%s: called; fc=0x%.2x/0x%.2x",
87 __func__, wh->i_fc[0], wh->i_fc[1]);
98 ieee80211_note(ni->ni_vap, "%s: called; category=%d, action=%d",
138 struct ieee80211com *ic = vap->iv_ic;
143 vap->iv_vht_cap.vht_cap_info = ic->ic_vht_cap.vht_cap_info;
144 vap->iv_vhtextcaps = ic->ic_vhtextcaps;
147 vap->iv_vht_flags =
151 if (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160MHZ(vap->iv_vht_cap.vht_cap_info))
152 vap->iv_vht_flags |= IEEE80211_FVHT_USEVHT160;
153 if (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160_80P80MHZ(vap->iv_vht_cap.vht_cap_info))
154 vap->iv_vht_flags |= IEEE80211_FVHT_USEVHT80P80;
156 memcpy(&vap->iv_vht_cap.supp_mcs, &ic->ic_vht_cap.supp_mcs,
167 vht_announce(struct ieee80211com *ic, enum ieee80211_phymode mode)
198 (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160MHZ(ic->ic_vht_cap.vht_cap_info)) ?
200 (IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_IS_160_80P80MHZ(ic->ic_vht_cap.vht_cap_info)) ?
203 ic_printf(ic, "[VHT] Features: %b\n", ic->ic_vht_cap.vht_cap_info,
209 tx = (ic->ic_vht_cap.supp_mcs.tx_mcs_map >> (2*i)) & 0x3;
210 rx = (ic->ic_vht_cap.supp_mcs.rx_mcs_map >> (2*i)) & 0x3;
222 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
224 ni->ni_flags |= IEEE80211_NODE_VHT;
231 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
233 ni->ni_flags &= ~IEEE80211_NODE_VHT;
234 ni->ni_vhtcap = 0;
235 bzero(&ni->ni_vht_mcsinfo, sizeof(struct ieee80211_vht_mcs_info));
245 ni->ni_vht_chanwidth = ie[2];
246 ni->ni_vht_chan1 = ie[3];
247 ni->ni_vht_chan2 = ie[4];
248 ni->ni_vht_basicmcs = le16dec(ie + 5);
252 __func__, ni->ni_vht_chan1, ni->ni_vht_chan2, ni->ni_vht_chanwidth,
253 ni->ni_vht_basicmcs);
265 ni->ni_vhtcap = le32dec(ie + 2);
268 ni->ni_vht_mcsinfo.rx_mcs_map = le16dec(ie + 6);
269 ni->ni_vht_mcsinfo.rx_highest = le16dec(ie + 8);
270 ni->ni_vht_mcsinfo.tx_mcs_map = le16dec(ie + 10);
271 ni->ni_vht_mcsinfo.tx_highest = le16dec(ie + 12);
306 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
314 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
322 * current operating mode and intersection of the TX/RX MCS maps.
332 * TODO: ensure I re-read 9.7.11 Rate Selection for VHT STAs.
334 * TODO: investigate what we should negotiate for MU-MIMO beamforming
343 struct ieee80211vap *vap = ni->ni_vap;
344 // struct ieee80211com *ic = vap->iv_ic;
350 * Capabilities - it depends on whether we are a station
356 * Station - use our desired configuration based on
357 * local config, local device bits and the already-learnt
362 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
365 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
372 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
375 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
379 ((vap->iv_vht_flags & IEEE80211_FVHT_USEVHT80P80) == 0))
382 ((vap->iv_vht_flags & IEEE80211_FVHT_USEVHT160) == 0))
389 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
392 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
398 /* Short-GI 80 */
399 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
402 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
408 /* Short-GI 160 */
409 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
412 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
421 * In non-STA mode, we just announce our capabilities and that
424 * In STA mode, we should calculate our capabilities based on
434 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
437 /* STA mode - enable it only if node RXSTBC is non-zero */
438 val2 = !! _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
442 if ((vap->iv_vht_flags & IEEE80211_FVHT_STBC_TX) == 0)
447 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
450 /* STA mode - enable it only if node TXSTBC is non-zero */
451 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
455 if ((vap->iv_vht_flags & IEEE80211_FVHT_STBC_RX) == 0)
460 * Finally - if RXSTBC is 0, then don't enable TXSTBC.
476 /* SU Beamformer capable */
477 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
480 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
487 /* SU Beamformee capable */
488 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
491 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
498 /* Beamformee STS capability - only if SU beamformee capable */
499 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
502 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
511 /* Sounding dimensions - only if SU beamformer capable */
512 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
515 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
524 * MU Beamformer capable - only if SU BFF capable, MU BFF capable
527 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
530 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
535 if (opmode != 1) /* Only enable for STA mode */
541 * MU Beamformee capable - only if SU BFE capable, MU BFE capable
544 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
547 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
552 if (opmode != 0) /* Only enable for AP mode */
558 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
561 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
567 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
570 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
575 /* A-MPDU length max */
577 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
580 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
587 * Link adaptation is only valid if HTC-VHT capable is 1.
590 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
593 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
607 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
610 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
617 val2 = val1 = _IEEE80211_MASKSHIFT(vap->iv_vht_cap.vht_cap_info,
620 val2 = _IEEE80211_MASKSHIFT(ni->ni_vhtcap,
627 * MCS set - again, we announce what we want to use
629 * already-learnt vhtcap/vhtinfo IE information.
632 /* MCS set - start with whatever the device supports */
633 vhtcap->supp_mcs.rx_mcs_map = vap->iv_vht_cap.supp_mcs.rx_mcs_map;
634 vhtcap->supp_mcs.rx_highest = 0;
635 vhtcap->supp_mcs.tx_mcs_map = vap->iv_vht_cap.supp_mcs.tx_mcs_map;
636 vhtcap->supp_mcs.tx_highest = 0;
638 vhtcap->vht_cap_info = new_vhtcap;
646 * Note: 0 - MCS0..7; 1 - MCS0..8; 2 - MCS0..9; 3 = not supported.
651 val1 = (vhtcap->supp_mcs.tx_mcs_map >> (i*2)) & 0x3;
652 val2 = (ni->ni_vht_mcsinfo.tx_mcs_map >> (i*2)) & 0x3;
656 vhtcap->supp_mcs.tx_mcs_map &= ~(0x3 << (i*2));
657 vhtcap->supp_mcs.tx_mcs_map |= (val << (i*2));
665 * If in station mode, we announce what we would like our
682 /* 32-bit VHT capability */
695 * Non-associated probe requests. Add VHT capabilities based on
709 /* 32-bit VHT capability */
710 ADDWORD(frm, vap->iv_vht_cap.vht_cap_info);
713 ADDSHORT(frm, vap->iv_vht_cap.supp_mcs.rx_mcs_map);
714 ADDSHORT(frm, vap->iv_vht_cap.supp_mcs.rx_highest);
715 ADDSHORT(frm, vap->iv_vht_cap.supp_mcs.tx_mcs_map);
716 ADDSHORT(frm, vap->iv_vht_cap.supp_mcs.tx_highest);
742 printf("%s: called on a non-VHT channel (freq=%d, flags=0x%08x\n",
743 __func__, (int) c->ic_freq, c->ic_flags);
752 * XXX TODO: read 802.11-2013 to determine what to set
767 /* 8-bit chanwidth */
768 *frm++ = ieee80211_vht_get_chwidth_ie(ni->ni_chan);
770 /* 8-bit freq1 */
771 *frm++ = ni->ni_chan->ic_vht_ch_freq1;
773 /* 8-bit freq2 */
774 *frm++ = ni->ni_chan->ic_vht_ch_freq2;
776 /* 16-bit basic MCS set - just MCS0..7 for NSS=1 for now */
795 return (ieee80211_find_channel(ic, c->ic_freq,
796 (c->ic_flags & ~IEEE80211_CHAN_VHT) | vhtflags));
808 /* First case - handle channel demotion - if VHT isn't set */
812 chan->ic_ieee, chan->ic_flags);
814 c = ieee80211_find_channel(ic, chan->ic_freq,
815 chan->ic_flags & ~IEEE80211_CHAN_VHT);
820 c->ic_ieee, c->ic_flags);
826 * We can upgrade to VHT - attempt to do so
856 printf("%s: selected %d/0x%08x\n", __func__, c->ic_ieee, c->ic_flags);
868 * TODO: ensure I read 10.39.7 - BSS Basic VHT-MCS and NSS set operation.
886 if (ni == NULL || ni->ni_chan == IEEE80211_CHAN_ANYC ||
887 ni->ni_vap == NULL || ni->ni_vap->iv_bss == NULL)
890 vap = ni->ni_vap;
891 bss_chan = vap->iv_bss->ni_chan;
896 return (IEEE80211_IS_CHAN_VHT(ni->ni_chan));
902 * This verifies that the BSS is VHT40 capable and the current
914 vap = ni->ni_vap;
915 bss_chan = vap->iv_bss->ni_chan;
918 IEEE80211_IS_CHAN_VHT40(ni->ni_chan) &&
919 (ni->ni_chw == IEEE80211_STA_RX_BW_40));
925 * This verifies that the BSS is VHT80 capable and the current
937 vap = ni->ni_vap;
938 bss_chan = vap->iv_bss->ni_chan;
941 IEEE80211_IS_CHAN_VHT80(ni->ni_chan) &&
942 (ni->ni_chw == IEEE80211_STA_RX_BW_80));
948 * This verifies that the BSS is VHT80+80 or VHT160 capable and the current
960 vap = ni->ni_vap;
961 bss_chan = vap->iv_bss->ni_chan;
963 if (ni->ni_chw != IEEE80211_STA_RX_BW_160)
967 IEEE80211_IS_CHAN_VHT160(ni->ni_chan))
971 IEEE80211_IS_CHAN_VHT80P80(ni->ni_chan))
985 * channels as well - eg a VHT160 channel will have the CHAN_VHT80,