Lines Matching +full:timeout +full:- +full:tap +full:- +full:ms
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
5 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
98 return (vap->iv_opmode == IEEE80211_M_IBSS); in doprint()
111 * A-MPDU state stuff, fast-frames state stuff, encapsulation
124 struct ieee80211com *ic = vap->iv_ic; in ieee80211_vap_pkt_send_dest()
125 struct ifnet *ifp = vap->iv_ifp; in ieee80211_vap_pkt_send_dest()
135 if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) && in ieee80211_vap_pkt_send_dest()
136 (m->m_flags & M_PWR_SAV) == 0) { in ieee80211_vap_pkt_send_dest()
156 ni->ni_macaddr, NULL, in ieee80211_vap_pkt_send_dest()
158 vap->iv_stats.is_tx_classify++; in ieee80211_vap_pkt_send_dest()
172 MPASS((m->m_pkthdr.csum_flags & CSUM_SND_TAG) == 0); in ieee80211_vap_pkt_send_dest()
173 m->m_pkthdr.rcvif = (void *)ni; in ieee80211_vap_pkt_send_dest()
174 mcast = (m->m_flags & (M_MCAST | M_BCAST)) ? 1: 0; in ieee80211_vap_pkt_send_dest()
179 * Figure out if we can do A-MPDU, A-MSDU or FF. in ieee80211_vap_pkt_send_dest()
181 * A-MPDU depends upon vap/node config. in ieee80211_vap_pkt_send_dest()
182 * A-MSDU depends upon vap/node config. in ieee80211_vap_pkt_send_dest()
189 do_ampdu = ((ni->ni_flags & IEEE80211_NODE_AMPDU_TX) && in ieee80211_vap_pkt_send_dest()
190 (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_TX)); in ieee80211_vap_pkt_send_dest()
192 do_amsdu = ((ni->ni_flags & IEEE80211_NODE_AMSDU_TX) && in ieee80211_vap_pkt_send_dest()
193 (vap->iv_flags_ht & IEEE80211_FHT_AMSDU_TX)); in ieee80211_vap_pkt_send_dest()
195 ((ni->ni_flags & IEEE80211_NODE_HT) == 0) && in ieee80211_vap_pkt_send_dest()
196 ((ni->ni_flags & IEEE80211_NODE_VHT) == 0) && in ieee80211_vap_pkt_send_dest()
201 * Check if A-MPDU tx aggregation is setup or if we in ieee80211_vap_pkt_send_dest()
203 * with HT and A-MPDU enabled for use. When the policy in ieee80211_vap_pkt_send_dest()
204 * routine decides we should enable A-MPDU we issue an in ieee80211_vap_pkt_send_dest()
206 * encapsulated will go out w/o using A-MPDU, or possibly in ieee80211_vap_pkt_send_dest()
212 * Don't treat group-addressed frames as candidates for aggregation; in ieee80211_vap_pkt_send_dest()
213 * net80211 doesn't support 802.11aa-2012 and so group addressed in ieee80211_vap_pkt_send_dest()
218 if ((m->m_flags & M_EAPOL) == 0 && (! mcast)) { in ieee80211_vap_pkt_send_dest()
220 struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[tid]; in ieee80211_vap_pkt_send_dest() local
222 ieee80211_txampdu_count_packet(tap); in ieee80211_vap_pkt_send_dest()
223 if (IEEE80211_AMPDU_RUNNING(tap)) { in ieee80211_vap_pkt_send_dest()
229 m->m_flags |= M_AMPDU_MPDU; in ieee80211_vap_pkt_send_dest()
230 } else if (!IEEE80211_AMPDU_REQUESTED(tap) && in ieee80211_vap_pkt_send_dest()
231 ic->ic_ampdu_enable(ni, tap)) { in ieee80211_vap_pkt_send_dest()
235 ieee80211_ampdu_request(ni, tap); in ieee80211_vap_pkt_send_dest()
239 * Now update the no-ampdu flag. A-MPDU may have been in ieee80211_vap_pkt_send_dest()
243 * This will let us know whether we should be doing A-MSDU in ieee80211_vap_pkt_send_dest()
244 * at this point. We only do A-MSDU if we're either not in ieee80211_vap_pkt_send_dest()
245 * doing A-MPDU, or A-MPDU is NACKed, or A-MPDU + A-MSDU in ieee80211_vap_pkt_send_dest()
248 * Whilst here, update the amsdu-ampdu flag. The above may in ieee80211_vap_pkt_send_dest()
249 * have also set or cleared the amsdu-in-ampdu txa_flags in ieee80211_vap_pkt_send_dest()
250 * combination so we can correctly do A-MPDU + A-MSDU. in ieee80211_vap_pkt_send_dest()
253 no_ampdu = (! IEEE80211_AMPDU_RUNNING(tap) in ieee80211_vap_pkt_send_dest()
254 || (IEEE80211_AMPDU_NACKED(tap))); in ieee80211_vap_pkt_send_dest()
255 do_ampdu_amsdu = IEEE80211_AMPDU_RUNNING_AMSDU(tap); in ieee80211_vap_pkt_send_dest()
265 * A-MSDU encapsulation for 802.3 drivers. Now, we in ieee80211_vap_pkt_send_dest()
268 * to really need to. For A-MSDU we'd have to set the in ieee80211_vap_pkt_send_dest()
269 * A-MSDU QoS bit in the wifi header, so we just plain in ieee80211_vap_pkt_send_dest()
272 if (__predict_true((vap->iv_caps & IEEE80211_C_8023ENCAP) == 0)) { in ieee80211_vap_pkt_send_dest()
298 * Grab the TX lock - serialise the TX process from this in ieee80211_vap_pkt_send_dest()
306 * so things like the FF (and later A-MSDU) path can just call in ieee80211_vap_pkt_send_dest()
309 if (__predict_true((vap->iv_caps & IEEE80211_C_8023ENCAP) == 0)) { in ieee80211_vap_pkt_send_dest()
325 * Unlock at this point - no need to hold it across in ieee80211_vap_pkt_send_dest()
329 ic->ic_lastdata = ticks; in ieee80211_vap_pkt_send_dest()
341 * does (eg CAC timeout, interface wakeup) - the caller must
348 (vap->iv_opmode == IEEE80211_M_WDS && \ in ieee80211_start_pkt()
349 (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY) == 0) in ieee80211_start_pkt()
350 struct ieee80211com *ic = vap->iv_ic; in ieee80211_start_pkt()
351 struct ifnet *ifp = vap->iv_ifp; in ieee80211_start_pkt()
358 if (ic->ic_flags & IEEE80211_F_SCAN) in ieee80211_start_pkt()
368 if (m->m_len < sizeof(struct ether_header) && in ieee80211_start_pkt()
372 vap->iv_stats.is_tx_nobuf++; /* XXX */ in ieee80211_start_pkt()
377 if (ETHER_IS_MULTICAST(eh->ether_dhost)) { in ieee80211_start_pkt()
386 eh->ether_dhost, "mcast", "%s", "on DWDS"); in ieee80211_start_pkt()
387 vap->iv_stats.is_dwds_mcast++; in ieee80211_start_pkt()
393 if (vap->iv_opmode == IEEE80211_M_HOSTAP) { in ieee80211_start_pkt()
402 if (vap->iv_opmode != IEEE80211_M_MBSS) { in ieee80211_start_pkt()
404 ni = ieee80211_find_txnode(vap, eh->ether_dhost); in ieee80211_start_pkt()
412 if (ni->ni_associd == 0 && in ieee80211_start_pkt()
413 (ni->ni_flags & IEEE80211_NODE_ASSOCID)) { in ieee80211_start_pkt()
415 eh->ether_dhost, NULL, in ieee80211_start_pkt()
417 htons(eh->ether_type)); in ieee80211_start_pkt()
418 vap->iv_stats.is_tx_notassoc++; in ieee80211_start_pkt()
427 if (!IEEE80211_ADDR_EQ(eh->ether_shost, vap->iv_myaddr)) { in ieee80211_start_pkt()
435 eh->ether_dhost, NULL, in ieee80211_start_pkt()
437 vap->iv_stats.is_mesh_notproxy++; in ieee80211_start_pkt()
445 eh->ether_shost, ":", in ieee80211_start_pkt()
446 eh->ether_dhost, ":"); in ieee80211_start_pkt()
447 ieee80211_mesh_proxy_check(vap, eh->ether_shost); in ieee80211_start_pkt()
449 ni = ieee80211_mesh_discover(vap, eh->ether_dhost, m); in ieee80211_start_pkt()
466 if (vap->iv_state == IEEE80211_S_SLEEP) { in ieee80211_start_pkt()
471 ic->ic_lastdata = ticks; in ieee80211_start_pkt()
496 struct ieee80211vap *vap = ifp->if_softc; in ieee80211_vap_transmit()
497 struct ieee80211com *ic = vap->iv_ic; in ieee80211_vap_transmit()
505 if (vap->iv_state != IEEE80211_S_RUN && in ieee80211_vap_transmit()
506 vap->iv_state != IEEE80211_S_SLEEP) { in ieee80211_vap_transmit()
508 /* re-check under the com lock to avoid races */ in ieee80211_vap_transmit()
509 if (vap->iv_state != IEEE80211_S_RUN && in ieee80211_vap_transmit()
510 vap->iv_state != IEEE80211_S_SLEEP) { in ieee80211_vap_transmit()
513 __func__, ieee80211_state_name[vap->iv_state]); in ieee80211_vap_transmit()
514 vap->iv_stats.is_tx_badstate++; in ieee80211_vap_transmit()
516 ifp->if_drv_flags |= IFF_DRV_OACTIVE; in ieee80211_vap_transmit()
527 * be set for frames that are re-submitted from the in ieee80211_vap_transmit()
533 m->m_flags &= ~(M_80211_TX - M_PWR_SAV - M_MORE_DATA); in ieee80211_vap_transmit()
563 struct ieee80211com *ic = vap->iv_ic; in ieee80211_raw_output()
567 * Set node - the caller has taken a reference, so ensure in ieee80211_raw_output()
571 MPASS((m->m_pkthdr.csum_flags & CSUM_SND_TAG) == 0); in ieee80211_raw_output()
572 m->m_pkthdr.rcvif = (void *)ni; in ieee80211_raw_output()
581 * they'll have to be added - so fail the transmit if in ieee80211_raw_output()
587 error = ic->ic_raw_xmit(ni, m, params); in ieee80211_raw_output()
589 if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS, 1); in ieee80211_raw_output()
602 if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_ack)) in ieee80211_validate_frame()
609 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in ieee80211_validate_frame()
611 if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) != in ieee80211_validate_frame()
616 (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) != 0) in ieee80211_validate_frame()
622 if ((params && (params->ibp_flags & IEEE80211_BPF_CRYPTO) != 0) || in ieee80211_validate_frame()
626 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; in ieee80211_validate_frame()
629 * See IEEE Std 802.11-2012, in ieee80211_validate_frame()
638 wh->i_fc[1] |= IEEE80211_FC1_PROTECTED; in ieee80211_validate_frame()
641 if (m->m_pkthdr.len < ieee80211_anyhdrsize(wh)) in ieee80211_validate_frame()
650 struct ieee80211com *ic = ni->ni_ic; in ieee80211_validate_rate()
653 if ((ic->ic_htcaps & IEEE80211_HTC_HT) == 0) in ieee80211_validate_rate()
658 if (rate > ic->ic_txstream * 8 - 1) in ieee80211_validate_rate()
665 if ((ic->ic_htcaps & IEEE80211_HTC_TXMCS32) == 0) in ieee80211_validate_rate()
671 if ((ic->ic_htcaps & IEEE80211_HTC_TXUNEQUAL) == 0) in ieee80211_validate_rate()
674 switch (ic->ic_txstream) { in ieee80211_validate_rate()
697 if (!ieee80211_isratevalid(ic->ic_rt, rate)) in ieee80211_validate_rate()
713 if (params->ibp_rate0 != 0) { in ieee80211_sanitize_rates()
714 error = ieee80211_validate_rate(ni, params->ibp_rate0); in ieee80211_sanitize_rates()
718 /* XXX pre-setup some default (e.g., mgmt / mcast) rate */ in ieee80211_sanitize_rates()
723 if (params->ibp_rate1 != 0 && in ieee80211_sanitize_rates()
724 (error = ieee80211_validate_rate(ni, params->ibp_rate1)) != 0) in ieee80211_sanitize_rates()
727 if (params->ibp_rate2 != 0 && in ieee80211_sanitize_rates()
728 (error = ieee80211_validate_rate(ni, params->ibp_rate2)) != 0) in ieee80211_sanitize_rates()
731 if (params->ibp_rate3 != 0 && in ieee80211_sanitize_rates()
732 (error = ieee80211_validate_rate(ni, params->ibp_rate3)) != 0) in ieee80211_sanitize_rates()
756 if (ifp->if_drv_flags & IFF_DRV_OACTIVE) { in ieee80211_output()
758 * Short-circuit requests if the vap is marked OACTIVE in ieee80211_output()
767 vap = ifp->if_softc; in ieee80211_output()
768 ic = vap->iv_ic; in ieee80211_output()
773 if (dst->sa_family != AF_IEEE80211) in ieee80211_output()
774 return vap->iv_output(ifp, m, dst, ro); in ieee80211_output()
784 if (vap->iv_state == IEEE80211_S_CAC) { in ieee80211_output()
788 vap->iv_stats.is_tx_badstate++; in ieee80211_output()
790 } else if (vap->iv_state == IEEE80211_S_SCAN) in ieee80211_output()
800 if (dst->sa_len != 0) in ieee80211_output()
801 params = (const struct ieee80211_bpf_params *)dst->sa_data; in ieee80211_output()
810 switch (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) { in ieee80211_output()
813 ni = ieee80211_find_txnode(vap, wh->i_addr1); in ieee80211_output()
817 ni = ieee80211_find_txnode(vap, wh->i_addr3); in ieee80211_output()
827 if (dst->sa_len == 0) in ieee80211_output()
829 ni = ieee80211_ref_node(vap->iv_bss); in ieee80211_output()
838 m->m_flags &= ~M_80211_TX; in ieee80211_output()
839 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_output()
848 m->m_pkthdr.len - ieee80211_hdrsize(wh)); in ieee80211_output()
857 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { in ieee80211_output()
859 m->m_flags |= M_MCAST; in ieee80211_output()
892 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_send_setup()
893 struct ieee80211_tx_ampdu *tap; in ieee80211_send_setup() local
896 IEEE80211_TX_LOCK_ASSERT(ni->ni_ic); in ieee80211_send_setup()
898 wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | type; in ieee80211_send_setup()
900 switch (vap->iv_opmode) { in ieee80211_send_setup()
902 wh->i_fc[1] = IEEE80211_FC1_DIR_TODS; in ieee80211_send_setup()
903 IEEE80211_ADDR_COPY(wh->i_addr1, bssid); in ieee80211_send_setup()
904 IEEE80211_ADDR_COPY(wh->i_addr2, sa); in ieee80211_send_setup()
905 IEEE80211_ADDR_COPY(wh->i_addr3, da); in ieee80211_send_setup()
909 wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_send_setup()
910 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
911 IEEE80211_ADDR_COPY(wh->i_addr2, sa); in ieee80211_send_setup()
912 IEEE80211_ADDR_COPY(wh->i_addr3, bssid); in ieee80211_send_setup()
915 wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; in ieee80211_send_setup()
916 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
917 IEEE80211_ADDR_COPY(wh->i_addr2, bssid); in ieee80211_send_setup()
918 IEEE80211_ADDR_COPY(wh->i_addr3, sa); in ieee80211_send_setup()
921 wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS; in ieee80211_send_setup()
922 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
923 IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); in ieee80211_send_setup()
924 IEEE80211_ADDR_COPY(wh->i_addr3, da); in ieee80211_send_setup()
925 IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, sa); in ieee80211_send_setup()
930 wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; in ieee80211_send_setup()
932 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
933 IEEE80211_ADDR_COPY(wh->i_addr2, in ieee80211_send_setup()
934 vap->iv_myaddr); in ieee80211_send_setup()
936 wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS; in ieee80211_send_setup()
937 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
938 IEEE80211_ADDR_COPY(wh->i_addr2, in ieee80211_send_setup()
939 vap->iv_myaddr); in ieee80211_send_setup()
940 IEEE80211_ADDR_COPY(wh->i_addr3, da); in ieee80211_send_setup()
941 IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, sa); in ieee80211_send_setup()
949 wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_send_setup()
950 IEEE80211_ADDR_COPY(wh->i_addr1, da); in ieee80211_send_setup()
951 IEEE80211_ADDR_COPY(wh->i_addr2, sa); in ieee80211_send_setup()
953 if (vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_send_setup()
954 IEEE80211_ADDR_COPY(wh->i_addr3, sa); in ieee80211_send_setup()
957 IEEE80211_ADDR_COPY(wh->i_addr3, bssid); in ieee80211_send_setup()
959 *(uint16_t *)&wh->i_dur[0] = 0; in ieee80211_send_setup()
964 * need to be in lock-step with what the driver is doing in ieee80211_send_setup()
971 tap = &ni->ni_tx_ampdu[tid]; in ieee80211_send_setup()
972 if (tid != IEEE80211_NONQOS_TID && IEEE80211_AMPDU_RUNNING(tap)) { in ieee80211_send_setup()
973 m->m_flags |= M_AMPDU_MPDU; in ieee80211_send_setup()
976 *(uint16_t *)&wh->i_seq[0] = 0; in ieee80211_send_setup()
977 } else if (!IEEE80211_CONF_SEQNO_OFFLOAD(ni->ni_ic)) in ieee80211_send_setup()
980 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) in ieee80211_send_setup()
981 m->m_flags |= M_MCAST; in ieee80211_send_setup()
997 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_mgmt_output()
998 struct ieee80211com *ic = ni->ni_ic; in ieee80211_mgmt_output()
1004 if (vap->iv_state == IEEE80211_S_CAC) { in ieee80211_mgmt_output()
1008 vap->iv_stats.is_tx_badstate++; in ieee80211_mgmt_output()
1025 vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); in ieee80211_mgmt_output()
1026 if (params->ibp_flags & IEEE80211_BPF_CRYPTO) { in ieee80211_mgmt_output()
1027 IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_AUTH, wh->i_addr1, in ieee80211_mgmt_output()
1029 wh->i_fc[1] |= IEEE80211_FC1_PROTECTED; in ieee80211_mgmt_output()
1031 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_mgmt_output()
1034 M_WME_SETAC(m, params->ibp_pri); in ieee80211_mgmt_output()
1041 ether_sprintf(wh->i_addr1), in ieee80211_mgmt_output()
1043 ieee80211_chan2ieee(ic, ic->ic_curchan)); in ieee80211_mgmt_output()
1057 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_nulldata_transmitted()
1065 * If this is a WDS station then a 4-address frame is constructed.
1077 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_send_nulldata()
1078 struct ieee80211com *ic = ni->ni_ic; in ieee80211_send_nulldata()
1086 if ((ic->ic_flags_ext & IEEE80211_FEXT_NO_NULLDATA) != 0) { in ieee80211_send_nulldata()
1091 if (vap->iv_state == IEEE80211_S_CAC) { in ieee80211_send_nulldata()
1095 vap->iv_stats.is_tx_badstate++; in ieee80211_send_nulldata()
1099 if (ni->ni_flags & (IEEE80211_NODE_QOS|IEEE80211_NODE_HT)) in ieee80211_send_nulldata()
1103 /* NB: only WDS vap's get 4-address frames */ in ieee80211_send_nulldata()
1104 if (vap->iv_opmode == IEEE80211_M_WDS) in ieee80211_send_nulldata()
1106 if (ic->ic_flags & IEEE80211_F_DATAPAD) in ieee80211_send_nulldata()
1109 m = ieee80211_getmgtframe(&frm, ic->ic_headroom + hdrlen, 0); in ieee80211_send_nulldata()
1113 vap->iv_stats.is_tx_nobuf++; in ieee80211_send_nulldata()
1128 if (ni->ni_flags & IEEE80211_NODE_QOS) { in ieee80211_send_nulldata()
1134 tid, vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); in ieee80211_send_nulldata()
1136 if (vap->iv_opmode == IEEE80211_M_WDS) in ieee80211_send_nulldata()
1137 qos = ((struct ieee80211_qosframe_addr4 *) wh)->i_qos; in ieee80211_send_nulldata()
1139 qos = ((struct ieee80211_qosframe *) wh)->i_qos; in ieee80211_send_nulldata()
1141 if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[WME_AC_BE].wmep_noackPolicy) in ieee80211_send_nulldata()
1148 vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); in ieee80211_send_nulldata()
1150 if (vap->iv_opmode != IEEE80211_M_WDS) { in ieee80211_send_nulldata()
1152 if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) && in ieee80211_send_nulldata()
1153 vap->iv_opmode != IEEE80211_M_HOSTAP) in ieee80211_send_nulldata()
1154 wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT; in ieee80211_send_nulldata()
1156 if ((ic->ic_flags & IEEE80211_F_SCAN) && in ieee80211_send_nulldata()
1157 (ni->ni_flags & IEEE80211_NODE_PWR_MGT)) { in ieee80211_send_nulldata()
1161 m->m_len = m->m_pkthdr.len = hdrlen; in ieee80211_send_nulldata()
1162 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_send_nulldata()
1170 ni->ni_flags & IEEE80211_NODE_QOS ? "QoS " : "", in ieee80211_send_nulldata()
1171 ieee80211_chan2ieee(ic, ic->ic_curchan), in ieee80211_send_nulldata()
1172 wh->i_fc[1] & IEEE80211_FC1_PWR_MGT ? "ena" : "dis"); in ieee80211_send_nulldata()
1192 if (__predict_false(m->m_flags & M_ENCAP)) { in ieee80211_classify()
1197 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; in ieee80211_classify()
1204 if (m->m_pkthdr.len < hdrlen + sizeof(*llc)) in ieee80211_classify()
1208 if (llc->llc_dsap != LLC_SNAP_LSAP || in ieee80211_classify()
1209 llc->llc_ssap != LLC_SNAP_LSAP || in ieee80211_classify()
1210 llc->llc_control != LLC_UI || in ieee80211_classify()
1211 llc->llc_snap.org_code[0] != 0 || in ieee80211_classify()
1212 llc->llc_snap.org_code[1] != 0 || in ieee80211_classify()
1213 llc->llc_snap.org_code[2] != 0) in ieee80211_classify()
1216 ether_type = llc->llc_snap.ether_type; in ieee80211_classify()
1219 ether_type = eh->ether_type; in ieee80211_classify()
1227 m->m_flags |= M_EAPOL; in ieee80211_classify()
1232 * Non-qos traffic goes to BE. in ieee80211_classify()
1234 if ((ni->ni_flags & IEEE80211_NODE_QOS) == 0) { in ieee80211_classify()
1244 if (ni->ni_vlan != 0) { in ieee80211_classify()
1245 if ((m->m_flags & M_VLANTAG) == 0) { in ieee80211_classify()
1249 if (EVL_VLANOFTAG(m->m_pkthdr.ether_vtag) != in ieee80211_classify()
1250 EVL_VLANOFTAG(ni->ni_vlan)) { in ieee80211_classify()
1255 v_wme_ac = TID_TO_WME_AC(EVL_PRIOFTAG(ni->ni_vlan)); in ieee80211_classify()
1262 switch (ntohs(eh->ether_type)) { in ieee80211_classify()
1312 if (ni->ni_vap->iv_opmode == IEEE80211_M_STA) { in ieee80211_classify()
1319 struct ieee80211com *ic = ni->ni_ic; in ieee80211_classify()
1322 ic->ic_wme.wme_wmeBssChanParams.cap_wmeParams[ac].wmep_acm) in ieee80211_classify()
1340 #define TO_BE_RECLAIMED (sizeof(struct ether_header) - sizeof(struct llc)) in ieee80211_mbuf_adjust()
1341 int needed_space = vap->iv_ic->ic_headroom + hdrsize; in ieee80211_mbuf_adjust()
1345 needed_space += key->wk_cipher->ic_header; in ieee80211_mbuf_adjust()
1353 if (key->wk_flags & (IEEE80211_KEY_SWENCRYPT|IEEE80211_KEY_SWENMIC)) { in ieee80211_mbuf_adjust()
1358 vap->iv_stats.is_tx_nobuf++; /* XXX new stat */ in ieee80211_mbuf_adjust()
1367 * sizeof(struct ether_header) - sizeof(struct llc) in ieee80211_mbuf_adjust()
1372 if (M_LEADINGSPACE(m) < needed_space - TO_BE_RECLAIMED) { in ieee80211_mbuf_adjust()
1373 struct mbuf *n = m_gethdr(IEEE80211_M_NOWAIT, m->m_type); in ieee80211_mbuf_adjust()
1377 vap->iv_stats.is_tx_nobuf++; in ieee80211_mbuf_adjust()
1391 n->m_len = 0; /* NB: m_gethdr does not set */ in ieee80211_mbuf_adjust()
1392 n->m_data += needed_space; in ieee80211_mbuf_adjust()
1400 n->m_len += sizeof(struct ether_header); in ieee80211_mbuf_adjust()
1401 m->m_len -= sizeof(struct ether_header); in ieee80211_mbuf_adjust()
1402 m->m_data += sizeof(struct ether_header); in ieee80211_mbuf_adjust()
1406 n->m_next = m; in ieee80211_mbuf_adjust()
1422 if (IEEE80211_KEY_UNDEFINED(&ni->ni_ucastkey)) { in ieee80211_crypto_getucastkey()
1423 if (vap->iv_def_txkey == IEEE80211_KEYIX_NONE || in ieee80211_crypto_getucastkey()
1424 IEEE80211_KEY_UNDEFINED(&vap->iv_nw_keys[vap->iv_def_txkey])) in ieee80211_crypto_getucastkey()
1426 return &vap->iv_nw_keys[vap->iv_def_txkey]; in ieee80211_crypto_getucastkey()
1428 return &ni->ni_ucastkey; in ieee80211_crypto_getucastkey()
1441 if (vap->iv_def_txkey == IEEE80211_KEYIX_NONE || in ieee80211_crypto_getmcastkey()
1442 IEEE80211_KEY_UNDEFINED(&vap->iv_nw_keys[vap->iv_def_txkey])) in ieee80211_crypto_getmcastkey()
1444 return &vap->iv_nw_keys[vap->iv_def_txkey]; in ieee80211_crypto_getmcastkey()
1462 struct ieee80211com *ic = ni->ni_ic; in ieee80211_encap()
1464 struct ieee80211_mesh_state *ms = vap->iv_mesh; in ieee80211_encap() local
1467 int dir = -1; in ieee80211_encap()
1480 is_mcast = !! (m->m_flags & (M_MCAST | M_BCAST)); in ieee80211_encap()
1487 KASSERT(m->m_len >= sizeof(eh), ("no ethernet header!")); in ieee80211_encap()
1502 if (vap->iv_flags & IEEE80211_F_PRIVACY) { in ieee80211_encap()
1503 if (vap->iv_opmode == IEEE80211_M_STA || in ieee80211_encap()
1505 (vap->iv_opmode == IEEE80211_M_WDS && in ieee80211_encap()
1506 (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY))) { in ieee80211_encap()
1508 } else if ((vap->iv_opmode == IEEE80211_M_WDS) && in ieee80211_encap()
1509 (! (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY))) { in ieee80211_encap()
1520 * AP VAP, the dynamically created per-STA WDS node) in ieee80211_encap()
1527 if (key == NULL && (m->m_flags & M_EAPOL) == 0) { in ieee80211_encap()
1531 __func__, vap->iv_def_txkey); in ieee80211_encap()
1532 vap->iv_stats.is_tx_nodefkey++; in ieee80211_encap()
1538 * XXX Some ap's don't handle QoS-encapsulated EAPOL in ieee80211_encap()
1540 * ap's require all data frames to be QoS-encapsulated in ieee80211_encap()
1551 (((is_mcast == 0) && (ni->ni_flags & in ieee80211_encap()
1553 (vap->iv_opmode == IEEE80211_M_MBSS)) && in ieee80211_encap()
1554 (m->m_flags & M_EAPOL) == 0; in ieee80211_encap()
1561 if (vap->iv_opmode == IEEE80211_M_MBSS) { in ieee80211_encap()
1566 * at the local sta are sent w/ 3-address format and in ieee80211_encap()
1569 * at the local sta are sent w/ 4-address format and in ieee80211_encap()
1571 * o Group Addressed data forwarded from a non-mesh sta are in ieee80211_encap()
1572 * sent w/ 3-address format and address extension mode 01 in ieee80211_encap()
1574 * w/ 4-address format and address extension mode 10 in ieee80211_encap()
1582 if (rt->rt_flags & IEEE80211_MESHRT_FLAGS_PROXY) { in ieee80211_encap()
1583 if (IEEE80211_ADDR_EQ(rt->rt_mesh_gate, in ieee80211_encap()
1584 vap->iv_myaddr)) { in ieee80211_encap()
1601 if (!IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)) { in ieee80211_encap()
1615 * 4-address frames need to be generated for: in ieee80211_encap()
1620 is4addr = vap->iv_opmode == IEEE80211_M_WDS || in ieee80211_encap()
1621 ((vap->iv_flags_ext & IEEE80211_FEXT_4ADDR) && in ieee80211_encap()
1622 !IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)); in ieee80211_encap()
1632 if (ic->ic_flags & IEEE80211_F_DATAPAD) in ieee80211_encap()
1637 if (__predict_true((m->m_flags & M_FF) == 0)) { in ieee80211_encap()
1647 m_adj(m, sizeof(struct ether_header) - sizeof(struct llc)); in ieee80211_encap()
1649 llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP; in ieee80211_encap()
1650 llc->llc_control = LLC_UI; in ieee80211_encap()
1651 llc->llc_snap.org_code[0] = 0; in ieee80211_encap()
1652 llc->llc_snap.org_code[1] = 0; in ieee80211_encap()
1653 llc->llc_snap.org_code[2] = 0; in ieee80211_encap()
1654 llc->llc_snap.ether_type = eh.ether_type; in ieee80211_encap()
1675 datalen = m->m_pkthdr.len; /* NB: w/o 802.11 header */ in ieee80211_encap()
1679 vap->iv_stats.is_tx_nobuf++; in ieee80211_encap()
1683 wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA; in ieee80211_encap()
1684 *(uint16_t *)wh->i_dur = 0; in ieee80211_encap()
1687 wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS; in ieee80211_encap()
1688 IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_macaddr); in ieee80211_encap()
1689 IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); in ieee80211_encap()
1690 IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_dhost); in ieee80211_encap()
1691 IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, eh.ether_shost); in ieee80211_encap()
1692 } else switch (vap->iv_opmode) { in ieee80211_encap()
1694 wh->i_fc[1] = IEEE80211_FC1_DIR_TODS; in ieee80211_encap()
1695 IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_bssid); in ieee80211_encap()
1696 IEEE80211_ADDR_COPY(wh->i_addr2, eh.ether_shost); in ieee80211_encap()
1697 IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_dhost); in ieee80211_encap()
1701 wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_encap()
1702 IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost); in ieee80211_encap()
1703 IEEE80211_ADDR_COPY(wh->i_addr2, eh.ether_shost); in ieee80211_encap()
1708 IEEE80211_ADDR_COPY(wh->i_addr3, vap->iv_bss->ni_bssid); in ieee80211_encap()
1711 wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; in ieee80211_encap()
1712 IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost); in ieee80211_encap()
1713 IEEE80211_ADDR_COPY(wh->i_addr2, ni->ni_bssid); in ieee80211_encap()
1714 IEEE80211_ADDR_COPY(wh->i_addr3, eh.ether_shost); in ieee80211_encap()
1721 wh->i_fc[1] = dir; in ieee80211_encap()
1724 mc->mc_flags = 0; in ieee80211_encap()
1726 IEEE80211_ADDR_COPY(wh->i_addr1, in ieee80211_encap()
1727 ni->ni_macaddr); in ieee80211_encap()
1728 IEEE80211_ADDR_COPY(wh->i_addr2, in ieee80211_encap()
1729 vap->iv_myaddr); in ieee80211_encap()
1730 IEEE80211_ADDR_COPY(wh->i_addr3, in ieee80211_encap()
1732 IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, in ieee80211_encap()
1735 wh)->i_qos; in ieee80211_encap()
1738 IEEE80211_ADDR_COPY(wh->i_addr1, in ieee80211_encap()
1740 IEEE80211_ADDR_COPY(wh->i_addr2, in ieee80211_encap()
1741 vap->iv_myaddr); in ieee80211_encap()
1742 IEEE80211_ADDR_COPY(wh->i_addr3, in ieee80211_encap()
1745 wh)->i_qos; in ieee80211_encap()
1749 wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS; in ieee80211_encap()
1750 IEEE80211_ADDR_COPY(wh->i_addr1, eh.ether_dhost); in ieee80211_encap()
1751 IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); in ieee80211_encap()
1752 IEEE80211_ADDR_COPY(wh->i_addr3, vap->iv_myaddr); in ieee80211_encap()
1753 mc->mc_flags = 1; in ieee80211_encap()
1754 IEEE80211_ADDR_COPY(MC01(mc)->mc_addr4, in ieee80211_encap()
1756 qos = ((struct ieee80211_qosframe *) wh)->i_qos; in ieee80211_encap()
1760 IEEE80211_ADDR_COPY(wh->i_addr1, rt->rt_nexthop); in ieee80211_encap()
1761 IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); in ieee80211_encap()
1762 IEEE80211_ADDR_COPY(wh->i_addr3, rt->rt_mesh_gate); in ieee80211_encap()
1763 IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, vap->iv_myaddr); in ieee80211_encap()
1764 mc->mc_flags = IEEE80211_MESH_AE_10; in ieee80211_encap()
1765 IEEE80211_ADDR_COPY(mc->mc_addr5, eh.ether_dhost); in ieee80211_encap()
1766 IEEE80211_ADDR_COPY(mc->mc_addr6, eh.ether_shost); in ieee80211_encap()
1767 qos = ((struct ieee80211_qosframe_addr4 *) wh)->i_qos; in ieee80211_encap()
1773 mc->mc_ttl = ms->ms_ttl; in ieee80211_encap()
1774 ms->ms_seq++; in ieee80211_encap()
1775 le32enc(mc->mc_seq, ms->ms_seq); in ieee80211_encap()
1782 if (m->m_flags & M_MORE_DATA) in ieee80211_encap()
1783 wh->i_fc[1] |= IEEE80211_FC1_MORE_DATA; in ieee80211_encap()
1788 qos = ((struct ieee80211_qosframe_addr4 *) wh)->i_qos; in ieee80211_encap()
1790 } else if (vap->iv_opmode != IEEE80211_M_MBSS) in ieee80211_encap()
1791 qos = ((struct ieee80211_qosframe *) wh)->i_qos; in ieee80211_encap()
1796 if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[ac].wmep_noackPolicy) in ieee80211_encap()
1799 if (vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_encap()
1804 wh->i_fc[0] |= IEEE80211_FC0_SUBTYPE_QOS_DATA; in ieee80211_encap()
1807 * If this is an A-MSDU then ensure we set the in ieee80211_encap()
1818 if ((m->m_flags & M_AMPDU_MPDU) == 0) { in ieee80211_encap()
1835 *(uint16_t *)wh->i_seq = 0; in ieee80211_encap()
1843 * be forced to be non-QoS traffic to be A-MSDU encapsulated. in ieee80211_encap()
1859 * 802.11-2016 10.2.7 (Fragmentation/defragmentation overview) in ieee80211_encap()
1864 txfrag = (m->m_pkthdr.len > vap->iv_fragthreshold && in ieee80211_encap()
1865 !IEEE80211_IS_MULTICAST(wh->i_addr1) && in ieee80211_encap()
1866 (vap->iv_caps & IEEE80211_C_TXFRAG) && in ieee80211_encap()
1867 (m->m_flags & (M_FF | M_AMPDU_MPDU)) == 0); in ieee80211_encap()
1874 if ((m->m_flags & M_EAPOL) == 0 || in ieee80211_encap()
1875 ((vap->iv_flags & IEEE80211_F_WPA) && in ieee80211_encap()
1876 (vap->iv_opmode == IEEE80211_M_STA ? in ieee80211_encap()
1878 !IEEE80211_KEY_UNDEFINED(&ni->ni_ucastkey)))) { in ieee80211_encap()
1879 wh->i_fc[1] |= IEEE80211_FC1_PROTECTED; in ieee80211_encap()
1884 vap->iv_stats.is_crypto_enmicfail++; in ieee80211_encap()
1890 key != NULL ? key->wk_cipher->ic_header : 0, vap->iv_fragthreshold)) in ieee80211_encap()
1893 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_encap()
1896 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { in ieee80211_encap()
1898 m->m_flags |= M_MCAST; in ieee80211_encap()
1930 next = m->m_nextpkt; in ieee80211_free_mbuf()
1931 m->m_nextpkt = NULL; in ieee80211_free_mbuf()
1939 * This implements the fragmentation part of 802.11-2016 10.2.7
1949 * the list - the caller is assumed to have taken a node
1975 struct ieee80211com *ic = vap->iv_ic; in ieee80211_fragment()
1981 KASSERT(m0->m_nextpkt == NULL, ("mbuf already chained?")); in ieee80211_fragment()
1982 KASSERT(m0->m_pkthdr.len > mtu, in ieee80211_fragment()
1983 ("pktlen %u mtu %u", m0->m_pkthdr.len, mtu)); in ieee80211_fragment()
1988 if (ic->ic_flags & IEEE80211_F_DATAPAD) in ieee80211_fragment()
1995 wh->i_fc[1] |= IEEE80211_FC1_MORE_FRAG; in ieee80211_fragment()
1998 off = mtu - ciphdrsize; in ieee80211_fragment()
1999 remainder = m0->m_pkthdr.len - off; in ieee80211_fragment()
2007 m_align(m, fragsize - ciphdrsize); in ieee80211_fragment()
2019 if (vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_fragment()
2022 *(uint16_t *)&whf->i_seq[0] |= htole16( in ieee80211_fragment()
2027 payload = fragsize - totalhdrsize; in ieee80211_fragment()
2031 m->m_len = hdrspace + payload; in ieee80211_fragment()
2032 m->m_pkthdr.len = hdrspace + payload; in ieee80211_fragment()
2033 m->m_flags |= M_FRAG; in ieee80211_fragment()
2036 prev->m_nextpkt = m; in ieee80211_fragment()
2040 remainder -= payload; in ieee80211_fragment()
2045 m->m_flags |= M_LASTFRAG; in ieee80211_fragment()
2046 whf->i_fc[1] &= ~IEEE80211_FC1_MORE_FRAG; in ieee80211_fragment()
2049 m_adj(m0, -(m0->m_pkthdr.len - (mtu - ciphdrsize))); in ieee80211_fragment()
2050 m0->m_flags |= M_FIRSTFRAG | M_FRAG; in ieee80211_fragment()
2052 vap->iv_stats.is_tx_fragframes++; in ieee80211_fragment()
2053 vap->iv_stats.is_tx_frags += fragno-1; in ieee80211_fragment()
2058 ieee80211_free_mbuf(m0->m_nextpkt); in ieee80211_fragment()
2059 m0->m_nextpkt = NULL; in ieee80211_fragment()
2072 nrates = rs->rs_nrates; in ieee80211_add_rates()
2076 memcpy(frm, rs->rs_rates, nrates); in ieee80211_add_rates()
2089 if (rs->rs_nrates > IEEE80211_RATE_SIZE) { in ieee80211_add_xrates()
2090 int nrates = rs->rs_nrates - IEEE80211_RATE_SIZE; in ieee80211_add_xrates()
2093 memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates); in ieee80211_add_xrates()
2117 struct ieee80211com *ic = vap->iv_ic; in ieee80211_add_erp()
2126 * the per-VAP flags are fine for per-VAP, but don't in ieee80211_add_erp()
2135 if (ic->ic_flags_ext & IEEE80211_FEXT_NONERP_PR) in ieee80211_add_erp()
2141 * of per-VAP and channels. in ieee80211_add_erp()
2143 if (ic->ic_flags & IEEE80211_F_USEPROT) in ieee80211_add_erp()
2145 if (ic->ic_flags & IEEE80211_F_USEBARKER) in ieee80211_add_erp()
2174 memcpy(frm, ie->ie_data, ie->ie_len); in add_appie()
2175 return frm + ie->ie_len; in add_appie()
2194 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_add_wme_info()
2197 *frm++ = sizeof(struct ieee80211_wme_info) - 2; in ieee80211_add_wme_info()
2204 switch (vap->iv_opmode) { in ieee80211_add_wme_info()
2206 *frm = wme->wme_bssChanParams.cap_info; in ieee80211_add_wme_info()
2207 if (vap->iv_flags_ext & IEEE80211_FEXT_UAPSD) in ieee80211_add_wme_info()
2216 *frm++ = vap->iv_uapsdinfo; in ieee80211_add_wme_info()
2240 .wme_len = sizeof(struct ieee80211_wme_param) - 2, in ieee80211_add_wme_param()
2250 *frm = wme->wme_bssChanParams.cap_info; /* AC info */ in ieee80211_add_wme_param()
2255 /* XXX TODO - U-APSD bits - SP, flags below */ in ieee80211_add_wme_param()
2258 &wme->wme_bssChanParams.cap_wmeParams[i]; in ieee80211_add_wme_param()
2260 | _IEEE80211_SHIFTMASK(ac->wmep_acm, WME_PARAM_ACM) in ieee80211_add_wme_param()
2261 | _IEEE80211_SHIFTMASK(ac->wmep_aifsn, WME_PARAM_AIFSN) in ieee80211_add_wme_param()
2263 *frm++ = _IEEE80211_SHIFTMASK(ac->wmep_logcwmax, in ieee80211_add_wme_param()
2265 | _IEEE80211_SHIFTMASK(ac->wmep_logcwmin, in ieee80211_add_wme_param()
2268 ADDSHORT(frm, ac->wmep_txopLimit); in ieee80211_add_wme_param()
2281 const struct ieee80211_channel *c = vap->iv_bss->ni_chan; in ieee80211_add_powerconstraint()
2282 /* XXX per-vap tx power limit? */ in ieee80211_add_powerconstraint()
2283 int8_t limit = vap->iv_ic->ic_txpowlimit / 2; in ieee80211_add_powerconstraint()
2287 frm[2] = c->ic_maxregpower > limit ? c->ic_maxregpower - limit : 0; in ieee80211_add_powerconstraint()
2299 frm[2] = c->ic_minpower; in ieee80211_add_powercapability()
2300 frm[3] = c->ic_maxpower; in ieee80211_add_powercapability()
2315 memcpy(frm+2, ic->ic_chan_avail, ielen); in ieee80211_add_supportedchannels()
2327 quiet->quiet_ie = IEEE80211_ELEMID_QUIET; in ieee80211_add_quiet()
2328 quiet->len = 6; in ieee80211_add_quiet()
2331 * Only update every beacon interval - otherwise probe responses in ieee80211_add_quiet()
2335 if (vap->iv_quiet_count_value == 1) in ieee80211_add_quiet()
2336 vap->iv_quiet_count_value = vap->iv_quiet_count; in ieee80211_add_quiet()
2337 else if (vap->iv_quiet_count_value > 1) in ieee80211_add_quiet()
2338 vap->iv_quiet_count_value--; in ieee80211_add_quiet()
2341 if (vap->iv_quiet_count_value == 0) { in ieee80211_add_quiet()
2343 vap->iv_quiet_count_value = 1; in ieee80211_add_quiet()
2346 quiet->tbttcount = vap->iv_quiet_count_value; in ieee80211_add_quiet()
2347 quiet->period = vap->iv_quiet_period; in ieee80211_add_quiet()
2348 quiet->duration = htole16(vap->iv_quiet_duration); in ieee80211_add_quiet()
2349 quiet->offset = htole16(vap->iv_quiet_offset); in ieee80211_add_quiet()
2355 * Note that we use the per-vap CSA count to adjust the global
2362 struct ieee80211com *ic = vap->iv_ic; in ieee80211_add_csa()
2365 csa->csa_ie = IEEE80211_ELEMID_CSA; in ieee80211_add_csa()
2366 csa->csa_len = 3; in ieee80211_add_csa()
2367 csa->csa_mode = 1; /* XXX force quiet on channel */ in ieee80211_add_csa()
2368 csa->csa_newchan = ieee80211_chan2ieee(ic, ic->ic_csa_newchan); in ieee80211_add_csa()
2369 csa->csa_count = ic->ic_csa_count - vap->iv_csa_count; in ieee80211_add_csa()
2380 if (ic->ic_countryie == NULL || in ieee80211_add_countryie()
2381 ic->ic_countryie_chan != ic->ic_bsschan) { in ieee80211_add_countryie()
2385 * re-calculation. in ieee80211_add_countryie()
2387 if (ic->ic_countryie != NULL) in ieee80211_add_countryie()
2388 IEEE80211_FREE(ic->ic_countryie, M_80211_NODE_IE); in ieee80211_add_countryie()
2389 ic->ic_countryie = ieee80211_alloc_countryie(ic); in ieee80211_add_countryie()
2390 if (ic->ic_countryie == NULL) in ieee80211_add_countryie()
2392 ic->ic_countryie_chan = ic->ic_bsschan; in ieee80211_add_countryie()
2394 return add_appie(frm, ic->ic_countryie); in ieee80211_add_countryie()
2400 if (vap->iv_flags & IEEE80211_F_WPA1 && vap->iv_wpa_ie != NULL) in ieee80211_add_wpa()
2401 return (add_ie(frm, vap->iv_wpa_ie)); in ieee80211_add_wpa()
2411 if (vap->iv_flags & IEEE80211_F_WPA2 && vap->iv_rsn_ie != NULL) in ieee80211_add_rsn()
2412 return (add_ie(frm, vap->iv_rsn_ie)); in ieee80211_add_rsn()
2422 if (ni->ni_flags & IEEE80211_NODE_QOS) { in ieee80211_add_qos()
2441 rs = ieee80211_get_suprates(ic, ic->ic_curchan); in ieee80211_probereq_ie_len()
2451 * [tlv] user-specified ie's in ieee80211_probereq_ie_len()
2455 + ((rs->rs_nrates > IEEE80211_RATE_SIZE) ? in ieee80211_probereq_ie_len()
2456 2 + (rs->rs_nrates - IEEE80211_RATE_SIZE) : 0) in ieee80211_probereq_ie_len()
2457 + (((vap->iv_opmode == IEEE80211_M_IBSS) && in ieee80211_probereq_ie_len()
2458 (vap->iv_flags_ht & IEEE80211_FHT_HT)) ? in ieee80211_probereq_ie_len()
2464 + ((vap->iv_flags & IEEE80211_F_WPA1 && vap->iv_wpa_ie != NULL) ? in ieee80211_probereq_ie_len()
2465 vap->iv_wpa_ie[1] : 0) in ieee80211_probereq_ie_len()
2466 + (vap->iv_appie_probereq != NULL ? in ieee80211_probereq_ie_len()
2467 vap->iv_appie_probereq->ie_len : 0) in ieee80211_probereq_ie_len()
2488 if (ssidlen == -1) in ieee80211_probereq_ie()
2489 len -= (2 + IEEE80211_NWID_LEN); in ieee80211_probereq_ie()
2499 if (ssidlen != -1) in ieee80211_probereq_ie()
2501 rs = ieee80211_get_suprates(ic, ic->ic_curchan); in ieee80211_probereq_ie()
2512 if ((vap->iv_opmode == IEEE80211_M_IBSS) && in ieee80211_probereq_ie()
2513 (vap->iv_flags_ht & IEEE80211_FHT_HT)) { in ieee80211_probereq_ie()
2520 c = ieee80211_ht_adjust_channel(ic, ic->ic_curchan, in ieee80211_probereq_ie()
2521 vap->iv_flags_ht); in ieee80211_probereq_ie()
2530 if (vap->iv_vht_flags & IEEE80211_FVHT_VHT) { in ieee80211_probereq_ie()
2533 c = ieee80211_ht_adjust_channel(ic, ic->ic_curchan, in ieee80211_probereq_ie()
2534 vap->iv_flags_ht); in ieee80211_probereq_ie()
2535 c = ieee80211_vht_adjust_channel(ic, c, vap->iv_vht_flags); in ieee80211_probereq_ie()
2541 if (vap->iv_appie_probereq != NULL) in ieee80211_probereq_ie()
2542 frm = add_appie(frm, vap->iv_appie_probereq); in ieee80211_probereq_ie()
2559 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_send_probereq()
2560 struct ieee80211com *ic = ni->ni_ic; in ieee80211_send_probereq()
2569 bss = ieee80211_ref_node(vap->iv_bss); in ieee80211_send_probereq()
2571 if (vap->iv_state == IEEE80211_S_CAC) { in ieee80211_send_probereq()
2574 vap->iv_stats.is_tx_badstate++; in ieee80211_send_probereq()
2587 ni, ether_sprintf(ni->ni_macaddr), in ieee80211_send_probereq()
2594 ic->ic_headroom + sizeof(struct ieee80211_frame), frmlen); in ieee80211_send_probereq()
2596 vap->iv_stats.is_tx_nobuf++; in ieee80211_send_probereq()
2607 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); in ieee80211_send_probereq()
2623 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_send_probereq()
2632 ieee80211_chan2ieee(ic, ic->ic_curchan), in ieee80211_send_probereq()
2640 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; in ieee80211_send_probereq()
2641 params.ibp_rate0 = tp->mgmtrate; in ieee80211_send_probereq()
2646 params.ibp_try0 = tp->maxretry; in ieee80211_send_probereq()
2647 params.ibp_power = ni->ni_txpower; in ieee80211_send_probereq()
2658 * frames for non-DMG STAs. DMG STAs are not supported.
2660 * See 802.11-2020 9.4.1.4 (Capability Information Field) for the
2668 KASSERT(vap->iv_opmode != IEEE80211_M_STA, ("station mode")); in ieee80211_getcapinfo()
2670 if (vap->iv_opmode == IEEE80211_M_HOSTAP) in ieee80211_getcapinfo()
2672 else if (vap->iv_opmode == IEEE80211_M_IBSS) in ieee80211_getcapinfo()
2676 if (vap->iv_flags & IEEE80211_F_PRIVACY) in ieee80211_getcapinfo()
2678 if ((vap->iv_flags & IEEE80211_F_SHPREAMBLE) && in ieee80211_getcapinfo()
2681 if (vap->iv_flags & IEEE80211_F_SHSLOT) in ieee80211_getcapinfo()
2683 if (IEEE80211_IS_CHAN_5GHZ(chan) && (vap->iv_flags & IEEE80211_F_DOTH)) in ieee80211_getcapinfo()
2697 #define senderr(_x, _v) do { vap->iv_stats._v++; ret = _x; goto bad; } while (0) in ieee80211_send_mgmt()
2698 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_send_mgmt()
2699 struct ieee80211com *ic = ni->ni_ic; in ieee80211_send_mgmt()
2700 struct ieee80211_node *bss = vap->iv_bss; in ieee80211_send_mgmt()
2717 ni, ether_sprintf(ni->ni_macaddr), in ieee80211_send_mgmt()
2728 ni->ni_challenge != NULL); in ieee80211_send_mgmt()
2740 bss->ni_authmode == IEEE80211_AUTH_SHARED); in ieee80211_send_mgmt()
2743 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_send_mgmt()
2760 memcpy(&((uint16_t *)frm)[4], ni->ni_challenge, in ieee80211_send_mgmt()
2762 m->m_pkthdr.len = m->m_len = in ieee80211_send_mgmt()
2771 m->m_pkthdr.len = m->m_len = 3 * sizeof(uint16_t); in ieee80211_send_mgmt()
2779 if (vap->iv_opmode == IEEE80211_M_STA) in ieee80211_send_mgmt()
2781 (void *) vap->iv_state); in ieee80211_send_mgmt()
2789 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_send_mgmt()
2794 m->m_pkthdr.len = m->m_len = sizeof(uint16_t); in ieee80211_send_mgmt()
2822 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_send_mgmt()
2828 + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) in ieee80211_send_mgmt()
2838 + (vap->iv_appie_wpa != NULL ? in ieee80211_send_mgmt()
2839 vap->iv_appie_wpa->ie_len : 0) in ieee80211_send_mgmt()
2840 + (vap->iv_appie_assocreq != NULL ? in ieee80211_send_mgmt()
2841 vap->iv_appie_assocreq->ie_len : 0) in ieee80211_send_mgmt()
2846 KASSERT(vap->iv_opmode == IEEE80211_M_STA, in ieee80211_send_mgmt()
2847 ("wrong mode %u", vap->iv_opmode)); in ieee80211_send_mgmt()
2849 if (vap->iv_flags & IEEE80211_F_PRIVACY) in ieee80211_send_mgmt()
2855 if ((vap->iv_flags & IEEE80211_F_SHPREAMBLE) && in ieee80211_send_mgmt()
2856 IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) in ieee80211_send_mgmt()
2858 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan) && in ieee80211_send_mgmt()
2859 (ic->ic_caps & IEEE80211_C_SHSLOT)) in ieee80211_send_mgmt()
2861 if ((ni->ni_capinfo & IEEE80211_CAPINFO_SPECTRUM_MGMT) && in ieee80211_send_mgmt()
2862 (vap->iv_flags & IEEE80211_F_DOTH)) in ieee80211_send_mgmt()
2867 KASSERT(bss->ni_intval != 0, ("beacon interval is zero!")); in ieee80211_send_mgmt()
2868 *(uint16_t *)frm = htole16(howmany(ic->ic_lintval, in ieee80211_send_mgmt()
2869 bss->ni_intval)); in ieee80211_send_mgmt()
2873 IEEE80211_ADDR_COPY(frm, bss->ni_bssid); in ieee80211_send_mgmt()
2877 frm = ieee80211_add_ssid(frm, ni->ni_essid, ni->ni_esslen); in ieee80211_send_mgmt()
2878 frm = ieee80211_add_rates(frm, &ni->ni_rates); in ieee80211_send_mgmt()
2880 frm = ieee80211_add_xrates(frm, &ni->ni_rates); in ieee80211_send_mgmt()
2883 ic->ic_curchan); in ieee80211_send_mgmt()
2888 * Check the channel - we may be using an 11n NIC with an in ieee80211_send_mgmt()
2892 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) && in ieee80211_send_mgmt()
2893 IEEE80211_IS_CHAN_HT(ni->ni_chan) && in ieee80211_send_mgmt()
2894 ni->ni_ies.htcap_ie != NULL && in ieee80211_send_mgmt()
2895 ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_HTCAP) { in ieee80211_send_mgmt()
2899 if ((vap->iv_vht_flags & IEEE80211_FVHT_VHT) && in ieee80211_send_mgmt()
2900 IEEE80211_IS_CHAN_VHT(ni->ni_chan) && in ieee80211_send_mgmt()
2901 ni->ni_ies.vhtcap_ie != NULL && in ieee80211_send_mgmt()
2902 ni->ni_ies.vhtcap_ie[0] == IEEE80211_ELEMID_VHT_CAP) { in ieee80211_send_mgmt()
2907 if ((vap->iv_flags & IEEE80211_F_WME) && in ieee80211_send_mgmt()
2908 ni->ni_ies.wme_ie != NULL) in ieee80211_send_mgmt()
2909 frm = ieee80211_add_wme_info(frm, &ic->ic_wme, ni); in ieee80211_send_mgmt()
2912 * Same deal - only send HT info if we're on an 11n in ieee80211_send_mgmt()
2915 if ((vap->iv_flags_ht & IEEE80211_FHT_HT) && in ieee80211_send_mgmt()
2916 IEEE80211_IS_CHAN_HT(ni->ni_chan) && in ieee80211_send_mgmt()
2917 ni->ni_ies.htcap_ie != NULL && in ieee80211_send_mgmt()
2918 ni->ni_ies.htcap_ie[0] == IEEE80211_ELEMID_VENDOR) { in ieee80211_send_mgmt()
2925 ((vap->iv_flags & IEEE80211_F_WPA) == 0 && in ieee80211_send_mgmt()
2926 ni->ni_authmode != IEEE80211_AUTH_8021X) ? in ieee80211_send_mgmt()
2927 vap->iv_def_txkey : IEEE80211_KEYIX_NONE); in ieee80211_send_mgmt()
2930 if (vap->iv_appie_assocreq != NULL) in ieee80211_send_mgmt()
2931 frm = add_appie(frm, vap->iv_appie_assocreq); in ieee80211_send_mgmt()
2932 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); in ieee80211_send_mgmt()
2935 (void *) vap->iv_state); in ieee80211_send_mgmt()
2958 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_send_mgmt()
2963 + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) in ieee80211_send_mgmt()
2972 + (vap->iv_appie_assocresp != NULL ? in ieee80211_send_mgmt()
2973 vap->iv_appie_assocresp->ie_len : 0) in ieee80211_send_mgmt()
2978 capinfo = ieee80211_getcapinfo(vap, bss->ni_chan); in ieee80211_send_mgmt()
2986 *(uint16_t *)frm = htole16(ni->ni_associd); in ieee80211_send_mgmt()
2992 frm = ieee80211_add_rates(frm, &ni->ni_rates); in ieee80211_send_mgmt()
2993 frm = ieee80211_add_xrates(frm, &ni->ni_rates); in ieee80211_send_mgmt()
2995 if ((ni->ni_flags & HTFLAGS) == IEEE80211_NODE_HT) { in ieee80211_send_mgmt()
2999 if ((vap->iv_flags & IEEE80211_F_WME) && in ieee80211_send_mgmt()
3000 ni->ni_ies.wme_ie != NULL) in ieee80211_send_mgmt()
3001 frm = ieee80211_add_wme_param(frm, &ic->ic_wme, in ieee80211_send_mgmt()
3002 !! (vap->iv_flags_ext & IEEE80211_FEXT_UAPSD)); in ieee80211_send_mgmt()
3003 if ((ni->ni_flags & HTFLAGS) == HTFLAGS) { in ieee80211_send_mgmt()
3007 if (ni->ni_flags & IEEE80211_NODE_VHT) { in ieee80211_send_mgmt()
3015 ((vap->iv_flags & IEEE80211_F_WPA) == 0 && in ieee80211_send_mgmt()
3016 ni->ni_authmode != IEEE80211_AUTH_8021X) ? in ieee80211_send_mgmt()
3017 vap->iv_def_txkey : IEEE80211_KEYIX_NONE); in ieee80211_send_mgmt()
3019 if (vap->iv_appie_assocresp != NULL) in ieee80211_send_mgmt()
3020 frm = add_appie(frm, vap->iv_appie_assocresp); in ieee80211_send_mgmt()
3021 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); in ieee80211_send_mgmt()
3029 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_send_mgmt()
3034 m->m_pkthdr.len = m->m_len = sizeof(uint16_t); in ieee80211_send_mgmt()
3047 /* NB: force non-ProbeResp frames to the highest queue */ in ieee80211_send_mgmt()
3049 params.ibp_rate0 = bss->ni_txparms->mgmtrate; in ieee80211_send_mgmt()
3051 params.ibp_try0 = bss->ni_txparms->maxretry; in ieee80211_send_mgmt()
3052 params.ibp_power = bss->ni_txpower; in ieee80211_send_mgmt()
3069 struct ieee80211vap *vap = bss->ni_vap; in ieee80211_alloc_proberesp()
3070 struct ieee80211com *ic = bss->ni_ic; in ieee80211_alloc_proberesp()
3105 ic->ic_headroom + sizeof(struct ieee80211_frame), in ieee80211_alloc_proberesp()
3117 + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) in ieee80211_alloc_proberesp()
3134 + (vap->iv_appie_proberesp != NULL ? in ieee80211_alloc_proberesp()
3135 vap->iv_appie_proberesp->ie_len : 0) in ieee80211_alloc_proberesp()
3138 vap->iv_stats.is_tx_nobuf++; in ieee80211_alloc_proberesp()
3144 *(uint16_t *)frm = htole16(bss->ni_intval); in ieee80211_alloc_proberesp()
3146 capinfo = ieee80211_getcapinfo(vap, bss->ni_chan); in ieee80211_alloc_proberesp()
3150 frm = ieee80211_add_ssid(frm, bss->ni_essid, bss->ni_esslen); in ieee80211_alloc_proberesp()
3151 rs = ieee80211_get_suprates(ic, bss->ni_chan); in ieee80211_alloc_proberesp()
3154 if (IEEE80211_IS_CHAN_FHSS(bss->ni_chan)) { in ieee80211_alloc_proberesp()
3157 *frm++ = bss->ni_fhdwell & 0x00ff; in ieee80211_alloc_proberesp()
3158 *frm++ = (bss->ni_fhdwell >> 8) & 0x00ff; in ieee80211_alloc_proberesp()
3160 ieee80211_chan2ieee(ic, bss->ni_chan)); in ieee80211_alloc_proberesp()
3162 ieee80211_chan2ieee(ic, bss->ni_chan)); in ieee80211_alloc_proberesp()
3163 *frm++ = bss->ni_fhindex; in ieee80211_alloc_proberesp()
3167 *frm++ = ieee80211_chan2ieee(ic, bss->ni_chan); in ieee80211_alloc_proberesp()
3170 if (vap->iv_opmode == IEEE80211_M_IBSS) { in ieee80211_alloc_proberesp()
3175 if ((vap->iv_flags & IEEE80211_F_DOTH) || in ieee80211_alloc_proberesp()
3176 (vap->iv_flags_ext & IEEE80211_FEXT_DOTD)) in ieee80211_alloc_proberesp()
3178 if (vap->iv_flags & IEEE80211_F_DOTH) { in ieee80211_alloc_proberesp()
3179 if (IEEE80211_IS_CHAN_5GHZ(bss->ni_chan)) in ieee80211_alloc_proberesp()
3181 if (ic->ic_flags & IEEE80211_F_CSAPENDING) in ieee80211_alloc_proberesp()
3184 if (vap->iv_flags & IEEE80211_F_DOTH) { in ieee80211_alloc_proberesp()
3185 if (IEEE80211_IS_CHAN_DFS(ic->ic_bsschan) && in ieee80211_alloc_proberesp()
3186 (vap->iv_flags_ext & IEEE80211_FEXT_DFS)) { in ieee80211_alloc_proberesp()
3187 if (vap->iv_quiet) in ieee80211_alloc_proberesp()
3191 if (IEEE80211_IS_CHAN_ANYG(bss->ni_chan)) in ieee80211_alloc_proberesp()
3201 if (IEEE80211_IS_CHAN_HT(bss->ni_chan) && in ieee80211_alloc_proberesp()
3206 if (IEEE80211_IS_CHAN_VHT(bss->ni_chan) && in ieee80211_alloc_proberesp()
3212 if (vap->iv_flags & IEEE80211_F_WME) in ieee80211_alloc_proberesp()
3213 frm = ieee80211_add_wme_param(frm, &ic->ic_wme, in ieee80211_alloc_proberesp()
3214 !! (vap->iv_flags_ext & IEEE80211_FEXT_UAPSD)); in ieee80211_alloc_proberesp()
3215 if (IEEE80211_IS_CHAN_HT(bss->ni_chan) && in ieee80211_alloc_proberesp()
3216 (vap->iv_flags_ht & IEEE80211_FHT_HTCOMPAT) && in ieee80211_alloc_proberesp()
3222 if ((vap->iv_flags & IEEE80211_F_ATHEROS) && in ieee80211_alloc_proberesp()
3226 if (vap->iv_appie_proberesp != NULL) in ieee80211_alloc_proberesp()
3227 frm = add_appie(frm, vap->iv_appie_proberesp); in ieee80211_alloc_proberesp()
3229 if (vap->iv_opmode == IEEE80211_M_MBSS) { in ieee80211_alloc_proberesp()
3234 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); in ieee80211_alloc_proberesp()
3242 * can specify the destination address and re-use the bss node
3249 struct ieee80211_node *bss = vap->iv_bss; in ieee80211_send_proberesp()
3250 struct ieee80211com *ic = vap->iv_ic; in ieee80211_send_proberesp()
3254 if (vap->iv_state == IEEE80211_S_CAC) { in ieee80211_send_proberesp()
3257 vap->iv_stats.is_tx_badstate++; in ieee80211_send_proberesp()
3268 __func__, __LINE__, bss, ether_sprintf(bss->ni_macaddr), in ieee80211_send_proberesp()
3284 IEEE80211_NONQOS_TID, vap->iv_myaddr, da, bss->ni_bssid); in ieee80211_send_proberesp()
3286 m->m_flags |= M_ENCAP; /* mark encapsulated */ in ieee80211_send_proberesp()
3292 ieee80211_chan2ieee(ic, ic->ic_curchan), ether_sprintf(da), in ieee80211_send_proberesp()
3317 rts->i_fc[0] = IEEE80211_FC0_VERSION_0 | in ieee80211_alloc_rts()
3319 rts->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_alloc_rts()
3320 *(u_int16_t *)rts->i_dur = htole16(dur); in ieee80211_alloc_rts()
3321 IEEE80211_ADDR_COPY(rts->i_ra, ra); in ieee80211_alloc_rts()
3322 IEEE80211_ADDR_COPY(rts->i_ta, ta); in ieee80211_alloc_rts()
3324 m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_rts); in ieee80211_alloc_rts()
3343 cts->i_fc[0] = IEEE80211_FC0_VERSION_0 | in ieee80211_alloc_cts()
3345 cts->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_alloc_cts()
3346 *(u_int16_t *)cts->i_dur = htole16(dur); in ieee80211_alloc_cts()
3347 IEEE80211_ADDR_COPY(cts->i_ra, ra); in ieee80211_alloc_cts()
3349 m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_cts); in ieee80211_alloc_cts()
3361 struct ieee80211com *ic = ni->ni_ic; in ieee80211_alloc_prot()
3362 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_alloc_prot()
3373 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN; in ieee80211_alloc_prot()
3374 isshort = (vap->iv_flags & IEEE80211_F_SHPREAMBLE) != 0; in ieee80211_alloc_prot()
3375 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort) in ieee80211_alloc_prot()
3376 + ieee80211_ack_duration(ic->ic_rt, rate, isshort); in ieee80211_alloc_prot()
3380 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort); in ieee80211_alloc_prot()
3381 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur); in ieee80211_alloc_prot()
3383 mprot = ieee80211_alloc_cts(ic, vap->iv_myaddr, dur); in ieee80211_alloc_prot()
3395 ieee80211_opmode_name[vap->iv_opmode], in ieee80211_tx_mgt_timeout()
3396 ieee80211_state_name[vap->iv_state], in ieee80211_tx_mgt_timeout()
3397 vap->iv_ic->ic_flags, IEEE80211_F_SCAN); in ieee80211_tx_mgt_timeout()
3399 IEEE80211_LOCK(vap->iv_ic); in ieee80211_tx_mgt_timeout()
3400 if (vap->iv_state != IEEE80211_S_INIT && in ieee80211_tx_mgt_timeout()
3401 (vap->iv_ic->ic_flags & IEEE80211_F_SCAN) == 0) { in ieee80211_tx_mgt_timeout()
3403 * NB: it's safe to specify a timeout as the reason here; in ieee80211_tx_mgt_timeout()
3409 IEEE80211_UNLOCK(vap->iv_ic); in ieee80211_tx_mgt_timeout()
3413 * This is the callback set on net80211-sourced transmitted
3429 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_tx_mgt_cb()
3438 * not be too time-critical and not happen too often so the in ieee80211_tx_mgt_cb()
3443 if (vap->iv_state == ostate) { in ieee80211_tx_mgt_cb()
3446 ieee80211_opmode_name[vap->iv_opmode], in ieee80211_tx_mgt_cb()
3447 ieee80211_state_name[vap->iv_state], arg, status); in ieee80211_tx_mgt_cb()
3449 callout_reset(&vap->iv_mgtsend, in ieee80211_tx_mgt_cb()
3459 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_beacon_construct()
3460 struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off; in ieee80211_beacon_construct()
3461 struct ieee80211com *ic = ni->ni_ic; in ieee80211_beacon_construct()
3462 struct ieee80211_rateset *rs = &ni->ni_rates; in ieee80211_beacon_construct()
3468 * TODO: update to 802.11-2012; a lot of stuff has changed; in ieee80211_beacon_construct()
3510 * XXX Vendor-specific OIDs (e.g. Atheros) in ieee80211_beacon_construct()
3526 *(uint16_t *)frm = htole16(ni->ni_intval); in ieee80211_beacon_construct()
3528 capinfo = ieee80211_getcapinfo(vap, ni->ni_chan); in ieee80211_beacon_construct()
3529 bo->bo_caps = (uint16_t *)frm; in ieee80211_beacon_construct()
3533 if ((vap->iv_flags & IEEE80211_F_HIDESSID) == 0) { in ieee80211_beacon_construct()
3534 *frm++ = ni->ni_esslen; in ieee80211_beacon_construct()
3535 memcpy(frm, ni->ni_essid, ni->ni_esslen); in ieee80211_beacon_construct()
3536 frm += ni->ni_esslen; in ieee80211_beacon_construct()
3540 if (!IEEE80211_IS_CHAN_FHSS(ni->ni_chan)) { in ieee80211_beacon_construct()
3543 *frm++ = ieee80211_chan2ieee(ic, ni->ni_chan); in ieee80211_beacon_construct()
3545 if (ic->ic_flags & IEEE80211_F_PCF) { in ieee80211_beacon_construct()
3546 bo->bo_cfp = frm; in ieee80211_beacon_construct()
3549 bo->bo_tim = frm; in ieee80211_beacon_construct()
3550 if (vap->iv_opmode == IEEE80211_M_IBSS) { in ieee80211_beacon_construct()
3554 bo->bo_tim_len = 0; in ieee80211_beacon_construct()
3555 } else if (vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_beacon_construct()
3556 vap->iv_opmode == IEEE80211_M_MBSS) { in ieee80211_beacon_construct()
3560 tie->tim_ie = IEEE80211_ELEMID_TIM; in ieee80211_beacon_construct()
3561 tie->tim_len = 4; /* length */ in ieee80211_beacon_construct()
3562 tie->tim_count = 0; /* DTIM count */ in ieee80211_beacon_construct()
3563 tie->tim_period = vap->iv_dtim_period; /* DTIM period */ in ieee80211_beacon_construct()
3564 tie->tim_bitctl = 0; /* bitmap control */ in ieee80211_beacon_construct()
3565 tie->tim_bitmap[0] = 0; /* Partial Virtual Bitmap */ in ieee80211_beacon_construct()
3567 bo->bo_tim_len = 1; in ieee80211_beacon_construct()
3569 bo->bo_tim_trailer = frm; in ieee80211_beacon_construct()
3570 if ((vap->iv_flags & IEEE80211_F_DOTH) || in ieee80211_beacon_construct()
3571 (vap->iv_flags_ext & IEEE80211_FEXT_DOTD)) in ieee80211_beacon_construct()
3573 if (vap->iv_flags & IEEE80211_F_DOTH) { in ieee80211_beacon_construct()
3574 if (IEEE80211_IS_CHAN_5GHZ(ni->ni_chan)) in ieee80211_beacon_construct()
3576 bo->bo_csa = frm; in ieee80211_beacon_construct()
3577 if (ic->ic_flags & IEEE80211_F_CSAPENDING) in ieee80211_beacon_construct()
3580 bo->bo_csa = frm; in ieee80211_beacon_construct()
3582 bo->bo_quiet = NULL; in ieee80211_beacon_construct()
3583 if (vap->iv_flags & IEEE80211_F_DOTH) { in ieee80211_beacon_construct()
3584 if (IEEE80211_IS_CHAN_DFS(ic->ic_bsschan) && in ieee80211_beacon_construct()
3585 (vap->iv_flags_ext & IEEE80211_FEXT_DFS) && in ieee80211_beacon_construct()
3586 (vap->iv_quiet == 1)) { in ieee80211_beacon_construct()
3593 if (vap->iv_quiet) { in ieee80211_beacon_construct()
3594 bo->bo_quiet = frm; in ieee80211_beacon_construct()
3600 if (IEEE80211_IS_CHAN_ANYG(ni->ni_chan)) { in ieee80211_beacon_construct()
3601 bo->bo_erp = frm; in ieee80211_beacon_construct()
3606 if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) { in ieee80211_beacon_construct()
3608 bo->bo_htinfo = frm; in ieee80211_beacon_construct()
3612 if (IEEE80211_IS_CHAN_VHT(ni->ni_chan)) { in ieee80211_beacon_construct()
3614 bo->bo_vhtinfo = frm; in ieee80211_beacon_construct()
3622 if (vap->iv_flags & IEEE80211_F_WME) { in ieee80211_beacon_construct()
3623 bo->bo_wme = frm; in ieee80211_beacon_construct()
3624 frm = ieee80211_add_wme_param(frm, &ic->ic_wme, in ieee80211_beacon_construct()
3625 !! (vap->iv_flags_ext & IEEE80211_FEXT_UAPSD)); in ieee80211_beacon_construct()
3627 if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && in ieee80211_beacon_construct()
3628 (vap->iv_flags_ht & IEEE80211_FHT_HTCOMPAT)) { in ieee80211_beacon_construct()
3634 if (vap->iv_flags & IEEE80211_F_ATHEROS) { in ieee80211_beacon_construct()
3635 bo->bo_ath = frm; in ieee80211_beacon_construct()
3640 if (vap->iv_caps & IEEE80211_C_TDMA) { in ieee80211_beacon_construct()
3641 bo->bo_tdma = frm; in ieee80211_beacon_construct()
3645 if (vap->iv_appie_beacon != NULL) { in ieee80211_beacon_construct()
3646 bo->bo_appie = frm; in ieee80211_beacon_construct()
3647 bo->bo_appie_len = vap->iv_appie_beacon->ie_len; in ieee80211_beacon_construct()
3648 frm = add_appie(frm, vap->iv_appie_beacon); in ieee80211_beacon_construct()
3653 if (vap->iv_opmode == IEEE80211_M_MBSS) { in ieee80211_beacon_construct()
3655 bo->bo_meshconf = frm; in ieee80211_beacon_construct()
3659 bo->bo_tim_trailer_len = frm - bo->bo_tim_trailer; in ieee80211_beacon_construct()
3660 bo->bo_csa_trailer_len = frm - bo->bo_csa; in ieee80211_beacon_construct()
3661 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); in ieee80211_beacon_construct()
3670 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_beacon_alloc()
3671 struct ieee80211com *ic = ni->ni_ic; in ieee80211_beacon_alloc()
3680 if (vap->iv_quiet == 1) in ieee80211_beacon_alloc()
3681 vap->iv_flags_ext |= IEEE80211_FEXT_QUIET_IE; in ieee80211_beacon_alloc()
3682 else if (vap->iv_quiet == 0) in ieee80211_beacon_alloc()
3683 vap->iv_flags_ext &= ~IEEE80211_FEXT_QUIET_IE; in ieee80211_beacon_alloc()
3688 * Note: This needs updating for 802.11-2012. in ieee80211_beacon_alloc()
3710 * XXX Vendor-specific OIDs (e.g. Atheros) in ieee80211_beacon_alloc()
3723 + 2 + ni->ni_esslen /* ssid */ in ieee80211_beacon_alloc()
3727 + 2 + 4 + vap->iv_tim_len /* DTIM/IBSSPARMS */ in ieee80211_beacon_alloc()
3733 + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) in ieee80211_beacon_alloc()
3734 + (vap->iv_caps & IEEE80211_C_WPA ? /* WPA 1+2 */ in ieee80211_beacon_alloc()
3741 + (vap->iv_caps & IEEE80211_C_WME ? /* WME */ in ieee80211_beacon_alloc()
3747 + (vap->iv_caps & IEEE80211_C_TDMA ? /* TDMA */ in ieee80211_beacon_alloc()
3751 + 2 + ni->ni_meshidlen in ieee80211_beacon_alloc()
3757 ic->ic_headroom + sizeof(struct ieee80211_frame), pktlen); in ieee80211_beacon_alloc()
3761 vap->iv_stats.is_tx_nobuf++; in ieee80211_beacon_alloc()
3769 wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | in ieee80211_beacon_alloc()
3771 wh->i_fc[1] = IEEE80211_FC1_DIR_NODS; in ieee80211_beacon_alloc()
3772 *(uint16_t *)wh->i_dur = 0; in ieee80211_beacon_alloc()
3773 IEEE80211_ADDR_COPY(wh->i_addr1, in ieee80211_beacon_alloc()
3775 IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr); in ieee80211_beacon_alloc()
3776 IEEE80211_ADDR_COPY(wh->i_addr3, ni->ni_bssid); in ieee80211_beacon_alloc()
3777 *(uint16_t *)wh->i_seq = 0; in ieee80211_beacon_alloc()
3788 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_beacon_update()
3789 struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off; in ieee80211_beacon_update()
3790 struct ieee80211com *ic = ni->ni_ic; in ieee80211_beacon_update()
3802 if (isset(bo->bo_flags, IEEE80211_BEACON_CSA) && in ieee80211_beacon_update()
3803 vap->iv_csa_count == ic->ic_csa_count) { in ieee80211_beacon_update()
3804 vap->iv_csa_count = 0; in ieee80211_beacon_update()
3809 if (ic->ic_csa_newchan != NULL) in ieee80211_beacon_update()
3827 * beacon - that way the gap is provided as appropriate. in ieee80211_beacon_update()
3832 if ((vap->iv_flags_ext & IEEE80211_FEXT_QUIET_IE) && in ieee80211_beacon_update()
3833 (vap->iv_quiet == 0)) { in ieee80211_beacon_update()
3838 vap->iv_flags_ext &= ~IEEE80211_FEXT_QUIET_IE; in ieee80211_beacon_update()
3846 if (((vap->iv_flags_ext & IEEE80211_FEXT_QUIET_IE) == 0) && in ieee80211_beacon_update()
3847 (vap->iv_quiet == 1)) { in ieee80211_beacon_update()
3852 vap->iv_flags_ext |= IEEE80211_FEXT_QUIET_IE; in ieee80211_beacon_update()
3862 * lock held so as to serialise access to the non-qos TID sequence in ieee80211_beacon_update()
3873 capinfo = ieee80211_getcapinfo(vap, ni->ni_chan); in ieee80211_beacon_update()
3874 *bo->bo_caps = htole16(capinfo); in ieee80211_beacon_update()
3876 if (vap->iv_flags & IEEE80211_F_WME) { in ieee80211_beacon_update()
3877 struct ieee80211_wme_state *wme = &ic->ic_wme; in ieee80211_beacon_update()
3884 * to optimize performance of legacy/non-QoS traffic. in ieee80211_beacon_update()
3886 if (wme->wme_flags & WME_F_AGGRMODE) { in ieee80211_beacon_update()
3887 if (wme->wme_hipri_traffic > in ieee80211_beacon_update()
3888 wme->wme_hipri_switch_thresh) { in ieee80211_beacon_update()
3891 __func__, wme->wme_hipri_traffic); in ieee80211_beacon_update()
3892 wme->wme_flags &= ~WME_F_AGGRMODE; in ieee80211_beacon_update()
3894 wme->wme_hipri_traffic = in ieee80211_beacon_update()
3895 wme->wme_hipri_switch_hysteresis; in ieee80211_beacon_update()
3897 wme->wme_hipri_traffic = 0; in ieee80211_beacon_update()
3899 if (wme->wme_hipri_traffic <= in ieee80211_beacon_update()
3900 wme->wme_hipri_switch_thresh) { in ieee80211_beacon_update()
3903 __func__, wme->wme_hipri_traffic); in ieee80211_beacon_update()
3904 wme->wme_flags |= WME_F_AGGRMODE; in ieee80211_beacon_update()
3906 wme->wme_hipri_traffic = 0; in ieee80211_beacon_update()
3908 wme->wme_hipri_traffic = in ieee80211_beacon_update()
3909 wme->wme_hipri_switch_hysteresis; in ieee80211_beacon_update()
3911 if (isset(bo->bo_flags, IEEE80211_BEACON_WME)) { in ieee80211_beacon_update()
3912 (void) ieee80211_add_wme_param(bo->bo_wme, wme, in ieee80211_beacon_update()
3913 vap->iv_flags_ext & IEEE80211_FEXT_UAPSD); in ieee80211_beacon_update()
3914 clrbit(bo->bo_flags, IEEE80211_BEACON_WME); in ieee80211_beacon_update()
3918 if (isset(bo->bo_flags, IEEE80211_BEACON_HTINFO)) { in ieee80211_beacon_update()
3920 clrbit(bo->bo_flags, IEEE80211_BEACON_HTINFO); in ieee80211_beacon_update()
3923 if (vap->iv_caps & IEEE80211_C_TDMA) { in ieee80211_beacon_update()
3931 if (vap->iv_opmode == IEEE80211_M_MBSS) in ieee80211_beacon_update()
3935 if (vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_beacon_update()
3936 vap->iv_opmode == IEEE80211_M_MBSS) { /* NB: no IBSS support*/ in ieee80211_beacon_update()
3938 (struct ieee80211_tim_ie *) bo->bo_tim; in ieee80211_beacon_update()
3939 if (isset(bo->bo_flags, IEEE80211_BEACON_TIM)) { in ieee80211_beacon_update()
3948 * maximal-size virtual bitmap (based on iv_max_aid). in ieee80211_beacon_update()
3957 if (vap->iv_ps_pending != 0) { in ieee80211_beacon_update()
3959 for (i = 0; i < vap->iv_tim_len; i++) in ieee80211_beacon_update()
3960 if (vap->iv_tim_bitmap[i]) { in ieee80211_beacon_update()
3965 for (i = vap->iv_tim_len-1; i >= timoff; i--) in ieee80211_beacon_update()
3966 if (vap->iv_tim_bitmap[i]) in ieee80211_beacon_update()
3968 timlen = 1 + (i - timoff); in ieee80211_beacon_update()
3977 if (timlen != bo->bo_tim_len) { in ieee80211_beacon_update()
3979 int adjust = tie->tim_bitmap+timlen in ieee80211_beacon_update()
3980 - bo->bo_tim_trailer; in ieee80211_beacon_update()
3981 ovbcopy(bo->bo_tim_trailer, in ieee80211_beacon_update()
3982 bo->bo_tim_trailer+adjust, in ieee80211_beacon_update()
3983 bo->bo_tim_trailer_len); in ieee80211_beacon_update()
3984 bo->bo_tim_trailer += adjust; in ieee80211_beacon_update()
3985 bo->bo_erp += adjust; in ieee80211_beacon_update()
3986 bo->bo_htinfo += adjust; in ieee80211_beacon_update()
3987 bo->bo_vhtinfo += adjust; in ieee80211_beacon_update()
3989 bo->bo_ath += adjust; in ieee80211_beacon_update()
3992 bo->bo_tdma += adjust; in ieee80211_beacon_update()
3995 bo->bo_meshconf += adjust; in ieee80211_beacon_update()
3997 bo->bo_appie += adjust; in ieee80211_beacon_update()
3998 bo->bo_wme += adjust; in ieee80211_beacon_update()
3999 bo->bo_csa += adjust; in ieee80211_beacon_update()
4000 bo->bo_quiet += adjust; in ieee80211_beacon_update()
4001 bo->bo_tim_len = timlen; in ieee80211_beacon_update()
4004 tie->tim_len = 3 + timlen; in ieee80211_beacon_update()
4005 tie->tim_bitctl = timoff; in ieee80211_beacon_update()
4008 memcpy(tie->tim_bitmap, vap->iv_tim_bitmap + timoff, in ieee80211_beacon_update()
4009 bo->bo_tim_len); in ieee80211_beacon_update()
4011 clrbit(bo->bo_flags, IEEE80211_BEACON_TIM); in ieee80211_beacon_update()
4015 __func__, vap->iv_ps_pending, timoff, timlen); in ieee80211_beacon_update()
4018 if (tie->tim_count == 0) in ieee80211_beacon_update()
4019 tie->tim_count = tie->tim_period - 1; in ieee80211_beacon_update()
4021 tie->tim_count--; in ieee80211_beacon_update()
4023 if (mcast && tie->tim_count == 0) in ieee80211_beacon_update()
4024 tie->tim_bitctl |= 1; in ieee80211_beacon_update()
4026 tie->tim_bitctl &= ~1; in ieee80211_beacon_update()
4027 if (isset(bo->bo_flags, IEEE80211_BEACON_CSA)) { in ieee80211_beacon_update()
4029 (struct ieee80211_csa_ie *) bo->bo_csa; in ieee80211_beacon_update()
4038 if (vap->iv_csa_count == 0) { in ieee80211_beacon_update()
4039 memmove(&csa[1], csa, bo->bo_csa_trailer_len); in ieee80211_beacon_update()
4040 bo->bo_erp += sizeof(*csa); in ieee80211_beacon_update()
4041 bo->bo_htinfo += sizeof(*csa); in ieee80211_beacon_update()
4042 bo->bo_vhtinfo += sizeof(*csa); in ieee80211_beacon_update()
4043 bo->bo_wme += sizeof(*csa); in ieee80211_beacon_update()
4045 bo->bo_ath += sizeof(*csa); in ieee80211_beacon_update()
4048 bo->bo_tdma += sizeof(*csa); in ieee80211_beacon_update()
4051 bo->bo_meshconf += sizeof(*csa); in ieee80211_beacon_update()
4053 bo->bo_appie += sizeof(*csa); in ieee80211_beacon_update()
4054 bo->bo_csa_trailer_len += sizeof(*csa); in ieee80211_beacon_update()
4055 bo->bo_quiet += sizeof(*csa); in ieee80211_beacon_update()
4056 bo->bo_tim_trailer_len += sizeof(*csa); in ieee80211_beacon_update()
4057 m->m_len += sizeof(*csa); in ieee80211_beacon_update()
4058 m->m_pkthdr.len += sizeof(*csa); in ieee80211_beacon_update()
4060 ieee80211_add_csa(bo->bo_csa, vap); in ieee80211_beacon_update()
4062 csa->csa_count--; in ieee80211_beacon_update()
4063 vap->iv_csa_count++; in ieee80211_beacon_update()
4071 if (IEEE80211_IS_CHAN_DFS(ic->ic_bsschan) && in ieee80211_beacon_update()
4072 (vap->iv_flags_ext & IEEE80211_FEXT_DFS)) { in ieee80211_beacon_update()
4073 if (vap->iv_quiet && in ieee80211_beacon_update()
4074 (vap->iv_flags_ext & IEEE80211_FEXT_QUIET_IE)) { in ieee80211_beacon_update()
4075 ieee80211_add_quiet(bo->bo_quiet, vap, 1); in ieee80211_beacon_update()
4078 if (isset(bo->bo_flags, IEEE80211_BEACON_ERP)) { in ieee80211_beacon_update()
4082 (void) ieee80211_add_erp(bo->bo_erp, vap); in ieee80211_beacon_update()
4083 clrbit(bo->bo_flags, IEEE80211_BEACON_ERP); in ieee80211_beacon_update()
4086 if (isset(bo->bo_flags, IEEE80211_BEACON_ATH)) { in ieee80211_beacon_update()
4087 ieee80211_add_athcaps(bo->bo_ath, ni); in ieee80211_beacon_update()
4088 clrbit(bo->bo_flags, IEEE80211_BEACON_ATH); in ieee80211_beacon_update()
4092 if (isset(bo->bo_flags, IEEE80211_BEACON_APPIE)) { in ieee80211_beacon_update()
4093 const struct ieee80211_appie *aie = vap->iv_appie_beacon; in ieee80211_beacon_update()
4099 aielen += aie->ie_len; in ieee80211_beacon_update()
4100 if (aielen != bo->bo_appie_len) { in ieee80211_beacon_update()
4102 int adjust = aielen - bo->bo_appie_len; in ieee80211_beacon_update()
4103 ovbcopy(bo->bo_tim_trailer, bo->bo_tim_trailer+adjust, in ieee80211_beacon_update()
4104 bo->bo_tim_trailer_len); in ieee80211_beacon_update()
4105 bo->bo_tim_trailer += adjust; in ieee80211_beacon_update()
4106 bo->bo_appie += adjust; in ieee80211_beacon_update()
4107 bo->bo_appie_len = aielen; in ieee80211_beacon_update()
4111 frm = bo->bo_appie; in ieee80211_beacon_update()
4114 clrbit(bo->bo_flags, IEEE80211_BEACON_APPIE); in ieee80211_beacon_update()
4122 * Do Ethernet-LLC encapsulation for each payload in a fast frame
4136 m_adj(m, sizeof(struct ether_header) - sizeof(struct llc)); in ieee80211_ff_encap1()
4138 llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP; in ieee80211_ff_encap1()
4139 llc->llc_control = LLC_UI; in ieee80211_ff_encap1()
4140 llc->llc_snap.org_code[0] = 0; in ieee80211_ff_encap1()
4141 llc->llc_snap.org_code[1] = 0; in ieee80211_ff_encap1()
4142 llc->llc_snap.org_code[2] = 0; in ieee80211_ff_encap1()
4143 llc->llc_snap.ether_type = eh->ether_type; in ieee80211_ff_encap1()
4144 payload = m->m_pkthdr.len; /* NB: w/o Ethernet header */ in ieee80211_ff_encap1()
4150 vap->iv_stats.is_tx_nobuf++; in ieee80211_ff_encap1()
4154 mtod(m, struct ether_header *)->ether_type = htons(payload); in ieee80211_ff_encap1()
4167 * and already transmitted, it may end up doing A-MPDU retransmission,
4182 struct ifnet *ifp = ni->ni_vap->iv_ifp; in ieee80211_tx_complete()
4185 if_inc_counter(ifp, IFCOUNTER_OBYTES, m->m_pkthdr.len); in ieee80211_tx_complete()
4187 if (m->m_flags & M_MCAST) in ieee80211_tx_complete()
4191 if (m->m_flags & M_TXCB) { in ieee80211_tx_complete()
4192 IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, in ieee80211_tx_complete()
4193 "ni %p vap %p mode %s state %s m %p status %d\n", ni, ni->ni_vap, in ieee80211_tx_complete()
4194 ieee80211_opmode_name[ni->ni_vap->iv_opmode], in ieee80211_tx_complete()
4195 ieee80211_state_name[ni->ni_vap->iv_state], m, status); in ieee80211_tx_complete()
4209 * This implements the components of 802.11-2020 10.3.2.14.2
4222 * they don't match. For new callers, use -1.
4235 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in ieee80211_output_seqno_assign()
4236 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; in ieee80211_output_seqno_assign()
4243 * correctly then it can pass in -1 and this check will be in ieee80211_output_seqno_assign()
4246 if (arg_tid != -1 && tid != arg_tid) in ieee80211_output_seqno_assign()
4247 ic_printf(ni->ni_vap->iv_ic, in ieee80211_output_seqno_assign()
4252 /* 802.11-2020 10.3.2.14.2 (Transmitter Requirements) sections */ in ieee80211_output_seqno_assign()
4254 /* SNS7 - unicast PV1 management frame */ in ieee80211_output_seqno_assign()
4256 /* SNS6 - unicast PV1 data frame */ in ieee80211_output_seqno_assign()
4258 /* SNS5 - QoS NULL frames */ in ieee80211_output_seqno_assign()
4262 /* SNS4 - QMF STA transmitting a QMF */ in ieee80211_output_seqno_assign()
4264 /* SNS3 - QoS STA; Time Priority Management frame */ in ieee80211_output_seqno_assign()
4266 /* SNS2 - unicast QoS STA, data frame, excluding SNS5 */ in ieee80211_output_seqno_assign()
4268 !IEEE80211_IS_MULTICAST(wh->i_addr1)) in ieee80211_output_seqno_assign()
4271 /* SNS1 - Baseline (everything else) */ in ieee80211_output_seqno_assign()
4281 *(uint16_t *)&wh->i_seq[0] = in ieee80211_output_seqno_assign()
4289 * TODO: update to 802.11-2020 10.3.2.14.2 (Transmitter Requirements)
4303 *(uint16_t *)&wh->i_seq[0] = in ieee80211_output_beacon_seqno_assign()