Lines Matching refs:ni

209 static int ieee80211_ampdu_enable(struct ieee80211_node *ni,
211 static int ieee80211_addba_request(struct ieee80211_node *ni,
214 static int ieee80211_addba_response(struct ieee80211_node *ni,
217 static void ieee80211_addba_stop(struct ieee80211_node *ni,
219 static void null_addba_response_timeout(struct ieee80211_node *ni,
222 static void ieee80211_bar_response(struct ieee80211_node *ni,
471 ieee80211_decap_amsdu(struct ieee80211_node *ni, struct mbuf *m)
473 struct ieee80211vap *vap = ni->ni_vap;
492 ni->ni_macaddr, "a-msdu", "%s", "decap failed");
501 ni->ni_macaddr, "a-msdu",
507 vap->iv_deliver_data(vap, ni, m);
545 struct ieee80211_node *ni,
550 struct ieee80211vap *vap = ni->ni_vap;
608 ni->ni_macaddr,
629 IEEE80211_NODE_STAT(ni, rx_amsdu_more_end);
631 IEEE80211_NODE_STAT(ni, rx_amsdu_more);
637 ni->ni_macaddr, "a-mpdu duplicate",
644 ni->ni_macaddr, "a-mpdu duplicate",
651 ni->ni_macaddr, "a-mpdu duplicate",
656 IEEE80211_NODE_STAT(ni, rx_dup);
683 ieee80211_ampdu_rx_init_rap(struct ieee80211_node *ni,
698 ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap,
701 struct ieee80211vap *vap = ni->ni_vap;
711 ieee80211_ampdu_rx_init_rap(ni, rap);
731 ieee80211_ampdu_rx_start_ext(struct ieee80211_node *ni, int tid, int seq, int baw)
737 rap = &ni->ni_rx_ampdu[tid];
747 ieee80211_ampdu_rx_init_rap(ni, rap);
762 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
777 ieee80211_ampdu_rx_stop_ext(struct ieee80211_node *ni, int tid)
782 rap = &ni->ni_rx_ampdu[tid];
783 ampdu_rx_stop(ni, rap);
790 ampdu_rx_stop(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap)
806 ampdu_dispatch(struct ieee80211_node *ni, struct mbuf *m)
810 (void) ieee80211_input(ni, m, 0, 0);
814 ampdu_dispatch_slot(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni,
829 ampdu_dispatch(ni, m);
835 ampdu_rx_moveup(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni,
838 struct ieee80211vap *vap = ni->ni_vap;
877 ampdu_rx_dispatch(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni)
879 struct ieee80211vap *vap = ni->ni_vap;
885 r = ampdu_dispatch_slot(rap, ni, i);
892 ampdu_rx_moveup(rap, ni, i, -1);
901 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
913 ampdu_rx_flush(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap)
918 r = ampdu_dispatch_slot(rap, ni, i);
921 ni->ni_vap->iv_stats.is_ampdu_rx_oor += r;
923 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
941 ampdu_rx_flush_upto(struct ieee80211_node *ni,
944 struct ieee80211vap *vap = ni->ni_vap;
958 (void) ampdu_dispatch_slot(rap, ni, i);
966 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
978 ampdu_rx_moveup(rap, ni, i, winstart);
1002 ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m,
1007 struct ieee80211vap *vap = ni->ni_vap;
1018 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT sta"));
1041 rap = &ni->ni_rx_ampdu[tid];
1054 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1058 IEEE80211_NODE_STAT(ni, rx_drop);
1084 ampdu_dispatch(ni, m);
1085 ampdu_rx_dispatch(rap, ni);
1095 IEEE80211_NODE_STAT(ni, rx_amsdu_more_end);
1097 IEEE80211_NODE_STAT(ni, rx_amsdu_more);
1143 ampdu_rx_flush(ni, rap);
1153 IEEE80211_NODE_STAT(ni,
1156 IEEE80211_NODE_STAT(ni,
1173 ampdu_rx_add_slot(rap, off, tid, rxseq, ni, m, rxs);
1182 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
1198 ampdu_rx_flush_upto(ni, rap,
1207 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1214 IEEE80211_NODE_STAT(ni, rx_drop);
1228 ieee80211_recv_bar(struct ieee80211_node *ni, struct mbuf *m0)
1230 struct ieee80211vap *vap = ni->ni_vap;
1239 ni->ni_macaddr, "BAR", "%s", "processing disabled");
1247 rap = &ni->ni_rx_ampdu[tid];
1254 ni->ni_macaddr, "BAR", "no BA stream, tid %u", tid);
1269 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
1276 ampdu_rx_flush_upto(ni, rap, rxseq);
1291 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1298 IEEE80211_NODE_STAT(ni, rx_drop);
1308 ieee80211_ht_node_init(struct ieee80211_node *ni)
1313 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1314 ni,
1317 ni);
1319 if (ni->ni_flags & IEEE80211_NODE_HT) {
1325 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1326 ni,
1328 __func__, ni);
1329 ieee80211_ht_node_cleanup(ni);
1332 tap = &ni->ni_tx_ampdu[tid];
1334 tap->txa_ni = ni;
1337 ieee80211_ampdu_rx_init_rap(ni, &ni->ni_rx_ampdu[tid]);
1339 ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU |
1348 ieee80211_ht_node_cleanup(struct ieee80211_node *ni)
1350 struct ieee80211com *ic = ni->ni_ic;
1353 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1354 ni,
1356 __func__, ni);
1358 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT node"));
1362 struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[i];
1367 ic->ic_ampdu_rx_stop(ni, &ni->ni_rx_ampdu[i]);
1369 ni->ni_htcap = 0;
1370 ni->ni_flags &= ~IEEE80211_NODE_HT_ALL;
1377 ieee80211_ht_node_age(struct ieee80211_node *ni)
1379 struct ieee80211vap *vap = ni->ni_vap;
1382 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT sta"));
1387 rap = &ni->ni_rx_ampdu[tid];
1403 ampdu_rx_flush(ni, rap);
1458 ieee80211_ht_wds_init(struct ieee80211_node *ni)
1460 struct ieee80211vap *vap = ni->ni_vap;
1473 ni->ni_chan = ieee80211_ht_adjust_channel(ni->ni_ic,
1474 ni->ni_chan, ieee80211_htchanflags(ni->ni_chan));
1476 ni->ni_htcap = 0;
1478 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI20;
1479 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {
1480 ni->ni_htcap |= IEEE80211_HTCAP_CHWIDTH40;
1481 ni->ni_chw = 40;
1482 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
1483 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_ABOVE;
1484 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
1485 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_BELOW;
1487 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI40;
1489 ni->ni_chw = 20;
1490 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_NONE;
1492 ni->ni_htctlchan = ni->ni_chan->ic_ieee;
1494 ni->ni_flags |= IEEE80211_NODE_RIFS;
1497 ni->ni_htopmode = 0; /* XXX need protection state */
1498 ni->ni_htstbc = 0; /* XXX need info */
1501 tap = &ni->ni_tx_ampdu[tid];
1506 ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU |
1577 ieee80211_ht_node_join(struct ieee80211_node *ni)
1579 struct ieee80211vap *vap = ni->ni_vap;
1583 if (ni->ni_flags & IEEE80211_NODE_HT) {
1585 if (ni->ni_chw == 40)
1595 ieee80211_ht_node_leave(struct ieee80211_node *ni)
1597 struct ieee80211vap *vap = ni->ni_vap;
1601 if (ni->ni_flags & IEEE80211_NODE_HT) {
1603 if (ni->ni_chw == 40)
1673 ieee80211_parse_htcap(struct ieee80211_node *ni, const uint8_t *ie)
1681 ni->ni_flags |= IEEE80211_NODE_HTCOMPAT;
1684 ni->ni_flags &= ~IEEE80211_NODE_HTCOMPAT;
1686 ni->ni_htcap = le16dec(ie +
1688 ni->ni_htparam = ie[__offsetof(struct ieee80211_ie_htcap, hc_param)];
1692 htinfo_parse(struct ieee80211_node *ni,
1697 ni->ni_htctlchan = htinfo->hi_ctrlchannel;
1698 ni->ni_ht2ndchan = _IEEE80211_SHIFTMASK(htinfo->hi_byte1,
1701 ni->ni_htopmode = _IEEE80211_SHIFTMASK(w, IEEE80211_HTINFO_OPMODE);
1703 ni->ni_htstbc = _IEEE80211_SHIFTMASK(w, IEEE80211_HTINFO_BASIC_STBCMCS);
1712 ieee80211_parse_htinfo(struct ieee80211_node *ni, const uint8_t *ie)
1716 htinfo_parse(ni, (const struct ieee80211_ie_htinfo *) ie);
1732 htinfo_update_chw(struct ieee80211_node *ni, int htflags, int vhtflags)
1734 struct ieee80211com *ic = ni->ni_ic;
1745 chanflags = (ni->ni_chan->ic_flags &~
1748 if (chanflags == ni->ni_chan->ic_flags)
1757 chanflags = (ni->ni_chan->ic_flags &~
1760 c = ieee80211_find_channel(ic, ni->ni_chan->ic_freq, chanflags);
1766 c = findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT20);
1768 IEEE80211_NOTE(ni->ni_vap,
1769 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1771 ni->ni_chan->ic_freq);
1778 c = ni->ni_chan;
1784 IEEE80211_NOTE(ni->ni_vap,
1785 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1797 if (IEEE80211_CONF_VHT(ic) && ni->ni_vhtcap != 0 && vhtflags != 0) {
1801 IEEE80211_NOTE(ni->ni_vap,
1803 ni,
1805 __func__, ni->ni_vht_chanwidth, vhtflags);
1807 IEEE80211_NOTE(ni->ni_vap,
1809 ni,
1816 if (c != NULL && c != ni->ni_chan) {
1817 IEEE80211_NOTE(ni->ni_vap,
1818 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1824 ni->ni_chan = c;
1831 ni->ni_chw = IEEE80211_IS_CHAN_HT40(ni->ni_chan)? 40 : 20;
1839 htcap_update_mimo_ps(struct ieee80211_node *ni)
1841 uint16_t oflags = ni->ni_flags;
1843 switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) {
1845 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
1846 ni->ni_flags |= IEEE80211_NODE_MIMO_RTS;
1849 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
1850 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
1854 ni->ni_flags &= ~IEEE80211_NODE_MIMO_PS;
1855 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
1858 return (oflags ^ ni->ni_flags);
1866 htcap_update_shortgi(struct ieee80211_node *ni)
1868 struct ieee80211vap *vap = ni->ni_vap;
1870 ni->ni_flags &= ~(IEEE80211_NODE_SGI20|IEEE80211_NODE_SGI40);
1871 if ((ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) &&
1873 ni->ni_flags |= IEEE80211_NODE_SGI20;
1874 if ((ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) &&
1876 ni->ni_flags |= IEEE80211_NODE_SGI40;
1884 htcap_update_ldpc(struct ieee80211_node *ni)
1886 struct ieee80211vap *vap = ni->ni_vap;
1888 if ((ni->ni_htcap & IEEE80211_HTCAP_LDPC) &&
1890 ni->ni_flags |= IEEE80211_NODE_LDPC;
1903 ieee80211_ht_updateparams(struct ieee80211_node *ni,
1906 struct ieee80211vap *vap = ni->ni_vap;
1909 ieee80211_parse_htcap(ni, htcapie);
1911 htcap_update_mimo_ps(ni);
1912 htcap_update_shortgi(ni);
1913 htcap_update_ldpc(ni);
1918 htinfo_parse(ni, htinfo);
1927 ni->ni_flags |= IEEE80211_NODE_RIFS;
1929 ni->ni_flags &= ~IEEE80211_NODE_RIFS;
1933 ieee80211_vht_get_vhtflags(struct ieee80211_node *ni, uint32_t htflags)
1935 struct ieee80211vap *vap = ni->ni_vap;
1939 if (ni->ni_flags & IEEE80211_NODE_VHT && vap->iv_flags_vht & IEEE80211_FVHT_VHT) {
1940 if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ) &&
1952 } else if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_80P80MHZ) &&
1964 } else if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_80MHZ) &&
1973 } else if (ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_USE_HT) {
2016 ieee80211_ht_updateparams_final(struct ieee80211_node *ni,
2019 struct ieee80211vap *vap = ni->ni_vap;
2032 if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE)
2034 else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW)
2043 vhtflags = ieee80211_vht_get_vhtflags(ni, htflags);
2045 if (htinfo_update_chw(ni, htflags, vhtflags))
2058 ieee80211_ht_updatehtcap(struct ieee80211_node *ni, const uint8_t *htcapie)
2060 struct ieee80211vap *vap = ni->ni_vap;
2062 ieee80211_parse_htcap(ni, htcapie);
2064 htcap_update_mimo_ps(ni);
2065 htcap_update_shortgi(ni);
2066 htcap_update_ldpc(ni);
2075 ieee80211_ht_updatehtcap_final(struct ieee80211_node *ni)
2077 struct ieee80211vap *vap = ni->ni_vap;
2085 if ((ni->ni_htcap & IEEE80211_HTCAP_CHWIDTH40) &&
2097 vhtflags = ieee80211_vht_get_vhtflags(ni, htflags);
2099 (void) htinfo_update_chw(ni, htflags, vhtflags);
2106 ieee80211_setup_htrates(struct ieee80211_node *ni, const uint8_t *ie, int flags)
2108 struct ieee80211com *ic = ni->ni_ic;
2109 struct ieee80211vap *vap = ni->ni_vap;
2125 rs = &ni->ni_htrates;
2136 IEEE80211_MSG_XRATE | IEEE80211_MSG_11N, ni,
2152 return ieee80211_fix_rate(ni, (struct ieee80211_rateset *) rs, flags);
2160 ieee80211_setup_basic_htrates(struct ieee80211_node *ni, const uint8_t *ie)
2169 rs = &ni->ni_htrates;
2171 IEEE80211_NOTE(ni->ni_vap,
2172 IEEE80211_MSG_XRATE | IEEE80211_MSG_11N, ni,
2196 struct ieee80211_node *ni = tap->txa_ni;
2197 struct ieee80211com *ic = ni->ni_ic;
2212 ic->ic_addba_stop(ni, tap);
2237 struct ieee80211_node *ni = tap->txa_ni;
2238 struct ieee80211com *ic = ni->ni_ic;
2243 ic->ic_addba_response_timeout(ni, tap);
2267 null_addba_response_timeout(struct ieee80211_node *ni,
2278 ieee80211_addba_request(struct ieee80211_node *ni,
2299 ieee80211_ampdu_tx_request_ext(struct ieee80211_node *ni, int tid)
2305 tap = &ni->ni_tx_ampdu[tid];
2322 ieee80211_ampdu_tx_request_active_ext(struct ieee80211_node *ni, int tid,
2329 tap = &ni->ni_tx_ampdu[tid];
2349 ieee80211_addba_response(struct ieee80211_node *ni,
2353 struct ieee80211vap *vap = ni->ni_vap;
2368 (ni->ni_flags & IEEE80211_NODE_AMSDU_TX) &&
2385 ieee80211_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
2403 ht_recv_action_ba_addba_request(struct ieee80211_node *ni,
2407 struct ieee80211com *ic = ni->ni_ic;
2408 struct ieee80211vap *vap = ni->ni_vap;
2422 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2432 rap = &ni->ni_rx_ampdu[tid];
2441 if ((ni->ni_flags & IEEE80211_NODE_AMPDU_RX) &&
2444 ic->ic_ampdu_rx_start(ni, rap,
2450 ni, "reject ADDBA request: %s",
2451 ni->ni_flags & IEEE80211_NODE_AMPDU_RX ?
2468 (ni->ni_flags & IEEE80211_NODE_AMSDU_RX) &&
2474 ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2480 ht_recv_action_ba_addba_response(struct ieee80211_node *ni,
2484 struct ieee80211com *ic = ni->ni_ic;
2485 struct ieee80211vap *vap = ni->ni_vap;
2501 tap = &ni->ni_tx_ampdu[tid];
2505 ni->ni_macaddr, "ADDBA response",
2514 ni->ni_macaddr, "ADDBA response",
2525 ni->ni_macaddr, "ADDBA response",
2538 ni->ni_macaddr, "ADDBA response",
2547 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2554 ic->ic_addba_response(ni, tap, code, baparamset, batimeout);
2559 ht_recv_action_ba_delba(struct ieee80211_node *ni,
2563 struct ieee80211com *ic = ni->ni_ic;
2574 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2580 tap = &ni->ni_tx_ampdu[tid];
2581 ic->ic_addba_stop(ni, tap);
2583 rap = &ni->ni_rx_ampdu[tid];
2584 ic->ic_ampdu_rx_stop(ni, rap);
2590 ht_recv_action_ht_txchwidth(struct ieee80211_node *ni,
2598 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2600 __func__, chw, ni->ni_chw != chw ? "*" : "");
2601 if (chw != ni->ni_chw) {
2603 ni->ni_chw = chw;
2610 ht_recv_action_ht_mimopwrsave(struct ieee80211_node *ni,
2619 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
2621 ni->ni_flags &= ~IEEE80211_NODE_MIMO_PS;
2623 ni->ni_flags |= IEEE80211_NODE_MIMO_RTS;
2625 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
2627 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2629 (ni->ni_flags & IEEE80211_NODE_MIMO_PS) ? "on" : "off",
2630 (ni->ni_flags & IEEE80211_NODE_MIMO_RTS) ? "+rts" : ""
2648 ieee80211_ampdu_enable(struct ieee80211_node *ni,
2651 struct ieee80211vap *vap = ni->ni_vap;
2666 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
2679 ieee80211_ampdu_request(struct ieee80211_node *ni,
2682 struct ieee80211com *ic = ni->ni_ic;
2701 tap->txa_start = ni->ni_txseqs[tid];
2712 if ((ni->ni_flags & IEEE80211_NODE_AMSDU_TX) &&
2713 (ni->ni_vap->iv_htcaps & IEEE80211_HTC_TX_AMSDU_AMPDU))
2718 if (!ic->ic_addba_request(ni, tap, dialogtoken, args[2], args[3])) {
2720 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2721 ni, "%s: could not setup BA stream for TID %d AC %d",
2735 return ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2744 ieee80211_ampdu_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap,
2747 struct ieee80211com *ic = ni->ni_ic;
2748 struct ieee80211vap *vap = ni->ni_vap;
2755 ni, "%s: stop BA stream for TID %d (reason: %d (%s))",
2760 ic->ic_addba_stop(ni, tap);
2764 ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2768 ni, "%s: BA stream for TID %d not running "
2782 struct ieee80211_node *ni = tap->txa_ni;
2787 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2788 ni, "%s: tid %u flags 0x%x attempts %d", __func__,
2796 struct ieee80211com *ic = ni->ni_ic;
2798 ni->ni_vap->iv_stats.is_ampdu_bar_tx_fail++;
2807 ic->ic_bar_response(ni, tap, 1);
2808 ieee80211_ampdu_stop(ni, tap, IEEE80211_REASON_TIMEOUT);
2810 ni->ni_vap->iv_stats.is_ampdu_bar_tx_retry++;
2811 if (ieee80211_send_bar(ni, tap, tap->txa_seqpending) != 0) {
2812 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2813 ni, "%s: failed to TX, starting timer\n",
2851 bar_tx_complete(struct ieee80211_node *ni, void *arg, int status)
2855 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2856 ni, "%s: tid %u flags 0x%x pending %d status %d",
2860 ni->ni_vap->iv_stats.is_ampdu_bar_tx++;
2864 struct ieee80211com *ic = ni->ni_ic;
2868 ic->ic_bar_response(ni, tap, status);
2874 ieee80211_bar_response(struct ieee80211_node *ni,
2883 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2884 ni, "BAR moves BA win <%u:%u> (%u frames) txseq %u tid %u",
2904 ieee80211_send_bar(struct ieee80211_node *ni,
2908 struct ieee80211vap *vap = ni->ni_vap;
2909 struct ieee80211com *ic = ni->ni_ic;
2929 ieee80211_ref_node(ni);
2945 IEEE80211_ADDR_COPY(bar->i_ra, ni->ni_macaddr);
2962 IEEE80211_NODE_STAT(ni, tx_mgmt); /* XXX tx_ctl? */
2974 ni, "send BAR: tid %u ctl 0x%x start %u (attempt %d)",
2982 ret = ieee80211_raw_output(vap, ni, m, NULL);
2986 ni, "send BAR: failed: (ret = %d)\n",
3003 ieee80211_free_node(ni);
3009 ht_action_output(struct ieee80211_node *ni, struct mbuf *m)
3015 params.ibp_rate0 = ni->ni_txparms->mgmtrate;
3017 params.ibp_try0 = ni->ni_txparms->maxretry;
3018 params.ibp_power = ni->ni_txpower;
3019 return ieee80211_mgmt_output(ni, m, IEEE80211_FC0_SUBTYPE_ACTION,
3035 ht_send_action_ba_addba(struct ieee80211_node *ni,
3038 struct ieee80211vap *vap = ni->ni_vap;
3039 struct ieee80211com *ic = ni->ni_ic;
3044 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3055 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3056 ieee80211_ref_node(ni);
3075 return ht_action_output(ni, m);
3078 ieee80211_free_node(ni);
3084 ht_send_action_ba_delba(struct ieee80211_node *ni,
3087 struct ieee80211vap *vap = ni->ni_vap;
3088 struct ieee80211com *ic = ni->ni_ic;
3097 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3103 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3104 ieee80211_ref_node(ni);
3118 return ht_action_output(ni, m);
3121 ieee80211_free_node(ni);
3127 ht_send_action_ht_txchwidth(struct ieee80211_node *ni,
3130 struct ieee80211vap *vap = ni->ni_vap;
3131 struct ieee80211com *ic = ni->ni_ic;
3135 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3137 IEEE80211_IS_CHAN_HT40(ni->ni_chan) ? 40 : 20);
3141 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3142 ieee80211_ref_node(ni);
3153 *frm++ = IEEE80211_IS_CHAN_HT40(ni->ni_chan) ?
3157 return ht_action_output(ni, m);
3160 ieee80211_free_node(ni);
3216 ieee80211_add_htcap_body(uint8_t *frm, struct ieee80211_node *ni)
3223 struct ieee80211com *ic = ni->ni_ic;
3224 struct ieee80211vap *vap = ni->ni_vap;
3246 rxmax = _IEEE80211_MASKSHIFT(ni->ni_htparam,
3248 density = _IEEE80211_MASKSHIFT(ni->ni_htparam,
3278 if (ni->ni_chan != IEEE80211_CHAN_ANYC &&
3279 findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT40U) == NULL &&
3280 findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT40D) == NULL)
3284 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))
3328 ieee80211_set_mcsset(ni->ni_ic, frm);
3349 ieee80211_add_htcap(uint8_t *frm, struct ieee80211_node *ni)
3353 return ieee80211_add_htcap_body(frm + 2, ni);
3451 ieee80211_add_htcap_vendor(uint8_t *frm, struct ieee80211_node *ni)
3459 return ieee80211_add_htcap_body(frm + 6, ni);
3489 struct ieee80211_node *ni;
3495 ni = ieee80211_ref_node(vap->iv_bss);
3496 bsschan = ni->ni_chan;
3522 ieee80211_free_node(ni);
3536 ieee80211_add_htinfo_body(uint8_t *frm, struct ieee80211_node *ni)
3538 struct ieee80211vap *vap = ni->ni_vap;
3539 struct ieee80211com *ic = ni->ni_ic;
3545 *frm++ = ieee80211_chan2ieee(ic, ni->ni_chan);
3551 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
3553 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
3557 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))
3569 ieee80211_set_basic_htrates(frm, &ni->ni_htrates);
3579 ieee80211_add_htinfo(uint8_t *frm, struct ieee80211_node *ni)
3583 return ieee80211_add_htinfo_body(frm + 2, ni);
3591 ieee80211_add_htinfo_vendor(uint8_t *frm, struct ieee80211_node *ni)
3599 return ieee80211_add_htinfo_body(frm + 6, ni);