Lines Matching full:ni
204 static int ieee80211_ampdu_enable(struct ieee80211_node *ni,
206 static int ieee80211_addba_request(struct ieee80211_node *ni,
209 static int ieee80211_addba_response(struct ieee80211_node *ni,
212 static void ieee80211_addba_stop(struct ieee80211_node *ni,
214 static void null_addba_response_timeout(struct ieee80211_node *ni,
217 static void ieee80211_bar_response(struct ieee80211_node *ni,
466 ieee80211_decap_amsdu(struct ieee80211_node *ni, struct mbuf *m)
468 struct ieee80211vap *vap = ni->ni_vap;
487 ni->ni_macaddr, "a-msdu", "%s", "decap failed");
496 ni->ni_macaddr, "a-msdu",
502 vap->iv_deliver_data(vap, ni, m);
540 struct ieee80211_node *ni,
545 struct ieee80211vap *vap = ni->ni_vap;
603 ni->ni_macaddr,
624 IEEE80211_NODE_STAT(ni, rx_amsdu_more_end);
626 IEEE80211_NODE_STAT(ni, rx_amsdu_more);
632 ni->ni_macaddr, "a-mpdu duplicate",
639 ni->ni_macaddr, "a-mpdu duplicate",
646 ni->ni_macaddr, "a-mpdu duplicate",
651 IEEE80211_NODE_STAT(ni, rx_dup);
678 ieee80211_ampdu_rx_init_rap(struct ieee80211_node *ni,
693 ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap,
696 struct ieee80211vap *vap = ni->ni_vap;
706 ieee80211_ampdu_rx_init_rap(ni, rap);
726 ieee80211_ampdu_rx_start_ext(struct ieee80211_node *ni, int tid, int seq, int baw)
732 rap = &ni->ni_rx_ampdu[tid];
742 ieee80211_ampdu_rx_init_rap(ni, rap);
757 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
772 ieee80211_ampdu_rx_stop_ext(struct ieee80211_node *ni, int tid)
777 rap = &ni->ni_rx_ampdu[tid];
778 ampdu_rx_stop(ni, rap);
785 ampdu_rx_stop(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap)
801 ampdu_dispatch(struct ieee80211_node *ni, struct mbuf *m)
805 (void) ieee80211_input(ni, m, 0, 0);
809 ampdu_dispatch_slot(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni,
824 ampdu_dispatch(ni, m);
830 ampdu_rx_moveup(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni,
833 struct ieee80211vap *vap = ni->ni_vap;
872 ampdu_rx_dispatch(struct ieee80211_rx_ampdu *rap, struct ieee80211_node *ni)
874 struct ieee80211vap *vap = ni->ni_vap;
880 r = ampdu_dispatch_slot(rap, ni, i);
887 ampdu_rx_moveup(rap, ni, i, -1);
896 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
908 ampdu_rx_flush(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap)
913 r = ampdu_dispatch_slot(rap, ni, i);
916 ni->ni_vap->iv_stats.is_ampdu_rx_oor += r;
918 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
936 ampdu_rx_flush_upto(struct ieee80211_node *ni,
939 struct ieee80211vap *vap = ni->ni_vap;
953 (void) ampdu_dispatch_slot(rap, ni, i);
961 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni,
973 ampdu_rx_moveup(rap, ni, i, winstart);
997 ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m,
1002 struct ieee80211vap *vap = ni->ni_vap;
1013 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT sta"));
1036 rap = &ni->ni_rx_ampdu[tid];
1049 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1053 IEEE80211_NODE_STAT(ni, rx_drop);
1079 ampdu_dispatch(ni, m);
1080 ampdu_rx_dispatch(rap, ni);
1090 IEEE80211_NODE_STAT(ni, rx_amsdu_more_end);
1092 IEEE80211_NODE_STAT(ni, rx_amsdu_more);
1138 ampdu_rx_flush(ni, rap);
1148 IEEE80211_NODE_STAT(ni,
1151 IEEE80211_NODE_STAT(ni,
1168 ampdu_rx_add_slot(rap, off, tid, rxseq, ni, m, rxs);
1177 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
1193 ampdu_rx_flush_upto(ni, rap,
1202 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1209 IEEE80211_NODE_STAT(ni, rx_drop);
1223 ieee80211_recv_bar(struct ieee80211_node *ni, struct mbuf *m0)
1225 struct ieee80211vap *vap = ni->ni_vap;
1234 ni->ni_macaddr, "BAR", "%s", "processing disabled");
1242 rap = &ni->ni_rx_ampdu[tid];
1249 ni->ni_macaddr, "BAR", "no BA stream, tid %u", tid);
1264 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
1271 ampdu_rx_flush_upto(ni, rap, rxseq);
1286 IEEE80211_MSG_INPUT | IEEE80211_MSG_11N, ni->ni_macaddr,
1293 IEEE80211_NODE_STAT(ni, rx_drop);
1303 ieee80211_ht_node_init(struct ieee80211_node *ni)
1308 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1309 ni,
1312 ni);
1314 if (ni->ni_flags & IEEE80211_NODE_HT) {
1320 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1321 ni,
1323 __func__, ni);
1324 ieee80211_ht_node_cleanup(ni);
1327 tap = &ni->ni_tx_ampdu[tid];
1329 tap->txa_ni = ni;
1332 ieee80211_ampdu_rx_init_rap(ni, &ni->ni_rx_ampdu[tid]);
1334 ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU |
1343 ieee80211_ht_node_cleanup(struct ieee80211_node *ni)
1345 struct ieee80211com *ic = ni->ni_ic;
1348 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
1349 ni,
1351 __func__, ni);
1353 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT node"));
1357 struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[i];
1362 ic->ic_ampdu_rx_stop(ni, &ni->ni_rx_ampdu[i]);
1364 ni->ni_htcap = 0;
1365 ni->ni_flags &= ~IEEE80211_NODE_HT_ALL;
1372 ieee80211_ht_node_age(struct ieee80211_node *ni)
1374 struct ieee80211vap *vap = ni->ni_vap;
1377 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT sta"));
1382 rap = &ni->ni_rx_ampdu[tid];
1398 ampdu_rx_flush(ni, rap);
1453 ieee80211_ht_wds_init(struct ieee80211_node *ni)
1455 struct ieee80211vap *vap = ni->ni_vap;
1468 ni->ni_chan = ieee80211_ht_adjust_channel(ni->ni_ic,
1469 ni->ni_chan, ieee80211_htchanflags(ni->ni_chan));
1471 ni->ni_htcap = 0;
1473 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI20;
1474 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {
1475 ni->ni_htcap |= IEEE80211_HTCAP_CHWIDTH40;
1476 ni->ni_chw = IEEE80211_STA_RX_BW_40;
1477 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
1478 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_ABOVE;
1479 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
1480 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_BELOW;
1482 ni->ni_htcap |= IEEE80211_HTCAP_SHORTGI40;
1484 ni->ni_chw = IEEE80211_STA_RX_BW_20;
1485 ni->ni_ht2ndchan = IEEE80211_HTINFO_2NDCHAN_NONE;
1487 ni->ni_htctlchan = ni->ni_chan->ic_ieee;
1489 ni->ni_flags |= IEEE80211_NODE_RIFS;
1492 ni->ni_htopmode = 0; /* XXX need protection state */
1493 ni->ni_htstbc = 0; /* XXX need info */
1496 tap = &ni->ni_tx_ampdu[tid];
1501 ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU |
1572 ieee80211_ht_node_join(struct ieee80211_node *ni)
1574 struct ieee80211vap *vap = ni->ni_vap;
1578 if (ni->ni_flags & IEEE80211_NODE_HT) {
1580 if (ni->ni_chw == IEEE80211_STA_RX_BW_40)
1590 ieee80211_ht_node_leave(struct ieee80211_node *ni)
1592 struct ieee80211vap *vap = ni->ni_vap;
1596 if (ni->ni_flags & IEEE80211_NODE_HT) {
1598 if (ni->ni_chw == IEEE80211_STA_RX_BW_40)
1668 ieee80211_parse_htcap(struct ieee80211_node *ni, const uint8_t *ie)
1676 ni->ni_flags |= IEEE80211_NODE_HTCOMPAT;
1679 ni->ni_flags &= ~IEEE80211_NODE_HTCOMPAT;
1681 ni->ni_htcap = le16dec(ie +
1683 ni->ni_htparam = ie[__offsetof(struct ieee80211_ie_htcap, hc_param)];
1687 htinfo_parse(struct ieee80211_node *ni,
1692 ni->ni_htctlchan = htinfo->hi_ctrlchannel;
1693 ni->ni_ht2ndchan = _IEEE80211_SHIFTMASK(htinfo->hi_byte1,
1696 ni->ni_htopmode = _IEEE80211_SHIFTMASK(w, IEEE80211_HTINFO_OPMODE);
1698 ni->ni_htstbc = _IEEE80211_SHIFTMASK(w, IEEE80211_HTINFO_BASIC_STBCMCS);
1707 ieee80211_parse_htinfo(struct ieee80211_node *ni, const uint8_t *ie)
1711 htinfo_parse(ni, (const struct ieee80211_ie_htinfo *) ie);
1727 htinfo_update_chw(struct ieee80211_node *ni, int htflags, int vhtflags)
1729 struct ieee80211com *ic = ni->ni_ic;
1740 chanflags = (ni->ni_chan->ic_flags &~
1743 if (chanflags == ni->ni_chan->ic_flags)
1752 chanflags = (ni->ni_chan->ic_flags &~
1755 c = ieee80211_find_channel(ic, ni->ni_chan->ic_freq, chanflags);
1761 c = findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT20);
1763 IEEE80211_NOTE(ni->ni_vap,
1764 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1766 ni->ni_chan->ic_freq);
1773 c = ni->ni_chan;
1779 IEEE80211_NOTE(ni->ni_vap,
1780 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1792 if (IEEE80211_CONF_VHT(ic) && ni->ni_vhtcap != 0 && vhtflags != 0) {
1796 IEEE80211_NOTE(ni->ni_vap,
1798 ni,
1800 __func__, ni->ni_vht_chanwidth, vhtflags);
1802 IEEE80211_NOTE(ni->ni_vap,
1804 ni,
1811 if (c != NULL && c != ni->ni_chan) {
1812 IEEE80211_NOTE(ni->ni_vap,
1813 IEEE80211_MSG_ASSOC | IEEE80211_MSG_11N, ni,
1819 ni->ni_chan = c;
1826 ni->ni_chw = IEEE80211_IS_CHAN_HT40(ni->ni_chan) ?
1835 htcap_update_mimo_ps(struct ieee80211_node *ni)
1837 uint16_t oflags = ni->ni_flags;
1839 switch (ni->ni_htcap & IEEE80211_HTCAP_SMPS) {
1841 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
1842 ni->ni_flags |= IEEE80211_NODE_MIMO_RTS;
1845 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
1846 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
1850 ni->ni_flags &= ~IEEE80211_NODE_MIMO_PS;
1851 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
1854 return (oflags ^ ni->ni_flags);
1862 htcap_update_shortgi(struct ieee80211_node *ni)
1864 struct ieee80211vap *vap = ni->ni_vap;
1866 ni->ni_flags &= ~(IEEE80211_NODE_SGI20|IEEE80211_NODE_SGI40);
1867 if ((ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) &&
1869 ni->ni_flags |= IEEE80211_NODE_SGI20;
1870 if ((ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) &&
1872 ni->ni_flags |= IEEE80211_NODE_SGI40;
1880 htcap_update_ldpc(struct ieee80211_node *ni)
1882 struct ieee80211vap *vap = ni->ni_vap;
1884 if ((ni->ni_htcap & IEEE80211_HTCAP_LDPC) &&
1886 ni->ni_flags |= IEEE80211_NODE_LDPC;
1899 ieee80211_ht_updateparams(struct ieee80211_node *ni,
1902 struct ieee80211vap *vap = ni->ni_vap;
1905 ieee80211_parse_htcap(ni, htcapie);
1907 htcap_update_mimo_ps(ni);
1908 htcap_update_shortgi(ni);
1909 htcap_update_ldpc(ni);
1914 htinfo_parse(ni, htinfo);
1923 ni->ni_flags |= IEEE80211_NODE_RIFS;
1925 ni->ni_flags &= ~IEEE80211_NODE_RIFS;
1929 ieee80211_vht_get_vhtflags(struct ieee80211_node *ni, uint32_t htflags)
1931 struct ieee80211vap *vap = ni->ni_vap;
1935 if (ni->ni_flags & IEEE80211_NODE_VHT && vap->iv_vht_flags & IEEE80211_FVHT_VHT) {
1936 if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_160MHZ) &&
1946 } else if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_80P80MHZ) &&
1956 } else if ((ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_80MHZ) &&
1965 } else if (ni->ni_vht_chanwidth == IEEE80211_VHT_CHANWIDTH_USE_HT) {
2008 ieee80211_ht_updateparams_final(struct ieee80211_node *ni,
2011 struct ieee80211vap *vap = ni->ni_vap;
2024 if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_ABOVE)
2026 else if (ni->ni_ht2ndchan == IEEE80211_HTINFO_2NDCHAN_BELOW)
2035 vhtflags = ieee80211_vht_get_vhtflags(ni, htflags);
2037 if (htinfo_update_chw(ni, htflags, vhtflags))
2050 ieee80211_ht_updatehtcap(struct ieee80211_node *ni, const uint8_t *htcapie)
2052 struct ieee80211vap *vap = ni->ni_vap;
2054 ieee80211_parse_htcap(ni, htcapie);
2056 htcap_update_mimo_ps(ni);
2057 htcap_update_shortgi(ni);
2058 htcap_update_ldpc(ni);
2067 ieee80211_ht_updatehtcap_final(struct ieee80211_node *ni)
2069 struct ieee80211vap *vap = ni->ni_vap;
2077 if ((ni->ni_htcap & IEEE80211_HTCAP_CHWIDTH40) &&
2089 vhtflags = ieee80211_vht_get_vhtflags(ni, htflags);
2091 (void) htinfo_update_chw(ni, htflags, vhtflags);
2098 ieee80211_setup_htrates(struct ieee80211_node *ni, const uint8_t *ie, int flags)
2100 struct ieee80211com *ic = ni->ni_ic;
2101 struct ieee80211vap *vap = ni->ni_vap;
2117 rs = &ni->ni_htrates;
2128 IEEE80211_MSG_XRATE | IEEE80211_MSG_11N, ni,
2144 return ieee80211_fix_rate(ni, (struct ieee80211_rateset *) rs, flags);
2152 ieee80211_setup_basic_htrates(struct ieee80211_node *ni, const uint8_t *ie)
2161 rs = &ni->ni_htrates;
2163 IEEE80211_NOTE(ni->ni_vap,
2164 IEEE80211_MSG_XRATE | IEEE80211_MSG_11N, ni,
2188 struct ieee80211_node *ni = tap->txa_ni;
2189 struct ieee80211com *ic = ni->ni_ic;
2204 ic->ic_addba_stop(ni, tap);
2229 struct ieee80211_node *ni = tap->txa_ni;
2230 struct ieee80211com *ic = ni->ni_ic;
2235 ic->ic_addba_response_timeout(ni, tap);
2259 null_addba_response_timeout(struct ieee80211_node *ni,
2270 ieee80211_addba_request(struct ieee80211_node *ni,
2291 ieee80211_ampdu_tx_request_ext(struct ieee80211_node *ni, int tid)
2297 tap = &ni->ni_tx_ampdu[tid];
2314 ieee80211_ampdu_tx_request_active_ext(struct ieee80211_node *ni, int tid,
2321 tap = &ni->ni_tx_ampdu[tid];
2341 ieee80211_addba_response(struct ieee80211_node *ni,
2345 struct ieee80211vap *vap = ni->ni_vap;
2362 (ni->ni_flags & IEEE80211_NODE_AMSDU_TX) &&
2379 ieee80211_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
2397 ht_recv_action_ba_addba_request(struct ieee80211_node *ni,
2401 struct ieee80211com *ic = ni->ni_ic;
2402 struct ieee80211vap *vap = ni->ni_vap;
2416 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2426 rap = &ni->ni_rx_ampdu[tid];
2435 if ((ni->ni_flags & IEEE80211_NODE_AMPDU_RX) &&
2438 ic->ic_ampdu_rx_start(ni, rap,
2444 ni, "reject ADDBA request: %s",
2445 ni->ni_flags & IEEE80211_NODE_AMPDU_RX ?
2462 (ni->ni_flags & IEEE80211_NODE_AMSDU_RX) &&
2468 ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2474 ht_recv_action_ba_addba_response(struct ieee80211_node *ni,
2478 struct ieee80211com *ic = ni->ni_ic;
2479 struct ieee80211vap *vap = ni->ni_vap;
2499 tap = &ni->ni_tx_ampdu[tid];
2503 ni->ni_macaddr, "ADDBA response",
2512 ni->ni_macaddr, "ADDBA response",
2523 ni->ni_macaddr, "ADDBA response",
2536 ni->ni_macaddr, "ADDBA response",
2545 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2552 ic->ic_addba_response(ni, tap, code, baparamset, batimeout);
2557 ht_recv_action_ba_delba(struct ieee80211_node *ni,
2561 struct ieee80211com *ic = ni->ni_ic;
2577 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2583 tap = &ni->ni_tx_ampdu[tid];
2584 ic->ic_addba_stop(ni, tap);
2586 rap = &ni->ni_rx_ampdu[tid];
2587 ic->ic_ampdu_rx_stop(ni, rap);
2593 ht_recv_action_ht_txchwidth(struct ieee80211_node *ni,
2600 if ((ni->ni_htcap & IEEE80211_HTCAP_CHWIDTH40) == 0)
2606 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2608 chw, ni->ni_chw != chw ? "*" : "", ieee80211_ni_chw_to_str(chw));
2609 if (chw != ni->ni_chw) {
2611 ni->ni_chw = chw;
2618 ht_recv_action_ht_mimopwrsave(struct ieee80211_node *ni,
2627 ni->ni_flags |= IEEE80211_NODE_MIMO_PS;
2629 ni->ni_flags &= ~IEEE80211_NODE_MIMO_PS;
2631 ni->ni_flags |= IEEE80211_NODE_MIMO_RTS;
2633 ni->ni_flags &= ~IEEE80211_NODE_MIMO_RTS;
2635 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
2637 (ni->ni_flags & IEEE80211_NODE_MIMO_PS) ? "on" : "off",
2638 (ni->ni_flags & IEEE80211_NODE_MIMO_RTS) ? "+rts" : ""
2656 ieee80211_ampdu_enable(struct ieee80211_node *ni,
2659 struct ieee80211vap *vap = ni->ni_vap;
2674 IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni,
2687 ieee80211_ampdu_request(struct ieee80211_node *ni,
2690 struct ieee80211com *ic = ni->ni_ic;
2709 tap->txa_start = ni->ni_txseqs[tid];
2720 if ((ni->ni_flags & IEEE80211_NODE_AMSDU_TX) &&
2721 (ni->ni_vap->iv_htcaps & IEEE80211_HTC_TX_AMSDU_AMPDU))
2726 if (!ic->ic_addba_request(ni, tap, dialogtoken, args[2], args[3])) {
2728 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2729 ni, "%s: could not setup BA stream for TID %d AC %d",
2743 return ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2752 ieee80211_ampdu_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap,
2755 struct ieee80211com *ic = ni->ni_ic;
2756 struct ieee80211vap *vap = ni->ni_vap;
2763 ni, "%s: stop BA stream for TID %d (reason: %d (%s))",
2768 ic->ic_addba_stop(ni, tap);
2772 ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA,
2776 ni, "%s: BA stream for TID %d not running "
2790 struct ieee80211_node *ni = tap->txa_ni;
2795 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2796 ni, "%s: tid %u flags 0x%x attempts %d", __func__,
2804 struct ieee80211com *ic = ni->ni_ic;
2806 ni->ni_vap->iv_stats.is_ampdu_bar_tx_fail++;
2815 ic->ic_bar_response(ni, tap, 1);
2816 ieee80211_ampdu_stop(ni, tap, IEEE80211_REASON_TIMEOUT);
2818 ni->ni_vap->iv_stats.is_ampdu_bar_tx_retry++;
2819 if (ieee80211_send_bar(ni, tap, tap->txa_seqpending) != 0) {
2820 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2821 ni, "%s: failed to TX, starting timer\n",
2859 bar_tx_complete(struct ieee80211_node *ni, void *arg, int status)
2863 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2864 ni, "%s: tid %u flags 0x%x pending %d status %d",
2868 ni->ni_vap->iv_stats.is_ampdu_bar_tx++;
2872 struct ieee80211com *ic = ni->ni_ic;
2876 ic->ic_bar_response(ni, tap, status);
2882 ieee80211_bar_response(struct ieee80211_node *ni,
2891 IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N,
2892 ni, "BAR moves BA win <%u:%u> (%u frames) txseq %u tid %u",
2912 ieee80211_send_bar(struct ieee80211_node *ni,
2916 struct ieee80211vap *vap = ni->ni_vap;
2917 struct ieee80211com *ic = ni->ni_ic;
2937 ieee80211_ref_node(ni);
2953 IEEE80211_ADDR_COPY(bar->i_ra, ni->ni_macaddr);
2970 IEEE80211_NODE_STAT(ni, tx_mgmt); /* XXX tx_ctl? */
2982 ni, "send BAR: tid %u ctl 0x%x start %u (attempt %d)",
2990 ret = ieee80211_raw_output(vap, ni, m, NULL);
2994 ni, "send BAR: failed: (ret = %d)\n",
3011 ieee80211_free_node(ni);
3017 ht_action_output(struct ieee80211_node *ni, struct mbuf *m)
3023 params.ibp_rate0 = ni->ni_txparms->mgmtrate;
3025 params.ibp_try0 = ni->ni_txparms->maxretry;
3026 params.ibp_power = ni->ni_txpower;
3027 return ieee80211_mgmt_output(ni, m, IEEE80211_FC0_SUBTYPE_ACTION,
3043 ht_send_action_ba_addba(struct ieee80211_node *ni,
3046 struct ieee80211vap *vap = ni->ni_vap;
3047 struct ieee80211com *ic = ni->ni_ic;
3052 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3063 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3064 ieee80211_ref_node(ni);
3083 return ht_action_output(ni, m);
3086 ieee80211_free_node(ni);
3092 ht_send_action_ba_delba(struct ieee80211_node *ni,
3095 struct ieee80211vap *vap = ni->ni_vap;
3096 struct ieee80211com *ic = ni->ni_ic;
3105 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3111 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3112 ieee80211_ref_node(ni);
3126 return ht_action_output(ni, m);
3129 ieee80211_free_node(ni);
3135 ht_send_action_ht_txchwidth(struct ieee80211_node *ni,
3138 struct ieee80211vap *vap = ni->ni_vap;
3139 struct ieee80211com *ic = ni->ni_ic;
3143 IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, ni,
3145 IEEE80211_IS_CHAN_HT40(ni->ni_chan) ? 40 : 20);
3149 ni, ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)+1);
3150 ieee80211_ref_node(ni);
3161 *frm++ = IEEE80211_IS_CHAN_HT40(ni->ni_chan) ?
3165 return ht_action_output(ni, m);
3168 ieee80211_free_node(ni);
3224 ieee80211_add_htcap_body(uint8_t *frm, struct ieee80211_node *ni)
3231 struct ieee80211com *ic = ni->ni_ic;
3232 struct ieee80211vap *vap = ni->ni_vap;
3254 rxmax = _IEEE80211_MASKSHIFT(ni->ni_htparam,
3256 density = _IEEE80211_MASKSHIFT(ni->ni_htparam,
3286 if (ni->ni_chan != IEEE80211_CHAN_ANYC &&
3287 findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT40U) == NULL &&
3288 findhtchan(ic, ni->ni_chan, IEEE80211_CHAN_HT40D) == NULL)
3292 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))
3336 ieee80211_set_mcsset(ni->ni_ic, frm);
3357 ieee80211_add_htcap(uint8_t *frm, struct ieee80211_node *ni)
3361 return ieee80211_add_htcap_body(frm + 2, ni);
3459 ieee80211_add_htcap_vendor(uint8_t *frm, struct ieee80211_node *ni)
3467 return ieee80211_add_htcap_body(frm + 6, ni);
3497 struct ieee80211_node *ni;
3503 ni = ieee80211_ref_node(vap->iv_bss);
3504 bsschan = ni->ni_chan;
3530 ieee80211_free_node(ni);
3544 ieee80211_add_htinfo_body(uint8_t *frm, struct ieee80211_node *ni)
3546 struct ieee80211vap *vap = ni->ni_vap;
3547 struct ieee80211com *ic = ni->ni_ic;
3553 *frm++ = ieee80211_chan2ieee(ic, ni->ni_chan);
3559 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
3561 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
3565 if (IEEE80211_IS_CHAN_HT40(ni->ni_chan))
3577 ieee80211_set_basic_htrates(frm, &ni->ni_htrates);
3587 ieee80211_add_htinfo(uint8_t *frm, struct ieee80211_node *ni)
3591 return ieee80211_add_htinfo_body(frm + 2, ni);
3599 ieee80211_add_htinfo_vendor(uint8_t *frm, struct ieee80211_node *ni)
3607 return ieee80211_add_htinfo_body(frm + 6, ni);
3618 ieee80211_ht_get_node_ampdu_density(const struct ieee80211_node *ni)
3623 vap = ni->ni_vap;
3625 _IEEE80211_MASKSHIFT(ni->ni_htparam, IEEE80211_HTCAP_MPDUDENSITY);
3639 ieee80211_ht_get_node_ampdu_limit(const struct ieee80211_node *ni)
3644 vap = ni->ni_vap;
3646 _IEEE80211_MASKSHIFT(ni->ni_htparam, IEEE80211_HTCAP_MAXRXAMPDU);
3659 ieee80211_ht_check_tx_shortgi_20(const struct ieee80211_node *ni)
3664 if (! ieee80211_ht_check_tx_ht(ni))
3667 vap = ni->ni_vap;
3668 ic = ni->ni_ic;
3671 (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) &&
3683 ieee80211_ht_check_tx_shortgi_40(const struct ieee80211_node *ni)
3688 if (! ieee80211_ht_check_tx_ht40(ni))
3691 vap = ni->ni_vap;
3692 ic = ni->ni_ic;
3695 (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40) &&
3706 ieee80211_ht_check_tx_ht(const struct ieee80211_node *ni)
3711 if (ni == NULL || ni->ni_chan == IEEE80211_CHAN_ANYC ||
3712 ni->ni_vap == NULL || ni->ni_vap->iv_bss == NULL)
3715 vap = ni->ni_vap;
3721 if (IEEE80211_IS_CHAN_HT(ni->ni_chan) &&
3722 ni->ni_htrates.rs_nrates == 0)
3724 return (IEEE80211_IS_CHAN_HT(ni->ni_chan));
3734 ieee80211_ht_check_tx_ht40(const struct ieee80211_node *ni)
3739 if (! ieee80211_ht_check_tx_ht(ni))
3742 vap = ni->ni_vap;
3746 IEEE80211_IS_CHAN_HT40(ni->ni_chan) &&
3747 (ni->ni_chw == IEEE80211_STA_RX_BW_40));