16b4cac81SBjoern A. Zeeb /*-
25778cbdaSBjoern A. Zeeb * Copyright (c) 2020-2025 The FreeBSD Foundation
3*9cac7351SBjoern A. Zeeb * Copyright (c) 2020-2025 Bjoern A. Zeeb
46b4cac81SBjoern A. Zeeb *
56b4cac81SBjoern A. Zeeb * This software was developed by Björn Zeeb under sponsorship from
66b4cac81SBjoern A. Zeeb * the FreeBSD Foundation.
76b4cac81SBjoern A. Zeeb *
86b4cac81SBjoern A. Zeeb * Redistribution and use in source and binary forms, with or without
96b4cac81SBjoern A. Zeeb * modification, are permitted provided that the following conditions
106b4cac81SBjoern A. Zeeb * are met:
116b4cac81SBjoern A. Zeeb * 1. Redistributions of source code must retain the above copyright
126b4cac81SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer.
136b4cac81SBjoern A. Zeeb * 2. Redistributions in binary form must reproduce the above copyright
146b4cac81SBjoern A. Zeeb * notice, this list of conditions and the following disclaimer in the
156b4cac81SBjoern A. Zeeb * documentation and/or other materials provided with the distribution.
166b4cac81SBjoern A. Zeeb *
176b4cac81SBjoern A. Zeeb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
186b4cac81SBjoern A. Zeeb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
196b4cac81SBjoern A. Zeeb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
206b4cac81SBjoern A. Zeeb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
216b4cac81SBjoern A. Zeeb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
226b4cac81SBjoern A. Zeeb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
236b4cac81SBjoern A. Zeeb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
246b4cac81SBjoern A. Zeeb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
256b4cac81SBjoern A. Zeeb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
266b4cac81SBjoern A. Zeeb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
276b4cac81SBjoern A. Zeeb * SUCH DAMAGE.
286b4cac81SBjoern A. Zeeb */
296b4cac81SBjoern A. Zeeb
306b4cac81SBjoern A. Zeeb #ifndef _LINUXKPI_NET_MAC80211_H
316b4cac81SBjoern A. Zeeb #define _LINUXKPI_NET_MAC80211_H
326b4cac81SBjoern A. Zeeb
336b4cac81SBjoern A. Zeeb #include <sys/types.h>
346b4cac81SBjoern A. Zeeb
356b4cac81SBjoern A. Zeeb #include <asm/atomic64.h>
366b4cac81SBjoern A. Zeeb #include <linux/bitops.h>
375778cbdaSBjoern A. Zeeb #include <linux/bitfield.h>
386b4cac81SBjoern A. Zeeb #include <linux/etherdevice.h>
392e183d99SBjoern A. Zeeb #include <linux/ethtool.h>
406b4cac81SBjoern A. Zeeb #include <linux/netdevice.h>
416b4cac81SBjoern A. Zeeb #include <linux/skbuff.h>
426b4cac81SBjoern A. Zeeb #include <linux/workqueue.h>
430080f30fSBjoern A. Zeeb #include <linux/dcache.h>
44e6010da6SBjoern A. Zeeb #include <linux/ieee80211.h>
456b4cac81SBjoern A. Zeeb #include <net/cfg80211.h>
46b42c339cSBjoern A. Zeeb #include <net/if_inet6.h>
476b4cac81SBjoern A. Zeeb
486b4cac81SBjoern A. Zeeb #define ARPHRD_IEEE80211_RADIOTAP __LINE__ /* XXX TODO brcmfmac */
496b4cac81SBjoern A. Zeeb
506b4cac81SBjoern A. Zeeb #define WLAN_OUI_MICROSOFT (0x0050F2)
512e183d99SBjoern A. Zeeb #define WLAN_OUI_TYPE_MICROSOFT_WPA (1)
526b4cac81SBjoern A. Zeeb #define WLAN_OUI_TYPE_MICROSOFT_TPC (8)
536b4cac81SBjoern A. Zeeb #define WLAN_OUI_TYPE_WFA_P2P (9)
546b4cac81SBjoern A. Zeeb #define WLAN_OUI_WFA (0x506F9A)
556b4cac81SBjoern A. Zeeb
56adff403fSBjoern A. Zeeb #define IEEE80211_LINK_UNSPECIFIED 0x0f
57adff403fSBjoern A. Zeeb
586b4cac81SBjoern A. Zeeb /* hw->conf.flags */
596b4cac81SBjoern A. Zeeb enum ieee80211_hw_conf_flags {
606b4cac81SBjoern A. Zeeb IEEE80211_CONF_IDLE = BIT(0),
616b4cac81SBjoern A. Zeeb IEEE80211_CONF_PS = BIT(1),
622e183d99SBjoern A. Zeeb IEEE80211_CONF_MONITOR = BIT(2),
63b0f73768SBjoern A. Zeeb IEEE80211_CONF_OFFCHANNEL = BIT(3),
646b4cac81SBjoern A. Zeeb };
656b4cac81SBjoern A. Zeeb
666b4cac81SBjoern A. Zeeb /* (*ops->config()) */
676b4cac81SBjoern A. Zeeb enum ieee80211_hw_conf_changed_flags {
686b4cac81SBjoern A. Zeeb IEEE80211_CONF_CHANGE_CHANNEL = BIT(0),
696b4cac81SBjoern A. Zeeb IEEE80211_CONF_CHANGE_IDLE = BIT(1),
706b4cac81SBjoern A. Zeeb IEEE80211_CONF_CHANGE_PS = BIT(2),
712e183d99SBjoern A. Zeeb IEEE80211_CONF_CHANGE_MONITOR = BIT(3),
72b0f73768SBjoern A. Zeeb IEEE80211_CONF_CHANGE_POWER = BIT(4),
736b4cac81SBjoern A. Zeeb };
746b4cac81SBjoern A. Zeeb
756b4cac81SBjoern A. Zeeb #define CFG80211_TESTMODE_CMD(_x) /* XXX TODO */
76b0f73768SBjoern A. Zeeb #define CFG80211_TESTMODE_DUMP(_x) /* XXX TODO */
776b4cac81SBjoern A. Zeeb
786b4cac81SBjoern A. Zeeb #define FCS_LEN 4
796b4cac81SBjoern A. Zeeb
806b4cac81SBjoern A. Zeeb /* ops.configure_filter() */
816b4cac81SBjoern A. Zeeb enum mcast_filter_flags {
826b4cac81SBjoern A. Zeeb FIF_ALLMULTI = BIT(0),
836b4cac81SBjoern A. Zeeb FIF_PROBE_REQ = BIT(1),
846b4cac81SBjoern A. Zeeb FIF_BCN_PRBRESP_PROMISC = BIT(2),
856b4cac81SBjoern A. Zeeb FIF_FCSFAIL = BIT(3),
866b4cac81SBjoern A. Zeeb FIF_OTHER_BSS = BIT(4),
872e183d99SBjoern A. Zeeb FIF_PSPOLL = BIT(5),
882e183d99SBjoern A. Zeeb FIF_CONTROL = BIT(6),
89ac1d519cSBjoern A. Zeeb FIF_MCAST_ACTION = BIT(7),
906b4cac81SBjoern A. Zeeb };
916b4cac81SBjoern A. Zeeb
926b4cac81SBjoern A. Zeeb enum ieee80211_bss_changed {
936b4cac81SBjoern A. Zeeb BSS_CHANGED_ARP_FILTER = BIT(0),
946b4cac81SBjoern A. Zeeb BSS_CHANGED_ASSOC = BIT(1),
956b4cac81SBjoern A. Zeeb BSS_CHANGED_BANDWIDTH = BIT(2),
966b4cac81SBjoern A. Zeeb BSS_CHANGED_BEACON = BIT(3),
976b4cac81SBjoern A. Zeeb BSS_CHANGED_BEACON_ENABLED = BIT(4),
986b4cac81SBjoern A. Zeeb BSS_CHANGED_BEACON_INFO = BIT(5),
996b4cac81SBjoern A. Zeeb BSS_CHANGED_BEACON_INT = BIT(6),
1006b4cac81SBjoern A. Zeeb BSS_CHANGED_BSSID = BIT(7),
1016b4cac81SBjoern A. Zeeb BSS_CHANGED_CQM = BIT(8),
1026b4cac81SBjoern A. Zeeb BSS_CHANGED_ERP_CTS_PROT = BIT(9),
1036b4cac81SBjoern A. Zeeb BSS_CHANGED_ERP_SLOT = BIT(10),
1046b4cac81SBjoern A. Zeeb BSS_CHANGED_FTM_RESPONDER = BIT(11),
1056b4cac81SBjoern A. Zeeb BSS_CHANGED_HT = BIT(12),
1066b4cac81SBjoern A. Zeeb BSS_CHANGED_IDLE = BIT(13),
1076b4cac81SBjoern A. Zeeb BSS_CHANGED_MU_GROUPS = BIT(14),
1086b4cac81SBjoern A. Zeeb BSS_CHANGED_P2P_PS = BIT(15),
1096b4cac81SBjoern A. Zeeb BSS_CHANGED_PS = BIT(16),
1106b4cac81SBjoern A. Zeeb BSS_CHANGED_QOS = BIT(17),
1116b4cac81SBjoern A. Zeeb BSS_CHANGED_TXPOWER = BIT(18),
11251b461b3SBjoern A. Zeeb BSS_CHANGED_HE_BSS_COLOR = BIT(19),
1132e183d99SBjoern A. Zeeb BSS_CHANGED_AP_PROBE_RESP = BIT(20),
1142e183d99SBjoern A. Zeeb BSS_CHANGED_BASIC_RATES = BIT(21),
1152e183d99SBjoern A. Zeeb BSS_CHANGED_ERP_PREAMBLE = BIT(22),
1162e183d99SBjoern A. Zeeb BSS_CHANGED_IBSS = BIT(23),
1172e183d99SBjoern A. Zeeb BSS_CHANGED_MCAST_RATE = BIT(24),
1182e183d99SBjoern A. Zeeb BSS_CHANGED_SSID = BIT(25),
119b0f73768SBjoern A. Zeeb BSS_CHANGED_FILS_DISCOVERY = BIT(26),
120b0f73768SBjoern A. Zeeb BSS_CHANGED_HE_OBSS_PD = BIT(27),
121b0f73768SBjoern A. Zeeb BSS_CHANGED_TWT = BIT(28),
122b0f73768SBjoern A. Zeeb BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = BIT(30),
123adff403fSBjoern A. Zeeb BSS_CHANGED_EHT_PUNCTURING = BIT(31),
124ac1d519cSBjoern A. Zeeb BSS_CHANGED_MLD_VALID_LINKS = BIT_ULL(32),
125ac1d519cSBjoern A. Zeeb BSS_CHANGED_MLD_TTLM = BIT_ULL(33),
126ac1d519cSBjoern A. Zeeb BSS_CHANGED_TPE = BIT_ULL(34),
1276b4cac81SBjoern A. Zeeb };
1286b4cac81SBjoern A. Zeeb
1296b4cac81SBjoern A. Zeeb /* 802.11 Figure 9-256 Suite selector format. [OUI(3), SUITE TYPE(1)] */
1307043ca91SJohn Baldwin #define WLAN_CIPHER_SUITE_OUI(_oui, _x) (((_oui) << 8) | ((_x) & 0xff))
1316b4cac81SBjoern A. Zeeb
1326b4cac81SBjoern A. Zeeb /* 802.11 Table 9-131 Cipher suite selectors. */
1336b4cac81SBjoern A. Zeeb /* 802.1x suite B 11 */
1346b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE(_x) WLAN_CIPHER_SUITE_OUI(0x000fac, _x)
1356b4cac81SBjoern A. Zeeb /* Use group 0 */
1366b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_WEP40 WLAN_CIPHER_SUITE(1)
1376b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_TKIP WLAN_CIPHER_SUITE(2)
1386b4cac81SBjoern A. Zeeb /* Reserved 3 */
1396b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_CCMP WLAN_CIPHER_SUITE(4) /* CCMP-128 */
1406b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_WEP104 WLAN_CIPHER_SUITE(5)
1416b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_AES_CMAC WLAN_CIPHER_SUITE(6) /* BIP-CMAC-128 */
1426b4cac81SBjoern A. Zeeb /* Group addressed traffic not allowed 7 */
1436b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_GCMP WLAN_CIPHER_SUITE(8)
1446b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_GCMP_256 WLAN_CIPHER_SUITE(9)
1456b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_CCMP_256 WLAN_CIPHER_SUITE(10)
1466b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_BIP_GMAC_128 WLAN_CIPHER_SUITE(11)
1476b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_BIP_GMAC_256 WLAN_CIPHER_SUITE(12)
1486b4cac81SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_BIP_CMAC_256 WLAN_CIPHER_SUITE(13)
1496b4cac81SBjoern A. Zeeb /* Reserved 14-255 */
1506b4cac81SBjoern A. Zeeb
151b0f73768SBjoern A. Zeeb /* See ISO/IEC JTC 1 N 9880 Table 11 */
152b0f73768SBjoern A. Zeeb #define WLAN_CIPHER_SUITE_SMS4 WLAN_CIPHER_SUITE_OUI(0x001472, 1)
153b0f73768SBjoern A. Zeeb
1546b4cac81SBjoern A. Zeeb
1556b4cac81SBjoern A. Zeeb /* 802.11 Table 9-133 AKM suite selectors. */
1566b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE(_x) WLAN_CIPHER_SUITE_OUI(0x000fac, _x)
1576b4cac81SBjoern A. Zeeb /* Reserved 0 */
1586b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_8021X WLAN_AKM_SUITE(1)
1596b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_PSK WLAN_AKM_SUITE(2)
1606b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_FT_8021X WLAN_AKM_SUITE(3)
1616b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_FT_PSK WLAN_AKM_SUITE(4)
1626b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_8021X_SHA256 WLAN_AKM_SUITE(5)
1636b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_PSK_SHA256 WLAN_AKM_SUITE(6)
1646b4cac81SBjoern A. Zeeb /* TDLS 7 */
1656b4cac81SBjoern A. Zeeb #define WLAN_AKM_SUITE_SAE WLAN_AKM_SUITE(8)
1666b4cac81SBjoern A. Zeeb /* FToSAE 9 */
1676b4cac81SBjoern A. Zeeb /* AP peer key 10 */
1686b4cac81SBjoern A. Zeeb /* 802.1x suite B 11 */
1696b4cac81SBjoern A. Zeeb /* 802.1x suite B 384 12 */
1706b4cac81SBjoern A. Zeeb /* FTo802.1x 384 13 */
1716b4cac81SBjoern A. Zeeb /* Reserved 14-255 */
1726b4cac81SBjoern A. Zeeb /* Apparently 11ax defines more. Seen (19,20) mentioned. */
1736b4cac81SBjoern A. Zeeb
174800aa9cdSBjoern A. Zeeb #define TKIP_PN_TO_IV16(_x) ((uint16_t)(_x & 0xffff))
175800aa9cdSBjoern A. Zeeb #define TKIP_PN_TO_IV32(_x) ((uint32_t)((_x >> 16) & 0xffffffff))
1766b4cac81SBjoern A. Zeeb
177ac1d519cSBjoern A. Zeeb enum ieee80211_neg_ttlm_res {
178ac1d519cSBjoern A. Zeeb NEG_TTLM_RES_ACCEPT,
179ac1d519cSBjoern A. Zeeb NEG_TTLM_RES_REJECT,
180ac1d519cSBjoern A. Zeeb };
181ac1d519cSBjoern A. Zeeb
182ac1d519cSBjoern A. Zeeb #define IEEE80211_TTLM_NUM_TIDS 8
183ac1d519cSBjoern A. Zeeb struct ieee80211_neg_ttlm {
184ac1d519cSBjoern A. Zeeb uint16_t downlink[IEEE80211_TTLM_NUM_TIDS];
185ac1d519cSBjoern A. Zeeb uint16_t uplink[IEEE80211_TTLM_NUM_TIDS];
186ac1d519cSBjoern A. Zeeb };
1876b4cac81SBjoern A. Zeeb
188b0f73768SBjoern A. Zeeb /* 802.11-2020 9.4.2.55.3 A-MPDU Parameters field */
189b0f73768SBjoern A. Zeeb #define IEEE80211_HT_AMPDU_PARM_FACTOR 0x3
190b0f73768SBjoern A. Zeeb #define IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT 2
191b0f73768SBjoern A. Zeeb #define IEEE80211_HT_AMPDU_PARM_DENSITY (0x7 << IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT)
192b0f73768SBjoern A. Zeeb
193ac1d519cSBjoern A. Zeeb struct ieee80211_sta;
194ac1d519cSBjoern A. Zeeb
1956b4cac81SBjoern A. Zeeb struct ieee80211_ampdu_params {
1966b4cac81SBjoern A. Zeeb struct ieee80211_sta *sta;
1979fb91463SBjoern A. Zeeb enum ieee80211_ampdu_mlme_action action;
1989fb91463SBjoern A. Zeeb uint16_t buf_size;
1999fb91463SBjoern A. Zeeb uint16_t timeout;
2006b4cac81SBjoern A. Zeeb uint16_t ssn;
2019fb91463SBjoern A. Zeeb uint8_t tid;
2029fb91463SBjoern A. Zeeb bool amsdu;
2036b4cac81SBjoern A. Zeeb };
2046b4cac81SBjoern A. Zeeb
2056b4cac81SBjoern A. Zeeb struct ieee80211_bar {
2066b4cac81SBjoern A. Zeeb /* TODO FIXME */
2076b4cac81SBjoern A. Zeeb int control, start_seq_num;
2086b4cac81SBjoern A. Zeeb uint8_t *ra;
2096b4cac81SBjoern A. Zeeb uint16_t frame_control;
2106b4cac81SBjoern A. Zeeb };
2116b4cac81SBjoern A. Zeeb
2122e183d99SBjoern A. Zeeb struct ieee80211_mutable_offsets {
2136b4cac81SBjoern A. Zeeb /* TODO FIXME */
2142e183d99SBjoern A. Zeeb uint16_t tim_offset;
215b0f73768SBjoern A. Zeeb uint16_t cntdwn_counter_offs[2];
216b0f73768SBjoern A. Zeeb
217b0f73768SBjoern A. Zeeb int mbssid_off;
218b0f73768SBjoern A. Zeeb };
219b0f73768SBjoern A. Zeeb
220b0f73768SBjoern A. Zeeb struct mac80211_fils_discovery {
221b0f73768SBjoern A. Zeeb uint32_t max_interval;
2226b4cac81SBjoern A. Zeeb };
2236b4cac81SBjoern A. Zeeb
2240080f30fSBjoern A. Zeeb struct ieee80211_chanctx_conf {
2250080f30fSBjoern A. Zeeb struct cfg80211_chan_def def;
2260080f30fSBjoern A. Zeeb struct cfg80211_chan_def min_def;
227ac1d519cSBjoern A. Zeeb struct cfg80211_chan_def ap;
228ac1d519cSBjoern A. Zeeb
229ac1d519cSBjoern A. Zeeb uint8_t rx_chains_dynamic;
230ac1d519cSBjoern A. Zeeb uint8_t rx_chains_static;
231ac1d519cSBjoern A. Zeeb bool radar_enabled;
2320080f30fSBjoern A. Zeeb
2330080f30fSBjoern A. Zeeb /* Must stay last. */
2340080f30fSBjoern A. Zeeb uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
2350080f30fSBjoern A. Zeeb };
2360080f30fSBjoern A. Zeeb
237c990500bSBjoern A. Zeeb struct ieee80211_rate_status {
238c990500bSBjoern A. Zeeb struct rate_info rate_idx;
239adff403fSBjoern A. Zeeb uint8_t try_count;
240adff403fSBjoern A. Zeeb };
241adff403fSBjoern A. Zeeb
242adff403fSBjoern A. Zeeb struct ieee80211_ema_beacons {
243adff403fSBjoern A. Zeeb uint8_t cnt;
244adff403fSBjoern A. Zeeb struct {
245adff403fSBjoern A. Zeeb struct sk_buff *skb;
246adff403fSBjoern A. Zeeb struct ieee80211_mutable_offsets offs;
247adff403fSBjoern A. Zeeb } bcn[0];
248c990500bSBjoern A. Zeeb };
249c990500bSBjoern A. Zeeb
250ac1d519cSBjoern A. Zeeb struct ieee80211_chanreq {
251ac1d519cSBjoern A. Zeeb struct cfg80211_chan_def oper;
252ac1d519cSBjoern A. Zeeb };
253ac1d519cSBjoern A. Zeeb
2546b4cac81SBjoern A. Zeeb #define WLAN_MEMBERSHIP_LEN (8)
2556b4cac81SBjoern A. Zeeb #define WLAN_USER_POSITION_LEN (16)
2566b4cac81SBjoern A. Zeeb
257ac1d519cSBjoern A. Zeeb /*
258ac1d519cSBjoern A. Zeeb * 802.11ac-2013, 8.4.2.164 VHT Transmit Power Envelope element
259ac1d519cSBjoern A. Zeeb * 802.11-???? ?
260ac1d519cSBjoern A. Zeeb */
261ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_eirp {
262ac1d519cSBjoern A. Zeeb int8_t power[5];
263ac1d519cSBjoern A. Zeeb uint8_t count;
264ac1d519cSBjoern A. Zeeb bool valid;
265ac1d519cSBjoern A. Zeeb };
266ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_psd {
267ac1d519cSBjoern A. Zeeb int8_t power[16];
268ac1d519cSBjoern A. Zeeb uint8_t count;
269ac1d519cSBjoern A. Zeeb bool valid;
270ac1d519cSBjoern A. Zeeb };
271ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe {
272ac1d519cSBjoern A. Zeeb /* We see access to [0] so assume at least 2. */
273ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_eirp max_local[2];
274ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_eirp max_reg_client[2];
275ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_psd psd_local[2];
276ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe_psd psd_reg_client[2];
277ac1d519cSBjoern A. Zeeb };
278ac1d519cSBjoern A. Zeeb
2796b4cac81SBjoern A. Zeeb struct ieee80211_bss_conf {
2806b4cac81SBjoern A. Zeeb /* TODO FIXME */
281adff403fSBjoern A. Zeeb struct ieee80211_vif *vif;
282ac1d519cSBjoern A. Zeeb struct cfg80211_bss *bss;
283caaa79c3SBjoern A. Zeeb const uint8_t *bssid;
284adff403fSBjoern A. Zeeb uint8_t addr[ETH_ALEN];
285adff403fSBjoern A. Zeeb uint8_t link_id;
286adff403fSBjoern A. Zeeb uint8_t _pad0;
2876b4cac81SBjoern A. Zeeb uint8_t transmitter_bssid[ETH_ALEN];
2886b4cac81SBjoern A. Zeeb struct ieee80211_ftm_responder_params *ftmr_params;
2896b4cac81SBjoern A. Zeeb struct ieee80211_p2p_noa_attr p2p_noa_attr;
2907b43f4d0SBjoern A. Zeeb struct ieee80211_chanreq chanreq;
2916b4cac81SBjoern A. Zeeb __be32 arp_addr_list[1]; /* XXX TODO */
2926b4cac81SBjoern A. Zeeb struct ieee80211_rate *beacon_rate;
2936b4cac81SBjoern A. Zeeb struct {
2946b4cac81SBjoern A. Zeeb uint8_t membership[WLAN_MEMBERSHIP_LEN];
2956b4cac81SBjoern A. Zeeb uint8_t position[WLAN_USER_POSITION_LEN];
2966b4cac81SBjoern A. Zeeb } mu_group;
2971d70218eSBjoern A. Zeeb struct {
2981d70218eSBjoern A. Zeeb uint32_t params;
2991d70218eSBjoern A. Zeeb /* single field struct? */
3001d70218eSBjoern A. Zeeb } he_oper;
301b0f73768SBjoern A. Zeeb struct cfg80211_he_bss_color he_bss_color;
302b0f73768SBjoern A. Zeeb struct ieee80211_he_obss_pd he_obss_pd;
303adff403fSBjoern A. Zeeb
304adff403fSBjoern A. Zeeb bool ht_ldpc;
305adff403fSBjoern A. Zeeb bool vht_ldpc;
306adff403fSBjoern A. Zeeb bool he_ldpc;
307adff403fSBjoern A. Zeeb bool vht_mu_beamformee;
308adff403fSBjoern A. Zeeb bool vht_mu_beamformer;
309adff403fSBjoern A. Zeeb bool vht_su_beamformee;
310adff403fSBjoern A. Zeeb bool vht_su_beamformer;
311adff403fSBjoern A. Zeeb bool he_mu_beamformer;
312adff403fSBjoern A. Zeeb bool he_su_beamformee;
313adff403fSBjoern A. Zeeb bool he_su_beamformer;
314adff403fSBjoern A. Zeeb bool he_full_ul_mumimo;
315adff403fSBjoern A. Zeeb bool eht_su_beamformee;
316adff403fSBjoern A. Zeeb bool eht_su_beamformer;
317adff403fSBjoern A. Zeeb bool eht_mu_beamformer;
318adff403fSBjoern A. Zeeb
3196b4cac81SBjoern A. Zeeb uint16_t ht_operation_mode;
3206b4cac81SBjoern A. Zeeb int arp_addr_cnt;
321adff403fSBjoern A. Zeeb uint16_t eht_puncturing;
322c8dafefaSBjoern A. Zeeb
3236b4cac81SBjoern A. Zeeb uint8_t dtim_period;
324b0f73768SBjoern A. Zeeb uint8_t sync_dtim_count;
325e6010da6SBjoern A. Zeeb uint8_t bss_param_ch_cnt_link_id;
3266b4cac81SBjoern A. Zeeb bool qos;
3276b4cac81SBjoern A. Zeeb bool twt_broadcast;
3286b4cac81SBjoern A. Zeeb bool use_cts_prot;
3296b4cac81SBjoern A. Zeeb bool use_short_preamble;
3306b4cac81SBjoern A. Zeeb bool use_short_slot;
331b0f73768SBjoern A. Zeeb bool he_support;
332adff403fSBjoern A. Zeeb bool eht_support;
333b0f73768SBjoern A. Zeeb bool csa_active;
334adff403fSBjoern A. Zeeb bool mu_mimo_owner;
3355321cf2bSBjoern A. Zeeb bool color_change_active;
336c8dafefaSBjoern A. Zeeb uint32_t sync_device_ts;
337c8dafefaSBjoern A. Zeeb uint64_t sync_tsf;
338b0f73768SBjoern A. Zeeb uint16_t beacon_int;
339c8dafefaSBjoern A. Zeeb int16_t txpower;
340b0f73768SBjoern A. Zeeb uint32_t basic_rates;
3412e183d99SBjoern A. Zeeb int mcast_rate[NUM_NL80211_BANDS];
342c1c98958SBjoern A. Zeeb enum ieee80211_ap_reg_power power_type;
343b0f73768SBjoern A. Zeeb struct cfg80211_bitrate_mask beacon_tx_rate;
344b0f73768SBjoern A. Zeeb struct mac80211_fils_discovery fils_discovery;
3450080f30fSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf;
346adff403fSBjoern A. Zeeb struct ieee80211_vif *mbssid_tx_vif;
347ac1d519cSBjoern A. Zeeb struct ieee80211_parsed_tpe tpe;
3486b4cac81SBjoern A. Zeeb
3496b4cac81SBjoern A. Zeeb int ack_enabled, bssid_index, bssid_indicator, cqm_rssi_hyst, cqm_rssi_thold, ema_ap, frame_time_rts_th, ftm_responder;
3506b4cac81SBjoern A. Zeeb int htc_trig_based_pkt_ext;
3516b4cac81SBjoern A. Zeeb int multi_sta_back_32bit, nontransmitted;
352c8dafefaSBjoern A. Zeeb int profile_periodicity;
3536b4cac81SBjoern A. Zeeb int twt_requester, uora_exists, uora_ocw_range;
3542e183d99SBjoern A. Zeeb int assoc_capability, enable_beacon, hidden_ssid, ibss_joined, twt_protected;
3551d70218eSBjoern A. Zeeb int twt_responder, unsol_bcast_probe_resp_interval;
3566b4cac81SBjoern A. Zeeb };
3576b4cac81SBjoern A. Zeeb
3586b4cac81SBjoern A. Zeeb struct ieee80211_channel_switch {
3596b4cac81SBjoern A. Zeeb /* TODO FIXME */
3606b4cac81SBjoern A. Zeeb int block_tx, count, delay, device_timestamp, timestamp;
361ac1d519cSBjoern A. Zeeb uint8_t link_id;
3626b4cac81SBjoern A. Zeeb struct cfg80211_chan_def chandef;
3636b4cac81SBjoern A. Zeeb };
3646b4cac81SBjoern A. Zeeb
3656b4cac81SBjoern A. Zeeb enum ieee80211_event_type {
3666b4cac81SBjoern A. Zeeb BA_FRAME_TIMEOUT,
3676b4cac81SBjoern A. Zeeb BAR_RX_EVENT,
3686b4cac81SBjoern A. Zeeb MLME_EVENT,
3696b4cac81SBjoern A. Zeeb RSSI_EVENT,
3706b4cac81SBjoern A. Zeeb };
3716b4cac81SBjoern A. Zeeb
3726b4cac81SBjoern A. Zeeb enum ieee80211_rssi_event_data {
3736b4cac81SBjoern A. Zeeb RSSI_EVENT_LOW,
3746b4cac81SBjoern A. Zeeb RSSI_EVENT_HIGH,
3756b4cac81SBjoern A. Zeeb };
3766b4cac81SBjoern A. Zeeb
3776b4cac81SBjoern A. Zeeb enum ieee80211_mlme_event_data {
3786b4cac81SBjoern A. Zeeb ASSOC_EVENT,
3796b4cac81SBjoern A. Zeeb AUTH_EVENT,
3806b4cac81SBjoern A. Zeeb DEAUTH_RX_EVENT,
3816b4cac81SBjoern A. Zeeb DEAUTH_TX_EVENT,
3826b4cac81SBjoern A. Zeeb };
3836b4cac81SBjoern A. Zeeb
3846b4cac81SBjoern A. Zeeb enum ieee80211_mlme_event_status {
3856b4cac81SBjoern A. Zeeb MLME_DENIED,
3866b4cac81SBjoern A. Zeeb MLME_TIMEOUT,
3876b4cac81SBjoern A. Zeeb };
3886b4cac81SBjoern A. Zeeb
3896b4cac81SBjoern A. Zeeb struct ieee80211_mlme_event {
3906b4cac81SBjoern A. Zeeb enum ieee80211_mlme_event_data data;
3916b4cac81SBjoern A. Zeeb enum ieee80211_mlme_event_status status;
3926b4cac81SBjoern A. Zeeb int reason;
3936b4cac81SBjoern A. Zeeb };
3946b4cac81SBjoern A. Zeeb
3956b4cac81SBjoern A. Zeeb struct ieee80211_event {
3966b4cac81SBjoern A. Zeeb /* TODO FIXME */
3976b4cac81SBjoern A. Zeeb enum ieee80211_event_type type;
3986b4cac81SBjoern A. Zeeb union {
3996b4cac81SBjoern A. Zeeb struct {
4006b4cac81SBjoern A. Zeeb int ssn;
4016b4cac81SBjoern A. Zeeb struct ieee80211_sta *sta;
4026b4cac81SBjoern A. Zeeb uint8_t tid;
4036b4cac81SBjoern A. Zeeb } ba;
4046b4cac81SBjoern A. Zeeb struct ieee80211_mlme_event mlme;
4056b4cac81SBjoern A. Zeeb } u;
4066b4cac81SBjoern A. Zeeb };
4076b4cac81SBjoern A. Zeeb
4086b4cac81SBjoern A. Zeeb struct ieee80211_ftm_responder_params {
4096b4cac81SBjoern A. Zeeb /* TODO FIXME */
4106b4cac81SBjoern A. Zeeb uint8_t *lci;
4116b4cac81SBjoern A. Zeeb uint8_t *civicloc;
4126b4cac81SBjoern A. Zeeb int lci_len;
4136b4cac81SBjoern A. Zeeb int civicloc_len;
4146b4cac81SBjoern A. Zeeb };
4156b4cac81SBjoern A. Zeeb
4162e183d99SBjoern A. Zeeb struct ieee80211_conf {
4172e183d99SBjoern A. Zeeb int dynamic_ps_timeout;
418b0f73768SBjoern A. Zeeb int power_level;
4192e183d99SBjoern A. Zeeb uint32_t listen_interval;
420b0f73768SBjoern A. Zeeb bool radar_enabled;
4212e183d99SBjoern A. Zeeb enum ieee80211_hw_conf_flags flags;
4222e183d99SBjoern A. Zeeb struct cfg80211_chan_def chandef;
4232e183d99SBjoern A. Zeeb };
4242e183d99SBjoern A. Zeeb
4256b4cac81SBjoern A. Zeeb enum ieee80211_hw_flags {
4266b4cac81SBjoern A. Zeeb IEEE80211_HW_AMPDU_AGGREGATION,
4276b4cac81SBjoern A. Zeeb IEEE80211_HW_AP_LINK_PS,
4286b4cac81SBjoern A. Zeeb IEEE80211_HW_BUFF_MMPDU_TXQ,
4296b4cac81SBjoern A. Zeeb IEEE80211_HW_CHANCTX_STA_CSA,
4306b4cac81SBjoern A. Zeeb IEEE80211_HW_CONNECTION_MONITOR,
4316b4cac81SBjoern A. Zeeb IEEE80211_HW_DEAUTH_NEED_MGD_TX_PREP,
4326b4cac81SBjoern A. Zeeb IEEE80211_HW_HAS_RATE_CONTROL,
4336b4cac81SBjoern A. Zeeb IEEE80211_HW_MFP_CAPABLE,
4346b4cac81SBjoern A. Zeeb IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR,
4356b4cac81SBjoern A. Zeeb IEEE80211_HW_REPORTS_TX_ACK_STATUS,
4366b4cac81SBjoern A. Zeeb IEEE80211_HW_RX_INCLUDES_FCS,
4376b4cac81SBjoern A. Zeeb IEEE80211_HW_SIGNAL_DBM,
4386b4cac81SBjoern A. Zeeb IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS,
4396b4cac81SBjoern A. Zeeb IEEE80211_HW_SPECTRUM_MGMT,
4406b4cac81SBjoern A. Zeeb IEEE80211_HW_STA_MMPDU_TXQ,
4416b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU,
4426b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_CLONED_SKBS,
4436b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_DYNAMIC_PS,
4446b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_MULTI_BSSID,
4456b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
4466b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_PS,
4476b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_REORDERING_BUFFER,
4486b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW,
4496b4cac81SBjoern A. Zeeb IEEE80211_HW_SUPPORT_FAST_XMIT,
4506b4cac81SBjoern A. Zeeb IEEE80211_HW_TDLS_WIDER_BW,
4516b4cac81SBjoern A. Zeeb IEEE80211_HW_TIMING_BEACON_ONLY,
4526b4cac81SBjoern A. Zeeb IEEE80211_HW_TX_AMPDU_SETUP_IN_HW,
4536b4cac81SBjoern A. Zeeb IEEE80211_HW_TX_AMSDU,
4546b4cac81SBjoern A. Zeeb IEEE80211_HW_TX_FRAG_LIST,
4556b4cac81SBjoern A. Zeeb IEEE80211_HW_USES_RSS,
4566b4cac81SBjoern A. Zeeb IEEE80211_HW_WANT_MONITOR_VIF,
4572e183d99SBjoern A. Zeeb IEEE80211_HW_SW_CRYPTO_CONTROL,
4582e183d99SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_TX_FRAG,
4592e183d99SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
4602e183d99SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_PER_STA_GTK,
4612e183d99SBjoern A. Zeeb IEEE80211_HW_REPORTS_LOW_ACK,
4622e183d99SBjoern A. Zeeb IEEE80211_HW_QUEUE_CONTROL,
463b0f73768SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
464b0f73768SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
465b0f73768SBjoern A. Zeeb IEEE80211_HW_SUPPORTS_RC_TABLE,
466adff403fSBjoern A. Zeeb IEEE80211_HW_DETECTS_COLOR_COLLISION,
467ac1d519cSBjoern A. Zeeb IEEE80211_HW_DISALLOW_PUNCTURING,
468ac1d519cSBjoern A. Zeeb IEEE80211_HW_DISALLOW_PUNCTURING_5GHZ,
469ac1d519cSBjoern A. Zeeb IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
470ac1d519cSBjoern A. Zeeb IEEE80211_HW_HANDLES_QUIET_CSA,
471675e6b1cSBjoern A. Zeeb IEEE80211_HW_NO_VIRTUAL_MONITOR,
4726b4cac81SBjoern A. Zeeb
4736b4cac81SBjoern A. Zeeb /* Keep last. */
4746b4cac81SBjoern A. Zeeb NUM_IEEE80211_HW_FLAGS
4756b4cac81SBjoern A. Zeeb };
4766b4cac81SBjoern A. Zeeb
4776b4cac81SBjoern A. Zeeb struct ieee80211_hw {
4786b4cac81SBjoern A. Zeeb
4796b4cac81SBjoern A. Zeeb struct wiphy *wiphy;
4806b4cac81SBjoern A. Zeeb
4816b4cac81SBjoern A. Zeeb /* TODO FIXME */
4826b4cac81SBjoern A. Zeeb int extra_tx_headroom, weight_multiplier;
4836b4cac81SBjoern A. Zeeb int max_rate_tries, max_rates, max_report_rates;
4846b4cac81SBjoern A. Zeeb const char *rate_control_algorithm;
4856b4cac81SBjoern A. Zeeb struct {
4866b4cac81SBjoern A. Zeeb uint16_t units_pos; /* radiotap "spec" is .. inconsistent. */
4876b4cac81SBjoern A. Zeeb uint16_t accuracy;
4886b4cac81SBjoern A. Zeeb } radiotap_timestamp;
4896b4cac81SBjoern A. Zeeb size_t sta_data_size;
4906b4cac81SBjoern A. Zeeb size_t vif_data_size;
4916b4cac81SBjoern A. Zeeb size_t chanctx_data_size;
4926b4cac81SBjoern A. Zeeb size_t txq_data_size;
4936b4cac81SBjoern A. Zeeb uint16_t radiotap_mcs_details;
4946b4cac81SBjoern A. Zeeb uint16_t radiotap_vht_details;
4956b4cac81SBjoern A. Zeeb uint16_t queues;
4966b4cac81SBjoern A. Zeeb uint16_t offchannel_tx_hw_queue;
4976b4cac81SBjoern A. Zeeb uint16_t uapsd_max_sp_len;
4986b4cac81SBjoern A. Zeeb uint16_t uapsd_queues;
4999fb91463SBjoern A. Zeeb uint16_t max_rx_aggregation_subframes;
5009fb91463SBjoern A. Zeeb uint16_t max_tx_aggregation_subframes;
5016b4cac81SBjoern A. Zeeb uint16_t max_tx_fragments;
5026b4cac81SBjoern A. Zeeb uint16_t max_listen_interval;
5030080f30fSBjoern A. Zeeb uint32_t extra_beacon_tailroom;
5046b4cac81SBjoern A. Zeeb netdev_features_t netdev_features;
5056b4cac81SBjoern A. Zeeb unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)];
5062e183d99SBjoern A. Zeeb struct ieee80211_conf conf;
5076b4cac81SBjoern A. Zeeb
5086b4cac81SBjoern A. Zeeb #if 0 /* leave here for documentation purposes. This does NOT work. */
5096b4cac81SBjoern A. Zeeb /* Must stay last. */
5106b4cac81SBjoern A. Zeeb uint8_t priv[0] __aligned(CACHE_LINE_SIZE);
5116b4cac81SBjoern A. Zeeb #else
5126b4cac81SBjoern A. Zeeb void *priv;
5136b4cac81SBjoern A. Zeeb #endif
5146b4cac81SBjoern A. Zeeb };
5156b4cac81SBjoern A. Zeeb
5166b4cac81SBjoern A. Zeeb enum ieee802111_key_flag {
5176b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_GENERATE_IV = BIT(0),
5186b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_GENERATE_MMIC = BIT(1),
5196b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_PAIRWISE = BIT(2),
5206b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(3),
5216b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_PUT_MIC_SPACE = BIT(4),
5226b4cac81SBjoern A. Zeeb IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(5),
5232e183d99SBjoern A. Zeeb IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(6),
524b0f73768SBjoern A. Zeeb IEEE80211_KEY_FLAG_GENERATE_MMIE = BIT(7),
5251d70218eSBjoern A. Zeeb IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(8),
526ac1d519cSBjoern A. Zeeb IEEE80211_KEY_FLAG_SPP_AMSDU = BIT(9),
5276b4cac81SBjoern A. Zeeb };
5286b4cac81SBjoern A. Zeeb
52952e39daeSBjoern A. Zeeb #define IEEE80211_KEY_FLAG_BITS \
53052e39daeSBjoern A. Zeeb "\20\1GENERATE_IV\2GENERATE_MMIC\3PAIRWISE\4PUT_IV_SPACE" \
53152e39daeSBjoern A. Zeeb "\5PUT_MIC_SPACE\6SW_MGMT_TX\7GENERATE_IV_MGMT\10GENERATE_MMIE" \
53252e39daeSBjoern A. Zeeb "\11RESERVE_TAILROOM\12SPP_AMSDU"
53352e39daeSBjoern A. Zeeb
5346b4cac81SBjoern A. Zeeb struct ieee80211_key_conf {
53511db70b6SBjoern A. Zeeb #if defined(__FreeBSD__)
53611db70b6SBjoern A. Zeeb const struct ieee80211_key *_k; /* backpointer to net80211 */
53711db70b6SBjoern A. Zeeb #endif
5386b4cac81SBjoern A. Zeeb atomic64_t tx_pn;
5396b4cac81SBjoern A. Zeeb uint32_t cipher;
5406b4cac81SBjoern A. Zeeb uint8_t icv_len; /* __unused nowadays? */
5416b4cac81SBjoern A. Zeeb uint8_t iv_len;
5426b4cac81SBjoern A. Zeeb uint8_t hw_key_idx; /* Set by drv. */
5436b4cac81SBjoern A. Zeeb uint8_t keyidx;
5446b4cac81SBjoern A. Zeeb uint16_t flags;
545adff403fSBjoern A. Zeeb int8_t link_id; /* signed! */
546828ce22fSBjoern A. Zeeb uint8_t keylen;
547828ce22fSBjoern A. Zeeb uint8_t key[0]; /* Must stay last! */
5486b4cac81SBjoern A. Zeeb };
5496b4cac81SBjoern A. Zeeb
5506b4cac81SBjoern A. Zeeb struct ieee80211_key_seq {
5516b4cac81SBjoern A. Zeeb /* TODO FIXME */
5526b4cac81SBjoern A. Zeeb union {
5536b4cac81SBjoern A. Zeeb struct {
5546b4cac81SBjoern A. Zeeb uint8_t seq[IEEE80211_MAX_PN_LEN];
5556b4cac81SBjoern A. Zeeb uint8_t seq_len;
5566b4cac81SBjoern A. Zeeb } hw;
5576b4cac81SBjoern A. Zeeb struct {
5586b4cac81SBjoern A. Zeeb uint8_t pn[IEEE80211_CCMP_PN_LEN];
5596b4cac81SBjoern A. Zeeb } ccmp;
5606b4cac81SBjoern A. Zeeb struct {
561c8a6676eSBjoern A. Zeeb uint8_t pn[IEEE80211_GCMP_PN_LEN];
562c8a6676eSBjoern A. Zeeb } gcmp;
563c8a6676eSBjoern A. Zeeb struct {
564c8a6676eSBjoern A. Zeeb uint8_t pn[IEEE80211_CMAC_PN_LEN];
5656b4cac81SBjoern A. Zeeb } aes_cmac;
5666b4cac81SBjoern A. Zeeb struct {
567c8a6676eSBjoern A. Zeeb uint8_t pn[IEEE80211_GMAC_PN_LEN];
5682f029bf9SBjoern A. Zeeb } aes_gmac;
5692f029bf9SBjoern A. Zeeb struct {
5706b4cac81SBjoern A. Zeeb uint32_t iv32;
5716b4cac81SBjoern A. Zeeb uint16_t iv16;
5726b4cac81SBjoern A. Zeeb } tkip;
5736b4cac81SBjoern A. Zeeb };
5746b4cac81SBjoern A. Zeeb };
5756b4cac81SBjoern A. Zeeb
5766b4cac81SBjoern A. Zeeb
5776b4cac81SBjoern A. Zeeb enum ieee80211_rx_status_flags {
5786b4cac81SBjoern A. Zeeb RX_FLAG_ALLOW_SAME_PN = BIT(0),
5796b4cac81SBjoern A. Zeeb RX_FLAG_AMPDU_DETAILS = BIT(1),
5806b4cac81SBjoern A. Zeeb RX_FLAG_AMPDU_EOF_BIT = BIT(2),
5816b4cac81SBjoern A. Zeeb RX_FLAG_AMPDU_EOF_BIT_KNOWN = BIT(3),
5826b4cac81SBjoern A. Zeeb RX_FLAG_DECRYPTED = BIT(4),
5836b4cac81SBjoern A. Zeeb RX_FLAG_DUP_VALIDATED = BIT(5),
5846b4cac81SBjoern A. Zeeb RX_FLAG_FAILED_FCS_CRC = BIT(6),
5856b4cac81SBjoern A. Zeeb RX_FLAG_ICV_STRIPPED = BIT(7),
58649010ba7SBjoern A. Zeeb RX_FLAG_MACTIME = BIT(8) | BIT(9),
58749010ba7SBjoern A. Zeeb RX_FLAG_MACTIME_PLCP_START = 1 << 8,
58849010ba7SBjoern A. Zeeb RX_FLAG_MACTIME_START = 2 << 8,
58949010ba7SBjoern A. Zeeb RX_FLAG_MACTIME_END = 3 << 8,
5906b4cac81SBjoern A. Zeeb RX_FLAG_MIC_STRIPPED = BIT(10),
5916b4cac81SBjoern A. Zeeb RX_FLAG_MMIC_ERROR = BIT(11),
5926b4cac81SBjoern A. Zeeb RX_FLAG_MMIC_STRIPPED = BIT(12),
5936b4cac81SBjoern A. Zeeb RX_FLAG_NO_PSDU = BIT(13),
5946b4cac81SBjoern A. Zeeb RX_FLAG_PN_VALIDATED = BIT(14),
5956b4cac81SBjoern A. Zeeb RX_FLAG_RADIOTAP_HE = BIT(15),
5966b4cac81SBjoern A. Zeeb RX_FLAG_RADIOTAP_HE_MU = BIT(16),
5976b4cac81SBjoern A. Zeeb RX_FLAG_RADIOTAP_LSIG = BIT(17),
5986b4cac81SBjoern A. Zeeb RX_FLAG_RADIOTAP_VENDOR_DATA = BIT(18),
5996b4cac81SBjoern A. Zeeb RX_FLAG_NO_SIGNAL_VAL = BIT(19),
6002e183d99SBjoern A. Zeeb RX_FLAG_IV_STRIPPED = BIT(20),
6012e183d99SBjoern A. Zeeb RX_FLAG_AMPDU_IS_LAST = BIT(21),
6022e183d99SBjoern A. Zeeb RX_FLAG_AMPDU_LAST_KNOWN = BIT(22),
6032e183d99SBjoern A. Zeeb RX_FLAG_AMSDU_MORE = BIT(23),
60449010ba7SBjoern A. Zeeb /* = BIT(24), */
6052e183d99SBjoern A. Zeeb RX_FLAG_ONLY_MONITOR = BIT(25),
6062e183d99SBjoern A. Zeeb RX_FLAG_SKIP_MONITOR = BIT(26),
607b0f73768SBjoern A. Zeeb RX_FLAG_8023 = BIT(27),
608adff403fSBjoern A. Zeeb RX_FLAG_RADIOTAP_TLV_AT_END = BIT(28),
60949010ba7SBjoern A. Zeeb /* = BIT(29), */
610ac1d519cSBjoern A. Zeeb RX_FLAG_MACTIME_IS_RTAP_TS64 = BIT(30),
611ac1d519cSBjoern A. Zeeb RX_FLAG_FAILED_PLCP_CRC = BIT(31),
612b0f73768SBjoern A. Zeeb };
613b0f73768SBjoern A. Zeeb
614f1aeb5d8SBjoern A. Zeeb #define IEEE80211_RX_STATUS_FLAGS_BITS \
615f1aeb5d8SBjoern A. Zeeb "\20\1ALLOW_SAME_PN\2AMPDU_DETAILS\3AMPDU_EOF_BIT\4AMPDU_EOF_BIT_KNOWN" \
616f1aeb5d8SBjoern A. Zeeb "\5DECRYPTED\6DUP_VALIDATED\7FAILED_FCS_CRC\10ICV_STRIPPED" \
617f1aeb5d8SBjoern A. Zeeb "\11MACTIME_PLCP_START\12MACTIME_START\13MIC_STRIPPED" \
618f1aeb5d8SBjoern A. Zeeb "\14MMIC_ERROR\15MMIC_STRIPPED\16NO_PSDU\17PN_VALIDATED" \
619f1aeb5d8SBjoern A. Zeeb "\20RADIOTAP_HE\21RADIOTAP_HE_MU\22RADIOTAP_LSIG\23RADIOTAP_VENDOR_DATA" \
620f1aeb5d8SBjoern A. Zeeb "\24NO_SIGNAL_VAL\25IV_STRIPPED\26AMPDU_IS_LAST\27AMPDU_LAST_KNOWN" \
621f1aeb5d8SBjoern A. Zeeb "\30AMSDU_MORE\31MACTIME_END\32ONLY_MONITOR\33SKIP_MONITOR" \
622f1aeb5d8SBjoern A. Zeeb "\348023\35RADIOTAP_TLV_AT_END\36MACTIME\37MACTIME_IS_RTAP_TS64" \
623f1aeb5d8SBjoern A. Zeeb "\40FAILED_PLCP_CRC"
624f1aeb5d8SBjoern A. Zeeb
625b0f73768SBjoern A. Zeeb enum mac80211_rx_encoding {
626b0f73768SBjoern A. Zeeb RX_ENC_LEGACY = 0,
627b0f73768SBjoern A. Zeeb RX_ENC_HT,
628b0f73768SBjoern A. Zeeb RX_ENC_VHT,
629adff403fSBjoern A. Zeeb RX_ENC_HE,
630adff403fSBjoern A. Zeeb RX_ENC_EHT,
6316b4cac81SBjoern A. Zeeb };
6326b4cac81SBjoern A. Zeeb
6336b4cac81SBjoern A. Zeeb struct ieee80211_rx_status {
6346b4cac81SBjoern A. Zeeb /* TODO FIXME, this is too large. Over-reduce types to u8 where possible. */
635adff403fSBjoern A. Zeeb union {
636c8dafefaSBjoern A. Zeeb uint64_t boottime_ns;
637adff403fSBjoern A. Zeeb int64_t ack_tx_hwtstamp;
638adff403fSBjoern A. Zeeb };
639c8dafefaSBjoern A. Zeeb uint64_t mactime;
640c8dafefaSBjoern A. Zeeb uint32_t device_timestamp;
6416b4cac81SBjoern A. Zeeb enum ieee80211_rx_status_flags flag;
642c8dafefaSBjoern A. Zeeb uint16_t freq;
643adff403fSBjoern A. Zeeb uint8_t encoding:3, bw:4; /* enum mac80211_rx_encoding, rate_info_bw */ /* See mt76.h */
644c8dafefaSBjoern A. Zeeb uint8_t ampdu_reference;
645c8dafefaSBjoern A. Zeeb uint8_t band;
646c8dafefaSBjoern A. Zeeb uint8_t chains;
64760970a32SBjoern A. Zeeb int8_t chain_signal[IEEE80211_MAX_CHAINS];
64860970a32SBjoern A. Zeeb int8_t signal;
649c8dafefaSBjoern A. Zeeb uint8_t enc_flags;
650adff403fSBjoern A. Zeeb union {
651adff403fSBjoern A. Zeeb struct {
652adff403fSBjoern A. Zeeb uint8_t he_ru:3; /* nl80211::enum nl80211_he_ru_alloc */
653adff403fSBjoern A. Zeeb uint8_t he_gi:2; /* nl80211::enum nl80211_he_gi */
654adff403fSBjoern A. Zeeb uint8_t he_dcm:1;
655adff403fSBjoern A. Zeeb };
656adff403fSBjoern A. Zeeb struct {
657adff403fSBjoern A. Zeeb uint8_t ru:4; /* nl80211::enum nl80211_eht_ru_alloc */
658adff403fSBjoern A. Zeeb uint8_t gi:2; /* nl80211::enum nl80211_eht_gi */
659adff403fSBjoern A. Zeeb } eht;
660adff403fSBjoern A. Zeeb };
661adff403fSBjoern A. Zeeb bool link_valid;
662adff403fSBjoern A. Zeeb uint8_t link_id; /* very incosistent sizes? */
663c8dafefaSBjoern A. Zeeb uint8_t zero_length_psdu_type;
6646b4cac81SBjoern A. Zeeb uint8_t nss;
6656b4cac81SBjoern A. Zeeb uint8_t rate_idx;
6666b4cac81SBjoern A. Zeeb };
6676b4cac81SBjoern A. Zeeb
668b0f73768SBjoern A. Zeeb struct ieee80211_tx_status {
669b0f73768SBjoern A. Zeeb struct ieee80211_sta *sta;
670b0f73768SBjoern A. Zeeb struct ieee80211_tx_info *info;
671adff403fSBjoern A. Zeeb int64_t ack_hwtstamp;
672b0f73768SBjoern A. Zeeb
673b0f73768SBjoern A. Zeeb u8 n_rates;
674c990500bSBjoern A. Zeeb struct ieee80211_rate_status *rates;
675b0f73768SBjoern A. Zeeb
676b0f73768SBjoern A. Zeeb struct sk_buff *skb;
677b0f73768SBjoern A. Zeeb struct list_head *free_list;
678b0f73768SBjoern A. Zeeb };
679b0f73768SBjoern A. Zeeb
6806b4cac81SBjoern A. Zeeb struct ieee80211_scan_ies {
6816b4cac81SBjoern A. Zeeb /* TODO FIXME */
6826b4cac81SBjoern A. Zeeb int common_ie_len;
6836b4cac81SBjoern A. Zeeb int len[NUM_NL80211_BANDS];
6846b4cac81SBjoern A. Zeeb uint8_t *common_ies;
6856b4cac81SBjoern A. Zeeb uint8_t *ies[NUM_NL80211_BANDS];
6866b4cac81SBjoern A. Zeeb };
6876b4cac81SBjoern A. Zeeb
6886b4cac81SBjoern A. Zeeb struct ieee80211_scan_request {
6896b4cac81SBjoern A. Zeeb struct ieee80211_scan_ies ies;
6906b4cac81SBjoern A. Zeeb struct cfg80211_scan_request req;
6916b4cac81SBjoern A. Zeeb };
6926b4cac81SBjoern A. Zeeb
6936b4cac81SBjoern A. Zeeb struct ieee80211_txq {
6946b4cac81SBjoern A. Zeeb struct ieee80211_sta *sta;
6956b4cac81SBjoern A. Zeeb struct ieee80211_vif *vif;
6966b4cac81SBjoern A. Zeeb int ac;
6976b4cac81SBjoern A. Zeeb uint8_t tid;
6986b4cac81SBjoern A. Zeeb
6996b4cac81SBjoern A. Zeeb /* Must stay last. */
7006b4cac81SBjoern A. Zeeb uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
7016b4cac81SBjoern A. Zeeb };
7026b4cac81SBjoern A. Zeeb
7036b4cac81SBjoern A. Zeeb struct ieee80211_sta_rates {
7046b4cac81SBjoern A. Zeeb /* XXX TODO */
7056b4cac81SBjoern A. Zeeb /* XXX some _rcu thing */
7066b4cac81SBjoern A. Zeeb struct {
707675e6b1cSBjoern A. Zeeb uint8_t idx;
708675e6b1cSBjoern A. Zeeb uint8_t count;
709675e6b1cSBjoern A. Zeeb uint16_t flags;
710675e6b1cSBjoern A. Zeeb } rate[4]; /* XXX what is the real number? */
7116b4cac81SBjoern A. Zeeb };
7126b4cac81SBjoern A. Zeeb
7132e183d99SBjoern A. Zeeb struct ieee80211_sta_txpwr {
7142e183d99SBjoern A. Zeeb /* XXX TODO */
7152e183d99SBjoern A. Zeeb enum nl80211_tx_power_setting type;
7162e183d99SBjoern A. Zeeb short power;
7172e183d99SBjoern A. Zeeb };
7182e183d99SBjoern A. Zeeb
719adff403fSBjoern A. Zeeb #define IEEE80211_NUM_TIDS 16 /* net80211::WME_NUM_TID */
720c990500bSBjoern A. Zeeb struct ieee80211_sta_agg {
721adff403fSBjoern A. Zeeb uint16_t max_amsdu_len;
722adff403fSBjoern A. Zeeb uint16_t max_rc_amsdu_len;
723adff403fSBjoern A. Zeeb uint16_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
724c990500bSBjoern A. Zeeb };
725c990500bSBjoern A. Zeeb
7266cf748adSBjoern A. Zeeb struct ieee80211_link_sta {
72707f65755SBjoern A. Zeeb struct ieee80211_sta *sta;
728adff403fSBjoern A. Zeeb uint8_t addr[ETH_ALEN];
729adff403fSBjoern A. Zeeb uint8_t link_id;
7306cf748adSBjoern A. Zeeb uint32_t supp_rates[NUM_NL80211_BANDS];
7316b4cac81SBjoern A. Zeeb struct ieee80211_sta_ht_cap ht_cap;
7326b4cac81SBjoern A. Zeeb struct ieee80211_sta_vht_cap vht_cap;
7336b4cac81SBjoern A. Zeeb struct ieee80211_sta_he_cap he_cap;
734675e6b1cSBjoern A. Zeeb struct ieee80211_he_6ghz_capa he_6ghz_capa;
735adff403fSBjoern A. Zeeb struct ieee80211_sta_eht_cap eht_cap;
7366cf748adSBjoern A. Zeeb uint8_t rx_nss;
7376cf748adSBjoern A. Zeeb enum ieee80211_sta_rx_bw bandwidth;
738c990500bSBjoern A. Zeeb enum ieee80211_smps_mode smps_mode;
739c990500bSBjoern A. Zeeb struct ieee80211_sta_agg agg;
7406cf748adSBjoern A. Zeeb struct ieee80211_sta_txpwr txpwr;
7416cf748adSBjoern A. Zeeb };
7426cf748adSBjoern A. Zeeb
7436cf748adSBjoern A. Zeeb struct ieee80211_sta {
7446cf748adSBjoern A. Zeeb /* TODO FIXME */
745adff403fSBjoern A. Zeeb int max_amsdu_subframes;
74605e640dcSBjoern A. Zeeb int mfp, smps_mode, tdls, tdls_initiator;
7476b4cac81SBjoern A. Zeeb struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; /* iwlwifi: 8 and adds +1 to tid_data, net80211::IEEE80211_TID_SIZE */
7486b4cac81SBjoern A. Zeeb struct ieee80211_sta_rates *rates; /* some rcu thing? */
7496b4cac81SBjoern A. Zeeb uint8_t addr[ETH_ALEN];
7506b4cac81SBjoern A. Zeeb uint16_t aid;
75105e640dcSBjoern A. Zeeb bool wme;
75271034267SBjoern A. Zeeb bool mlo;
75305e640dcSBjoern A. Zeeb uint8_t max_sp;
75405e640dcSBjoern A. Zeeb uint8_t uapsd_queues;
755adff403fSBjoern A. Zeeb uint16_t valid_links;
7566b4cac81SBjoern A. Zeeb
7576cf748adSBjoern A. Zeeb struct ieee80211_link_sta deflink;
758adff403fSBjoern A. Zeeb struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
759adff403fSBjoern A. Zeeb
7606b4cac81SBjoern A. Zeeb /* Must stay last. */
7616b4cac81SBjoern A. Zeeb uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
7626b4cac81SBjoern A. Zeeb };
7636b4cac81SBjoern A. Zeeb
7646b4cac81SBjoern A. Zeeb struct ieee80211_tdls_ch_sw_params {
7656b4cac81SBjoern A. Zeeb /* TODO FIXME */
7666b4cac81SBjoern A. Zeeb int action_code, ch_sw_tm_ie, status, switch_time, switch_timeout, timestamp;
7676b4cac81SBjoern A. Zeeb struct ieee80211_sta *sta;
7686b4cac81SBjoern A. Zeeb struct cfg80211_chan_def *chandef;
7696b4cac81SBjoern A. Zeeb struct sk_buff *tmpl_skb;
7706b4cac81SBjoern A. Zeeb };
7716b4cac81SBjoern A. Zeeb
7726b4cac81SBjoern A. Zeeb struct ieee80211_tx_control {
7736b4cac81SBjoern A. Zeeb /* TODO FIXME */
7746b4cac81SBjoern A. Zeeb struct ieee80211_sta *sta;
7756b4cac81SBjoern A. Zeeb };
7766b4cac81SBjoern A. Zeeb
7776b4cac81SBjoern A. Zeeb struct ieee80211_tx_queue_params {
7786b4cac81SBjoern A. Zeeb /* These types are based on iwlwifi FW structs. */
7796b4cac81SBjoern A. Zeeb uint16_t cw_min;
7806b4cac81SBjoern A. Zeeb uint16_t cw_max;
7816b4cac81SBjoern A. Zeeb uint16_t txop;
7826b4cac81SBjoern A. Zeeb uint8_t aifs;
7836b4cac81SBjoern A. Zeeb
7846b4cac81SBjoern A. Zeeb /* TODO FIXME */
7856b4cac81SBjoern A. Zeeb int acm, mu_edca, uapsd;
7866b4cac81SBjoern A. Zeeb struct ieee80211_he_mu_edca_param_ac_rec mu_edca_param_rec;
7876b4cac81SBjoern A. Zeeb };
7886b4cac81SBjoern A. Zeeb
7896b4cac81SBjoern A. Zeeb struct ieee80211_tx_rate {
7906b4cac81SBjoern A. Zeeb uint8_t idx;
7916b4cac81SBjoern A. Zeeb uint16_t count:5,
7926b4cac81SBjoern A. Zeeb flags:11;
7936b4cac81SBjoern A. Zeeb };
7946b4cac81SBjoern A. Zeeb
7956b4cac81SBjoern A. Zeeb enum ieee80211_vif_driver_flags {
7966b4cac81SBjoern A. Zeeb IEEE80211_VIF_BEACON_FILTER = BIT(0),
7976b4cac81SBjoern A. Zeeb IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1),
7986b4cac81SBjoern A. Zeeb IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2),
7997b43f4d0SBjoern A. Zeeb #if defined(LINUXKPI_VERSION) && (LINUXKPI_VERSION < 60600) /* v6.6 */
800ac1d519cSBjoern A. Zeeb IEEE80211_VIF_DISABLE_SMPS_OVERRIDE = BIT(3), /* Renamed to IEEE80211_VIF_EML_ACTIVE. */
8017b43f4d0SBjoern A. Zeeb #endif
802ac1d519cSBjoern A. Zeeb IEEE80211_VIF_EML_ACTIVE = BIT(4),
803ac1d519cSBjoern A. Zeeb IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW = BIT(5),
804e6010da6SBjoern A. Zeeb IEEE80211_VIF_REMOVE_AP_AFTER_DISASSOC = BIT(6),
8056b4cac81SBjoern A. Zeeb };
8066b4cac81SBjoern A. Zeeb
807b0f73768SBjoern A. Zeeb #define IEEE80211_BSS_ARP_ADDR_LIST_LEN 4
808b0f73768SBjoern A. Zeeb
809b0f73768SBjoern A. Zeeb struct ieee80211_vif_cfg {
810b0f73768SBjoern A. Zeeb uint16_t aid;
811adff403fSBjoern A. Zeeb uint16_t eml_cap;
812adff403fSBjoern A. Zeeb uint16_t eml_med_sync_delay;
813b0f73768SBjoern A. Zeeb bool assoc;
814c990500bSBjoern A. Zeeb bool ps;
815adff403fSBjoern A. Zeeb bool idle;
816adff403fSBjoern A. Zeeb bool ibss_joined;
817b0f73768SBjoern A. Zeeb int arp_addr_cnt;
818adff403fSBjoern A. Zeeb size_t ssid_len;
819b0f73768SBjoern A. Zeeb uint32_t arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; /* big endian */
820adff403fSBjoern A. Zeeb uint8_t ssid[IEEE80211_NWID_LEN];
821adff403fSBjoern A. Zeeb uint8_t ap_addr[ETH_ALEN];
822b0f73768SBjoern A. Zeeb };
823b0f73768SBjoern A. Zeeb
8246b4cac81SBjoern A. Zeeb struct ieee80211_vif {
8256b4cac81SBjoern A. Zeeb /* TODO FIXME */
8266b4cac81SBjoern A. Zeeb enum nl80211_iftype type;
8272e183d99SBjoern A. Zeeb int cab_queue;
8285321cf2bSBjoern A. Zeeb int offload_flags;
8296b4cac81SBjoern A. Zeeb enum ieee80211_vif_driver_flags driver_flags;
8306b4cac81SBjoern A. Zeeb bool p2p;
8316b4cac81SBjoern A. Zeeb bool probe_req_reg;
8326b4cac81SBjoern A. Zeeb uint8_t addr[ETH_ALEN];
833b0f73768SBjoern A. Zeeb struct ieee80211_vif_cfg cfg;
8346b4cac81SBjoern A. Zeeb struct ieee80211_txq *txq;
8356b4cac81SBjoern A. Zeeb struct ieee80211_bss_conf bss_conf;
836adff403fSBjoern A. Zeeb struct ieee80211_bss_conf *link_conf[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
8372e183d99SBjoern A. Zeeb uint8_t hw_queue[IEEE80211_NUM_ACS];
838adff403fSBjoern A. Zeeb uint16_t active_links;
839adff403fSBjoern A. Zeeb uint16_t valid_links;
840adff403fSBjoern A. Zeeb struct ieee80211_vif *mbssid_tx_vif;
8416b4cac81SBjoern A. Zeeb
8420080f30fSBjoern A. Zeeb /* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change structure depending on compile-time option. */
8430080f30fSBjoern A. Zeeb struct dentry *debugfs_dir;
8440080f30fSBjoern A. Zeeb /* #endif */
8450080f30fSBjoern A. Zeeb
8466b4cac81SBjoern A. Zeeb /* Must stay last. */
8476b4cac81SBjoern A. Zeeb uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
8486b4cac81SBjoern A. Zeeb };
8496b4cac81SBjoern A. Zeeb
8506b4cac81SBjoern A. Zeeb struct ieee80211_vif_chanctx_switch {
8516b4cac81SBjoern A. Zeeb struct ieee80211_chanctx_conf *old_ctx, *new_ctx;
8526b4cac81SBjoern A. Zeeb struct ieee80211_vif *vif;
853adff403fSBjoern A. Zeeb struct ieee80211_bss_conf *link_conf;
8546b4cac81SBjoern A. Zeeb };
8556b4cac81SBjoern A. Zeeb
8566b4cac81SBjoern A. Zeeb struct ieee80211_prep_tx_info {
8576b4cac81SBjoern A. Zeeb u16 duration;
8586b4cac81SBjoern A. Zeeb bool success;
859ac1d519cSBjoern A. Zeeb bool was_assoc;
860ac1d519cSBjoern A. Zeeb int link_id;
8616b4cac81SBjoern A. Zeeb };
8626b4cac81SBjoern A. Zeeb
8636b4cac81SBjoern A. Zeeb /* XXX-BZ too big, over-reduce size to u8, and array sizes to minuimum to fit in skb->cb. */
8646b4cac81SBjoern A. Zeeb /* Also warning: some sizes change by pointer size! This is 64bit only. */
8656b4cac81SBjoern A. Zeeb struct ieee80211_tx_info {
866470aaf42SBjoern A. Zeeb enum ieee80211_tx_info_flags flags; /* 32 bits */
8676b4cac81SBjoern A. Zeeb /* TODO FIXME */
868470aaf42SBjoern A. Zeeb enum nl80211_band band; /* 3 bits */
869470aaf42SBjoern A. Zeeb uint16_t hw_queue:4, /* 4 bits */
870470aaf42SBjoern A. Zeeb tx_time_est:10; /* 10 bits */
8716b4cac81SBjoern A. Zeeb union {
8726b4cac81SBjoern A. Zeeb struct {
8736b4cac81SBjoern A. Zeeb struct ieee80211_tx_rate rates[4];
8746b4cac81SBjoern A. Zeeb bool use_rts;
875ac1d519cSBjoern A. Zeeb uint8_t antennas:2;
8766b4cac81SBjoern A. Zeeb struct ieee80211_vif *vif;
8776b4cac81SBjoern A. Zeeb struct ieee80211_key_conf *hw_key;
8786b4cac81SBjoern A. Zeeb enum ieee80211_tx_control_flags flags;
8796b4cac81SBjoern A. Zeeb } control;
8806b4cac81SBjoern A. Zeeb struct {
8816b4cac81SBjoern A. Zeeb struct ieee80211_tx_rate rates[4];
8826b4cac81SBjoern A. Zeeb uint32_t ack_signal;
8836b4cac81SBjoern A. Zeeb uint8_t ampdu_ack_len;
8846b4cac81SBjoern A. Zeeb uint8_t ampdu_len;
8856b4cac81SBjoern A. Zeeb uint8_t antenna;
8866b4cac81SBjoern A. Zeeb uint16_t tx_time;
887adff403fSBjoern A. Zeeb uint8_t flags;
88886220d3cSBjoern A. Zeeb void *status_driver_data[16 / sizeof(void *)]; /* XXX TODO */
8896b4cac81SBjoern A. Zeeb } status;
890910a8343SBjoern A. Zeeb #define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40
8912e183d99SBjoern A. Zeeb void *driver_data[IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)];
8926b4cac81SBjoern A. Zeeb };
8936b4cac81SBjoern A. Zeeb };
8946b4cac81SBjoern A. Zeeb
8956b4cac81SBjoern A. Zeeb /* net80211 conflict */
8962e183d99SBjoern A. Zeeb struct linuxkpi_ieee80211_tim_ie {
8976b4cac81SBjoern A. Zeeb uint8_t dtim_count;
8986b4cac81SBjoern A. Zeeb uint8_t dtim_period;
8996b4cac81SBjoern A. Zeeb uint8_t bitmap_ctrl;
9002e183d99SBjoern A. Zeeb uint8_t *virtual_map;
9016b4cac81SBjoern A. Zeeb };
9022e183d99SBjoern A. Zeeb #define ieee80211_tim_ie linuxkpi_ieee80211_tim_ie
9036b4cac81SBjoern A. Zeeb
9046b4cac81SBjoern A. Zeeb struct survey_info { /* net80211::struct ieee80211_channel_survey */
9056b4cac81SBjoern A. Zeeb /* TODO FIXME */
9066b4cac81SBjoern A. Zeeb uint32_t filled;
9076b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME 0x0001
9086b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME_RX 0x0002
9096b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME_SCAN 0x0004
9106b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME_TX 0x0008
9116b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME_BSS_RX 0x0010
9126b4cac81SBjoern A. Zeeb #define SURVEY_INFO_TIME_BUSY 0x0020
9136b4cac81SBjoern A. Zeeb #define SURVEY_INFO_IN_USE 0x0040
9146b4cac81SBjoern A. Zeeb #define SURVEY_INFO_NOISE_DBM 0x0080
9156b4cac81SBjoern A. Zeeb uint32_t noise;
9166b4cac81SBjoern A. Zeeb uint64_t time;
9176b4cac81SBjoern A. Zeeb uint64_t time_bss_rx;
9186b4cac81SBjoern A. Zeeb uint64_t time_busy;
9196b4cac81SBjoern A. Zeeb uint64_t time_rx;
9206b4cac81SBjoern A. Zeeb uint64_t time_scan;
9216b4cac81SBjoern A. Zeeb uint64_t time_tx;
9226b4cac81SBjoern A. Zeeb struct ieee80211_channel *channel;
9236b4cac81SBjoern A. Zeeb };
9246b4cac81SBjoern A. Zeeb
9256b4cac81SBjoern A. Zeeb enum ieee80211_iface_iter {
9266b4cac81SBjoern A. Zeeb IEEE80211_IFACE_ITER_NORMAL = BIT(0),
9276b4cac81SBjoern A. Zeeb IEEE80211_IFACE_ITER_RESUME_ALL = BIT(1),
9282e183d99SBjoern A. Zeeb IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER = BIT(2), /* seems to be an iter flag */
929adff403fSBjoern A. Zeeb IEEE80211_IFACE_ITER_ACTIVE = BIT(3),
9306b4cac81SBjoern A. Zeeb
9316b4cac81SBjoern A. Zeeb /* Internal flags only. */
9326b4cac81SBjoern A. Zeeb IEEE80211_IFACE_ITER__ATOMIC = BIT(6),
933800aa9cdSBjoern A. Zeeb IEEE80211_IFACE_ITER__MTX = BIT(8),
9346b4cac81SBjoern A. Zeeb };
9356b4cac81SBjoern A. Zeeb
9366b4cac81SBjoern A. Zeeb enum set_key_cmd {
9376b4cac81SBjoern A. Zeeb SET_KEY,
9386b4cac81SBjoern A. Zeeb DISABLE_KEY,
9396b4cac81SBjoern A. Zeeb };
9406b4cac81SBjoern A. Zeeb
941b0f73768SBjoern A. Zeeb /* 802.11-2020, 9.4.2.55.2 HT Capability Information field. */
9426b4cac81SBjoern A. Zeeb enum rx_enc_flags {
9436b4cac81SBjoern A. Zeeb RX_ENC_FLAG_SHORTPRE = BIT(0),
944b0f73768SBjoern A. Zeeb RX_ENC_FLAG_SHORT_GI = BIT(2),
945b0f73768SBjoern A. Zeeb RX_ENC_FLAG_HT_GF = BIT(3),
946b0f73768SBjoern A. Zeeb RX_ENC_FLAG_STBC_MASK = BIT(4) | BIT(5),
947b0f73768SBjoern A. Zeeb #define RX_ENC_FLAG_STBC_SHIFT 4
948b0f73768SBjoern A. Zeeb RX_ENC_FLAG_LDPC = BIT(6),
949b0f73768SBjoern A. Zeeb RX_ENC_FLAG_BF = BIT(7),
9506b4cac81SBjoern A. Zeeb };
9516b4cac81SBjoern A. Zeeb
9526b4cac81SBjoern A. Zeeb enum sta_notify_cmd {
9536b4cac81SBjoern A. Zeeb STA_NOTIFY_AWAKE,
9546b4cac81SBjoern A. Zeeb STA_NOTIFY_SLEEP,
9556b4cac81SBjoern A. Zeeb };
9566b4cac81SBjoern A. Zeeb
957b0f73768SBjoern A. Zeeb struct ieee80211_low_level_stats {
958b0f73768SBjoern A. Zeeb /* Can we make them uint64_t? */
959b0f73768SBjoern A. Zeeb uint32_t dot11ACKFailureCount;
960b0f73768SBjoern A. Zeeb uint32_t dot11FCSErrorCount;
961b0f73768SBjoern A. Zeeb uint32_t dot11RTSFailureCount;
962b0f73768SBjoern A. Zeeb uint32_t dot11RTSSuccessCount;
963b0f73768SBjoern A. Zeeb };
964b0f73768SBjoern A. Zeeb
965b0f73768SBjoern A. Zeeb enum ieee80211_offload_flags {
966b0f73768SBjoern A. Zeeb IEEE80211_OFFLOAD_ENCAP_4ADDR,
967f02e2115SBjoern A. Zeeb IEEE80211_OFFLOAD_ENCAP_ENABLED,
968f02e2115SBjoern A. Zeeb IEEE80211_OFFLOAD_DECAP_ENABLED,
969b0f73768SBjoern A. Zeeb };
970b0f73768SBjoern A. Zeeb
9716b4cac81SBjoern A. Zeeb struct ieee80211_ops {
9726b4cac81SBjoern A. Zeeb /* TODO FIXME */
9736b4cac81SBjoern A. Zeeb int (*start)(struct ieee80211_hw *);
9747b43f4d0SBjoern A. Zeeb void (*stop)(struct ieee80211_hw *, bool);
9756b4cac81SBjoern A. Zeeb
9766b4cac81SBjoern A. Zeeb int (*config)(struct ieee80211_hw *, u32);
9776b4cac81SBjoern A. Zeeb void (*reconfig_complete)(struct ieee80211_hw *, enum ieee80211_reconfig_type);
9786b4cac81SBjoern A. Zeeb
979e6010da6SBjoern A. Zeeb void (*prep_add_interface)(struct ieee80211_hw *, enum nl80211_iftype);
9806b4cac81SBjoern A. Zeeb int (*add_interface)(struct ieee80211_hw *, struct ieee80211_vif *);
9816b4cac81SBjoern A. Zeeb void (*remove_interface)(struct ieee80211_hw *, struct ieee80211_vif *);
9826b4cac81SBjoern A. Zeeb int (*change_interface)(struct ieee80211_hw *, struct ieee80211_vif *, enum nl80211_iftype, bool);
9836b4cac81SBjoern A. Zeeb
9846b4cac81SBjoern A. Zeeb void (*sw_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, const u8 *);
9856b4cac81SBjoern A. Zeeb void (*sw_scan_complete)(struct ieee80211_hw *, struct ieee80211_vif *);
9866b4cac81SBjoern A. Zeeb int (*sched_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_sched_scan_request *, struct ieee80211_scan_ies *);
9876b4cac81SBjoern A. Zeeb int (*sched_scan_stop)(struct ieee80211_hw *, struct ieee80211_vif *);
9886b4cac81SBjoern A. Zeeb int (*hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_scan_request *);
9896b4cac81SBjoern A. Zeeb void (*cancel_hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *);
9906b4cac81SBjoern A. Zeeb
991549198b1SBjoern A. Zeeb int (*conf_tx)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u16, const struct ieee80211_tx_queue_params *);
9926b4cac81SBjoern A. Zeeb void (*tx)(struct ieee80211_hw *, struct ieee80211_tx_control *, struct sk_buff *);
9936b4cac81SBjoern A. Zeeb int (*tx_last_beacon)(struct ieee80211_hw *);
9946b4cac81SBjoern A. Zeeb void (*wake_tx_queue)(struct ieee80211_hw *, struct ieee80211_txq *);
9956b4cac81SBjoern A. Zeeb
9966b4cac81SBjoern A. Zeeb void (*mgd_prepare_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *);
9976b4cac81SBjoern A. Zeeb void (*mgd_complete_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *);
9987b43f4d0SBjoern A. Zeeb void (*mgd_protect_tdls_discover)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int);
9996b4cac81SBjoern A. Zeeb
10006b4cac81SBjoern A. Zeeb void (*flush)(struct ieee80211_hw *, struct ieee80211_vif *, u32, bool);
1001adff403fSBjoern A. Zeeb void (*flush_sta)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10026b4cac81SBjoern A. Zeeb
10036b4cac81SBjoern A. Zeeb int (*set_frag_threshold)(struct ieee80211_hw *, u32);
10046b4cac81SBjoern A. Zeeb
10056b4cac81SBjoern A. Zeeb void (*sync_rx_queues)(struct ieee80211_hw *);
10066b4cac81SBjoern A. Zeeb
10076b4cac81SBjoern A. Zeeb void (*allow_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool);
10086b4cac81SBjoern A. Zeeb void (*release_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool);
10096b4cac81SBjoern A. Zeeb
10106b4cac81SBjoern A. Zeeb int (*sta_add)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10116b4cac81SBjoern A. Zeeb int (*sta_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10126b4cac81SBjoern A. Zeeb int (*sta_set_txpwr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10136b4cac81SBjoern A. Zeeb void (*sta_statistics)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct station_info *);
10146b4cac81SBjoern A. Zeeb void (*sta_pre_rcu_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10156b4cac81SBjoern A. Zeeb int (*sta_state)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, enum ieee80211_sta_state, enum ieee80211_sta_state);
10166b4cac81SBjoern A. Zeeb void (*sta_notify)(struct ieee80211_hw *, struct ieee80211_vif *, enum sta_notify_cmd, struct ieee80211_sta *);
10176b4cac81SBjoern A. Zeeb void (*sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u32);
1018e6010da6SBjoern A. Zeeb void (*link_sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_link_sta *, u32);
10196b4cac81SBjoern A. Zeeb void (*sta_rate_tbl_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10202e183d99SBjoern A. Zeeb void (*sta_set_4addr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool);
1021b0f73768SBjoern A. Zeeb void (*sta_set_decap_offload)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool);
10226b4cac81SBjoern A. Zeeb
10236b4cac81SBjoern A. Zeeb u64 (*prepare_multicast)(struct ieee80211_hw *, struct netdev_hw_addr_list *);
10246b4cac81SBjoern A. Zeeb
10256b4cac81SBjoern A. Zeeb int (*ampdu_action)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_ampdu_params *);
10266b4cac81SBjoern A. Zeeb
10276b4cac81SBjoern A. Zeeb bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *, struct sk_buff *, struct sk_buff *);
10286b4cac81SBjoern A. Zeeb
10296b4cac81SBjoern A. Zeeb int (*pre_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
10307b43f4d0SBjoern A. Zeeb int (*post_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *);
10316b4cac81SBjoern A. Zeeb void (*channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
1032b0f73768SBjoern A. Zeeb void (*channel_switch_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_chan_def *);
10337b43f4d0SBjoern A. Zeeb void (*abort_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *);
10346b4cac81SBjoern A. Zeeb void (*channel_switch_rx_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
10356b4cac81SBjoern A. Zeeb int (*tdls_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8, struct cfg80211_chan_def *, struct sk_buff *, u32);
10366b4cac81SBjoern A. Zeeb void (*tdls_cancel_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
10376b4cac81SBjoern A. Zeeb void (*tdls_recv_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_tdls_ch_sw_params *);
10386b4cac81SBjoern A. Zeeb
10396b4cac81SBjoern A. Zeeb int (*add_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
10406b4cac81SBjoern A. Zeeb void (*remove_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
10416b4cac81SBjoern A. Zeeb void (*change_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, u32);
1042549198b1SBjoern A. Zeeb int (*assign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
1043549198b1SBjoern A. Zeeb void (*unassign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
10446b4cac81SBjoern A. Zeeb int (*switch_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif_chanctx_switch *, int, enum ieee80211_chanctx_switch_mode);
10456b4cac81SBjoern A. Zeeb
10466b4cac81SBjoern A. Zeeb int (*get_antenna)(struct ieee80211_hw *, u32 *, u32 *);
10476b4cac81SBjoern A. Zeeb int (*set_antenna)(struct ieee80211_hw *, u32, u32);
10486b4cac81SBjoern A. Zeeb
10496b4cac81SBjoern A. Zeeb int (*remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel *, int, enum ieee80211_roc_type);
10506b4cac81SBjoern A. Zeeb int (*cancel_remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *);
10516b4cac81SBjoern A. Zeeb
10526b4cac81SBjoern A. Zeeb void (*configure_filter)(struct ieee80211_hw *, unsigned int, unsigned int *, u64);
10536b4cac81SBjoern A. Zeeb void (*config_iface_filter)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, unsigned int);
10546b4cac81SBjoern A. Zeeb
1055467d3e2eSBjoern A. Zeeb void (*bss_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64);
1056616e1330SBjoern A. Zeeb void (*link_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64);
1057616e1330SBjoern A. Zeeb
10586b4cac81SBjoern A. Zeeb int (*set_rts_threshold)(struct ieee80211_hw *, u32);
10596b4cac81SBjoern A. Zeeb void (*event_callback)(struct ieee80211_hw *, struct ieee80211_vif *, const struct ieee80211_event *);
10606b4cac81SBjoern A. Zeeb int (*get_survey)(struct ieee80211_hw *, int, struct survey_info *);
10616b4cac81SBjoern A. Zeeb int (*get_ftm_responder_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_ftm_responder_stats *);
1062b0f73768SBjoern A. Zeeb
1063b0f73768SBjoern A. Zeeb uint64_t (*get_tsf)(struct ieee80211_hw *, struct ieee80211_vif *);
1064b0f73768SBjoern A. Zeeb void (*set_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, uint64_t);
10656b4cac81SBjoern A. Zeeb void (*offset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, s64);
1066b0f73768SBjoern A. Zeeb
10676b4cac81SBjoern A. Zeeb int (*set_bitrate_mask)(struct ieee80211_hw *, struct ieee80211_vif *, const struct cfg80211_bitrate_mask *);
10686b4cac81SBjoern A. Zeeb void (*set_coverage_class)(struct ieee80211_hw *, s16);
10696b4cac81SBjoern A. Zeeb int (*set_tim)(struct ieee80211_hw *, struct ieee80211_sta *, bool);
10706b4cac81SBjoern A. Zeeb
10716b4cac81SBjoern A. Zeeb int (*set_key)(struct ieee80211_hw *, enum set_key_cmd, struct ieee80211_vif *, struct ieee80211_sta *, struct ieee80211_key_conf *);
10726b4cac81SBjoern A. Zeeb void (*update_tkip_key)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_key_conf *, struct ieee80211_sta *, u32, u16 *);
10736b4cac81SBjoern A. Zeeb
10746b4cac81SBjoern A. Zeeb int (*start_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
10756b4cac81SBjoern A. Zeeb void (*abort_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
10766b4cac81SBjoern A. Zeeb
1077549198b1SBjoern A. Zeeb int (*start_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *link_conf);
1078549198b1SBjoern A. Zeeb void (*stop_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *link_conf);
10796b4cac81SBjoern A. Zeeb int (*join_ibss)(struct ieee80211_hw *, struct ieee80211_vif *);
10806b4cac81SBjoern A. Zeeb void (*leave_ibss)(struct ieee80211_hw *, struct ieee80211_vif *);
10816b4cac81SBjoern A. Zeeb
108251b461b3SBjoern A. Zeeb int (*set_sar_specs)(struct ieee80211_hw *, const struct cfg80211_sar_specs *);
108351b461b3SBjoern A. Zeeb
10842e183d99SBjoern A. Zeeb int (*set_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct cfg80211_tid_config *);
10852e183d99SBjoern A. Zeeb int (*reset_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8);
10862e183d99SBjoern A. Zeeb
10872e183d99SBjoern A. Zeeb int (*get_et_sset_count)(struct ieee80211_hw *, struct ieee80211_vif *, int);
10882e183d99SBjoern A. Zeeb void (*get_et_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct ethtool_stats *, u64 *);
10892e183d99SBjoern A. Zeeb void (*get_et_strings)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u8 *);
10902e183d99SBjoern A. Zeeb
10912e183d99SBjoern A. Zeeb void (*update_vif_offload)(struct ieee80211_hw *, struct ieee80211_vif *);
1092b0f73768SBjoern A. Zeeb
1093675e6b1cSBjoern A. Zeeb int (*get_txpower)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, int *);
1094b0f73768SBjoern A. Zeeb int (*get_stats)(struct ieee80211_hw *, struct ieee80211_low_level_stats *);
1095b0f73768SBjoern A. Zeeb
1096b0f73768SBjoern A. Zeeb int (*set_radar_background)(struct ieee80211_hw *, struct cfg80211_chan_def *);
1097b0f73768SBjoern A. Zeeb
1098b0f73768SBjoern A. Zeeb void (*add_twt_setup)(struct ieee80211_hw *, struct ieee80211_sta *, struct ieee80211_twt_setup *);
1099b0f73768SBjoern A. Zeeb void (*twt_teardown_request)(struct ieee80211_hw *, struct ieee80211_sta *, u8);
11000080f30fSBjoern A. Zeeb
1101adff403fSBjoern A. Zeeb int (*set_hw_timestamp)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_set_hw_timestamp *);
1102adff403fSBjoern A. Zeeb
1103adff403fSBjoern A. Zeeb void (*vif_cfg_changed)(struct ieee80211_hw *, struct ieee80211_vif *, u64);
1104adff403fSBjoern A. Zeeb
1105adff403fSBjoern A. Zeeb int (*change_vif_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16, u16, struct ieee80211_bss_conf *[IEEE80211_MLD_MAX_NUM_LINKS]);
1106adff403fSBjoern A. Zeeb int (*change_sta_links)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u16, u16);
1107ac1d519cSBjoern A. Zeeb bool (*can_activate_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16);
1108ac1d519cSBjoern A. Zeeb enum ieee80211_neg_ttlm_res (*can_neg_ttlm)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_neg_ttlm *);
1109adff403fSBjoern A. Zeeb
1110e6010da6SBjoern A. Zeeb void (*rfkill_poll)(struct ieee80211_hw *);
1111e6010da6SBjoern A. Zeeb
11120080f30fSBjoern A. Zeeb /* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change depending on compile-time option. */
11130080f30fSBjoern A. Zeeb void (*sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct dentry *);
111407f65755SBjoern A. Zeeb void (*vif_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *);
111507f65755SBjoern A. Zeeb void (*link_sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_link_sta *, struct dentry *);
111607f65755SBjoern A. Zeeb void (*link_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct dentry *);
11170080f30fSBjoern A. Zeeb /* #endif */
1118b42c339cSBjoern A. Zeeb /* #ifdef CONFIG_PM_SLEEP */ /* Do not change depending on compile-time option. */
1119b42c339cSBjoern A. Zeeb int (*suspend)(struct ieee80211_hw *, struct cfg80211_wowlan *);
1120b42c339cSBjoern A. Zeeb int (*resume)(struct ieee80211_hw *);
1121b42c339cSBjoern A. Zeeb void (*set_wakeup)(struct ieee80211_hw *, bool);
1122b42c339cSBjoern A. Zeeb void (*set_rekey_data)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_gtk_rekey_data *);
1123b42c339cSBjoern A. Zeeb void (*set_default_unicast_key)(struct ieee80211_hw *, struct ieee80211_vif *, int);
1124b42c339cSBjoern A. Zeeb /* #if IS_ENABLED(CONFIG_IPV6) */
1125b42c339cSBjoern A. Zeeb void (*ipv6_addr_change)(struct ieee80211_hw *, struct ieee80211_vif *, struct inet6_dev *);
1126b42c339cSBjoern A. Zeeb /* #endif */
1127b42c339cSBjoern A. Zeeb /* #endif CONFIG_PM_SLEEP */
11286b4cac81SBjoern A. Zeeb };
11296b4cac81SBjoern A. Zeeb
11306b4cac81SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
11316b4cac81SBjoern A. Zeeb
11326b4cac81SBjoern A. Zeeb /* linux_80211.c */
11336b4cac81SBjoern A. Zeeb extern const struct cfg80211_ops linuxkpi_mac80211cfgops;
11346b4cac81SBjoern A. Zeeb
11356b4cac81SBjoern A. Zeeb struct ieee80211_hw *linuxkpi_ieee80211_alloc_hw(size_t,
11366b4cac81SBjoern A. Zeeb const struct ieee80211_ops *);
11376b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_iffree(struct ieee80211_hw *);
11386b4cac81SBjoern A. Zeeb void linuxkpi_set_ieee80211_dev(struct ieee80211_hw *, char *);
11392e183d99SBjoern A. Zeeb int linuxkpi_ieee80211_ifattach(struct ieee80211_hw *);
11406b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_ifdetach(struct ieee80211_hw *);
11414b0af114SBjoern A. Zeeb void linuxkpi_ieee80211_unregister_hw(struct ieee80211_hw *);
11426b4cac81SBjoern A. Zeeb struct ieee80211_hw * linuxkpi_wiphy_to_ieee80211_hw(struct wiphy *);
11434b0af114SBjoern A. Zeeb void linuxkpi_ieee80211_restart_hw(struct ieee80211_hw *);
11446b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_iterate_interfaces(
11456b4cac81SBjoern A. Zeeb struct ieee80211_hw *hw, enum ieee80211_iface_iter flags,
11466b4cac81SBjoern A. Zeeb void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
11476b4cac81SBjoern A. Zeeb void *);
11486b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_iterate_keys(struct ieee80211_hw *,
11496b4cac81SBjoern A. Zeeb struct ieee80211_vif *,
11506b4cac81SBjoern A. Zeeb void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
11516b4cac81SBjoern A. Zeeb struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
115211db70b6SBjoern A. Zeeb void *, bool);
11536b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_iterate_chan_contexts(struct ieee80211_hw *,
11546b4cac81SBjoern A. Zeeb void(*iterfunc)(struct ieee80211_hw *,
11556b4cac81SBjoern A. Zeeb struct ieee80211_chanctx_conf *, void *),
11566b4cac81SBjoern A. Zeeb void *);
11576b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_iterate_stations_atomic(struct ieee80211_hw *,
11586b4cac81SBjoern A. Zeeb void (*iterfunc)(void *, struct ieee80211_sta *), void *);
11596b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_scan_completed(struct ieee80211_hw *,
11606b4cac81SBjoern A. Zeeb struct cfg80211_scan_info *);
11616b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_rx(struct ieee80211_hw *, struct sk_buff *,
1162e30e05d3SBjoern A. Zeeb struct ieee80211_sta *, struct napi_struct *, struct list_head *);
1163ec190d91SBjoern A. Zeeb uint8_t linuxkpi_ieee80211_get_tid(struct ieee80211_hdr *, bool);
11646b4cac81SBjoern A. Zeeb struct ieee80211_sta *linuxkpi_ieee80211_find_sta(struct ieee80211_vif *,
11656b4cac81SBjoern A. Zeeb const u8 *);
11666b4cac81SBjoern A. Zeeb struct ieee80211_sta *linuxkpi_ieee80211_find_sta_by_ifaddr(
11672e183d99SBjoern A. Zeeb struct ieee80211_hw *, const uint8_t *, const uint8_t *);
11686b4cac81SBjoern A. Zeeb struct sk_buff *linuxkpi_ieee80211_tx_dequeue(struct ieee80211_hw *,
11696b4cac81SBjoern A. Zeeb struct ieee80211_txq *);
11706b4cac81SBjoern A. Zeeb bool linuxkpi_ieee80211_is_ie_id_in_ie_buf(const u8, const u8 *, size_t);
11716b4cac81SBjoern A. Zeeb bool linuxkpi_ieee80211_ie_advance(size_t *, const u8 *, size_t);
11726b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_free_txskb(struct ieee80211_hw *, struct sk_buff *,
11736b4cac81SBjoern A. Zeeb int);
11746b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_queue_delayed_work(struct ieee80211_hw *,
11756b4cac81SBjoern A. Zeeb struct delayed_work *, int);
11766b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_queue_work(struct ieee80211_hw *, struct work_struct *);
11776b4cac81SBjoern A. Zeeb struct sk_buff *linuxkpi_ieee80211_pspoll_get(struct ieee80211_hw *,
11786b4cac81SBjoern A. Zeeb struct ieee80211_vif *);
11796b4cac81SBjoern A. Zeeb struct sk_buff *linuxkpi_ieee80211_nullfunc_get(struct ieee80211_hw *,
1180adff403fSBjoern A. Zeeb struct ieee80211_vif *, int, bool);
118186220d3cSBjoern A. Zeeb void linuxkpi_ieee80211_txq_get_depth(struct ieee80211_txq *, unsigned long *,
118286220d3cSBjoern A. Zeeb unsigned long *);
11836b4cac81SBjoern A. Zeeb struct wireless_dev *linuxkpi_ieee80211_vif_to_wdev(struct ieee80211_vif *);
11846b4cac81SBjoern A. Zeeb void linuxkpi_ieee80211_connection_loss(struct ieee80211_vif *);
1185bb81db90SBjoern A. Zeeb void linuxkpi_ieee80211_beacon_loss(struct ieee80211_vif *);
1186ade774b1SBjoern A. Zeeb struct sk_buff *linuxkpi_ieee80211_probereq_get(struct ieee80211_hw *,
1187ade774b1SBjoern A. Zeeb uint8_t *, uint8_t *, size_t, size_t);
1188383b3e8fSBjoern A. Zeeb void linuxkpi_ieee80211_tx_status(struct ieee80211_hw *, struct sk_buff *);
1189a8397571SBjoern A. Zeeb void linuxkpi_ieee80211_tx_status_ext(struct ieee80211_hw *,
1190a8397571SBjoern A. Zeeb struct ieee80211_tx_status *);
11915a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_stop_queues(struct ieee80211_hw *);
11925a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_wake_queues(struct ieee80211_hw *);
11935a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_stop_queue(struct ieee80211_hw *, int);
11945a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_wake_queue(struct ieee80211_hw *, int);
11955a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_txq_schedule_start(struct ieee80211_hw *, uint8_t);
11965a9a0d78SBjoern A. Zeeb struct ieee80211_txq *linuxkpi_ieee80211_next_txq(struct ieee80211_hw *, uint8_t);
11975a9a0d78SBjoern A. Zeeb void linuxkpi_ieee80211_schedule_txq(struct ieee80211_hw *,
11985a9a0d78SBjoern A. Zeeb struct ieee80211_txq *, bool);
1199eac3646fSBjoern A. Zeeb void linuxkpi_ieee80211_handle_wake_tx_queue(struct ieee80211_hw *,
1200eac3646fSBjoern A. Zeeb struct ieee80211_txq *);
12016b4cac81SBjoern A. Zeeb
12026b4cac81SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
12036b4cac81SBjoern A. Zeeb
12046b4cac81SBjoern A. Zeeb static __inline void
_ieee80211_hw_set(struct ieee80211_hw * hw,enum ieee80211_hw_flags flag)12056b4cac81SBjoern A. Zeeb _ieee80211_hw_set(struct ieee80211_hw *hw, enum ieee80211_hw_flags flag)
12066b4cac81SBjoern A. Zeeb {
12076b4cac81SBjoern A. Zeeb
12086b4cac81SBjoern A. Zeeb set_bit(flag, hw->flags);
12096b4cac81SBjoern A. Zeeb }
12106b4cac81SBjoern A. Zeeb
12116b4cac81SBjoern A. Zeeb static __inline bool
__ieee80211_hw_check(struct ieee80211_hw * hw,enum ieee80211_hw_flags flag)12126b4cac81SBjoern A. Zeeb __ieee80211_hw_check(struct ieee80211_hw *hw, enum ieee80211_hw_flags flag)
12136b4cac81SBjoern A. Zeeb {
12146b4cac81SBjoern A. Zeeb
12156b4cac81SBjoern A. Zeeb return (test_bit(flag, hw->flags));
12166b4cac81SBjoern A. Zeeb }
12176b4cac81SBjoern A. Zeeb
12186b4cac81SBjoern A. Zeeb /* They pass in shortened flag names; how confusingly inconsistent. */
12196b4cac81SBjoern A. Zeeb #define ieee80211_hw_set(_hw, _flag) \
12206b4cac81SBjoern A. Zeeb _ieee80211_hw_set(_hw, IEEE80211_HW_ ## _flag)
12216b4cac81SBjoern A. Zeeb #define ieee80211_hw_check(_hw, _flag) \
12226b4cac81SBjoern A. Zeeb __ieee80211_hw_check(_hw, IEEE80211_HW_ ## _flag)
12236b4cac81SBjoern A. Zeeb
12246b4cac81SBjoern A. Zeeb /* XXX-BZ add CTASSERTS that size of struct is <= sizeof skb->cb. */
12256b4cac81SBjoern A. Zeeb CTASSERT(sizeof(struct ieee80211_tx_info) <= sizeof(((struct sk_buff *)0)->cb));
12266b4cac81SBjoern A. Zeeb #define IEEE80211_SKB_CB(_skb) \
12276b4cac81SBjoern A. Zeeb ((struct ieee80211_tx_info *)((_skb)->cb))
12286b4cac81SBjoern A. Zeeb
12296b4cac81SBjoern A. Zeeb CTASSERT(sizeof(struct ieee80211_rx_status) <= sizeof(((struct sk_buff *)0)->cb));
12306b4cac81SBjoern A. Zeeb #define IEEE80211_SKB_RXCB(_skb) \
12316b4cac81SBjoern A. Zeeb ((struct ieee80211_rx_status *)((_skb)->cb))
12326b4cac81SBjoern A. Zeeb
12336b4cac81SBjoern A. Zeeb static __inline void
ieee80211_free_hw(struct ieee80211_hw * hw)12346b4cac81SBjoern A. Zeeb ieee80211_free_hw(struct ieee80211_hw *hw)
12356b4cac81SBjoern A. Zeeb {
12366b4cac81SBjoern A. Zeeb
12376b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iffree(hw);
12386b4cac81SBjoern A. Zeeb
12396b4cac81SBjoern A. Zeeb if (hw->wiphy != NULL)
12406b4cac81SBjoern A. Zeeb wiphy_free(hw->wiphy);
12416b4cac81SBjoern A. Zeeb /* Note that *hw is not valid any longer after this. */
12426b4cac81SBjoern A. Zeeb
12436b4cac81SBjoern A. Zeeb IMPROVE();
12446b4cac81SBjoern A. Zeeb }
12456b4cac81SBjoern A. Zeeb
12466b4cac81SBjoern A. Zeeb static __inline struct ieee80211_hw *
ieee80211_alloc_hw(size_t priv_len,const struct ieee80211_ops * ops)12476b4cac81SBjoern A. Zeeb ieee80211_alloc_hw(size_t priv_len, const struct ieee80211_ops *ops)
12486b4cac81SBjoern A. Zeeb {
12496b4cac81SBjoern A. Zeeb
12506b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_alloc_hw(priv_len, ops));
12516b4cac81SBjoern A. Zeeb }
12526b4cac81SBjoern A. Zeeb
12536b4cac81SBjoern A. Zeeb static __inline void
SET_IEEE80211_DEV(struct ieee80211_hw * hw,struct device * dev)12546b4cac81SBjoern A. Zeeb SET_IEEE80211_DEV(struct ieee80211_hw *hw, struct device *dev)
12556b4cac81SBjoern A. Zeeb {
12566b4cac81SBjoern A. Zeeb
12576b4cac81SBjoern A. Zeeb set_wiphy_dev(hw->wiphy, dev);
12586b4cac81SBjoern A. Zeeb linuxkpi_set_ieee80211_dev(hw, dev_name(dev));
12596b4cac81SBjoern A. Zeeb
12606b4cac81SBjoern A. Zeeb IMPROVE();
12616b4cac81SBjoern A. Zeeb }
12626b4cac81SBjoern A. Zeeb
12636b4cac81SBjoern A. Zeeb static __inline int
ieee80211_register_hw(struct ieee80211_hw * hw)12646b4cac81SBjoern A. Zeeb ieee80211_register_hw(struct ieee80211_hw *hw)
12656b4cac81SBjoern A. Zeeb {
12666b4cac81SBjoern A. Zeeb int error;
12676b4cac81SBjoern A. Zeeb
12686b4cac81SBjoern A. Zeeb error = wiphy_register(hw->wiphy);
12696b4cac81SBjoern A. Zeeb if (error != 0)
12706b4cac81SBjoern A. Zeeb return (error);
12716b4cac81SBjoern A. Zeeb
12726b4cac81SBjoern A. Zeeb /*
12736b4cac81SBjoern A. Zeeb * At this point the driver has set all the options, flags, bands,
12746b4cac81SBjoern A. Zeeb * ciphers, hw address(es), ... basically mac80211/cfg80211 hw/wiphy
12756b4cac81SBjoern A. Zeeb * setup is done.
12766b4cac81SBjoern A. Zeeb * We need to replicate a lot of information from here into net80211.
12776b4cac81SBjoern A. Zeeb */
12782e183d99SBjoern A. Zeeb error = linuxkpi_ieee80211_ifattach(hw);
12796b4cac81SBjoern A. Zeeb
12806b4cac81SBjoern A. Zeeb IMPROVE();
12816b4cac81SBjoern A. Zeeb
12822e183d99SBjoern A. Zeeb return (error);
12836b4cac81SBjoern A. Zeeb }
12846b4cac81SBjoern A. Zeeb
12854b0af114SBjoern A. Zeeb static inline void
ieee80211_unregister_hw(struct ieee80211_hw * hw)12866b4cac81SBjoern A. Zeeb ieee80211_unregister_hw(struct ieee80211_hw *hw)
12876b4cac81SBjoern A. Zeeb {
12886b4cac81SBjoern A. Zeeb
12894b0af114SBjoern A. Zeeb linuxkpi_ieee80211_unregister_hw(hw);
12906b4cac81SBjoern A. Zeeb }
12916b4cac81SBjoern A. Zeeb
12926b4cac81SBjoern A. Zeeb static __inline struct ieee80211_hw *
wiphy_to_ieee80211_hw(struct wiphy * wiphy)12936b4cac81SBjoern A. Zeeb wiphy_to_ieee80211_hw(struct wiphy *wiphy)
12946b4cac81SBjoern A. Zeeb {
12956b4cac81SBjoern A. Zeeb
12966b4cac81SBjoern A. Zeeb return (linuxkpi_wiphy_to_ieee80211_hw(wiphy));
12976b4cac81SBjoern A. Zeeb }
12986b4cac81SBjoern A. Zeeb
12994b0af114SBjoern A. Zeeb static inline void
ieee80211_restart_hw(struct ieee80211_hw * hw)13004b0af114SBjoern A. Zeeb ieee80211_restart_hw(struct ieee80211_hw *hw)
13014b0af114SBjoern A. Zeeb {
13024b0af114SBjoern A. Zeeb linuxkpi_ieee80211_restart_hw(hw);
13034b0af114SBjoern A. Zeeb }
13044b0af114SBjoern A. Zeeb
1305adff403fSBjoern A. Zeeb static inline void
ieee80211_hw_restart_disconnect(struct ieee80211_vif * vif)1306adff403fSBjoern A. Zeeb ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif)
1307adff403fSBjoern A. Zeeb {
1308adff403fSBjoern A. Zeeb TODO();
1309adff403fSBjoern A. Zeeb }
1310adff403fSBjoern A. Zeeb
1311adff403fSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
1312adff403fSBjoern A. Zeeb
1313adff403fSBjoern A. Zeeb #define link_conf_dereference_check(_vif, _linkid) \
1314adff403fSBjoern A. Zeeb rcu_dereference_check((_vif)->link_conf[_linkid], true)
1315adff403fSBjoern A. Zeeb
1316adff403fSBjoern A. Zeeb #define link_conf_dereference_protected(_vif, _linkid) \
1317adff403fSBjoern A. Zeeb rcu_dereference_protected((_vif)->link_conf[_linkid], true)
1318adff403fSBjoern A. Zeeb
1319adff403fSBjoern A. Zeeb #define link_sta_dereference_check(_sta, _linkid) \
1320adff403fSBjoern A. Zeeb rcu_dereference_check((_sta)->link[_linkid], true)
1321adff403fSBjoern A. Zeeb
1322adff403fSBjoern A. Zeeb #define link_sta_dereference_protected(_sta, _linkid) \
1323adff403fSBjoern A. Zeeb rcu_dereference_protected((_sta)->link[_linkid], true)
1324adff403fSBjoern A. Zeeb
1325adff403fSBjoern A. Zeeb #define for_each_vif_active_link(_vif, _link, _linkid) \
1326adff403fSBjoern A. Zeeb for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++) \
1327adff403fSBjoern A. Zeeb if ( ((_vif)->active_links == 0 /* no MLO */ || \
1328adff403fSBjoern A. Zeeb ((_vif)->active_links & BIT(_linkid)) != 0) && \
1329adff403fSBjoern A. Zeeb (_link = rcu_dereference((_vif)->link_conf[_linkid])) )
1330adff403fSBjoern A. Zeeb
1331adff403fSBjoern A. Zeeb #define for_each_sta_active_link(_vif, _sta, _linksta, _linkid) \
133269b6c4a6SBjoern A. Zeeb for (_linkid = 0; _linkid < nitems((_sta)->link); _linkid++) \
1333adff403fSBjoern A. Zeeb if ( ((_vif)->active_links == 0 /* no MLO */ || \
1334adff403fSBjoern A. Zeeb ((_vif)->active_links & BIT(_linkid)) != 0) && \
1335adff403fSBjoern A. Zeeb (_linksta = link_sta_dereference_protected((_sta), (_linkid))) )
13364b0af114SBjoern A. Zeeb
13376b4cac81SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
13386b4cac81SBjoern A. Zeeb
13396b4cac81SBjoern A. Zeeb static __inline bool
ieee80211_vif_is_mesh(struct ieee80211_vif * vif)13406b4cac81SBjoern A. Zeeb ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
13416b4cac81SBjoern A. Zeeb {
13426b4cac81SBjoern A. Zeeb TODO();
13436b4cac81SBjoern A. Zeeb return (false);
13446b4cac81SBjoern A. Zeeb }
13456b4cac81SBjoern A. Zeeb
13466b4cac81SBjoern A. Zeeb
13476b4cac81SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
13486b4cac81SBjoern A. Zeeb /* Receive functions (air/driver to mac80211/net80211). */
13496b4cac81SBjoern A. Zeeb
13506b4cac81SBjoern A. Zeeb
13516b4cac81SBjoern A. Zeeb static __inline void
ieee80211_rx_napi(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct sk_buff * skb,struct napi_struct * napi)13526b4cac81SBjoern A. Zeeb ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
13536b4cac81SBjoern A. Zeeb struct sk_buff *skb, struct napi_struct *napi)
13546b4cac81SBjoern A. Zeeb {
13556b4cac81SBjoern A. Zeeb
1356e30e05d3SBjoern A. Zeeb linuxkpi_ieee80211_rx(hw, skb, sta, napi, NULL);
1357e30e05d3SBjoern A. Zeeb }
1358e30e05d3SBjoern A. Zeeb
1359e30e05d3SBjoern A. Zeeb static __inline void
ieee80211_rx_list(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct sk_buff * skb,struct list_head * list)1360e30e05d3SBjoern A. Zeeb ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
1361e30e05d3SBjoern A. Zeeb struct sk_buff *skb, struct list_head *list)
1362e30e05d3SBjoern A. Zeeb {
1363e30e05d3SBjoern A. Zeeb
1364e30e05d3SBjoern A. Zeeb linuxkpi_ieee80211_rx(hw, skb, sta, NULL, list);
13656b4cac81SBjoern A. Zeeb }
13666b4cac81SBjoern A. Zeeb
13676b4cac81SBjoern A. Zeeb static __inline void
ieee80211_rx_ni(struct ieee80211_hw * hw,struct sk_buff * skb)13686b4cac81SBjoern A. Zeeb ieee80211_rx_ni(struct ieee80211_hw *hw, struct sk_buff *skb)
13696b4cac81SBjoern A. Zeeb {
13706b4cac81SBjoern A. Zeeb
1371e30e05d3SBjoern A. Zeeb linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
13726b4cac81SBjoern A. Zeeb }
13736b4cac81SBjoern A. Zeeb
13746b4cac81SBjoern A. Zeeb static __inline void
ieee80211_rx_irqsafe(struct ieee80211_hw * hw,struct sk_buff * skb)13756b4cac81SBjoern A. Zeeb ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb)
13766b4cac81SBjoern A. Zeeb {
13776b4cac81SBjoern A. Zeeb
1378e30e05d3SBjoern A. Zeeb linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
13796b4cac81SBjoern A. Zeeb }
13806b4cac81SBjoern A. Zeeb
13811d70218eSBjoern A. Zeeb static __inline void
ieee80211_rx(struct ieee80211_hw * hw,struct sk_buff * skb)13821d70218eSBjoern A. Zeeb ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
13831d70218eSBjoern A. Zeeb {
13841d70218eSBjoern A. Zeeb
1385e30e05d3SBjoern A. Zeeb linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
13861d70218eSBjoern A. Zeeb }
13871d70218eSBjoern A. Zeeb
13886b4cac81SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
13896b4cac81SBjoern A. Zeeb
13905a9a0d78SBjoern A. Zeeb static inline void
ieee80211_stop_queues(struct ieee80211_hw * hw)13915a9a0d78SBjoern A. Zeeb ieee80211_stop_queues(struct ieee80211_hw *hw)
13925a9a0d78SBjoern A. Zeeb {
13935a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_stop_queues(hw);
13945a9a0d78SBjoern A. Zeeb }
13955a9a0d78SBjoern A. Zeeb
13965a9a0d78SBjoern A. Zeeb static inline void
ieee80211_wake_queues(struct ieee80211_hw * hw)13975a9a0d78SBjoern A. Zeeb ieee80211_wake_queues(struct ieee80211_hw *hw)
13985a9a0d78SBjoern A. Zeeb {
13995a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_wake_queues(hw);
14005a9a0d78SBjoern A. Zeeb }
14015a9a0d78SBjoern A. Zeeb
14025a9a0d78SBjoern A. Zeeb static inline void
ieee80211_stop_queue(struct ieee80211_hw * hw,int qnum)14035a9a0d78SBjoern A. Zeeb ieee80211_stop_queue(struct ieee80211_hw *hw, int qnum)
14045a9a0d78SBjoern A. Zeeb {
14055a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_stop_queue(hw, qnum);
14065a9a0d78SBjoern A. Zeeb }
14075a9a0d78SBjoern A. Zeeb
14085a9a0d78SBjoern A. Zeeb static inline void
ieee80211_wake_queue(struct ieee80211_hw * hw,int qnum)14095a9a0d78SBjoern A. Zeeb ieee80211_wake_queue(struct ieee80211_hw *hw, int qnum)
14105a9a0d78SBjoern A. Zeeb {
14115a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_wake_queue(hw, qnum);
14125a9a0d78SBjoern A. Zeeb }
14135a9a0d78SBjoern A. Zeeb
14145a9a0d78SBjoern A. Zeeb static inline void
ieee80211_schedule_txq(struct ieee80211_hw * hw,struct ieee80211_txq * txq)14155a9a0d78SBjoern A. Zeeb ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
14165a9a0d78SBjoern A. Zeeb {
14175a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_schedule_txq(hw, txq, true);
14185a9a0d78SBjoern A. Zeeb }
14195a9a0d78SBjoern A. Zeeb
14205a9a0d78SBjoern A. Zeeb static inline void
ieee80211_return_txq(struct ieee80211_hw * hw,struct ieee80211_txq * txq,bool withoutpkts)14215a9a0d78SBjoern A. Zeeb ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq,
14225a9a0d78SBjoern A. Zeeb bool withoutpkts)
14235a9a0d78SBjoern A. Zeeb {
1424eac3646fSBjoern A. Zeeb linuxkpi_ieee80211_schedule_txq(hw, txq, withoutpkts);
14255a9a0d78SBjoern A. Zeeb }
14265a9a0d78SBjoern A. Zeeb
14275a9a0d78SBjoern A. Zeeb static inline void
ieee80211_txq_schedule_start(struct ieee80211_hw * hw,uint8_t ac)14285a9a0d78SBjoern A. Zeeb ieee80211_txq_schedule_start(struct ieee80211_hw *hw, uint8_t ac)
14295a9a0d78SBjoern A. Zeeb {
14305a9a0d78SBjoern A. Zeeb linuxkpi_ieee80211_txq_schedule_start(hw, ac);
14315a9a0d78SBjoern A. Zeeb }
14325a9a0d78SBjoern A. Zeeb
14335a9a0d78SBjoern A. Zeeb static inline void
ieee80211_txq_schedule_end(struct ieee80211_hw * hw,uint8_t ac)14345a9a0d78SBjoern A. Zeeb ieee80211_txq_schedule_end(struct ieee80211_hw *hw, uint8_t ac)
14355a9a0d78SBjoern A. Zeeb {
14365a9a0d78SBjoern A. Zeeb /* DO_NADA; */
14375a9a0d78SBjoern A. Zeeb }
14385a9a0d78SBjoern A. Zeeb
14395a9a0d78SBjoern A. Zeeb static inline struct ieee80211_txq *
ieee80211_next_txq(struct ieee80211_hw * hw,uint8_t ac)14405a9a0d78SBjoern A. Zeeb ieee80211_next_txq(struct ieee80211_hw *hw, uint8_t ac)
14415a9a0d78SBjoern A. Zeeb {
14425a9a0d78SBjoern A. Zeeb return (linuxkpi_ieee80211_next_txq(hw, ac));
14435a9a0d78SBjoern A. Zeeb }
14445a9a0d78SBjoern A. Zeeb
1445adff403fSBjoern A. Zeeb static inline void
ieee80211_handle_wake_tx_queue(struct ieee80211_hw * hw,struct ieee80211_txq * txq)1446adff403fSBjoern A. Zeeb ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
1447adff403fSBjoern A. Zeeb struct ieee80211_txq *txq)
1448adff403fSBjoern A. Zeeb {
1449eac3646fSBjoern A. Zeeb linuxkpi_ieee80211_handle_wake_tx_queue(hw, txq);
1450adff403fSBjoern A. Zeeb }
1451adff403fSBjoern A. Zeeb
1452*9cac7351SBjoern A. Zeeb static inline void
ieee80211_purge_tx_queue(struct ieee80211_hw * hw,struct sk_buff_head * skbs)1453*9cac7351SBjoern A. Zeeb ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
1454*9cac7351SBjoern A. Zeeb struct sk_buff_head *skbs)
1455*9cac7351SBjoern A. Zeeb {
1456*9cac7351SBjoern A. Zeeb TODO();
1457*9cac7351SBjoern A. Zeeb }
1458*9cac7351SBjoern A. Zeeb
14595a9a0d78SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
14605a9a0d78SBjoern A. Zeeb
14616b4cac81SBjoern A. Zeeb static __inline uint8_t
ieee80211_get_tid(struct ieee80211_hdr * hdr)14626b4cac81SBjoern A. Zeeb ieee80211_get_tid(struct ieee80211_hdr *hdr)
14636b4cac81SBjoern A. Zeeb {
14646b4cac81SBjoern A. Zeeb
1465ec190d91SBjoern A. Zeeb return (linuxkpi_ieee80211_get_tid(hdr, false));
14666b4cac81SBjoern A. Zeeb }
14676b4cac81SBjoern A. Zeeb
1468978f25e8SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_beacon_get_tim(struct ieee80211_hw * hw,struct ieee80211_vif * vif,uint16_t * tim_offset,uint16_t * tim_len,uint32_t link_id)1469978f25e8SBjoern A. Zeeb ieee80211_beacon_get_tim(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1470549198b1SBjoern A. Zeeb uint16_t *tim_offset, uint16_t *tim_len, uint32_t link_id)
1471978f25e8SBjoern A. Zeeb {
1472978f25e8SBjoern A. Zeeb
1473978f25e8SBjoern A. Zeeb if (tim_offset != NULL)
1474978f25e8SBjoern A. Zeeb *tim_offset = 0;
1475978f25e8SBjoern A. Zeeb if (tim_len != NULL)
1476978f25e8SBjoern A. Zeeb *tim_len = 0;
1477978f25e8SBjoern A. Zeeb TODO();
1478978f25e8SBjoern A. Zeeb return (NULL);
1479978f25e8SBjoern A. Zeeb }
1480978f25e8SBjoern A. Zeeb
14816b4cac81SBjoern A. Zeeb static __inline void
ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw * hw,enum ieee80211_iface_iter flags,void (* iterfunc)(void *,uint8_t *,struct ieee80211_vif *),void * arg)14826b4cac81SBjoern A. Zeeb ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
14836b4cac81SBjoern A. Zeeb enum ieee80211_iface_iter flags,
14846b4cac81SBjoern A. Zeeb void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
14856b4cac81SBjoern A. Zeeb void *arg)
14866b4cac81SBjoern A. Zeeb {
14876b4cac81SBjoern A. Zeeb
14886b4cac81SBjoern A. Zeeb flags |= IEEE80211_IFACE_ITER__ATOMIC;
1489adff403fSBjoern A. Zeeb flags |= IEEE80211_IFACE_ITER_ACTIVE;
14906b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
14916b4cac81SBjoern A. Zeeb }
14926b4cac81SBjoern A. Zeeb
14936b4cac81SBjoern A. Zeeb static __inline void
ieee80211_iterate_active_interfaces(struct ieee80211_hw * hw,enum ieee80211_iface_iter flags,void (* iterfunc)(void *,uint8_t *,struct ieee80211_vif *),void * arg)14946b4cac81SBjoern A. Zeeb ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
14956b4cac81SBjoern A. Zeeb enum ieee80211_iface_iter flags,
14966b4cac81SBjoern A. Zeeb void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
14976b4cac81SBjoern A. Zeeb void *arg)
14986b4cac81SBjoern A. Zeeb {
14996b4cac81SBjoern A. Zeeb
1500adff403fSBjoern A. Zeeb flags |= IEEE80211_IFACE_ITER_ACTIVE;
15016b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
15026b4cac81SBjoern A. Zeeb }
15036b4cac81SBjoern A. Zeeb
15046b4cac81SBjoern A. Zeeb static __inline void
ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw * hw,enum ieee80211_iface_iter flags,void (* iterfunc)(void *,uint8_t *,struct ieee80211_vif *),void * arg)1505800aa9cdSBjoern A. Zeeb ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw *hw,
1506800aa9cdSBjoern A. Zeeb enum ieee80211_iface_iter flags,
1507800aa9cdSBjoern A. Zeeb void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1508800aa9cdSBjoern A. Zeeb void *arg)
1509800aa9cdSBjoern A. Zeeb {
1510adff403fSBjoern A. Zeeb flags |= IEEE80211_IFACE_ITER_ACTIVE;
1511800aa9cdSBjoern A. Zeeb flags |= IEEE80211_IFACE_ITER__MTX;
1512800aa9cdSBjoern A. Zeeb linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
1513800aa9cdSBjoern A. Zeeb }
1514800aa9cdSBjoern A. Zeeb
1515800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_iterate_interfaces(struct ieee80211_hw * hw,enum ieee80211_iface_iter flags,void (* iterfunc)(void *,uint8_t *,struct ieee80211_vif *),void * arg)15166b4cac81SBjoern A. Zeeb ieee80211_iterate_interfaces(struct ieee80211_hw *hw,
15176b4cac81SBjoern A. Zeeb enum ieee80211_iface_iter flags,
15186b4cac81SBjoern A. Zeeb void (*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
15196b4cac81SBjoern A. Zeeb void *arg)
15206b4cac81SBjoern A. Zeeb {
15216b4cac81SBjoern A. Zeeb
15226b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
15236b4cac81SBjoern A. Zeeb }
15246b4cac81SBjoern A. Zeeb
152511db70b6SBjoern A. Zeeb static inline void
ieee80211_iter_keys(struct ieee80211_hw * hw,struct ieee80211_vif * vif,void (* iterfunc)(struct ieee80211_hw *,struct ieee80211_vif *,struct ieee80211_sta *,struct ieee80211_key_conf *,void *),void * arg)15266b4cac81SBjoern A. Zeeb ieee80211_iter_keys(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
15276b4cac81SBjoern A. Zeeb void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
15286b4cac81SBjoern A. Zeeb struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
15296b4cac81SBjoern A. Zeeb void *arg)
15306b4cac81SBjoern A. Zeeb {
153111db70b6SBjoern A. Zeeb linuxkpi_ieee80211_iterate_keys(hw, vif, iterfunc, arg, false);
15326b4cac81SBjoern A. Zeeb }
15336b4cac81SBjoern A. Zeeb
153411db70b6SBjoern A. Zeeb static inline void
ieee80211_iter_keys_rcu(struct ieee80211_hw * hw,struct ieee80211_vif * vif,void (* iterfunc)(struct ieee80211_hw *,struct ieee80211_vif *,struct ieee80211_sta *,struct ieee80211_key_conf *,void *),void * arg)15356b4cac81SBjoern A. Zeeb ieee80211_iter_keys_rcu(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
15366b4cac81SBjoern A. Zeeb void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
15376b4cac81SBjoern A. Zeeb struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
15386b4cac81SBjoern A. Zeeb void *arg)
15396b4cac81SBjoern A. Zeeb {
154011db70b6SBjoern A. Zeeb linuxkpi_ieee80211_iterate_keys(hw, vif, iterfunc, arg, true);
15416b4cac81SBjoern A. Zeeb }
15426b4cac81SBjoern A. Zeeb
15436b4cac81SBjoern A. Zeeb static __inline void
ieee80211_iter_chan_contexts_atomic(struct ieee80211_hw * hw,void (* iterfunc)(struct ieee80211_hw *,struct ieee80211_chanctx_conf *,void *),void * arg)15446b4cac81SBjoern A. Zeeb ieee80211_iter_chan_contexts_atomic(struct ieee80211_hw *hw,
15456b4cac81SBjoern A. Zeeb void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, void *),
15466b4cac81SBjoern A. Zeeb void *arg)
15476b4cac81SBjoern A. Zeeb {
15486b4cac81SBjoern A. Zeeb
15496b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iterate_chan_contexts(hw, iterfunc, arg);
15506b4cac81SBjoern A. Zeeb }
15516b4cac81SBjoern A. Zeeb
15526b4cac81SBjoern A. Zeeb static __inline void
ieee80211_iterate_stations_atomic(struct ieee80211_hw * hw,void (* iterfunc)(void *,struct ieee80211_sta *),void * arg)15536b4cac81SBjoern A. Zeeb ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
15546b4cac81SBjoern A. Zeeb void (*iterfunc)(void *, struct ieee80211_sta *), void *arg)
15556b4cac81SBjoern A. Zeeb {
15566b4cac81SBjoern A. Zeeb
15576b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_iterate_stations_atomic(hw, iterfunc, arg);
15586b4cac81SBjoern A. Zeeb }
15596b4cac81SBjoern A. Zeeb
15606b4cac81SBjoern A. Zeeb static __inline struct wireless_dev *
ieee80211_vif_to_wdev(struct ieee80211_vif * vif)15616b4cac81SBjoern A. Zeeb ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
15626b4cac81SBjoern A. Zeeb {
15636b4cac81SBjoern A. Zeeb
15646b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_vif_to_wdev(vif));
15656b4cac81SBjoern A. Zeeb }
15666b4cac81SBjoern A. Zeeb
15676b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_beacon_get_template(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct ieee80211_mutable_offsets * offs,uint32_t link_id)15686b4cac81SBjoern A. Zeeb ieee80211_beacon_get_template(struct ieee80211_hw *hw,
1569467d3e2eSBjoern A. Zeeb struct ieee80211_vif *vif, struct ieee80211_mutable_offsets *offs,
1570549198b1SBjoern A. Zeeb uint32_t link_id)
15716b4cac81SBjoern A. Zeeb {
15726b4cac81SBjoern A. Zeeb TODO();
15736b4cac81SBjoern A. Zeeb return (NULL);
15746b4cac81SBjoern A. Zeeb }
15756b4cac81SBjoern A. Zeeb
15766b4cac81SBjoern A. Zeeb static __inline void
ieee80211_beacon_loss(struct ieee80211_vif * vif)15776b4cac81SBjoern A. Zeeb ieee80211_beacon_loss(struct ieee80211_vif *vif)
15786b4cac81SBjoern A. Zeeb {
1579bb81db90SBjoern A. Zeeb linuxkpi_ieee80211_beacon_loss(vif);
15806b4cac81SBjoern A. Zeeb }
15816b4cac81SBjoern A. Zeeb
15826b4cac81SBjoern A. Zeeb static __inline void
ieee80211_chswitch_done(struct ieee80211_vif * vif,bool t,uint32_t link_id)15837b43f4d0SBjoern A. Zeeb ieee80211_chswitch_done(struct ieee80211_vif *vif, bool t, uint32_t link_id)
15846b4cac81SBjoern A. Zeeb {
15856b4cac81SBjoern A. Zeeb TODO();
15866b4cac81SBjoern A. Zeeb }
15876b4cac81SBjoern A. Zeeb
15886b4cac81SBjoern A. Zeeb static __inline bool
ieee80211_csa_is_complete(struct ieee80211_vif * vif)15896b4cac81SBjoern A. Zeeb ieee80211_csa_is_complete(struct ieee80211_vif *vif)
15906b4cac81SBjoern A. Zeeb {
15916b4cac81SBjoern A. Zeeb TODO();
15926b4cac81SBjoern A. Zeeb return (false);
15936b4cac81SBjoern A. Zeeb }
15946b4cac81SBjoern A. Zeeb
15956b4cac81SBjoern A. Zeeb static __inline void
ieee80211_csa_set_counter(struct ieee80211_vif * vif,uint8_t counter)15966b4cac81SBjoern A. Zeeb ieee80211_csa_set_counter(struct ieee80211_vif *vif, uint8_t counter)
15976b4cac81SBjoern A. Zeeb {
15986b4cac81SBjoern A. Zeeb TODO();
15996b4cac81SBjoern A. Zeeb }
16006b4cac81SBjoern A. Zeeb
16016b4cac81SBjoern A. Zeeb static __inline int
ieee80211_csa_update_counter(struct ieee80211_vif * vif)16026b4cac81SBjoern A. Zeeb ieee80211_csa_update_counter(struct ieee80211_vif *vif)
16036b4cac81SBjoern A. Zeeb {
16046b4cac81SBjoern A. Zeeb TODO();
16056b4cac81SBjoern A. Zeeb return (-1);
16066b4cac81SBjoern A. Zeeb }
16076b4cac81SBjoern A. Zeeb
16086b4cac81SBjoern A. Zeeb static __inline void
ieee80211_csa_finish(struct ieee80211_vif * vif,uint32_t link_id)16097b43f4d0SBjoern A. Zeeb ieee80211_csa_finish(struct ieee80211_vif *vif, uint32_t link_id)
16106b4cac81SBjoern A. Zeeb {
16116b4cac81SBjoern A. Zeeb TODO();
16126b4cac81SBjoern A. Zeeb }
16136b4cac81SBjoern A. Zeeb
1614c75a558dSBjoern A. Zeeb static inline enum nl80211_iftype
ieee80211_vif_type_p2p(struct ieee80211_vif * vif)16156b4cac81SBjoern A. Zeeb ieee80211_vif_type_p2p(struct ieee80211_vif *vif)
16166b4cac81SBjoern A. Zeeb {
16176b4cac81SBjoern A. Zeeb
16186b4cac81SBjoern A. Zeeb /* If we are not p2p enabled, just return the type. */
16196b4cac81SBjoern A. Zeeb if (!vif->p2p)
16206b4cac81SBjoern A. Zeeb return (vif->type);
16216b4cac81SBjoern A. Zeeb
16226b4cac81SBjoern A. Zeeb /* If we are p2p, depending on side, return type. */
16236b4cac81SBjoern A. Zeeb switch (vif->type) {
16246b4cac81SBjoern A. Zeeb case NL80211_IFTYPE_AP:
16256b4cac81SBjoern A. Zeeb return (NL80211_IFTYPE_P2P_GO);
16266b4cac81SBjoern A. Zeeb case NL80211_IFTYPE_STATION:
16276b4cac81SBjoern A. Zeeb return (NL80211_IFTYPE_P2P_CLIENT);
16286b4cac81SBjoern A. Zeeb default:
16296b4cac81SBjoern A. Zeeb fallthrough;
16306b4cac81SBjoern A. Zeeb }
16316b4cac81SBjoern A. Zeeb return (vif->type);
16326b4cac81SBjoern A. Zeeb }
16336b4cac81SBjoern A. Zeeb
16346b4cac81SBjoern A. Zeeb static __inline unsigned long
ieee80211_tu_to_usec(unsigned long tu)16356b4cac81SBjoern A. Zeeb ieee80211_tu_to_usec(unsigned long tu)
16366b4cac81SBjoern A. Zeeb {
16376b4cac81SBjoern A. Zeeb
16386b4cac81SBjoern A. Zeeb return (tu * IEEE80211_DUR_TU);
16396b4cac81SBjoern A. Zeeb }
16406b4cac81SBjoern A. Zeeb
164135f7fa4aSBjoern A. Zeeb /*
164235f7fa4aSBjoern A. Zeeb * Below we assume that the two values from different emums are the same.
164335f7fa4aSBjoern A. Zeeb * Make sure this does not accidentally change.
164435f7fa4aSBjoern A. Zeeb */
164535f7fa4aSBjoern A. Zeeb CTASSERT((int)IEEE80211_ACTION_SM_TPCREP == (int)IEEE80211_ACTION_RADIO_MEASUREMENT_LMREP);
16466b4cac81SBjoern A. Zeeb
1647800aa9cdSBjoern A. Zeeb static __inline bool
ieee80211_action_contains_tpc(struct sk_buff * skb)16486b4cac81SBjoern A. Zeeb ieee80211_action_contains_tpc(struct sk_buff *skb)
16496b4cac81SBjoern A. Zeeb {
1650800aa9cdSBjoern A. Zeeb struct ieee80211_mgmt *mgmt;
1651800aa9cdSBjoern A. Zeeb
1652800aa9cdSBjoern A. Zeeb mgmt = (struct ieee80211_mgmt *)skb->data;
1653800aa9cdSBjoern A. Zeeb
1654800aa9cdSBjoern A. Zeeb /* Check that this is a mgmt/action frame? */
1655800aa9cdSBjoern A. Zeeb if (!ieee80211_is_action(mgmt->frame_control))
1656800aa9cdSBjoern A. Zeeb return (false);
1657800aa9cdSBjoern A. Zeeb
1658800aa9cdSBjoern A. Zeeb /*
1659800aa9cdSBjoern A. Zeeb * This is a bit convoluted but according to docs both actions
1660800aa9cdSBjoern A. Zeeb * are checked for this. Kind-of makes sense for the only consumer
1661800aa9cdSBjoern A. Zeeb * (iwlwifi) I am aware off given the txpower fields are at the
1662800aa9cdSBjoern A. Zeeb * same location so firmware can update the value.
1663800aa9cdSBjoern A. Zeeb */
1664800aa9cdSBjoern A. Zeeb /* 80211-2020 9.6.2 Spectrum Management Action frames */
1665800aa9cdSBjoern A. Zeeb /* 80211-2020 9.6.2.5 TPC Report frame format */
1666800aa9cdSBjoern A. Zeeb /* 80211-2020 9.6.6 Radio Measurement action details */
1667800aa9cdSBjoern A. Zeeb /* 80211-2020 9.6.6.4 Link Measurement Report frame format */
1668800aa9cdSBjoern A. Zeeb /* Check that it is Spectrum Management or Radio Measurement? */
1669800aa9cdSBjoern A. Zeeb if (mgmt->u.action.category != IEEE80211_ACTION_CAT_SM &&
1670800aa9cdSBjoern A. Zeeb mgmt->u.action.category != IEEE80211_ACTION_CAT_RADIO_MEASUREMENT)
1671800aa9cdSBjoern A. Zeeb return (false);
1672800aa9cdSBjoern A. Zeeb
167335f7fa4aSBjoern A. Zeeb /*
167435f7fa4aSBjoern A. Zeeb * Check that it is TPC Report or Link Measurement Report?
167535f7fa4aSBjoern A. Zeeb * The values of each are the same (see CTASSERT above function).
167635f7fa4aSBjoern A. Zeeb */
1677800aa9cdSBjoern A. Zeeb if (mgmt->u.action.u.tpc_report.spec_mgmt != IEEE80211_ACTION_SM_TPCREP)
1678800aa9cdSBjoern A. Zeeb return (false);
1679800aa9cdSBjoern A. Zeeb
1680800aa9cdSBjoern A. Zeeb /* 80211-2020 9.4.2.16 TPC Report element */
1681800aa9cdSBjoern A. Zeeb /* Check that the ELEMID and length are correct? */
1682800aa9cdSBjoern A. Zeeb if (mgmt->u.action.u.tpc_report.tpc_elem_id != IEEE80211_ELEMID_TPCREP ||
1683800aa9cdSBjoern A. Zeeb mgmt->u.action.u.tpc_report.tpc_elem_length != 4)
1684800aa9cdSBjoern A. Zeeb return (false);
1685800aa9cdSBjoern A. Zeeb
1686800aa9cdSBjoern A. Zeeb /* All the right fields in the right place. */
1687800aa9cdSBjoern A. Zeeb return (true);
16886b4cac81SBjoern A. Zeeb }
16896b4cac81SBjoern A. Zeeb
16906b4cac81SBjoern A. Zeeb static __inline void
ieee80211_connection_loss(struct ieee80211_vif * vif)16916b4cac81SBjoern A. Zeeb ieee80211_connection_loss(struct ieee80211_vif *vif)
16926b4cac81SBjoern A. Zeeb {
16936b4cac81SBjoern A. Zeeb
16946b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_connection_loss(vif);
16956b4cac81SBjoern A. Zeeb }
16966b4cac81SBjoern A. Zeeb
16976b4cac81SBjoern A. Zeeb static __inline struct ieee80211_sta *
ieee80211_find_sta(struct ieee80211_vif * vif,const u8 * peer)16986b4cac81SBjoern A. Zeeb ieee80211_find_sta(struct ieee80211_vif *vif, const u8 *peer)
16996b4cac81SBjoern A. Zeeb {
17006b4cac81SBjoern A. Zeeb
17016b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_find_sta(vif, peer));
17026b4cac81SBjoern A. Zeeb }
17036b4cac81SBjoern A. Zeeb
17046b4cac81SBjoern A. Zeeb static __inline struct ieee80211_sta *
ieee80211_find_sta_by_ifaddr(struct ieee80211_hw * hw,const uint8_t * addr,const uint8_t * ourvifaddr)17052e183d99SBjoern A. Zeeb ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, const uint8_t *addr,
17062e183d99SBjoern A. Zeeb const uint8_t *ourvifaddr)
17076b4cac81SBjoern A. Zeeb {
17086b4cac81SBjoern A. Zeeb
17096b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_find_sta_by_ifaddr(hw, addr, ourvifaddr));
17106b4cac81SBjoern A. Zeeb }
17116b4cac81SBjoern A. Zeeb
17126b4cac81SBjoern A. Zeeb static __inline size_t
ieee80211_ie_split(const u8 * ies,size_t ies_len,const u8 * ie_ids,size_t ie_ids_len,size_t start)17136b4cac81SBjoern A. Zeeb ieee80211_ie_split(const u8 *ies, size_t ies_len,
17146b4cac81SBjoern A. Zeeb const u8 *ie_ids, size_t ie_ids_len, size_t start)
17156b4cac81SBjoern A. Zeeb {
17166b4cac81SBjoern A. Zeeb size_t x;
17176b4cac81SBjoern A. Zeeb
17186b4cac81SBjoern A. Zeeb x = start;
17196b4cac81SBjoern A. Zeeb
17206b4cac81SBjoern A. Zeeb /* XXX FIXME, we need to deal with "Element ID Extension" */
17216b4cac81SBjoern A. Zeeb while (x < ies_len) {
17226b4cac81SBjoern A. Zeeb
17236b4cac81SBjoern A. Zeeb /* Is this IE[s] one of the ie_ids? */
17246b4cac81SBjoern A. Zeeb if (!linuxkpi_ieee80211_is_ie_id_in_ie_buf(ies[x],
17256b4cac81SBjoern A. Zeeb ie_ids, ie_ids_len))
17266b4cac81SBjoern A. Zeeb break;
17276b4cac81SBjoern A. Zeeb
17286b4cac81SBjoern A. Zeeb if (!linuxkpi_ieee80211_ie_advance(&x, ies, ies_len))
17296b4cac81SBjoern A. Zeeb break;
17306b4cac81SBjoern A. Zeeb }
17316b4cac81SBjoern A. Zeeb
17326b4cac81SBjoern A. Zeeb return (x);
17336b4cac81SBjoern A. Zeeb }
17346b4cac81SBjoern A. Zeeb
17356b4cac81SBjoern A. Zeeb static __inline void
ieee80211_request_smps(struct ieee80211_vif * vif,u_int link_id,enum ieee80211_smps_mode smps)1736815b7436SBjoern A. Zeeb ieee80211_request_smps(struct ieee80211_vif *vif, u_int link_id,
1737adff403fSBjoern A. Zeeb enum ieee80211_smps_mode smps)
17386b4cac81SBjoern A. Zeeb {
1739b0f73768SBjoern A. Zeeb static const char *smps_mode_name[] = {
1740b0f73768SBjoern A. Zeeb "SMPS_OFF",
1741b0f73768SBjoern A. Zeeb "SMPS_STATIC",
1742b0f73768SBjoern A. Zeeb "SMPS_DYNAMIC",
1743b0f73768SBjoern A. Zeeb "SMPS_AUTOMATIC",
1744b0f73768SBjoern A. Zeeb "SMPS_NUM_MODES"
1745b0f73768SBjoern A. Zeeb };
17466b4cac81SBjoern A. Zeeb
1747b0f73768SBjoern A. Zeeb if (linuxkpi_debug_80211 & D80211_TODO)
1748b0f73768SBjoern A. Zeeb printf("%s:%d: XXX LKPI80211 TODO smps %d %s\n",
1749b0f73768SBjoern A. Zeeb __func__, __LINE__, smps, smps_mode_name[smps]);
17506b4cac81SBjoern A. Zeeb }
17516b4cac81SBjoern A. Zeeb
17526b4cac81SBjoern A. Zeeb static __inline void
ieee80211_tdls_oper_request(struct ieee80211_vif * vif,uint8_t * addr,enum nl80211_tdls_operation oper,enum ieee80211_reason_code code,gfp_t gfp)17536b4cac81SBjoern A. Zeeb ieee80211_tdls_oper_request(struct ieee80211_vif *vif, uint8_t *addr,
17546b4cac81SBjoern A. Zeeb enum nl80211_tdls_operation oper, enum ieee80211_reason_code code,
17556b4cac81SBjoern A. Zeeb gfp_t gfp)
17566b4cac81SBjoern A. Zeeb {
17576b4cac81SBjoern A. Zeeb TODO();
17586b4cac81SBjoern A. Zeeb }
17596b4cac81SBjoern A. Zeeb
17606b4cac81SBjoern A. Zeeb static __inline void
wiphy_rfkill_set_hw_state(struct wiphy * wiphy,bool state)17616b4cac81SBjoern A. Zeeb wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool state)
17626b4cac81SBjoern A. Zeeb {
17636b4cac81SBjoern A. Zeeb TODO();
17646b4cac81SBjoern A. Zeeb }
17656b4cac81SBjoern A. Zeeb
17666b4cac81SBjoern A. Zeeb static __inline void
ieee80211_free_txskb(struct ieee80211_hw * hw,struct sk_buff * skb)17676b4cac81SBjoern A. Zeeb ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
17686b4cac81SBjoern A. Zeeb {
17696b4cac81SBjoern A. Zeeb IMPROVE();
17706b4cac81SBjoern A. Zeeb
17716b4cac81SBjoern A. Zeeb /*
17726b4cac81SBjoern A. Zeeb * This is called on transmit failure.
17736b4cac81SBjoern A. Zeeb * Use a not-so-random random high status error so we can distinguish
17746b4cac81SBjoern A. Zeeb * it from normal low values flying around in net80211 ("ETX").
17756b4cac81SBjoern A. Zeeb */
17766b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_free_txskb(hw, skb, 0x455458);
17776b4cac81SBjoern A. Zeeb }
17786b4cac81SBjoern A. Zeeb
17796b4cac81SBjoern A. Zeeb static __inline void
ieee80211_ready_on_channel(struct ieee80211_hw * hw)17806b4cac81SBjoern A. Zeeb ieee80211_ready_on_channel(struct ieee80211_hw *hw)
17816b4cac81SBjoern A. Zeeb {
17826b4cac81SBjoern A. Zeeb TODO();
17836b4cac81SBjoern A. Zeeb /* XXX-BZ We need to see that. */
17846b4cac81SBjoern A. Zeeb }
17856b4cac81SBjoern A. Zeeb
17866b4cac81SBjoern A. Zeeb static __inline void
ieee80211_remain_on_channel_expired(struct ieee80211_hw * hw)17876b4cac81SBjoern A. Zeeb ieee80211_remain_on_channel_expired(struct ieee80211_hw *hw)
17886b4cac81SBjoern A. Zeeb {
17896b4cac81SBjoern A. Zeeb TODO();
17906b4cac81SBjoern A. Zeeb }
17916b4cac81SBjoern A. Zeeb
17926b4cac81SBjoern A. Zeeb static __inline void
ieee80211_cqm_rssi_notify(struct ieee80211_vif * vif,enum nl80211_cqm_rssi_threshold_event crte,int sig,gfp_t gfp)17936b4cac81SBjoern A. Zeeb ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
17946b4cac81SBjoern A. Zeeb enum nl80211_cqm_rssi_threshold_event crte, int sig, gfp_t gfp)
17956b4cac81SBjoern A. Zeeb {
17966b4cac81SBjoern A. Zeeb TODO();
17976b4cac81SBjoern A. Zeeb }
17986b4cac81SBjoern A. Zeeb
1799db8b3578SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
1800db8b3578SBjoern A. Zeeb
1801db8b3578SBjoern A. Zeeb static inline bool
ieee80211_sn_less(uint16_t sn1,uint16_t sn2)1802db8b3578SBjoern A. Zeeb ieee80211_sn_less(uint16_t sn1, uint16_t sn2)
1803db8b3578SBjoern A. Zeeb {
1804db8b3578SBjoern A. Zeeb return (IEEE80211_SEQ_BA_BEFORE(sn1, sn2));
1805db8b3578SBjoern A. Zeeb }
1806db8b3578SBjoern A. Zeeb
1807db8b3578SBjoern A. Zeeb static inline uint16_t
ieee80211_sn_inc(uint16_t sn)1808db8b3578SBjoern A. Zeeb ieee80211_sn_inc(uint16_t sn)
1809db8b3578SBjoern A. Zeeb {
1810db8b3578SBjoern A. Zeeb return (IEEE80211_SEQ_INC(sn));
1811db8b3578SBjoern A. Zeeb }
1812db8b3578SBjoern A. Zeeb
1813db8b3578SBjoern A. Zeeb static inline uint16_t
ieee80211_sn_add(uint16_t sn,uint16_t a)1814db8b3578SBjoern A. Zeeb ieee80211_sn_add(uint16_t sn, uint16_t a)
1815db8b3578SBjoern A. Zeeb {
1816db8b3578SBjoern A. Zeeb return (IEEE80211_SEQ_ADD(sn, a));
1817db8b3578SBjoern A. Zeeb }
1818db8b3578SBjoern A. Zeeb
1819db8b3578SBjoern A. Zeeb static inline uint16_t
ieee80211_sn_sub(uint16_t sa,uint16_t sb)1820db8b3578SBjoern A. Zeeb ieee80211_sn_sub(uint16_t sa, uint16_t sb)
1821db8b3578SBjoern A. Zeeb {
1822db8b3578SBjoern A. Zeeb return (IEEE80211_SEQ_SUB(sa, sb));
1823db8b3578SBjoern A. Zeeb }
1824db8b3578SBjoern A. Zeeb
18256b4cac81SBjoern A. Zeeb static __inline void
ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta * sta,uint8_t tid,uint32_t ssn,uint64_t bitmap,uint16_t received_mpdu)18266b4cac81SBjoern A. Zeeb ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *sta, uint8_t tid,
18276b4cac81SBjoern A. Zeeb uint32_t ssn, uint64_t bitmap, uint16_t received_mpdu)
18286b4cac81SBjoern A. Zeeb {
18296b4cac81SBjoern A. Zeeb TODO();
18306b4cac81SBjoern A. Zeeb }
18316b4cac81SBjoern A. Zeeb
18326b4cac81SBjoern A. Zeeb static __inline void
ieee80211_stop_rx_ba_session(struct ieee80211_vif * vif,uint32_t x,uint8_t * addr)18336b4cac81SBjoern A. Zeeb ieee80211_stop_rx_ba_session(struct ieee80211_vif *vif, uint32_t x, uint8_t *addr)
18346b4cac81SBjoern A. Zeeb {
18356b4cac81SBjoern A. Zeeb TODO();
18366b4cac81SBjoern A. Zeeb }
18376b4cac81SBjoern A. Zeeb
18386b4cac81SBjoern A. Zeeb static __inline void
ieee80211_rx_ba_timer_expired(struct ieee80211_vif * vif,uint8_t * addr,uint8_t tid)1839db8b3578SBjoern A. Zeeb ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif, uint8_t *addr,
1840db8b3578SBjoern A. Zeeb uint8_t tid)
1841db8b3578SBjoern A. Zeeb {
1842db8b3578SBjoern A. Zeeb TODO();
1843db8b3578SBjoern A. Zeeb }
1844db8b3578SBjoern A. Zeeb
1845db8b3578SBjoern A. Zeeb static __inline void
ieee80211_start_rx_ba_session_offl(struct ieee80211_vif * vif,uint8_t * addr,uint8_t tid)1846db8b3578SBjoern A. Zeeb ieee80211_start_rx_ba_session_offl(struct ieee80211_vif *vif, uint8_t *addr,
1847db8b3578SBjoern A. Zeeb uint8_t tid)
1848db8b3578SBjoern A. Zeeb {
1849db8b3578SBjoern A. Zeeb TODO();
1850db8b3578SBjoern A. Zeeb }
1851db8b3578SBjoern A. Zeeb
1852db8b3578SBjoern A. Zeeb static __inline void
ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif * vif,uint8_t * addr,uint8_t tid)1853db8b3578SBjoern A. Zeeb ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif *vif, uint8_t *addr,
1854db8b3578SBjoern A. Zeeb uint8_t tid)
1855db8b3578SBjoern A. Zeeb {
1856db8b3578SBjoern A. Zeeb TODO();
1857db8b3578SBjoern A. Zeeb }
1858db8b3578SBjoern A. Zeeb
1859db8b3578SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
1860db8b3578SBjoern A. Zeeb
18615778cbdaSBjoern A. Zeeb static inline void
ieee80211_rate_set_vht(struct ieee80211_tx_rate * r,uint8_t mcs,uint8_t nss)18625778cbdaSBjoern A. Zeeb ieee80211_rate_set_vht(struct ieee80211_tx_rate *r, uint8_t mcs, uint8_t nss)
18636b4cac81SBjoern A. Zeeb {
18645778cbdaSBjoern A. Zeeb
18655778cbdaSBjoern A. Zeeb /* XXX-BZ make it KASSERTS? */
18665778cbdaSBjoern A. Zeeb if (((mcs & 0xF0) != 0) || (((nss - 1) & 0xf8) != 0)) {
18675778cbdaSBjoern A. Zeeb printf("%s:%d: mcs %#04x nss %#04x invalid\n",
18685778cbdaSBjoern A. Zeeb __func__, __LINE__, mcs, nss);
18695778cbdaSBjoern A. Zeeb return;
18706b4cac81SBjoern A. Zeeb }
18716b4cac81SBjoern A. Zeeb
18725778cbdaSBjoern A. Zeeb r->idx = mcs;
18735778cbdaSBjoern A. Zeeb r->idx |= ((nss - 1) << 4);
18745778cbdaSBjoern A. Zeeb }
18755778cbdaSBjoern A. Zeeb
18765778cbdaSBjoern A. Zeeb static inline uint8_t
ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate * r)1877675e6b1cSBjoern A. Zeeb ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *r)
1878adff403fSBjoern A. Zeeb {
18795778cbdaSBjoern A. Zeeb return (((r->idx >> 4) & 0x07) + 1);
18805778cbdaSBjoern A. Zeeb }
18815778cbdaSBjoern A. Zeeb
18825778cbdaSBjoern A. Zeeb static inline uint8_t
ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate * r)1883675e6b1cSBjoern A. Zeeb ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *r)
18845778cbdaSBjoern A. Zeeb {
18855778cbdaSBjoern A. Zeeb return (r->idx & 0x0f);
18865778cbdaSBjoern A. Zeeb }
18875778cbdaSBjoern A. Zeeb
18885778cbdaSBjoern A. Zeeb static inline int
ieee80211_get_vht_max_nss(struct ieee80211_vht_cap * vht_cap,enum ieee80211_vht_chanwidth chanwidth,int mcs,bool ext_nss_bw_cap,int max_nss)18895778cbdaSBjoern A. Zeeb ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *vht_cap,
18905778cbdaSBjoern A. Zeeb enum ieee80211_vht_chanwidth chanwidth, /* defined in net80211. */
18915778cbdaSBjoern A. Zeeb int mcs /* always 0 */, bool ext_nss_bw_cap /* always true */, int max_nss)
18925778cbdaSBjoern A. Zeeb {
18935778cbdaSBjoern A. Zeeb enum ieee80211_vht_mcs_support mcs_s;
18945778cbdaSBjoern A. Zeeb uint32_t supp_cw, ext_nss_bw;
18955778cbdaSBjoern A. Zeeb
18965778cbdaSBjoern A. Zeeb switch (mcs) {
18975778cbdaSBjoern A. Zeeb case 0 ... 7:
18985778cbdaSBjoern A. Zeeb mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_7;
18995778cbdaSBjoern A. Zeeb break;
19005778cbdaSBjoern A. Zeeb case 8:
19015778cbdaSBjoern A. Zeeb mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_8;
19025778cbdaSBjoern A. Zeeb break;
19035778cbdaSBjoern A. Zeeb case 9:
19045778cbdaSBjoern A. Zeeb mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_9;
19055778cbdaSBjoern A. Zeeb break;
19065778cbdaSBjoern A. Zeeb default:
19075778cbdaSBjoern A. Zeeb printf("%s: unsupported mcs value %d\n", __func__, mcs);
1908adff403fSBjoern A. Zeeb return (0);
1909adff403fSBjoern A. Zeeb }
1910adff403fSBjoern A. Zeeb
19115778cbdaSBjoern A. Zeeb if (max_nss == 0) {
19125778cbdaSBjoern A. Zeeb uint16_t map;
19135778cbdaSBjoern A. Zeeb
19145778cbdaSBjoern A. Zeeb map = le16toh(vht_cap->supp_mcs.rx_mcs_map);
19155778cbdaSBjoern A. Zeeb for (int i = 7; i >= 0; i--) {
19165778cbdaSBjoern A. Zeeb uint8_t val;
19175778cbdaSBjoern A. Zeeb
19185778cbdaSBjoern A. Zeeb val = (map >> (2 * i)) & 0x03;
19195778cbdaSBjoern A. Zeeb if (val == IEEE80211_VHT_MCS_NOT_SUPPORTED)
19205778cbdaSBjoern A. Zeeb continue;
19215778cbdaSBjoern A. Zeeb if (val >= mcs_s) {
19225778cbdaSBjoern A. Zeeb max_nss = i + 1;
19235778cbdaSBjoern A. Zeeb break;
1924adff403fSBjoern A. Zeeb }
19255778cbdaSBjoern A. Zeeb }
19265778cbdaSBjoern A. Zeeb }
19275778cbdaSBjoern A. Zeeb
19285778cbdaSBjoern A. Zeeb if (max_nss == 0)
19295778cbdaSBjoern A. Zeeb return (0);
19305778cbdaSBjoern A. Zeeb
19315778cbdaSBjoern A. Zeeb if ((le16toh(vht_cap->supp_mcs.tx_mcs_map) &
19325778cbdaSBjoern A. Zeeb IEEE80211_VHT_EXT_NSS_BW_CAPABLE) == 0)
19335778cbdaSBjoern A. Zeeb return (max_nss);
19345778cbdaSBjoern A. Zeeb
19355778cbdaSBjoern A. Zeeb supp_cw = le32_get_bits(vht_cap->vht_cap_info,
19365778cbdaSBjoern A. Zeeb IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK);
19375778cbdaSBjoern A. Zeeb ext_nss_bw = le32_get_bits(vht_cap->vht_cap_info,
19385778cbdaSBjoern A. Zeeb IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
19395778cbdaSBjoern A. Zeeb
19405778cbdaSBjoern A. Zeeb /* If requested as ext nss not supported assume ext_nss_bw 0. */
19415778cbdaSBjoern A. Zeeb if (!ext_nss_bw_cap)
19425778cbdaSBjoern A. Zeeb ext_nss_bw = 0;
19435778cbdaSBjoern A. Zeeb
19445778cbdaSBjoern A. Zeeb /*
19455778cbdaSBjoern A. Zeeb * Cover 802.11-2016, Table 9-250.
19465778cbdaSBjoern A. Zeeb */
19475778cbdaSBjoern A. Zeeb
19485778cbdaSBjoern A. Zeeb /* Unsupported settings. */
19495778cbdaSBjoern A. Zeeb if (supp_cw == 3)
19505778cbdaSBjoern A. Zeeb return (0);
19515778cbdaSBjoern A. Zeeb if (supp_cw == 2 && (ext_nss_bw == 1 || ext_nss_bw == 2))
19525778cbdaSBjoern A. Zeeb return (0);
19535778cbdaSBjoern A. Zeeb
19545778cbdaSBjoern A. Zeeb /* Settings with factor != 1 or unsupported. */
19555778cbdaSBjoern A. Zeeb switch (chanwidth) {
19565778cbdaSBjoern A. Zeeb case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
19575778cbdaSBjoern A. Zeeb if (supp_cw == 0 && (ext_nss_bw == 0 || ext_nss_bw == 1))
19585778cbdaSBjoern A. Zeeb return (0);
19595778cbdaSBjoern A. Zeeb if (supp_cw == 1 && ext_nss_bw == 0)
19605778cbdaSBjoern A. Zeeb return (0);
19615778cbdaSBjoern A. Zeeb if ((supp_cw == 0 || supp_cw == 1) && ext_nss_bw == 2)
19625778cbdaSBjoern A. Zeeb return (max_nss / 2);
19635778cbdaSBjoern A. Zeeb if ((supp_cw == 0 || supp_cw == 1) && ext_nss_bw == 3)
19645778cbdaSBjoern A. Zeeb return (3 * max_nss / 4);
19655778cbdaSBjoern A. Zeeb break;
19665778cbdaSBjoern A. Zeeb case IEEE80211_VHT_CHANWIDTH_160MHZ:
19675778cbdaSBjoern A. Zeeb if (supp_cw == 0 && ext_nss_bw == 0)
19685778cbdaSBjoern A. Zeeb return (0);
19695778cbdaSBjoern A. Zeeb if (supp_cw == 0 && (ext_nss_bw == 1 || ext_nss_bw == 2))
19705778cbdaSBjoern A. Zeeb return (max_nss / 2);
19715778cbdaSBjoern A. Zeeb if (supp_cw == 0 && ext_nss_bw == 3)
19725778cbdaSBjoern A. Zeeb return (3 * max_nss / 4);
19735778cbdaSBjoern A. Zeeb if (supp_cw == 1 && ext_nss_bw == 3)
19745778cbdaSBjoern A. Zeeb return (2 * max_nss);
19755778cbdaSBjoern A. Zeeb break;
19765778cbdaSBjoern A. Zeeb case IEEE80211_VHT_CHANWIDTH_80MHZ:
19775778cbdaSBjoern A. Zeeb case IEEE80211_VHT_CHANWIDTH_USE_HT:
19785778cbdaSBjoern A. Zeeb if ((supp_cw == 1 || supp_cw == 2) && ext_nss_bw == 3)
19795778cbdaSBjoern A. Zeeb return (2 * max_nss);
19805778cbdaSBjoern A. Zeeb break;
19815778cbdaSBjoern A. Zeeb }
19825778cbdaSBjoern A. Zeeb
19835778cbdaSBjoern A. Zeeb /* Everything else has a factor of 1. */
19845778cbdaSBjoern A. Zeeb return (max_nss);
19855778cbdaSBjoern A. Zeeb }
19865778cbdaSBjoern A. Zeeb
1987adff403fSBjoern A. Zeeb
19886b4cac81SBjoern A. Zeeb static __inline void
ieee80211_reserve_tid(struct ieee80211_sta * sta,uint8_t tid)19896b4cac81SBjoern A. Zeeb ieee80211_reserve_tid(struct ieee80211_sta *sta, uint8_t tid)
19906b4cac81SBjoern A. Zeeb {
19916b4cac81SBjoern A. Zeeb TODO();
19926b4cac81SBjoern A. Zeeb }
19936b4cac81SBjoern A. Zeeb
19946b4cac81SBjoern A. Zeeb static __inline void
ieee80211_unreserve_tid(struct ieee80211_sta * sta,uint8_t tid)19956b4cac81SBjoern A. Zeeb ieee80211_unreserve_tid(struct ieee80211_sta *sta, uint8_t tid)
19966b4cac81SBjoern A. Zeeb {
19976b4cac81SBjoern A. Zeeb TODO();
19986b4cac81SBjoern A. Zeeb }
19996b4cac81SBjoern A. Zeeb
20006b4cac81SBjoern A. Zeeb static __inline void
ieee80211_send_eosp_nullfunc(struct ieee80211_sta * sta,uint8_t tid)20016b4cac81SBjoern A. Zeeb ieee80211_send_eosp_nullfunc(struct ieee80211_sta *sta, uint8_t tid)
20026b4cac81SBjoern A. Zeeb {
20036b4cac81SBjoern A. Zeeb TODO();
20046b4cac81SBjoern A. Zeeb }
20056b4cac81SBjoern A. Zeeb
20066b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_block_awake(struct ieee80211_hw * hw,struct ieee80211_sta * sta,bool disable)20076b4cac81SBjoern A. Zeeb ieee80211_sta_block_awake(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
20086b4cac81SBjoern A. Zeeb bool disable)
20096b4cac81SBjoern A. Zeeb {
20106b4cac81SBjoern A. Zeeb TODO();
20116b4cac81SBjoern A. Zeeb }
20126b4cac81SBjoern A. Zeeb
20136b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_ps_transition(struct ieee80211_sta * sta,bool sleeping)20146b4cac81SBjoern A. Zeeb ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool sleeping)
20156b4cac81SBjoern A. Zeeb {
20166b4cac81SBjoern A. Zeeb TODO();
20176b4cac81SBjoern A. Zeeb }
20186b4cac81SBjoern A. Zeeb
20196b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_pspoll(struct ieee80211_sta * sta)20206b4cac81SBjoern A. Zeeb ieee80211_sta_pspoll(struct ieee80211_sta *sta)
20216b4cac81SBjoern A. Zeeb {
20226b4cac81SBjoern A. Zeeb TODO();
20236b4cac81SBjoern A. Zeeb }
20246b4cac81SBjoern A. Zeeb
202572ee3d57SBjoern A. Zeeb static inline void
ieee80211_sta_recalc_aggregates(struct ieee80211_sta * sta)2026adff403fSBjoern A. Zeeb ieee80211_sta_recalc_aggregates(struct ieee80211_sta *sta)
2027adff403fSBjoern A. Zeeb {
202872ee3d57SBjoern A. Zeeb if (sta->valid_links) {
2029adff403fSBjoern A. Zeeb TODO();
2030adff403fSBjoern A. Zeeb }
203172ee3d57SBjoern A. Zeeb }
2032adff403fSBjoern A. Zeeb
2033adff403fSBjoern A. Zeeb static __inline void
ieee80211_sta_uapsd_trigger(struct ieee80211_sta * sta,int ntids)20346b4cac81SBjoern A. Zeeb ieee80211_sta_uapsd_trigger(struct ieee80211_sta *sta, int ntids)
20356b4cac81SBjoern A. Zeeb {
20366b4cac81SBjoern A. Zeeb TODO();
20376b4cac81SBjoern A. Zeeb }
20386b4cac81SBjoern A. Zeeb
2039eac3646fSBjoern A. Zeeb static inline struct sk_buff *
ieee80211_tx_dequeue(struct ieee80211_hw * hw,struct ieee80211_txq * txq)20406b4cac81SBjoern A. Zeeb ieee80211_tx_dequeue(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
20416b4cac81SBjoern A. Zeeb {
20426b4cac81SBjoern A. Zeeb
20436b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_tx_dequeue(hw, txq));
20446b4cac81SBjoern A. Zeeb }
20456b4cac81SBjoern A. Zeeb
2046eac3646fSBjoern A. Zeeb static inline struct sk_buff *
ieee80211_tx_dequeue_ni(struct ieee80211_hw * hw,struct ieee80211_txq * txq)2047eac3646fSBjoern A. Zeeb ieee80211_tx_dequeue_ni(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
2048eac3646fSBjoern A. Zeeb {
2049eac3646fSBjoern A. Zeeb struct sk_buff *skb;
2050eac3646fSBjoern A. Zeeb
2051eac3646fSBjoern A. Zeeb local_bh_disable();
2052eac3646fSBjoern A. Zeeb skb = linuxkpi_ieee80211_tx_dequeue(hw, txq);
2053eac3646fSBjoern A. Zeeb local_bh_enable();
2054eac3646fSBjoern A. Zeeb
2055eac3646fSBjoern A. Zeeb return (skb);
2056eac3646fSBjoern A. Zeeb }
2057eac3646fSBjoern A. Zeeb
20586b4cac81SBjoern A. Zeeb static __inline void
ieee80211_update_mu_groups(struct ieee80211_vif * vif,u_int _i,uint8_t * ms,uint8_t * up)2059adff403fSBjoern A. Zeeb ieee80211_update_mu_groups(struct ieee80211_vif *vif,
20603e1f5cc9SBjoern A. Zeeb u_int _i, uint8_t *ms, uint8_t *up)
20616b4cac81SBjoern A. Zeeb {
20626b4cac81SBjoern A. Zeeb TODO();
20636b4cac81SBjoern A. Zeeb }
20646b4cac81SBjoern A. Zeeb
20656b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_set_buffered(struct ieee80211_sta * sta,uint8_t tid,bool t)20666b4cac81SBjoern A. Zeeb ieee80211_sta_set_buffered(struct ieee80211_sta *sta, uint8_t tid, bool t)
20676b4cac81SBjoern A. Zeeb {
20686b4cac81SBjoern A. Zeeb TODO();
20696b4cac81SBjoern A. Zeeb }
20706b4cac81SBjoern A. Zeeb
20716b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sched_scan_results(struct ieee80211_hw * hw)20726b4cac81SBjoern A. Zeeb ieee80211_sched_scan_results(struct ieee80211_hw *hw)
20736b4cac81SBjoern A. Zeeb {
20746b4cac81SBjoern A. Zeeb TODO();
20756b4cac81SBjoern A. Zeeb }
20766b4cac81SBjoern A. Zeeb
20776b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_eosp(struct ieee80211_sta * sta)20786b4cac81SBjoern A. Zeeb ieee80211_sta_eosp(struct ieee80211_sta *sta)
20796b4cac81SBjoern A. Zeeb {
20806b4cac81SBjoern A. Zeeb TODO();
20816b4cac81SBjoern A. Zeeb }
20826b4cac81SBjoern A. Zeeb
2083800aa9cdSBjoern A. Zeeb static __inline int
ieee80211_start_tx_ba_session(struct ieee80211_sta * sta,uint8_t tid,int x)2084800aa9cdSBjoern A. Zeeb ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid, int x)
2085800aa9cdSBjoern A. Zeeb {
2086800aa9cdSBjoern A. Zeeb TODO("rtw8x");
2087800aa9cdSBjoern A. Zeeb return (-EINVAL);
2088800aa9cdSBjoern A. Zeeb }
2089800aa9cdSBjoern A. Zeeb
2090800aa9cdSBjoern A. Zeeb static __inline int
ieee80211_stop_tx_ba_session(struct ieee80211_sta * sta,uint8_t tid)2091800aa9cdSBjoern A. Zeeb ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid)
2092800aa9cdSBjoern A. Zeeb {
2093800aa9cdSBjoern A. Zeeb TODO("rtw89");
2094800aa9cdSBjoern A. Zeeb return (-EINVAL);
2095800aa9cdSBjoern A. Zeeb }
2096800aa9cdSBjoern A. Zeeb
2097800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif * vif,uint8_t * addr,uint8_t tid)2098800aa9cdSBjoern A. Zeeb ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr,
2099800aa9cdSBjoern A. Zeeb uint8_t tid)
2100800aa9cdSBjoern A. Zeeb {
2101800aa9cdSBjoern A. Zeeb TODO("iwlwifi");
2102800aa9cdSBjoern A. Zeeb }
2103800aa9cdSBjoern A. Zeeb
21046b4cac81SBjoern A. Zeeb static __inline void
ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif * vif,uint8_t * addr,uint8_t tid)21056b4cac81SBjoern A. Zeeb ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr,
21066b4cac81SBjoern A. Zeeb uint8_t tid)
21076b4cac81SBjoern A. Zeeb {
2108800aa9cdSBjoern A. Zeeb TODO("iwlwifi/rtw8x/...");
21096b4cac81SBjoern A. Zeeb }
21106b4cac81SBjoern A. Zeeb
21116b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sched_scan_stopped(struct ieee80211_hw * hw)21126b4cac81SBjoern A. Zeeb ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
21136b4cac81SBjoern A. Zeeb {
21146b4cac81SBjoern A. Zeeb TODO();
21156b4cac81SBjoern A. Zeeb }
21166b4cac81SBjoern A. Zeeb
21176b4cac81SBjoern A. Zeeb static __inline void
ieee80211_scan_completed(struct ieee80211_hw * hw,struct cfg80211_scan_info * info)21186b4cac81SBjoern A. Zeeb ieee80211_scan_completed(struct ieee80211_hw *hw,
21196b4cac81SBjoern A. Zeeb struct cfg80211_scan_info *info)
21206b4cac81SBjoern A. Zeeb {
21216b4cac81SBjoern A. Zeeb
21226b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_scan_completed(hw, info);
21236b4cac81SBjoern A. Zeeb }
21246b4cac81SBjoern A. Zeeb
21256b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_beacon_get(struct ieee80211_hw * hw,struct ieee80211_vif * vif,uint32_t link_id)2126800aa9cdSBjoern A. Zeeb ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2127800aa9cdSBjoern A. Zeeb uint32_t link_id)
21286b4cac81SBjoern A. Zeeb {
21296b4cac81SBjoern A. Zeeb TODO();
21306b4cac81SBjoern A. Zeeb return (NULL);
21316b4cac81SBjoern A. Zeeb }
21326b4cac81SBjoern A. Zeeb
21336b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_pspoll_get(struct ieee80211_hw * hw,struct ieee80211_vif * vif)21346b4cac81SBjoern A. Zeeb ieee80211_pspoll_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
21356b4cac81SBjoern A. Zeeb {
21366b4cac81SBjoern A. Zeeb
21376b4cac81SBjoern A. Zeeb /* Only STA needs this. Otherwise return NULL and panic bad drivers. */
21386b4cac81SBjoern A. Zeeb if (vif->type != NL80211_IFTYPE_STATION)
21396b4cac81SBjoern A. Zeeb return (NULL);
21406b4cac81SBjoern A. Zeeb
21416b4cac81SBjoern A. Zeeb return (linuxkpi_ieee80211_pspoll_get(hw, vif));
21426b4cac81SBjoern A. Zeeb }
21436b4cac81SBjoern A. Zeeb
21446b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_proberesp_get(struct ieee80211_hw * hw,struct ieee80211_vif * vif)21456b4cac81SBjoern A. Zeeb ieee80211_proberesp_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
21466b4cac81SBjoern A. Zeeb {
21476b4cac81SBjoern A. Zeeb TODO();
21486b4cac81SBjoern A. Zeeb return (NULL);
21496b4cac81SBjoern A. Zeeb }
21506b4cac81SBjoern A. Zeeb
21516b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_nullfunc_get(struct ieee80211_hw * hw,struct ieee80211_vif * vif,int linkid,bool qos)21526b4cac81SBjoern A. Zeeb ieee80211_nullfunc_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2153815b7436SBjoern A. Zeeb int linkid, bool qos)
21546b4cac81SBjoern A. Zeeb {
21556b4cac81SBjoern A. Zeeb
21566b4cac81SBjoern A. Zeeb /* Only STA needs this. Otherwise return NULL and panic bad drivers. */
21576b4cac81SBjoern A. Zeeb if (vif->type != NL80211_IFTYPE_STATION)
21586b4cac81SBjoern A. Zeeb return (NULL);
21596b4cac81SBjoern A. Zeeb
2160adff403fSBjoern A. Zeeb return (linuxkpi_ieee80211_nullfunc_get(hw, vif, linkid, qos));
21616b4cac81SBjoern A. Zeeb }
21626b4cac81SBjoern A. Zeeb
21636b4cac81SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_probereq_get(struct ieee80211_hw * hw,uint8_t * addr,uint8_t * ssid,size_t ssid_len,size_t tailroom)21646b4cac81SBjoern A. Zeeb ieee80211_probereq_get(struct ieee80211_hw *hw, uint8_t *addr,
2165ade774b1SBjoern A. Zeeb uint8_t *ssid, size_t ssid_len, size_t tailroom)
21666b4cac81SBjoern A. Zeeb {
2167ade774b1SBjoern A. Zeeb
2168ade774b1SBjoern A. Zeeb return (linuxkpi_ieee80211_probereq_get(hw, addr, ssid, ssid_len,
2169ade774b1SBjoern A. Zeeb tailroom));
21706b4cac81SBjoern A. Zeeb }
21716b4cac81SBjoern A. Zeeb
21726b4cac81SBjoern A. Zeeb static __inline void
ieee80211_queue_delayed_work(struct ieee80211_hw * hw,struct delayed_work * w,int delay)21736b4cac81SBjoern A. Zeeb ieee80211_queue_delayed_work(struct ieee80211_hw *hw, struct delayed_work *w,
21746b4cac81SBjoern A. Zeeb int delay)
21756b4cac81SBjoern A. Zeeb {
21766b4cac81SBjoern A. Zeeb
21776b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_queue_delayed_work(hw, w, delay);
21786b4cac81SBjoern A. Zeeb }
21796b4cac81SBjoern A. Zeeb
21806b4cac81SBjoern A. Zeeb static __inline void
ieee80211_queue_work(struct ieee80211_hw * hw,struct work_struct * w)21816b4cac81SBjoern A. Zeeb ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *w)
21826b4cac81SBjoern A. Zeeb {
21836b4cac81SBjoern A. Zeeb
21846b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_queue_work(hw, w);
21856b4cac81SBjoern A. Zeeb }
21866b4cac81SBjoern A. Zeeb
2187675e6b1cSBjoern A. Zeeb static __inline bool
ieee80211_tx_prepare_skb(struct ieee80211_hw * hw,struct ieee80211_vif * vif,struct sk_buff * skb,enum nl80211_band band,struct ieee80211_sta ** sta)2188675e6b1cSBjoern A. Zeeb ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2189675e6b1cSBjoern A. Zeeb struct sk_buff *skb, enum nl80211_band band, struct ieee80211_sta **sta)
2190675e6b1cSBjoern A. Zeeb {
2191675e6b1cSBjoern A. Zeeb TODO();
2192675e6b1cSBjoern A. Zeeb return (false);
2193675e6b1cSBjoern A. Zeeb }
2194675e6b1cSBjoern A. Zeeb
21956b4cac81SBjoern A. Zeeb static __inline void
ieee80211_tx_status_skb(struct ieee80211_hw * hw,struct sk_buff * skb)21967b43f4d0SBjoern A. Zeeb ieee80211_tx_status_skb(struct ieee80211_hw *hw, struct sk_buff *skb)
2197a8397571SBjoern A. Zeeb {
2198a8397571SBjoern A. Zeeb linuxkpi_ieee80211_tx_status(hw, skb);
2199a8397571SBjoern A. Zeeb }
2200a8397571SBjoern A. Zeeb
2201675e6b1cSBjoern A. Zeeb static inline void
ieee80211_tx_status_noskb(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct ieee80211_tx_info * info)2202675e6b1cSBjoern A. Zeeb ieee80211_tx_status_noskb(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
2203675e6b1cSBjoern A. Zeeb struct ieee80211_tx_info *info)
2204675e6b1cSBjoern A. Zeeb {
2205675e6b1cSBjoern A. Zeeb TODO();
2206675e6b1cSBjoern A. Zeeb }
2207675e6b1cSBjoern A. Zeeb
2208a8397571SBjoern A. Zeeb static __inline void
ieee80211_tx_status_irqsafe(struct ieee80211_hw * hw,struct sk_buff * skb)22096b4cac81SBjoern A. Zeeb ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb)
22106b4cac81SBjoern A. Zeeb {
22116b4cac81SBjoern A. Zeeb IMPROVE();
2212ac1d519cSBjoern A. Zeeb linuxkpi_ieee80211_tx_status(hw, skb);
22136b4cac81SBjoern A. Zeeb }
22146b4cac81SBjoern A. Zeeb
221551b461b3SBjoern A. Zeeb static __inline void
ieee80211_tx_status_ni(struct ieee80211_hw * hw,struct sk_buff * skb)221651b461b3SBjoern A. Zeeb ieee80211_tx_status_ni(struct ieee80211_hw *hw, struct sk_buff *skb)
221751b461b3SBjoern A. Zeeb {
221851b461b3SBjoern A. Zeeb IMPROVE();
2219ac1d519cSBjoern A. Zeeb linuxkpi_ieee80211_tx_status(hw, skb);
222051b461b3SBjoern A. Zeeb }
222151b461b3SBjoern A. Zeeb
22226b4cac81SBjoern A. Zeeb static __inline void
ieee80211_tx_status_ext(struct ieee80211_hw * hw,struct ieee80211_tx_status * txstat)2223a8397571SBjoern A. Zeeb ieee80211_tx_status_ext(struct ieee80211_hw *hw,
2224a8397571SBjoern A. Zeeb struct ieee80211_tx_status *txstat)
2225a8397571SBjoern A. Zeeb {
2226a8397571SBjoern A. Zeeb
2227a8397571SBjoern A. Zeeb linuxkpi_ieee80211_tx_status_ext(hw, txstat);
2228a8397571SBjoern A. Zeeb }
2229a8397571SBjoern A. Zeeb
2230a8397571SBjoern A. Zeeb static __inline void
ieee80211_tx_info_clear_status(struct ieee80211_tx_info * info)22316b4cac81SBjoern A. Zeeb ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
22326b4cac81SBjoern A. Zeeb {
22336b4cac81SBjoern A. Zeeb int i;
22346b4cac81SBjoern A. Zeeb
22356b4cac81SBjoern A. Zeeb /*
22366b4cac81SBjoern A. Zeeb * Apparently clearing flags and some other fields is not right.
22376b4cac81SBjoern A. Zeeb * Given the function is called "status" we work on that part of
22386b4cac81SBjoern A. Zeeb * the union.
22396b4cac81SBjoern A. Zeeb */
22406b4cac81SBjoern A. Zeeb for (i = 0; i < nitems(info->status.rates); i++)
22416b4cac81SBjoern A. Zeeb info->status.rates[i].count = 0;
22426b4cac81SBjoern A. Zeeb /*
22436b4cac81SBjoern A. Zeeb * Unclear if ack_signal should be included or not but we clear the
22446b4cac81SBjoern A. Zeeb * "valid" bool so this field is no longer valid.
22456b4cac81SBjoern A. Zeeb */
22466b4cac81SBjoern A. Zeeb memset(&info->status.ack_signal, 0, sizeof(*info) -
22476b4cac81SBjoern A. Zeeb offsetof(struct ieee80211_tx_info, status.ack_signal));
22486b4cac81SBjoern A. Zeeb }
22496b4cac81SBjoern A. Zeeb
22506b4cac81SBjoern A. Zeeb static __inline void
ieee80211_txq_get_depth(struct ieee80211_txq * txq,unsigned long * frame_cnt,unsigned long * byte_cnt)225186220d3cSBjoern A. Zeeb ieee80211_txq_get_depth(struct ieee80211_txq *txq, unsigned long *frame_cnt,
225286220d3cSBjoern A. Zeeb unsigned long *byte_cnt)
22536b4cac81SBjoern A. Zeeb {
22546b4cac81SBjoern A. Zeeb
22556b4cac81SBjoern A. Zeeb if (frame_cnt == NULL && byte_cnt == NULL)
22566b4cac81SBjoern A. Zeeb return;
22576b4cac81SBjoern A. Zeeb
22586b4cac81SBjoern A. Zeeb linuxkpi_ieee80211_txq_get_depth(txq, frame_cnt, byte_cnt);
22596b4cac81SBjoern A. Zeeb }
22606b4cac81SBjoern A. Zeeb
22616b4cac81SBjoern A. Zeeb static __inline void
SET_IEEE80211_PERM_ADDR(struct ieee80211_hw * hw,uint8_t * addr)22626b4cac81SBjoern A. Zeeb SET_IEEE80211_PERM_ADDR (struct ieee80211_hw *hw, uint8_t *addr)
22636b4cac81SBjoern A. Zeeb {
22646b4cac81SBjoern A. Zeeb
22656b4cac81SBjoern A. Zeeb ether_addr_copy(hw->wiphy->perm_addr, addr);
22666b4cac81SBjoern A. Zeeb }
22676b4cac81SBjoern A. Zeeb
22686b4cac81SBjoern A. Zeeb static __inline void
ieee80211_report_low_ack(struct ieee80211_sta * sta,int x)22696b4cac81SBjoern A. Zeeb ieee80211_report_low_ack(struct ieee80211_sta *sta, int x)
22706b4cac81SBjoern A. Zeeb {
22716b4cac81SBjoern A. Zeeb TODO();
22726b4cac81SBjoern A. Zeeb }
22736b4cac81SBjoern A. Zeeb
22746b4cac81SBjoern A. Zeeb static __inline void
ieee80211_tx_rate_update(struct ieee80211_hw * hw,struct ieee80211_sta * sta,struct ieee80211_tx_info * info)22756b4cac81SBjoern A. Zeeb ieee80211_tx_rate_update(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
22766b4cac81SBjoern A. Zeeb struct ieee80211_tx_info *info)
22776b4cac81SBjoern A. Zeeb {
22786b4cac81SBjoern A. Zeeb TODO();
22796b4cac81SBjoern A. Zeeb }
22806b4cac81SBjoern A. Zeeb
22816b4cac81SBjoern A. Zeeb static __inline bool
ieee80211_txq_may_transmit(struct ieee80211_hw * hw,struct ieee80211_txq * txq)22826b4cac81SBjoern A. Zeeb ieee80211_txq_may_transmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
22836b4cac81SBjoern A. Zeeb {
22846b4cac81SBjoern A. Zeeb TODO();
22856b4cac81SBjoern A. Zeeb return (false);
22866b4cac81SBjoern A. Zeeb }
22876b4cac81SBjoern A. Zeeb
22886b4cac81SBjoern A. Zeeb static __inline void
ieee80211_radar_detected(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * chanctx_conf)2289675e6b1cSBjoern A. Zeeb ieee80211_radar_detected(struct ieee80211_hw *hw,
2290675e6b1cSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf)
22916b4cac81SBjoern A. Zeeb {
22926b4cac81SBjoern A. Zeeb TODO();
22936b4cac81SBjoern A. Zeeb }
22946b4cac81SBjoern A. Zeeb
22956b4cac81SBjoern A. Zeeb static __inline void
ieee80211_sta_register_airtime(struct ieee80211_sta * sta,uint8_t tid,uint32_t duration,int x)22966b4cac81SBjoern A. Zeeb ieee80211_sta_register_airtime(struct ieee80211_sta *sta,
22976b4cac81SBjoern A. Zeeb uint8_t tid, uint32_t duration, int x)
22986b4cac81SBjoern A. Zeeb {
22996b4cac81SBjoern A. Zeeb TODO();
23006b4cac81SBjoern A. Zeeb }
23016b4cac81SBjoern A. Zeeb
2302800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_beacon_set_cntdwn(struct ieee80211_vif * vif,u8 counter)23036b4cac81SBjoern A. Zeeb ieee80211_beacon_set_cntdwn(struct ieee80211_vif *vif, u8 counter)
23046b4cac81SBjoern A. Zeeb {
23056b4cac81SBjoern A. Zeeb TODO();
23066b4cac81SBjoern A. Zeeb }
23076b4cac81SBjoern A. Zeeb
23086b4cac81SBjoern A. Zeeb static __inline int
ieee80211_beacon_update_cntdwn(struct ieee80211_vif * vif,uint32_t link_id)23097b43f4d0SBjoern A. Zeeb ieee80211_beacon_update_cntdwn(struct ieee80211_vif *vif, uint32_t link_id)
23106b4cac81SBjoern A. Zeeb {
23116b4cac81SBjoern A. Zeeb TODO();
23126b4cac81SBjoern A. Zeeb return (-1);
23136b4cac81SBjoern A. Zeeb }
23146b4cac81SBjoern A. Zeeb
23156b4cac81SBjoern A. Zeeb static __inline bool
ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif * vif,uint32_t link_id)23167b43f4d0SBjoern A. Zeeb ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif, uint32_t link_id)
23176b4cac81SBjoern A. Zeeb {
23186b4cac81SBjoern A. Zeeb TODO();
23196b4cac81SBjoern A. Zeeb return (true);
23206b4cac81SBjoern A. Zeeb }
23216b4cac81SBjoern A. Zeeb
23226b4cac81SBjoern A. Zeeb static __inline void
ieee80211_disconnect(struct ieee80211_vif * vif,bool _x)23236b4cac81SBjoern A. Zeeb ieee80211_disconnect(struct ieee80211_vif *vif, bool _x)
23246b4cac81SBjoern A. Zeeb {
23256b4cac81SBjoern A. Zeeb TODO();
23266b4cac81SBjoern A. Zeeb }
23276b4cac81SBjoern A. Zeeb
2328d875aa15SBjoern A. Zeeb static __inline void
ieee80211_channel_switch_disconnect(struct ieee80211_vif * vif)2329e6010da6SBjoern A. Zeeb ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif)
2330d875aa15SBjoern A. Zeeb {
2331d875aa15SBjoern A. Zeeb TODO();
2332d875aa15SBjoern A. Zeeb }
2333d875aa15SBjoern A. Zeeb
2334b0f73768SBjoern A. Zeeb static __inline uint32_t
ieee80211_calc_rx_airtime(struct ieee80211_hw * hw,struct ieee80211_rx_status * rxstat,int len)2335b0f73768SBjoern A. Zeeb ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
2336b0f73768SBjoern A. Zeeb struct ieee80211_rx_status *rxstat, int len)
2337b0f73768SBjoern A. Zeeb {
2338b0f73768SBjoern A. Zeeb TODO();
2339b0f73768SBjoern A. Zeeb return (0);
2340b0f73768SBjoern A. Zeeb }
2341b0f73768SBjoern A. Zeeb
2342b0f73768SBjoern A. Zeeb static __inline void
ieee80211_get_tx_rates(struct ieee80211_vif * vif,struct ieee80211_sta * sta,struct sk_buff * skb,struct ieee80211_tx_rate * txrate,int nrates)2343b0f73768SBjoern A. Zeeb ieee80211_get_tx_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2344b0f73768SBjoern A. Zeeb struct sk_buff *skb, struct ieee80211_tx_rate *txrate, int nrates)
2345b0f73768SBjoern A. Zeeb {
2346b0f73768SBjoern A. Zeeb TODO();
2347b0f73768SBjoern A. Zeeb }
2348b0f73768SBjoern A. Zeeb
2349b0f73768SBjoern A. Zeeb static __inline void
ieee80211_color_change_finish(struct ieee80211_vif * vif,uint8_t link_id)2350675e6b1cSBjoern A. Zeeb ieee80211_color_change_finish(struct ieee80211_vif *vif, uint8_t link_id)
2351b0f73768SBjoern A. Zeeb {
2352b0f73768SBjoern A. Zeeb TODO();
2353b0f73768SBjoern A. Zeeb }
2354b0f73768SBjoern A. Zeeb
2355b0f73768SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw * hw,struct ieee80211_vif * vif)2356b0f73768SBjoern A. Zeeb ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
2357b0f73768SBjoern A. Zeeb struct ieee80211_vif *vif)
2358b0f73768SBjoern A. Zeeb {
2359b0f73768SBjoern A. Zeeb TODO();
2360b0f73768SBjoern A. Zeeb return (NULL);
2361b0f73768SBjoern A. Zeeb }
2362b0f73768SBjoern A. Zeeb
2363b0f73768SBjoern A. Zeeb static __inline struct sk_buff *
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw * hw,struct ieee80211_vif * vif)2364b0f73768SBjoern A. Zeeb ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
2365b0f73768SBjoern A. Zeeb struct ieee80211_vif *vif)
2366b0f73768SBjoern A. Zeeb {
2367b0f73768SBjoern A. Zeeb TODO();
2368b0f73768SBjoern A. Zeeb return (NULL);
2369b0f73768SBjoern A. Zeeb }
2370b0f73768SBjoern A. Zeeb
2371b0f73768SBjoern A. Zeeb static __inline void
linuxkpi_ieee80211_send_bar(struct ieee80211_vif * vif,uint8_t * ra,uint16_t tid,uint16_t ssn)2372b0f73768SBjoern A. Zeeb linuxkpi_ieee80211_send_bar(struct ieee80211_vif *vif, uint8_t *ra, uint16_t tid,
2373b0f73768SBjoern A. Zeeb uint16_t ssn)
2374b0f73768SBjoern A. Zeeb {
2375b0f73768SBjoern A. Zeeb TODO();
2376b0f73768SBjoern A. Zeeb }
2377b0f73768SBjoern A. Zeeb
2378800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_resume_disconnect(struct ieee80211_vif * vif)2379800aa9cdSBjoern A. Zeeb ieee80211_resume_disconnect(struct ieee80211_vif *vif)
2380800aa9cdSBjoern A. Zeeb {
2381800aa9cdSBjoern A. Zeeb TODO();
2382800aa9cdSBjoern A. Zeeb }
2383800aa9cdSBjoern A. Zeeb
2384800aa9cdSBjoern A. Zeeb static __inline int
ieee80211_data_to_8023(struct sk_buff * skb,const uint8_t * addr,enum nl80211_iftype iftype)2385800aa9cdSBjoern A. Zeeb ieee80211_data_to_8023(struct sk_buff *skb, const uint8_t *addr,
2386800aa9cdSBjoern A. Zeeb enum nl80211_iftype iftype)
2387800aa9cdSBjoern A. Zeeb {
2388800aa9cdSBjoern A. Zeeb TODO();
2389800aa9cdSBjoern A. Zeeb return (-1);
2390800aa9cdSBjoern A. Zeeb }
2391800aa9cdSBjoern A. Zeeb
2392b31f33c0SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
2393b31f33c0SBjoern A. Zeeb
2394800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_key_mic_failure(struct ieee80211_key_conf * key)2395b31f33c0SBjoern A. Zeeb ieee80211_key_mic_failure(struct ieee80211_key_conf *key)
2396b31f33c0SBjoern A. Zeeb {
2397b31f33c0SBjoern A. Zeeb TODO();
2398b31f33c0SBjoern A. Zeeb }
2399b31f33c0SBjoern A. Zeeb
2400b31f33c0SBjoern A. Zeeb static __inline void
ieee80211_key_replay(struct ieee80211_key_conf * key)2401b31f33c0SBjoern A. Zeeb ieee80211_key_replay(struct ieee80211_key_conf *key)
2402b31f33c0SBjoern A. Zeeb {
2403b31f33c0SBjoern A. Zeeb TODO();
2404b31f33c0SBjoern A. Zeeb }
2405b31f33c0SBjoern A. Zeeb
2406b31f33c0SBjoern A. Zeeb static __inline void
ieee80211_remove_key(struct ieee80211_key_conf * key)2407b31f33c0SBjoern A. Zeeb ieee80211_remove_key(struct ieee80211_key_conf *key)
2408800aa9cdSBjoern A. Zeeb {
2409800aa9cdSBjoern A. Zeeb TODO();
2410800aa9cdSBjoern A. Zeeb }
2411800aa9cdSBjoern A. Zeeb
2412800aa9cdSBjoern A. Zeeb static __inline struct ieee80211_key_conf *
ieee80211_gtk_rekey_add(struct ieee80211_vif * vif,struct ieee80211_key_conf * key,int link_id)2413800aa9cdSBjoern A. Zeeb ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
2414b42c339cSBjoern A. Zeeb struct ieee80211_key_conf *key, int link_id)
2415800aa9cdSBjoern A. Zeeb {
2416800aa9cdSBjoern A. Zeeb TODO();
2417800aa9cdSBjoern A. Zeeb return (NULL);
2418800aa9cdSBjoern A. Zeeb }
2419800aa9cdSBjoern A. Zeeb
2420800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_gtk_rekey_notify(struct ieee80211_vif * vif,const uint8_t * bssid,const uint8_t * replay_ctr,gfp_t gfp)2421800aa9cdSBjoern A. Zeeb ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const uint8_t *bssid,
2422800aa9cdSBjoern A. Zeeb const uint8_t *replay_ctr, gfp_t gfp)
2423800aa9cdSBjoern A. Zeeb {
2424800aa9cdSBjoern A. Zeeb TODO();
2425800aa9cdSBjoern A. Zeeb }
2426800aa9cdSBjoern A. Zeeb
2427800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_tkip_add_iv(u8 * crypto_hdr,struct ieee80211_key_conf * keyconf,uint64_t pn)2428b31f33c0SBjoern A. Zeeb ieee80211_tkip_add_iv(u8 *crypto_hdr, struct ieee80211_key_conf *keyconf,
2429b31f33c0SBjoern A. Zeeb uint64_t pn)
2430b31f33c0SBjoern A. Zeeb {
2431b31f33c0SBjoern A. Zeeb TODO();
2432b31f33c0SBjoern A. Zeeb }
2433b31f33c0SBjoern A. Zeeb
2434b31f33c0SBjoern A. Zeeb static __inline void
ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf * keyconf,const u8 * addr,uint32_t iv32,u16 * p1k)2435b31f33c0SBjoern A. Zeeb ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
2436b31f33c0SBjoern A. Zeeb const u8 *addr, uint32_t iv32, u16 *p1k)
2437b31f33c0SBjoern A. Zeeb {
2438b31f33c0SBjoern A. Zeeb
2439b31f33c0SBjoern A. Zeeb KASSERT(keyconf != NULL && addr != NULL && p1k != NULL,
2440b31f33c0SBjoern A. Zeeb ("%s: keyconf %p addr %p p1k %p\n", __func__, keyconf, addr, p1k));
2441b31f33c0SBjoern A. Zeeb
2442b31f33c0SBjoern A. Zeeb TODO();
2443b31f33c0SBjoern A. Zeeb memset(p1k, 0xfa, 5 * sizeof(*p1k)); /* Just initializing. */
2444b31f33c0SBjoern A. Zeeb }
2445b31f33c0SBjoern A. Zeeb
2446b31f33c0SBjoern A. Zeeb static __inline void
ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf * key,uint32_t iv32,uint16_t * p1k)2447b31f33c0SBjoern A. Zeeb ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *key,
2448b31f33c0SBjoern A. Zeeb uint32_t iv32, uint16_t *p1k)
2449b31f33c0SBjoern A. Zeeb {
2450b31f33c0SBjoern A. Zeeb TODO();
2451b31f33c0SBjoern A. Zeeb }
2452b31f33c0SBjoern A. Zeeb
2453b31f33c0SBjoern A. Zeeb static __inline void
ieee80211_get_tkip_p2k(struct ieee80211_key_conf * keyconf,struct sk_buff * skb_frag,u8 * key)2454b31f33c0SBjoern A. Zeeb ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
2455b31f33c0SBjoern A. Zeeb struct sk_buff *skb_frag, u8 *key)
2456800aa9cdSBjoern A. Zeeb {
2457800aa9cdSBjoern A. Zeeb TODO();
2458800aa9cdSBjoern A. Zeeb }
2459800aa9cdSBjoern A. Zeeb
246011db70b6SBjoern A. Zeeb static inline void
ieee80211_get_key_rx_seq(struct ieee80211_key_conf * keyconf,int8_t tid,struct ieee80211_key_seq * seq)246111db70b6SBjoern A. Zeeb ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, int8_t tid,
246211db70b6SBjoern A. Zeeb struct ieee80211_key_seq *seq)
246311db70b6SBjoern A. Zeeb {
246411db70b6SBjoern A. Zeeb const struct ieee80211_key *k;
246511db70b6SBjoern A. Zeeb const uint8_t *p;
246611db70b6SBjoern A. Zeeb
246711db70b6SBjoern A. Zeeb KASSERT(keyconf != NULL && seq != NULL, ("%s: keyconf %p seq %p\n",
246811db70b6SBjoern A. Zeeb __func__, keyconf, seq));
246911db70b6SBjoern A. Zeeb k = keyconf->_k;
247011db70b6SBjoern A. Zeeb KASSERT(k != NULL, ("%s: keyconf %p ieee80211_key is NULL\n", __func__, keyconf));
247111db70b6SBjoern A. Zeeb
247211db70b6SBjoern A. Zeeb switch (keyconf->cipher) {
2473a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_TKIP:
2474a7131a74SBjoern A. Zeeb if (tid < 0 || tid >= IEEE80211_NUM_TIDS)
2475a7131a74SBjoern A. Zeeb return;
2476a7131a74SBjoern A. Zeeb /* See net80211::tkip_decrypt() */
2477a7131a74SBjoern A. Zeeb seq->tkip.iv32 = TKIP_PN_TO_IV32(k->wk_keyrsc[tid]);
2478a7131a74SBjoern A. Zeeb seq->tkip.iv16 = TKIP_PN_TO_IV16(k->wk_keyrsc[tid]);
2479a7131a74SBjoern A. Zeeb break;
248011db70b6SBjoern A. Zeeb case WLAN_CIPHER_SUITE_CCMP:
248111db70b6SBjoern A. Zeeb case WLAN_CIPHER_SUITE_CCMP_256:
2482a7131a74SBjoern A. Zeeb if (tid < -1 || tid >= IEEE80211_NUM_TIDS)
2483a7131a74SBjoern A. Zeeb return;
2484a7131a74SBjoern A. Zeeb if (tid == -1)
248511db70b6SBjoern A. Zeeb p = (const uint8_t *)&k->wk_keyrsc[IEEE80211_NUM_TIDS]; /* IEEE80211_NONQOS_TID */
248611db70b6SBjoern A. Zeeb else
248711db70b6SBjoern A. Zeeb p = (const uint8_t *)&k->wk_keyrsc[tid];
248811db70b6SBjoern A. Zeeb memcpy(seq->ccmp.pn, p, sizeof(seq->ccmp.pn));
248911db70b6SBjoern A. Zeeb break;
2490a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_GCMP:
2491a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_GCMP_256:
2492a7131a74SBjoern A. Zeeb if (tid < -1 || tid >= IEEE80211_NUM_TIDS)
2493a7131a74SBjoern A. Zeeb return;
2494a7131a74SBjoern A. Zeeb if (tid == -1)
2495a7131a74SBjoern A. Zeeb p = (const uint8_t *)&k->wk_keyrsc[IEEE80211_NUM_TIDS]; /* IEEE80211_NONQOS_TID */
2496a7131a74SBjoern A. Zeeb else
2497a7131a74SBjoern A. Zeeb p = (const uint8_t *)&k->wk_keyrsc[tid];
2498a7131a74SBjoern A. Zeeb memcpy(seq->gcmp.pn, p, sizeof(seq->gcmp.pn));
2499a7131a74SBjoern A. Zeeb break;
250011db70b6SBjoern A. Zeeb case WLAN_CIPHER_SUITE_AES_CMAC:
2501a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_BIP_CMAC_256:
250211db70b6SBjoern A. Zeeb TODO();
250311db70b6SBjoern A. Zeeb memset(seq->aes_cmac.pn, 0xfa, sizeof(seq->aes_cmac.pn)); /* XXX TODO */
250411db70b6SBjoern A. Zeeb break;
2505a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_BIP_GMAC_128:
2506a7131a74SBjoern A. Zeeb case WLAN_CIPHER_SUITE_BIP_GMAC_256:
250711db70b6SBjoern A. Zeeb TODO();
2508a7131a74SBjoern A. Zeeb memset(seq->aes_gmac.pn, 0xfa, sizeof(seq->aes_gmac.pn)); /* XXX TODO */
250911db70b6SBjoern A. Zeeb break;
251011db70b6SBjoern A. Zeeb default:
251111db70b6SBjoern A. Zeeb pr_debug("%s: unsupported cipher suite %d\n", __func__, keyconf->cipher);
251211db70b6SBjoern A. Zeeb break;
251311db70b6SBjoern A. Zeeb }
251411db70b6SBjoern A. Zeeb }
251511db70b6SBjoern A. Zeeb
2516800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_set_key_rx_seq(struct ieee80211_key_conf * key,int tid,struct ieee80211_key_seq * seq)2517800aa9cdSBjoern A. Zeeb ieee80211_set_key_rx_seq(struct ieee80211_key_conf *key, int tid,
2518800aa9cdSBjoern A. Zeeb struct ieee80211_key_seq *seq)
2519800aa9cdSBjoern A. Zeeb {
2520800aa9cdSBjoern A. Zeeb TODO();
2521800aa9cdSBjoern A. Zeeb }
2522800aa9cdSBjoern A. Zeeb
2523b31f33c0SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
2524b31f33c0SBjoern A. Zeeb
2525800aa9cdSBjoern A. Zeeb static __inline void
ieee80211_report_wowlan_wakeup(struct ieee80211_vif * vif,struct cfg80211_wowlan_wakeup * wakeup,gfp_t gfp)2526800aa9cdSBjoern A. Zeeb ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif,
2527800aa9cdSBjoern A. Zeeb struct cfg80211_wowlan_wakeup *wakeup, gfp_t gfp)
2528800aa9cdSBjoern A. Zeeb {
2529800aa9cdSBjoern A. Zeeb TODO();
2530800aa9cdSBjoern A. Zeeb }
2531800aa9cdSBjoern A. Zeeb
2532f02e2115SBjoern A. Zeeb static __inline void
ieee80211_obss_color_collision_notify(struct ieee80211_vif * vif,uint64_t obss_color_bitmap,gfp_t gfp)2533adff403fSBjoern A. Zeeb ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
2534adff403fSBjoern A. Zeeb uint64_t obss_color_bitmap, gfp_t gfp)
2535f02e2115SBjoern A. Zeeb {
2536f02e2115SBjoern A. Zeeb TODO();
2537f02e2115SBjoern A. Zeeb }
2538f02e2115SBjoern A. Zeeb
2539adff403fSBjoern A. Zeeb static __inline void
ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta * sta,uint8_t tid)2540adff403fSBjoern A. Zeeb ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta,
2541adff403fSBjoern A. Zeeb uint8_t tid)
2542adff403fSBjoern A. Zeeb {
2543adff403fSBjoern A. Zeeb TODO();
2544adff403fSBjoern A. Zeeb }
2545adff403fSBjoern A. Zeeb
2546adff403fSBjoern A. Zeeb static __inline struct ieee80211_ema_beacons *
ieee80211_beacon_get_template_ema_list(struct ieee80211_hw * hw,struct ieee80211_vif * vif,uint32_t link_id)2547adff403fSBjoern A. Zeeb ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw,
2548adff403fSBjoern A. Zeeb struct ieee80211_vif *vif, uint32_t link_id)
2549adff403fSBjoern A. Zeeb {
2550adff403fSBjoern A. Zeeb TODO();
2551adff403fSBjoern A. Zeeb return (NULL);
2552adff403fSBjoern A. Zeeb }
2553adff403fSBjoern A. Zeeb
2554adff403fSBjoern A. Zeeb static __inline void
ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons * bcns)2555adff403fSBjoern A. Zeeb ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *bcns)
2556adff403fSBjoern A. Zeeb {
2557adff403fSBjoern A. Zeeb TODO();
2558adff403fSBjoern A. Zeeb }
2559adff403fSBjoern A. Zeeb
2560adff403fSBjoern A. Zeeb static inline bool
ieee80211_vif_is_mld(const struct ieee80211_vif * vif)2561adff403fSBjoern A. Zeeb ieee80211_vif_is_mld(const struct ieee80211_vif *vif)
2562adff403fSBjoern A. Zeeb {
2563adff403fSBjoern A. Zeeb
2564adff403fSBjoern A. Zeeb /* If valid_links is non-zero, the vif is an MLD. */
2565adff403fSBjoern A. Zeeb return (vif->valid_links != 0);
2566adff403fSBjoern A. Zeeb }
2567adff403fSBjoern A. Zeeb
2568c75a558dSBjoern A. Zeeb static inline const struct ieee80211_sta_he_cap *
ieee80211_get_he_iftype_cap_vif(const struct ieee80211_supported_band * band,struct ieee80211_vif * vif)2569adff403fSBjoern A. Zeeb ieee80211_get_he_iftype_cap_vif(const struct ieee80211_supported_band *band,
2570adff403fSBjoern A. Zeeb struct ieee80211_vif *vif)
2571adff403fSBjoern A. Zeeb {
2572c75a558dSBjoern A. Zeeb enum nl80211_iftype iftype;
2573c75a558dSBjoern A. Zeeb
2574c75a558dSBjoern A. Zeeb iftype = ieee80211_vif_type_p2p(vif);
2575c75a558dSBjoern A. Zeeb return (ieee80211_get_he_iftype_cap(band, iftype));
2576adff403fSBjoern A. Zeeb }
2577adff403fSBjoern A. Zeeb
2578c75a558dSBjoern A. Zeeb static inline const struct ieee80211_sta_eht_cap *
ieee80211_get_eht_iftype_cap_vif(const struct ieee80211_supported_band * band,struct ieee80211_vif * vif)2579adff403fSBjoern A. Zeeb ieee80211_get_eht_iftype_cap_vif(const struct ieee80211_supported_band *band,
2580adff403fSBjoern A. Zeeb struct ieee80211_vif *vif)
2581adff403fSBjoern A. Zeeb {
2582c75a558dSBjoern A. Zeeb enum nl80211_iftype iftype;
2583c75a558dSBjoern A. Zeeb
2584c75a558dSBjoern A. Zeeb iftype = ieee80211_vif_type_p2p(vif);
2585c75a558dSBjoern A. Zeeb return (ieee80211_get_eht_iftype_cap(band, iftype));
2586adff403fSBjoern A. Zeeb }
2587adff403fSBjoern A. Zeeb
2588ac1d519cSBjoern A. Zeeb static inline uint32_t
ieee80211_vif_usable_links(const struct ieee80211_vif * vif)2589ac1d519cSBjoern A. Zeeb ieee80211_vif_usable_links(const struct ieee80211_vif *vif)
2590ac1d519cSBjoern A. Zeeb {
2591d2407a21SBjoern A. Zeeb IMPROVE("MLO usable links likely are not just valid");
2592d2407a21SBjoern A. Zeeb return (vif->valid_links);
2593ac1d519cSBjoern A. Zeeb }
2594ac1d519cSBjoern A. Zeeb
2595ac1d519cSBjoern A. Zeeb static inline bool
ieee80211_vif_link_active(const struct ieee80211_vif * vif,uint8_t link_id)2596ac1d519cSBjoern A. Zeeb ieee80211_vif_link_active(const struct ieee80211_vif *vif, uint8_t link_id)
2597ac1d519cSBjoern A. Zeeb {
2598ac1d519cSBjoern A. Zeeb if (ieee80211_vif_is_mld(vif))
2599ac1d519cSBjoern A. Zeeb return (vif->active_links & BIT(link_id));
2600ac1d519cSBjoern A. Zeeb return (link_id == 0);
2601ac1d519cSBjoern A. Zeeb }
2602ac1d519cSBjoern A. Zeeb
2603ac1d519cSBjoern A. Zeeb static inline void
ieee80211_set_active_links_async(struct ieee80211_vif * vif,uint32_t new_active_links)2604ac1d519cSBjoern A. Zeeb ieee80211_set_active_links_async(struct ieee80211_vif *vif,
2605ac1d519cSBjoern A. Zeeb uint32_t new_active_links)
2606ac1d519cSBjoern A. Zeeb {
2607ac1d519cSBjoern A. Zeeb TODO();
2608ac1d519cSBjoern A. Zeeb }
2609ac1d519cSBjoern A. Zeeb
2610ac1d519cSBjoern A. Zeeb static inline int
ieee80211_set_active_links(struct ieee80211_vif * vif,uint32_t active_links)2611ac1d519cSBjoern A. Zeeb ieee80211_set_active_links(struct ieee80211_vif *vif,
2612ac1d519cSBjoern A. Zeeb uint32_t active_links)
2613ac1d519cSBjoern A. Zeeb {
2614ac1d519cSBjoern A. Zeeb TODO();
2615ac1d519cSBjoern A. Zeeb return (-ENXIO);
2616ac1d519cSBjoern A. Zeeb }
2617ac1d519cSBjoern A. Zeeb
2618ac1d519cSBjoern A. Zeeb static inline void
ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif * vif,gfp_t gfp __unused)2619ac1d519cSBjoern A. Zeeb ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp __unused)
2620ac1d519cSBjoern A. Zeeb {
2621ac1d519cSBjoern A. Zeeb IMPROVE("we notify user space by a vap state change eventually");
2622ac1d519cSBjoern A. Zeeb linuxkpi_ieee80211_beacon_loss(vif);
2623ac1d519cSBjoern A. Zeeb }
2624ac1d519cSBjoern A. Zeeb
2625b0f73768SBjoern A. Zeeb #define ieee80211_send_bar(_v, _r, _t, _s) \
2626b0f73768SBjoern A. Zeeb linuxkpi_ieee80211_send_bar(_v, _r, _t, _s)
2627b0f73768SBjoern A. Zeeb
2628ac1d519cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
2629ac1d519cSBjoern A. Zeeb
2630ac1d519cSBjoern A. Zeeb int lkpi_80211_update_chandef(struct ieee80211_hw *,
2631ac1d519cSBjoern A. Zeeb struct ieee80211_chanctx_conf *);
2632ac1d519cSBjoern A. Zeeb
2633ac1d519cSBjoern A. Zeeb static inline int
ieee80211_emulate_add_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * chanctx_conf)2634ac1d519cSBjoern A. Zeeb ieee80211_emulate_add_chanctx(struct ieee80211_hw *hw,
2635ac1d519cSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf)
2636ac1d519cSBjoern A. Zeeb {
2637ac1d519cSBjoern A. Zeeb int error;
2638ac1d519cSBjoern A. Zeeb
2639ac1d519cSBjoern A. Zeeb hw->conf.radar_enabled = chanctx_conf->radar_enabled;
2640ac1d519cSBjoern A. Zeeb error = lkpi_80211_update_chandef(hw, chanctx_conf);
2641ac1d519cSBjoern A. Zeeb return (error);
2642ac1d519cSBjoern A. Zeeb }
2643ac1d519cSBjoern A. Zeeb
2644ac1d519cSBjoern A. Zeeb static inline void
ieee80211_emulate_remove_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * chanctx_conf __unused)2645ac1d519cSBjoern A. Zeeb ieee80211_emulate_remove_chanctx(struct ieee80211_hw *hw,
2646ac1d519cSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf __unused)
2647ac1d519cSBjoern A. Zeeb {
2648ac1d519cSBjoern A. Zeeb hw->conf.radar_enabled = false;
2649ac1d519cSBjoern A. Zeeb lkpi_80211_update_chandef(hw, NULL);
2650ac1d519cSBjoern A. Zeeb }
2651ac1d519cSBjoern A. Zeeb
2652ac1d519cSBjoern A. Zeeb static inline void
ieee80211_emulate_change_chanctx(struct ieee80211_hw * hw,struct ieee80211_chanctx_conf * chanctx_conf,uint32_t changed __unused)2653ac1d519cSBjoern A. Zeeb ieee80211_emulate_change_chanctx(struct ieee80211_hw *hw,
2654ac1d519cSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf, uint32_t changed __unused)
2655ac1d519cSBjoern A. Zeeb {
2656ac1d519cSBjoern A. Zeeb hw->conf.radar_enabled = chanctx_conf->radar_enabled;
2657ac1d519cSBjoern A. Zeeb lkpi_80211_update_chandef(hw, chanctx_conf);
2658ac1d519cSBjoern A. Zeeb }
2659ac1d519cSBjoern A. Zeeb
2660ac1d519cSBjoern A. Zeeb static inline int
ieee80211_emulate_switch_vif_chanctx(struct ieee80211_hw * hw,struct ieee80211_vif_chanctx_switch * vifs,int n_vifs,enum ieee80211_chanctx_switch_mode mode __unused)2661ac1d519cSBjoern A. Zeeb ieee80211_emulate_switch_vif_chanctx(struct ieee80211_hw *hw,
2662ac1d519cSBjoern A. Zeeb struct ieee80211_vif_chanctx_switch *vifs, int n_vifs,
2663ac1d519cSBjoern A. Zeeb enum ieee80211_chanctx_switch_mode mode __unused)
2664ac1d519cSBjoern A. Zeeb {
2665ac1d519cSBjoern A. Zeeb struct ieee80211_chanctx_conf *chanctx_conf;
2666ac1d519cSBjoern A. Zeeb int error;
2667ac1d519cSBjoern A. Zeeb
2668ac1d519cSBjoern A. Zeeb /* Sanity check. */
2669ac1d519cSBjoern A. Zeeb if (n_vifs <= 0)
2670ac1d519cSBjoern A. Zeeb return (-EINVAL);
2671ac1d519cSBjoern A. Zeeb if (vifs == NULL || vifs[0].new_ctx == NULL)
2672ac1d519cSBjoern A. Zeeb return (-EINVAL);
2673ac1d519cSBjoern A. Zeeb
2674ac1d519cSBjoern A. Zeeb /*
2675ac1d519cSBjoern A. Zeeb * What to do if n_vifs > 1?
2676ac1d519cSBjoern A. Zeeb * Does that make sense for drivers not supporting chanctx?
2677ac1d519cSBjoern A. Zeeb */
2678ac1d519cSBjoern A. Zeeb hw->conf.radar_enabled = vifs[0].new_ctx->radar_enabled;
2679ac1d519cSBjoern A. Zeeb chanctx_conf = vifs[0].new_ctx;
2680ac1d519cSBjoern A. Zeeb error = lkpi_80211_update_chandef(hw, chanctx_conf);
2681ac1d519cSBjoern A. Zeeb return (error);
2682ac1d519cSBjoern A. Zeeb }
2683ac1d519cSBjoern A. Zeeb
2684ac1d519cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
2685ac1d519cSBjoern A. Zeeb
26866b4cac81SBjoern A. Zeeb #endif /* _LINUXKPI_NET_MAC80211_H */
2687