xref: /linux/include/net/cfg80211.h (revision d2912cb15bdda8ba4a5dd73396ad62641af2f520)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2704232c2SJohannes Berg #ifndef __NET_CFG80211_H
3704232c2SJohannes Berg #define __NET_CFG80211_H
4d3236553SJohannes Berg /*
5d3236553SJohannes Berg  * 802.11 device and configuration interface
6d3236553SJohannes Berg  *
7026331c4SJouni Malinen  * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
82740f0cfSJohannes Berg  * Copyright 2013-2014 Intel Mobile Communications GmbH
98585989dSLuca Coelho  * Copyright 2015-2017	Intel Deutschland GmbH
107011ba58SSara Sharon  * Copyright (C) 2018-2019 Intel Corporation
11d3236553SJohannes Berg  */
12704232c2SJohannes Berg 
13d3236553SJohannes Berg #include <linux/netdevice.h>
14d3236553SJohannes Berg #include <linux/debugfs.h>
15d3236553SJohannes Berg #include <linux/list.h>
16187f1882SPaul Gortmaker #include <linux/bug.h>
17704232c2SJohannes Berg #include <linux/netlink.h>
18704232c2SJohannes Berg #include <linux/skbuff.h>
1955682965SJohannes Berg #include <linux/nl80211.h>
202a519311SJohannes Berg #include <linux/if_ether.h>
212a519311SJohannes Berg #include <linux/ieee80211.h>
222a0e047eSJohannes Berg #include <linux/net.h>
23d3236553SJohannes Berg #include <net/regulatory.h>
24d3236553SJohannes Berg 
25d70e9693SJohannes Berg /**
26d70e9693SJohannes Berg  * DOC: Introduction
27d70e9693SJohannes Berg  *
28d70e9693SJohannes Berg  * cfg80211 is the configuration API for 802.11 devices in Linux. It bridges
29d70e9693SJohannes Berg  * userspace and drivers, and offers some utility functionality associated
30d70e9693SJohannes Berg  * with 802.11. cfg80211 must, directly or indirectly via mac80211, be used
31d70e9693SJohannes Berg  * by all modern wireless drivers in Linux, so that they offer a consistent
32d70e9693SJohannes Berg  * API through nl80211. For backward compatibility, cfg80211 also offers
33d70e9693SJohannes Berg  * wireless extensions to userspace, but hides them from drivers completely.
34d70e9693SJohannes Berg  *
35d70e9693SJohannes Berg  * Additionally, cfg80211 contains code to help enforce regulatory spectrum
36d70e9693SJohannes Berg  * use restrictions.
37d70e9693SJohannes Berg  */
38d70e9693SJohannes Berg 
39d70e9693SJohannes Berg 
40d70e9693SJohannes Berg /**
41d70e9693SJohannes Berg  * DOC: Device registration
42d70e9693SJohannes Berg  *
43d70e9693SJohannes Berg  * In order for a driver to use cfg80211, it must register the hardware device
44d70e9693SJohannes Berg  * with cfg80211. This happens through a number of hardware capability structs
45d70e9693SJohannes Berg  * described below.
46d70e9693SJohannes Berg  *
47d70e9693SJohannes Berg  * The fundamental structure for each device is the 'wiphy', of which each
48d70e9693SJohannes Berg  * instance describes a physical wireless device connected to the system. Each
49d70e9693SJohannes Berg  * such wiphy can have zero, one, or many virtual interfaces associated with
50d70e9693SJohannes Berg  * it, which need to be identified as such by pointing the network interface's
51d70e9693SJohannes Berg  * @ieee80211_ptr pointer to a &struct wireless_dev which further describes
52d70e9693SJohannes Berg  * the wireless part of the interface, normally this struct is embedded in the
53d70e9693SJohannes Berg  * network interface's private data area. Drivers can optionally allow creating
54d70e9693SJohannes Berg  * or destroying virtual interfaces on the fly, but without at least one or the
55d70e9693SJohannes Berg  * ability to create some the wireless device isn't useful.
56d70e9693SJohannes Berg  *
57d70e9693SJohannes Berg  * Each wiphy structure contains device capability information, and also has
58d70e9693SJohannes Berg  * a pointer to the various operations the driver offers. The definitions and
59d70e9693SJohannes Berg  * structures here describe these capabilities in detail.
60d70e9693SJohannes Berg  */
61d70e9693SJohannes Berg 
629f5e8f6eSJohannes Berg struct wiphy;
639f5e8f6eSJohannes Berg 
64704232c2SJohannes Berg /*
65d3236553SJohannes Berg  * wireless hardware capability structures
66d3236553SJohannes Berg  */
67d3236553SJohannes Berg 
68d3236553SJohannes Berg /**
69d3236553SJohannes Berg  * enum ieee80211_channel_flags - channel flags
70d3236553SJohannes Berg  *
71d3236553SJohannes Berg  * Channel flags set by the regulatory control code.
72d3236553SJohannes Berg  *
73d3236553SJohannes Berg  * @IEEE80211_CHAN_DISABLED: This channel is disabled.
748fe02e16SLuis R. Rodriguez  * @IEEE80211_CHAN_NO_IR: do not initiate radiation, this includes
758fe02e16SLuis R. Rodriguez  * 	sending probe requests or beaconing.
76d3236553SJohannes Berg  * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
77689da1b3SLuis R. Rodriguez  * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
78d3236553SJohannes Berg  * 	is not permitted.
79689da1b3SLuis R. Rodriguez  * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel
80d3236553SJohannes Berg  * 	is not permitted.
8103f6b084SSeth Forshee  * @IEEE80211_CHAN_NO_OFDM: OFDM is not allowed on this channel.
82c7a6ee27SJohannes Berg  * @IEEE80211_CHAN_NO_80MHZ: If the driver supports 80 MHz on the band,
83c7a6ee27SJohannes Berg  *	this flag indicates that an 80 MHz channel cannot use this
84c7a6ee27SJohannes Berg  *	channel as the control or any of the secondary channels.
85c7a6ee27SJohannes Berg  *	This may be due to the driver or due to regulatory bandwidth
86c7a6ee27SJohannes Berg  *	restrictions.
87c7a6ee27SJohannes Berg  * @IEEE80211_CHAN_NO_160MHZ: If the driver supports 160 MHz on the band,
88c7a6ee27SJohannes Berg  *	this flag indicates that an 160 MHz channel cannot use this
89c7a6ee27SJohannes Berg  *	channel as the control or any of the secondary channels.
90c7a6ee27SJohannes Berg  *	This may be due to the driver or due to regulatory bandwidth
91c7a6ee27SJohannes Berg  *	restrictions.
92570dbde1SDavid Spinadel  * @IEEE80211_CHAN_INDOOR_ONLY: see %NL80211_FREQUENCY_ATTR_INDOOR_ONLY
9306f207fcSArik Nemtsov  * @IEEE80211_CHAN_IR_CONCURRENT: see %NL80211_FREQUENCY_ATTR_IR_CONCURRENT
94ea077c1cSRostislav Lisovy  * @IEEE80211_CHAN_NO_20MHZ: 20 MHz bandwidth is not permitted
95ea077c1cSRostislav Lisovy  *	on this channel.
96ea077c1cSRostislav Lisovy  * @IEEE80211_CHAN_NO_10MHZ: 10 MHz bandwidth is not permitted
97ea077c1cSRostislav Lisovy  *	on this channel.
98570dbde1SDavid Spinadel  *
99d3236553SJohannes Berg  */
100d3236553SJohannes Berg enum ieee80211_channel_flags {
101d3236553SJohannes Berg 	IEEE80211_CHAN_DISABLED		= 1<<0,
1028fe02e16SLuis R. Rodriguez 	IEEE80211_CHAN_NO_IR		= 1<<1,
1038fe02e16SLuis R. Rodriguez 	/* hole at 1<<2 */
104d3236553SJohannes Berg 	IEEE80211_CHAN_RADAR		= 1<<3,
105689da1b3SLuis R. Rodriguez 	IEEE80211_CHAN_NO_HT40PLUS	= 1<<4,
106689da1b3SLuis R. Rodriguez 	IEEE80211_CHAN_NO_HT40MINUS	= 1<<5,
10703f6b084SSeth Forshee 	IEEE80211_CHAN_NO_OFDM		= 1<<6,
108c7a6ee27SJohannes Berg 	IEEE80211_CHAN_NO_80MHZ		= 1<<7,
109c7a6ee27SJohannes Berg 	IEEE80211_CHAN_NO_160MHZ	= 1<<8,
110570dbde1SDavid Spinadel 	IEEE80211_CHAN_INDOOR_ONLY	= 1<<9,
11106f207fcSArik Nemtsov 	IEEE80211_CHAN_IR_CONCURRENT	= 1<<10,
112ea077c1cSRostislav Lisovy 	IEEE80211_CHAN_NO_20MHZ		= 1<<11,
113ea077c1cSRostislav Lisovy 	IEEE80211_CHAN_NO_10MHZ		= 1<<12,
114d3236553SJohannes Berg };
115d3236553SJohannes Berg 
116038659e7SLuis R. Rodriguez #define IEEE80211_CHAN_NO_HT40 \
117689da1b3SLuis R. Rodriguez 	(IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS)
118038659e7SLuis R. Rodriguez 
11904f39047SSimon Wunderlich #define IEEE80211_DFS_MIN_CAC_TIME_MS		60000
12004f39047SSimon Wunderlich #define IEEE80211_DFS_MIN_NOP_TIME_MS		(30 * 60 * 1000)
12104f39047SSimon Wunderlich 
122d3236553SJohannes Berg /**
123d3236553SJohannes Berg  * struct ieee80211_channel - channel definition
124d3236553SJohannes Berg  *
125d3236553SJohannes Berg  * This structure describes a single channel for use
126d3236553SJohannes Berg  * with cfg80211.
127d3236553SJohannes Berg  *
128d3236553SJohannes Berg  * @center_freq: center frequency in MHz
129d3236553SJohannes Berg  * @hw_value: hardware-specific value for the channel
130d3236553SJohannes Berg  * @flags: channel flags from &enum ieee80211_channel_flags.
131d3236553SJohannes Berg  * @orig_flags: channel flags at registration time, used by regulatory
132d3236553SJohannes Berg  *	code to support devices with additional restrictions
133d3236553SJohannes Berg  * @band: band this channel belongs to.
134d3236553SJohannes Berg  * @max_antenna_gain: maximum antenna gain in dBi
135d3236553SJohannes Berg  * @max_power: maximum transmission power (in dBm)
136eccc068eSHong Wu  * @max_reg_power: maximum regulatory transmission power (in dBm)
137d3236553SJohannes Berg  * @beacon_found: helper to regulatory code to indicate when a beacon
138d3236553SJohannes Berg  *	has been found on this channel. Use regulatory_hint_found_beacon()
13977c2061dSWalter Goldens  *	to enable this, this is useful only on 5 GHz band.
140d3236553SJohannes Berg  * @orig_mag: internal use
141d3236553SJohannes Berg  * @orig_mpwr: internal use
14204f39047SSimon Wunderlich  * @dfs_state: current state of this channel. Only relevant if radar is required
14304f39047SSimon Wunderlich  *	on this channel.
14404f39047SSimon Wunderlich  * @dfs_state_entered: timestamp (jiffies) when the dfs state was entered.
145089027e5SJanusz Dziedzic  * @dfs_cac_ms: DFS CAC time in milliseconds, this is valid for DFS channels.
146d3236553SJohannes Berg  */
147d3236553SJohannes Berg struct ieee80211_channel {
14857fbcce3SJohannes Berg 	enum nl80211_band band;
1499cf0a0b4SAlexei Avshalom Lazar 	u32 center_freq;
150d3236553SJohannes Berg 	u16 hw_value;
151d3236553SJohannes Berg 	u32 flags;
152d3236553SJohannes Berg 	int max_antenna_gain;
153d3236553SJohannes Berg 	int max_power;
154eccc068eSHong Wu 	int max_reg_power;
155d3236553SJohannes Berg 	bool beacon_found;
156d3236553SJohannes Berg 	u32 orig_flags;
157d3236553SJohannes Berg 	int orig_mag, orig_mpwr;
15804f39047SSimon Wunderlich 	enum nl80211_dfs_state dfs_state;
15904f39047SSimon Wunderlich 	unsigned long dfs_state_entered;
160089027e5SJanusz Dziedzic 	unsigned int dfs_cac_ms;
161d3236553SJohannes Berg };
162d3236553SJohannes Berg 
163d3236553SJohannes Berg /**
164d3236553SJohannes Berg  * enum ieee80211_rate_flags - rate flags
165d3236553SJohannes Berg  *
166d3236553SJohannes Berg  * Hardware/specification flags for rates. These are structured
167d3236553SJohannes Berg  * in a way that allows using the same bitrate structure for
168d3236553SJohannes Berg  * different bands/PHY modes.
169d3236553SJohannes Berg  *
170d3236553SJohannes Berg  * @IEEE80211_RATE_SHORT_PREAMBLE: Hardware can send with short
171d3236553SJohannes Berg  *	preamble on this bitrate; only relevant in 2.4GHz band and
172d3236553SJohannes Berg  *	with CCK rates.
173d3236553SJohannes Berg  * @IEEE80211_RATE_MANDATORY_A: This bitrate is a mandatory rate
174d3236553SJohannes Berg  *	when used with 802.11a (on the 5 GHz band); filled by the
175d3236553SJohannes Berg  *	core code when registering the wiphy.
176d3236553SJohannes Berg  * @IEEE80211_RATE_MANDATORY_B: This bitrate is a mandatory rate
177d3236553SJohannes Berg  *	when used with 802.11b (on the 2.4 GHz band); filled by the
178d3236553SJohannes Berg  *	core code when registering the wiphy.
179d3236553SJohannes Berg  * @IEEE80211_RATE_MANDATORY_G: This bitrate is a mandatory rate
180d3236553SJohannes Berg  *	when used with 802.11g (on the 2.4 GHz band); filled by the
181d3236553SJohannes Berg  *	core code when registering the wiphy.
182d3236553SJohannes Berg  * @IEEE80211_RATE_ERP_G: This is an ERP rate in 802.11g mode.
18330e74732SSimon Wunderlich  * @IEEE80211_RATE_SUPPORTS_5MHZ: Rate can be used in 5 MHz mode
18430e74732SSimon Wunderlich  * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode
185d3236553SJohannes Berg  */
186d3236553SJohannes Berg enum ieee80211_rate_flags {
187d3236553SJohannes Berg 	IEEE80211_RATE_SHORT_PREAMBLE	= 1<<0,
188d3236553SJohannes Berg 	IEEE80211_RATE_MANDATORY_A	= 1<<1,
189d3236553SJohannes Berg 	IEEE80211_RATE_MANDATORY_B	= 1<<2,
190d3236553SJohannes Berg 	IEEE80211_RATE_MANDATORY_G	= 1<<3,
191d3236553SJohannes Berg 	IEEE80211_RATE_ERP_G		= 1<<4,
19230e74732SSimon Wunderlich 	IEEE80211_RATE_SUPPORTS_5MHZ	= 1<<5,
19330e74732SSimon Wunderlich 	IEEE80211_RATE_SUPPORTS_10MHZ	= 1<<6,
194d3236553SJohannes Berg };
195d3236553SJohannes Berg 
196d3236553SJohannes Berg /**
1976eb18137SDedy Lansky  * enum ieee80211_bss_type - BSS type filter
1986eb18137SDedy Lansky  *
1996eb18137SDedy Lansky  * @IEEE80211_BSS_TYPE_ESS: Infrastructure BSS
2006eb18137SDedy Lansky  * @IEEE80211_BSS_TYPE_PBSS: Personal BSS
2016eb18137SDedy Lansky  * @IEEE80211_BSS_TYPE_IBSS: Independent BSS
2026eb18137SDedy Lansky  * @IEEE80211_BSS_TYPE_MBSS: Mesh BSS
2036eb18137SDedy Lansky  * @IEEE80211_BSS_TYPE_ANY: Wildcard value for matching any BSS type
2046eb18137SDedy Lansky  */
2056eb18137SDedy Lansky enum ieee80211_bss_type {
2066eb18137SDedy Lansky 	IEEE80211_BSS_TYPE_ESS,
2076eb18137SDedy Lansky 	IEEE80211_BSS_TYPE_PBSS,
2086eb18137SDedy Lansky 	IEEE80211_BSS_TYPE_IBSS,
2096eb18137SDedy Lansky 	IEEE80211_BSS_TYPE_MBSS,
2106eb18137SDedy Lansky 	IEEE80211_BSS_TYPE_ANY
2116eb18137SDedy Lansky };
2126eb18137SDedy Lansky 
2136eb18137SDedy Lansky /**
2146eb18137SDedy Lansky  * enum ieee80211_privacy - BSS privacy filter
2156eb18137SDedy Lansky  *
2166eb18137SDedy Lansky  * @IEEE80211_PRIVACY_ON: privacy bit set
2176eb18137SDedy Lansky  * @IEEE80211_PRIVACY_OFF: privacy bit clear
2186eb18137SDedy Lansky  * @IEEE80211_PRIVACY_ANY: Wildcard value for matching any privacy setting
2196eb18137SDedy Lansky  */
2206eb18137SDedy Lansky enum ieee80211_privacy {
2216eb18137SDedy Lansky 	IEEE80211_PRIVACY_ON,
2226eb18137SDedy Lansky 	IEEE80211_PRIVACY_OFF,
2236eb18137SDedy Lansky 	IEEE80211_PRIVACY_ANY
2246eb18137SDedy Lansky };
2256eb18137SDedy Lansky 
2266eb18137SDedy Lansky #define IEEE80211_PRIVACY(x)	\
2276eb18137SDedy Lansky 	((x) ? IEEE80211_PRIVACY_ON : IEEE80211_PRIVACY_OFF)
2286eb18137SDedy Lansky 
2296eb18137SDedy Lansky /**
230d3236553SJohannes Berg  * struct ieee80211_rate - bitrate definition
231d3236553SJohannes Berg  *
232d3236553SJohannes Berg  * This structure describes a bitrate that an 802.11 PHY can
233d3236553SJohannes Berg  * operate with. The two values @hw_value and @hw_value_short
234d3236553SJohannes Berg  * are only for driver use when pointers to this structure are
235d3236553SJohannes Berg  * passed around.
236d3236553SJohannes Berg  *
237d3236553SJohannes Berg  * @flags: rate-specific flags
238d3236553SJohannes Berg  * @bitrate: bitrate in units of 100 Kbps
239d3236553SJohannes Berg  * @hw_value: driver/hardware value for this rate
240d3236553SJohannes Berg  * @hw_value_short: driver/hardware value for this rate when
241d3236553SJohannes Berg  *	short preamble is used
242d3236553SJohannes Berg  */
243d3236553SJohannes Berg struct ieee80211_rate {
244d3236553SJohannes Berg 	u32 flags;
245d3236553SJohannes Berg 	u16 bitrate;
246d3236553SJohannes Berg 	u16 hw_value, hw_value_short;
247d3236553SJohannes Berg };
248d3236553SJohannes Berg 
249d3236553SJohannes Berg /**
250d3236553SJohannes Berg  * struct ieee80211_sta_ht_cap - STA's HT capabilities
251d3236553SJohannes Berg  *
252d3236553SJohannes Berg  * This structure describes most essential parameters needed
253d3236553SJohannes Berg  * to describe 802.11n HT capabilities for an STA.
254d3236553SJohannes Berg  *
255d3236553SJohannes Berg  * @ht_supported: is HT supported by the STA
256d3236553SJohannes Berg  * @cap: HT capabilities map as described in 802.11n spec
257d3236553SJohannes Berg  * @ampdu_factor: Maximum A-MPDU length factor
258d3236553SJohannes Berg  * @ampdu_density: Minimum A-MPDU spacing
259d3236553SJohannes Berg  * @mcs: Supported MCS rates
260d3236553SJohannes Berg  */
261d3236553SJohannes Berg struct ieee80211_sta_ht_cap {
262d3236553SJohannes Berg 	u16 cap; /* use IEEE80211_HT_CAP_ */
263d3236553SJohannes Berg 	bool ht_supported;
264d3236553SJohannes Berg 	u8 ampdu_factor;
265d3236553SJohannes Berg 	u8 ampdu_density;
266d3236553SJohannes Berg 	struct ieee80211_mcs_info mcs;
267d3236553SJohannes Berg };
268d3236553SJohannes Berg 
269d3236553SJohannes Berg /**
270bf0c111eSMahesh Palivela  * struct ieee80211_sta_vht_cap - STA's VHT capabilities
271bf0c111eSMahesh Palivela  *
272bf0c111eSMahesh Palivela  * This structure describes most essential parameters needed
273bf0c111eSMahesh Palivela  * to describe 802.11ac VHT capabilities for an STA.
274bf0c111eSMahesh Palivela  *
275bf0c111eSMahesh Palivela  * @vht_supported: is VHT supported by the STA
276bf0c111eSMahesh Palivela  * @cap: VHT capabilities map as described in 802.11ac spec
277bf0c111eSMahesh Palivela  * @vht_mcs: Supported VHT MCS rates
278bf0c111eSMahesh Palivela  */
279bf0c111eSMahesh Palivela struct ieee80211_sta_vht_cap {
280bf0c111eSMahesh Palivela 	bool vht_supported;
281bf0c111eSMahesh Palivela 	u32 cap; /* use IEEE80211_VHT_CAP_ */
282bf0c111eSMahesh Palivela 	struct ieee80211_vht_mcs_info vht_mcs;
283bf0c111eSMahesh Palivela };
284bf0c111eSMahesh Palivela 
285c4cbaf79SLuca Coelho #define IEEE80211_HE_PPE_THRES_MAX_LEN		25
286c4cbaf79SLuca Coelho 
287c4cbaf79SLuca Coelho /**
288c4cbaf79SLuca Coelho  * struct ieee80211_sta_he_cap - STA's HE capabilities
289c4cbaf79SLuca Coelho  *
290c4cbaf79SLuca Coelho  * This structure describes most essential parameters needed
291c4cbaf79SLuca Coelho  * to describe 802.11ax HE capabilities for a STA.
292c4cbaf79SLuca Coelho  *
293c4cbaf79SLuca Coelho  * @has_he: true iff HE data is valid.
294c4cbaf79SLuca Coelho  * @he_cap_elem: Fixed portion of the HE capabilities element.
295c4cbaf79SLuca Coelho  * @he_mcs_nss_supp: The supported NSS/MCS combinations.
296c4cbaf79SLuca Coelho  * @ppe_thres: Holds the PPE Thresholds data.
297c4cbaf79SLuca Coelho  */
298c4cbaf79SLuca Coelho struct ieee80211_sta_he_cap {
299c4cbaf79SLuca Coelho 	bool has_he;
300c4cbaf79SLuca Coelho 	struct ieee80211_he_cap_elem he_cap_elem;
301c4cbaf79SLuca Coelho 	struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp;
302c4cbaf79SLuca Coelho 	u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN];
303c4cbaf79SLuca Coelho };
304c4cbaf79SLuca Coelho 
305c4cbaf79SLuca Coelho /**
306c4cbaf79SLuca Coelho  * struct ieee80211_sband_iftype_data
307c4cbaf79SLuca Coelho  *
308c4cbaf79SLuca Coelho  * This structure encapsulates sband data that is relevant for the
309c4cbaf79SLuca Coelho  * interface types defined in @types_mask.  Each type in the
310c4cbaf79SLuca Coelho  * @types_mask must be unique across all instances of iftype_data.
311c4cbaf79SLuca Coelho  *
312c4cbaf79SLuca Coelho  * @types_mask: interface types mask
313c4cbaf79SLuca Coelho  * @he_cap: holds the HE capabilities
314c4cbaf79SLuca Coelho  */
315c4cbaf79SLuca Coelho struct ieee80211_sband_iftype_data {
316c4cbaf79SLuca Coelho 	u16 types_mask;
317c4cbaf79SLuca Coelho 	struct ieee80211_sta_he_cap he_cap;
318c4cbaf79SLuca Coelho };
319c4cbaf79SLuca Coelho 
320bf0c111eSMahesh Palivela /**
321d3236553SJohannes Berg  * struct ieee80211_supported_band - frequency band definition
322d3236553SJohannes Berg  *
323d3236553SJohannes Berg  * This structure describes a frequency band a wiphy
324d3236553SJohannes Berg  * is able to operate in.
325d3236553SJohannes Berg  *
326d3236553SJohannes Berg  * @channels: Array of channels the hardware can operate in
327d3236553SJohannes Berg  *	in this band.
328d3236553SJohannes Berg  * @band: the band this structure represents
329d3236553SJohannes Berg  * @n_channels: Number of channels in @channels
330d3236553SJohannes Berg  * @bitrates: Array of bitrates the hardware can operate with
331d3236553SJohannes Berg  *	in this band. Must be sorted to give a valid "supported
332d3236553SJohannes Berg  *	rates" IE, i.e. CCK rates first, then OFDM.
333d3236553SJohannes Berg  * @n_bitrates: Number of bitrates in @bitrates
334abe37c4bSJohannes Berg  * @ht_cap: HT capabilities in this band
335c9a0a302SRobert P. J. Day  * @vht_cap: VHT capabilities in this band
336c4cbaf79SLuca Coelho  * @n_iftype_data: number of iftype data entries
337c4cbaf79SLuca Coelho  * @iftype_data: interface type data entries.  Note that the bits in
338c4cbaf79SLuca Coelho  *	@types_mask inside this structure cannot overlap (i.e. only
339c4cbaf79SLuca Coelho  *	one occurrence of each type is allowed across all instances of
340c4cbaf79SLuca Coelho  *	iftype_data).
341d3236553SJohannes Berg  */
342d3236553SJohannes Berg struct ieee80211_supported_band {
343d3236553SJohannes Berg 	struct ieee80211_channel *channels;
344d3236553SJohannes Berg 	struct ieee80211_rate *bitrates;
34557fbcce3SJohannes Berg 	enum nl80211_band band;
346d3236553SJohannes Berg 	int n_channels;
347d3236553SJohannes Berg 	int n_bitrates;
348d3236553SJohannes Berg 	struct ieee80211_sta_ht_cap ht_cap;
349bf0c111eSMahesh Palivela 	struct ieee80211_sta_vht_cap vht_cap;
350c4cbaf79SLuca Coelho 	u16 n_iftype_data;
351c4cbaf79SLuca Coelho 	const struct ieee80211_sband_iftype_data *iftype_data;
352d3236553SJohannes Berg };
353d3236553SJohannes Berg 
354e691ac2fSRafał Miłecki /**
355c4cbaf79SLuca Coelho  * ieee80211_get_sband_iftype_data - return sband data for a given iftype
356c4cbaf79SLuca Coelho  * @sband: the sband to search for the STA on
357c4cbaf79SLuca Coelho  * @iftype: enum nl80211_iftype
358c4cbaf79SLuca Coelho  *
359c4cbaf79SLuca Coelho  * Return: pointer to struct ieee80211_sband_iftype_data, or NULL is none found
360c4cbaf79SLuca Coelho  */
361c4cbaf79SLuca Coelho static inline const struct ieee80211_sband_iftype_data *
362c4cbaf79SLuca Coelho ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband,
363c4cbaf79SLuca Coelho 				u8 iftype)
364c4cbaf79SLuca Coelho {
365c4cbaf79SLuca Coelho 	int i;
366c4cbaf79SLuca Coelho 
367c4cbaf79SLuca Coelho 	if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
368c4cbaf79SLuca Coelho 		return NULL;
369c4cbaf79SLuca Coelho 
370c4cbaf79SLuca Coelho 	for (i = 0; i < sband->n_iftype_data; i++)  {
371c4cbaf79SLuca Coelho 		const struct ieee80211_sband_iftype_data *data =
372c4cbaf79SLuca Coelho 			&sband->iftype_data[i];
373c4cbaf79SLuca Coelho 
374c4cbaf79SLuca Coelho 		if (data->types_mask & BIT(iftype))
375c4cbaf79SLuca Coelho 			return data;
376c4cbaf79SLuca Coelho 	}
377c4cbaf79SLuca Coelho 
378c4cbaf79SLuca Coelho 	return NULL;
379c4cbaf79SLuca Coelho }
380c4cbaf79SLuca Coelho 
381c4cbaf79SLuca Coelho /**
382c4cbaf79SLuca Coelho  * ieee80211_get_he_sta_cap - return HE capabilities for an sband's STA
383c4cbaf79SLuca Coelho  * @sband: the sband to search for the STA on
384c4cbaf79SLuca Coelho  *
385c4cbaf79SLuca Coelho  * Return: pointer to the struct ieee80211_sta_he_cap, or NULL is none found
386c4cbaf79SLuca Coelho  */
387c4cbaf79SLuca Coelho static inline const struct ieee80211_sta_he_cap *
388c4cbaf79SLuca Coelho ieee80211_get_he_sta_cap(const struct ieee80211_supported_band *sband)
389c4cbaf79SLuca Coelho {
390c4cbaf79SLuca Coelho 	const struct ieee80211_sband_iftype_data *data =
391c4cbaf79SLuca Coelho 		ieee80211_get_sband_iftype_data(sband, NL80211_IFTYPE_STATION);
392c4cbaf79SLuca Coelho 
393c4cbaf79SLuca Coelho 	if (data && data->he_cap.has_he)
394c4cbaf79SLuca Coelho 		return &data->he_cap;
395c4cbaf79SLuca Coelho 
396c4cbaf79SLuca Coelho 	return NULL;
397c4cbaf79SLuca Coelho }
398c4cbaf79SLuca Coelho 
399c4cbaf79SLuca Coelho /**
400e691ac2fSRafał Miłecki  * wiphy_read_of_freq_limits - read frequency limits from device tree
401e691ac2fSRafał Miłecki  *
402e691ac2fSRafał Miłecki  * @wiphy: the wireless device to get extra limits for
403e691ac2fSRafał Miłecki  *
404e691ac2fSRafał Miłecki  * Some devices may have extra limitations specified in DT. This may be useful
405e691ac2fSRafał Miłecki  * for chipsets that normally support more bands but are limited due to board
406e691ac2fSRafał Miłecki  * design (e.g. by antennas or external power amplifier).
407e691ac2fSRafał Miłecki  *
408e691ac2fSRafał Miłecki  * This function reads info from DT and uses it to *modify* channels (disable
409e691ac2fSRafał Miłecki  * unavailable ones). It's usually a *bad* idea to use it in drivers with
410e691ac2fSRafał Miłecki  * shared channel data as DT limitations are device specific. You should make
411e691ac2fSRafał Miłecki  * sure to call it only if channels in wiphy are copied and can be modified
412e691ac2fSRafał Miłecki  * without affecting other devices.
413e691ac2fSRafał Miłecki  *
414e691ac2fSRafał Miłecki  * As this function access device node it has to be called after set_wiphy_dev.
415e691ac2fSRafał Miłecki  * It also modifies channels so they have to be set first.
416e691ac2fSRafał Miłecki  * If using this helper, call it before wiphy_register().
417e691ac2fSRafał Miłecki  */
418e691ac2fSRafał Miłecki #ifdef CONFIG_OF
419e691ac2fSRafał Miłecki void wiphy_read_of_freq_limits(struct wiphy *wiphy);
420e691ac2fSRafał Miłecki #else /* CONFIG_OF */
421e691ac2fSRafał Miłecki static inline void wiphy_read_of_freq_limits(struct wiphy *wiphy)
422e691ac2fSRafał Miłecki {
423e691ac2fSRafał Miłecki }
424e691ac2fSRafał Miłecki #endif /* !CONFIG_OF */
425e691ac2fSRafał Miłecki 
426e691ac2fSRafał Miłecki 
427d3236553SJohannes Berg /*
428d3236553SJohannes Berg  * Wireless hardware/device configuration structures and methods
429704232c2SJohannes Berg  */
430704232c2SJohannes Berg 
4312ec600d6SLuis Carlos Cobo /**
432d70e9693SJohannes Berg  * DOC: Actions and configuration
433d70e9693SJohannes Berg  *
434d70e9693SJohannes Berg  * Each wireless device and each virtual interface offer a set of configuration
435d70e9693SJohannes Berg  * operations and other actions that are invoked by userspace. Each of these
436d70e9693SJohannes Berg  * actions is described in the operations structure, and the parameters these
437d70e9693SJohannes Berg  * operations use are described separately.
438d70e9693SJohannes Berg  *
439d70e9693SJohannes Berg  * Additionally, some operations are asynchronous and expect to get status
440d70e9693SJohannes Berg  * information via some functions that drivers need to call.
441d70e9693SJohannes Berg  *
442d70e9693SJohannes Berg  * Scanning and BSS list handling with its associated functionality is described
443d70e9693SJohannes Berg  * in a separate chapter.
444d70e9693SJohannes Berg  */
445d70e9693SJohannes Berg 
446c6e6a0c8SAviya Erenfeld #define VHT_MUMIMO_GROUPS_DATA_LEN (WLAN_MEMBERSHIP_LEN +\
447c6e6a0c8SAviya Erenfeld 				    WLAN_USER_POSITION_LEN)
448c6e6a0c8SAviya Erenfeld 
449d70e9693SJohannes Berg /**
4502ec600d6SLuis Carlos Cobo  * struct vif_params - describes virtual interface parameters
451818a986eSJohannes Berg  * @flags: monitor interface flags, unchanged if 0, otherwise
452818a986eSJohannes Berg  *	%MONITOR_FLAG_CHANGED will be set
4538b787643SFelix Fietkau  * @use_4addr: use 4-address frames
454e8f479b1SBen Greear  * @macaddr: address to use for this virtual interface.
455e8f479b1SBen Greear  *	If this parameter is set to zero address the driver may
456e8f479b1SBen Greear  *	determine the address as needed.
457e8f479b1SBen Greear  *	This feature is only fully supported by drivers that enable the
458e8f479b1SBen Greear  *	%NL80211_FEATURE_MAC_ON_CREATE flag.  Others may support creating
459e8f479b1SBen Greear  **	only p2p devices with specified MAC.
460b0265024SJohannes Berg  * @vht_mumimo_groups: MU-MIMO groupID, used for monitoring MU-MIMO packets
461b0265024SJohannes Berg  *	belonging to that MU-MIMO groupID; %NULL if not changed
462b0265024SJohannes Berg  * @vht_mumimo_follow_addr: MU-MIMO follow address, used for monitoring
463b0265024SJohannes Berg  *	MU-MIMO packets going to the specified station; %NULL if not changed
4642ec600d6SLuis Carlos Cobo  */
4652ec600d6SLuis Carlos Cobo struct vif_params {
466818a986eSJohannes Berg 	u32 flags;
4678b787643SFelix Fietkau 	int use_4addr;
4681c18f145SArend van Spriel 	u8 macaddr[ETH_ALEN];
469b0265024SJohannes Berg 	const u8 *vht_mumimo_groups;
470b0265024SJohannes Berg 	const u8 *vht_mumimo_follow_addr;
4712ec600d6SLuis Carlos Cobo };
4722ec600d6SLuis Carlos Cobo 
47341ade00fSJohannes Berg /**
47441ade00fSJohannes Berg  * struct key_params - key information
47541ade00fSJohannes Berg  *
47641ade00fSJohannes Berg  * Information about a key
47741ade00fSJohannes Berg  *
47841ade00fSJohannes Berg  * @key: key material
47941ade00fSJohannes Berg  * @key_len: length of key material
48041ade00fSJohannes Berg  * @cipher: cipher suite selector
48141ade00fSJohannes Berg  * @seq: sequence counter (IV/PN) for TKIP and CCMP keys, only used
48241ade00fSJohannes Berg  *	with the get_key() callback, must be in little endian,
48341ade00fSJohannes Berg  *	length given by @seq_len.
484abe37c4bSJohannes Berg  * @seq_len: length of @seq.
4856cdd3979SAlexander Wetzel  * @mode: key install mode (RX_TX, NO_TX or SET_TX)
48641ade00fSJohannes Berg  */
48741ade00fSJohannes Berg struct key_params {
488c1e5f471SJohannes Berg 	const u8 *key;
489c1e5f471SJohannes Berg 	const u8 *seq;
49041ade00fSJohannes Berg 	int key_len;
49141ade00fSJohannes Berg 	int seq_len;
49241ade00fSJohannes Berg 	u32 cipher;
4936cdd3979SAlexander Wetzel 	enum nl80211_key_mode mode;
49441ade00fSJohannes Berg };
49541ade00fSJohannes Berg 
496ed1b6cc7SJohannes Berg /**
497683b6d3bSJohannes Berg  * struct cfg80211_chan_def - channel definition
498683b6d3bSJohannes Berg  * @chan: the (control) channel
4993d9d1d66SJohannes Berg  * @width: channel width
5003d9d1d66SJohannes Berg  * @center_freq1: center frequency of first segment
5013d9d1d66SJohannes Berg  * @center_freq2: center frequency of second segment
5023d9d1d66SJohannes Berg  *	(only with 80+80 MHz)
503683b6d3bSJohannes Berg  */
504683b6d3bSJohannes Berg struct cfg80211_chan_def {
505683b6d3bSJohannes Berg 	struct ieee80211_channel *chan;
5063d9d1d66SJohannes Berg 	enum nl80211_chan_width width;
5073d9d1d66SJohannes Berg 	u32 center_freq1;
5083d9d1d66SJohannes Berg 	u32 center_freq2;
509683b6d3bSJohannes Berg };
510683b6d3bSJohannes Berg 
5113d9d1d66SJohannes Berg /**
5123d9d1d66SJohannes Berg  * cfg80211_get_chandef_type - return old channel type from chandef
5133d9d1d66SJohannes Berg  * @chandef: the channel definition
5143d9d1d66SJohannes Berg  *
5150ae997dcSYacine Belkadi  * Return: The old channel type (NOHT, HT20, HT40+/-) from a given
5163d9d1d66SJohannes Berg  * chandef, which must have a bandwidth allowing this conversion.
5173d9d1d66SJohannes Berg  */
518683b6d3bSJohannes Berg static inline enum nl80211_channel_type
519683b6d3bSJohannes Berg cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef)
520683b6d3bSJohannes Berg {
5213d9d1d66SJohannes Berg 	switch (chandef->width) {
5223d9d1d66SJohannes Berg 	case NL80211_CHAN_WIDTH_20_NOHT:
5233d9d1d66SJohannes Berg 		return NL80211_CHAN_NO_HT;
5243d9d1d66SJohannes Berg 	case NL80211_CHAN_WIDTH_20:
5253d9d1d66SJohannes Berg 		return NL80211_CHAN_HT20;
5263d9d1d66SJohannes Berg 	case NL80211_CHAN_WIDTH_40:
5273d9d1d66SJohannes Berg 		if (chandef->center_freq1 > chandef->chan->center_freq)
5283d9d1d66SJohannes Berg 			return NL80211_CHAN_HT40PLUS;
5293d9d1d66SJohannes Berg 		return NL80211_CHAN_HT40MINUS;
5303d9d1d66SJohannes Berg 	default:
5313d9d1d66SJohannes Berg 		WARN_ON(1);
5323d9d1d66SJohannes Berg 		return NL80211_CHAN_NO_HT;
533683b6d3bSJohannes Berg 	}
5343d9d1d66SJohannes Berg }
5353d9d1d66SJohannes Berg 
5363d9d1d66SJohannes Berg /**
5373d9d1d66SJohannes Berg  * cfg80211_chandef_create - create channel definition using channel type
5383d9d1d66SJohannes Berg  * @chandef: the channel definition struct to fill
5393d9d1d66SJohannes Berg  * @channel: the control channel
5403d9d1d66SJohannes Berg  * @chantype: the channel type
5413d9d1d66SJohannes Berg  *
5423d9d1d66SJohannes Berg  * Given a channel type, create a channel definition.
5433d9d1d66SJohannes Berg  */
5443d9d1d66SJohannes Berg void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
5453d9d1d66SJohannes Berg 			     struct ieee80211_channel *channel,
5463d9d1d66SJohannes Berg 			     enum nl80211_channel_type chantype);
5473d9d1d66SJohannes Berg 
5483d9d1d66SJohannes Berg /**
5493d9d1d66SJohannes Berg  * cfg80211_chandef_identical - check if two channel definitions are identical
5503d9d1d66SJohannes Berg  * @chandef1: first channel definition
5513d9d1d66SJohannes Berg  * @chandef2: second channel definition
5523d9d1d66SJohannes Berg  *
5530ae997dcSYacine Belkadi  * Return: %true if the channels defined by the channel definitions are
5543d9d1d66SJohannes Berg  * identical, %false otherwise.
5553d9d1d66SJohannes Berg  */
5563d9d1d66SJohannes Berg static inline bool
5573d9d1d66SJohannes Berg cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef1,
5583d9d1d66SJohannes Berg 			   const struct cfg80211_chan_def *chandef2)
5593d9d1d66SJohannes Berg {
5603d9d1d66SJohannes Berg 	return (chandef1->chan == chandef2->chan &&
5613d9d1d66SJohannes Berg 		chandef1->width == chandef2->width &&
5623d9d1d66SJohannes Berg 		chandef1->center_freq1 == chandef2->center_freq1 &&
5633d9d1d66SJohannes Berg 		chandef1->center_freq2 == chandef2->center_freq2);
5643d9d1d66SJohannes Berg }
5653d9d1d66SJohannes Berg 
5663d9d1d66SJohannes Berg /**
5673d9d1d66SJohannes Berg  * cfg80211_chandef_compatible - check if two channel definitions are compatible
5683d9d1d66SJohannes Berg  * @chandef1: first channel definition
5693d9d1d66SJohannes Berg  * @chandef2: second channel definition
5703d9d1d66SJohannes Berg  *
5710ae997dcSYacine Belkadi  * Return: %NULL if the given channel definitions are incompatible,
5723d9d1d66SJohannes Berg  * chandef1 or chandef2 otherwise.
5733d9d1d66SJohannes Berg  */
5743d9d1d66SJohannes Berg const struct cfg80211_chan_def *
5753d9d1d66SJohannes Berg cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1,
5763d9d1d66SJohannes Berg 			    const struct cfg80211_chan_def *chandef2);
577683b6d3bSJohannes Berg 
578683b6d3bSJohannes Berg /**
5799f5e8f6eSJohannes Berg  * cfg80211_chandef_valid - check if a channel definition is valid
5809f5e8f6eSJohannes Berg  * @chandef: the channel definition to check
5810ae997dcSYacine Belkadi  * Return: %true if the channel definition is valid. %false otherwise.
5829f5e8f6eSJohannes Berg  */
5839f5e8f6eSJohannes Berg bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef);
5849f5e8f6eSJohannes Berg 
5859f5e8f6eSJohannes Berg /**
5869f5e8f6eSJohannes Berg  * cfg80211_chandef_usable - check if secondary channels can be used
5879f5e8f6eSJohannes Berg  * @wiphy: the wiphy to validate against
5889f5e8f6eSJohannes Berg  * @chandef: the channel definition to check
5890ae997dcSYacine Belkadi  * @prohibited_flags: the regulatory channel flags that must not be set
5900ae997dcSYacine Belkadi  * Return: %true if secondary channels are usable. %false otherwise.
5919f5e8f6eSJohannes Berg  */
5929f5e8f6eSJohannes Berg bool cfg80211_chandef_usable(struct wiphy *wiphy,
5939f5e8f6eSJohannes Berg 			     const struct cfg80211_chan_def *chandef,
5949f5e8f6eSJohannes Berg 			     u32 prohibited_flags);
5959f5e8f6eSJohannes Berg 
5969f5e8f6eSJohannes Berg /**
597774f0734SSimon Wunderlich  * cfg80211_chandef_dfs_required - checks if radar detection is required
598774f0734SSimon Wunderlich  * @wiphy: the wiphy to validate against
599774f0734SSimon Wunderlich  * @chandef: the channel definition to check
6002beb6dabSLuciano Coelho  * @iftype: the interface type as specified in &enum nl80211_iftype
6012beb6dabSLuciano Coelho  * Returns:
6022beb6dabSLuciano Coelho  *	1 if radar detection is required, 0 if it is not, < 0 on error
603774f0734SSimon Wunderlich  */
604774f0734SSimon Wunderlich int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
6052beb6dabSLuciano Coelho 				  const struct cfg80211_chan_def *chandef,
606c3d62036SLuciano Coelho 				  enum nl80211_iftype iftype);
607774f0734SSimon Wunderlich 
608774f0734SSimon Wunderlich /**
60930e74732SSimon Wunderlich  * ieee80211_chandef_rate_flags - returns rate flags for a channel
61030e74732SSimon Wunderlich  *
61130e74732SSimon Wunderlich  * In some channel types, not all rates may be used - for example CCK
61230e74732SSimon Wunderlich  * rates may not be used in 5/10 MHz channels.
61330e74732SSimon Wunderlich  *
61430e74732SSimon Wunderlich  * @chandef: channel definition for the channel
61530e74732SSimon Wunderlich  *
61630e74732SSimon Wunderlich  * Returns: rate flags which apply for this channel
61730e74732SSimon Wunderlich  */
61830e74732SSimon Wunderlich static inline enum ieee80211_rate_flags
61930e74732SSimon Wunderlich ieee80211_chandef_rate_flags(struct cfg80211_chan_def *chandef)
62030e74732SSimon Wunderlich {
62130e74732SSimon Wunderlich 	switch (chandef->width) {
62230e74732SSimon Wunderlich 	case NL80211_CHAN_WIDTH_5:
62330e74732SSimon Wunderlich 		return IEEE80211_RATE_SUPPORTS_5MHZ;
62430e74732SSimon Wunderlich 	case NL80211_CHAN_WIDTH_10:
62530e74732SSimon Wunderlich 		return IEEE80211_RATE_SUPPORTS_10MHZ;
62630e74732SSimon Wunderlich 	default:
62730e74732SSimon Wunderlich 		break;
62830e74732SSimon Wunderlich 	}
62930e74732SSimon Wunderlich 	return 0;
63030e74732SSimon Wunderlich }
63130e74732SSimon Wunderlich 
63230e74732SSimon Wunderlich /**
6330430c883SSimon Wunderlich  * ieee80211_chandef_max_power - maximum transmission power for the chandef
6340430c883SSimon Wunderlich  *
6350430c883SSimon Wunderlich  * In some regulations, the transmit power may depend on the configured channel
6360430c883SSimon Wunderlich  * bandwidth which may be defined as dBm/MHz. This function returns the actual
6370430c883SSimon Wunderlich  * max_power for non-standard (20 MHz) channels.
6380430c883SSimon Wunderlich  *
6390430c883SSimon Wunderlich  * @chandef: channel definition for the channel
6400430c883SSimon Wunderlich  *
6410430c883SSimon Wunderlich  * Returns: maximum allowed transmission power in dBm for the chandef
6420430c883SSimon Wunderlich  */
6430430c883SSimon Wunderlich static inline int
6440430c883SSimon Wunderlich ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef)
6450430c883SSimon Wunderlich {
6460430c883SSimon Wunderlich 	switch (chandef->width) {
6470430c883SSimon Wunderlich 	case NL80211_CHAN_WIDTH_5:
6480430c883SSimon Wunderlich 		return min(chandef->chan->max_reg_power - 6,
6490430c883SSimon Wunderlich 			   chandef->chan->max_power);
6500430c883SSimon Wunderlich 	case NL80211_CHAN_WIDTH_10:
6510430c883SSimon Wunderlich 		return min(chandef->chan->max_reg_power - 3,
6520430c883SSimon Wunderlich 			   chandef->chan->max_power);
6530430c883SSimon Wunderlich 	default:
6540430c883SSimon Wunderlich 		break;
6550430c883SSimon Wunderlich 	}
6560430c883SSimon Wunderlich 	return chandef->chan->max_power;
6570430c883SSimon Wunderlich }
6580430c883SSimon Wunderlich 
6590430c883SSimon Wunderlich /**
66061fa713cSHolger Schurig  * enum survey_info_flags - survey information flags
66161fa713cSHolger Schurig  *
662abe37c4bSJohannes Berg  * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in
66317e5a808SFelix Fietkau  * @SURVEY_INFO_IN_USE: channel is currently being used
6644ed20bebSJohannes Berg  * @SURVEY_INFO_TIME: active time (in ms) was filled in
6654ed20bebSJohannes Berg  * @SURVEY_INFO_TIME_BUSY: busy time was filled in
6664ed20bebSJohannes Berg  * @SURVEY_INFO_TIME_EXT_BUSY: extension channel busy time was filled in
6674ed20bebSJohannes Berg  * @SURVEY_INFO_TIME_RX: receive time was filled in
6684ed20bebSJohannes Berg  * @SURVEY_INFO_TIME_TX: transmit time was filled in
669052536abSJohannes Berg  * @SURVEY_INFO_TIME_SCAN: scan time was filled in
670abe37c4bSJohannes Berg  *
67161fa713cSHolger Schurig  * Used by the driver to indicate which info in &struct survey_info
67261fa713cSHolger Schurig  * it has filled in during the get_survey().
67361fa713cSHolger Schurig  */
67461fa713cSHolger Schurig enum survey_info_flags {
6754ed20bebSJohannes Berg 	SURVEY_INFO_NOISE_DBM		= BIT(0),
6764ed20bebSJohannes Berg 	SURVEY_INFO_IN_USE		= BIT(1),
6774ed20bebSJohannes Berg 	SURVEY_INFO_TIME		= BIT(2),
6784ed20bebSJohannes Berg 	SURVEY_INFO_TIME_BUSY		= BIT(3),
6794ed20bebSJohannes Berg 	SURVEY_INFO_TIME_EXT_BUSY	= BIT(4),
6804ed20bebSJohannes Berg 	SURVEY_INFO_TIME_RX		= BIT(5),
6814ed20bebSJohannes Berg 	SURVEY_INFO_TIME_TX		= BIT(6),
682052536abSJohannes Berg 	SURVEY_INFO_TIME_SCAN		= BIT(7),
68361fa713cSHolger Schurig };
68461fa713cSHolger Schurig 
68561fa713cSHolger Schurig /**
68661fa713cSHolger Schurig  * struct survey_info - channel survey response
68761fa713cSHolger Schurig  *
68811f78ac3SJohannes Berg  * @channel: the channel this survey record reports, may be %NULL for a single
68911f78ac3SJohannes Berg  *	record to report global statistics
69061fa713cSHolger Schurig  * @filled: bitflag of flags from &enum survey_info_flags
69161fa713cSHolger Schurig  * @noise: channel noise in dBm. This and all following fields are
69261fa713cSHolger Schurig  *	optional
6934ed20bebSJohannes Berg  * @time: amount of time in ms the radio was turn on (on the channel)
6944ed20bebSJohannes Berg  * @time_busy: amount of time the primary channel was sensed busy
6954ed20bebSJohannes Berg  * @time_ext_busy: amount of time the extension channel was sensed busy
6964ed20bebSJohannes Berg  * @time_rx: amount of time the radio spent receiving data
6974ed20bebSJohannes Berg  * @time_tx: amount of time the radio spent transmitting data
698052536abSJohannes Berg  * @time_scan: amount of time the radio spent for scanning
69961fa713cSHolger Schurig  *
700abe37c4bSJohannes Berg  * Used by dump_survey() to report back per-channel survey information.
701abe37c4bSJohannes Berg  *
70261fa713cSHolger Schurig  * This structure can later be expanded with things like
70361fa713cSHolger Schurig  * channel duty cycle etc.
70461fa713cSHolger Schurig  */
70561fa713cSHolger Schurig struct survey_info {
70661fa713cSHolger Schurig 	struct ieee80211_channel *channel;
7074ed20bebSJohannes Berg 	u64 time;
7084ed20bebSJohannes Berg 	u64 time_busy;
7094ed20bebSJohannes Berg 	u64 time_ext_busy;
7104ed20bebSJohannes Berg 	u64 time_rx;
7114ed20bebSJohannes Berg 	u64 time_tx;
712052536abSJohannes Berg 	u64 time_scan;
71361fa713cSHolger Schurig 	u32 filled;
71461fa713cSHolger Schurig 	s8 noise;
71561fa713cSHolger Schurig };
71661fa713cSHolger Schurig 
717b8676221SDavid Spinadel #define CFG80211_MAX_WEP_KEYS	4
718b8676221SDavid Spinadel 
71961fa713cSHolger Schurig /**
7205fb628e9SJouni Malinen  * struct cfg80211_crypto_settings - Crypto settings
7215fb628e9SJouni Malinen  * @wpa_versions: indicates which, if any, WPA versions are enabled
7225fb628e9SJouni Malinen  *	(from enum nl80211_wpa_versions)
7235fb628e9SJouni Malinen  * @cipher_group: group key cipher suite (or 0 if unset)
7245fb628e9SJouni Malinen  * @n_ciphers_pairwise: number of AP supported unicast ciphers
7255fb628e9SJouni Malinen  * @ciphers_pairwise: unicast key cipher suites
7265fb628e9SJouni Malinen  * @n_akm_suites: number of AKM suites
7275fb628e9SJouni Malinen  * @akm_suites: AKM suites
7285fb628e9SJouni Malinen  * @control_port: Whether user space controls IEEE 802.1X port, i.e.,
7295fb628e9SJouni Malinen  *	sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
7305fb628e9SJouni Malinen  *	required to assume that the port is unauthorized until authorized by
7315fb628e9SJouni Malinen  *	user space. Otherwise, port is marked authorized by default.
7325fb628e9SJouni Malinen  * @control_port_ethertype: the control port protocol that should be
7335fb628e9SJouni Malinen  *	allowed through even on unauthorized ports
7345fb628e9SJouni Malinen  * @control_port_no_encrypt: TRUE to prevent encryption of control port
7355fb628e9SJouni Malinen  *	protocol frames.
73664bf3d4bSDenis Kenzior  * @control_port_over_nl80211: TRUE if userspace expects to exchange control
73764bf3d4bSDenis Kenzior  *	port frames over NL80211 instead of the network interface.
738b8676221SDavid Spinadel  * @wep_keys: static WEP keys, if not NULL points to an array of
739b8676221SDavid Spinadel  *	CFG80211_MAX_WEP_KEYS WEP keys
740b8676221SDavid Spinadel  * @wep_tx_key: key index (0..3) of the default TX static WEP key
74191b5ab62SEliad Peller  * @psk: PSK (for devices supporting 4-way-handshake offload)
7425fb628e9SJouni Malinen  */
7435fb628e9SJouni Malinen struct cfg80211_crypto_settings {
7445fb628e9SJouni Malinen 	u32 wpa_versions;
7455fb628e9SJouni Malinen 	u32 cipher_group;
7465fb628e9SJouni Malinen 	int n_ciphers_pairwise;
7475fb628e9SJouni Malinen 	u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES];
7485fb628e9SJouni Malinen 	int n_akm_suites;
7495fb628e9SJouni Malinen 	u32 akm_suites[NL80211_MAX_NR_AKM_SUITES];
7505fb628e9SJouni Malinen 	bool control_port;
7515fb628e9SJouni Malinen 	__be16 control_port_ethertype;
7525fb628e9SJouni Malinen 	bool control_port_no_encrypt;
75364bf3d4bSDenis Kenzior 	bool control_port_over_nl80211;
754b8676221SDavid Spinadel 	struct key_params *wep_keys;
755b8676221SDavid Spinadel 	int wep_tx_key;
75691b5ab62SEliad Peller 	const u8 *psk;
7575fb628e9SJouni Malinen };
7585fb628e9SJouni Malinen 
7595fb628e9SJouni Malinen /**
7608860020eSJohannes Berg  * struct cfg80211_beacon_data - beacon data
761ed1b6cc7SJohannes Berg  * @head: head portion of beacon (before TIM IE)
762ed1b6cc7SJohannes Berg  *	or %NULL if not changed
763ed1b6cc7SJohannes Berg  * @tail: tail portion of beacon (after TIM IE)
764ed1b6cc7SJohannes Berg  *	or %NULL if not changed
765ed1b6cc7SJohannes Berg  * @head_len: length of @head
766ed1b6cc7SJohannes Berg  * @tail_len: length of @tail
7679946ecfbSJouni Malinen  * @beacon_ies: extra information element(s) to add into Beacon frames or %NULL
7689946ecfbSJouni Malinen  * @beacon_ies_len: length of beacon_ies in octets
7699946ecfbSJouni Malinen  * @proberesp_ies: extra information element(s) to add into Probe Response
7709946ecfbSJouni Malinen  *	frames or %NULL
7719946ecfbSJouni Malinen  * @proberesp_ies_len: length of proberesp_ies in octets
7729946ecfbSJouni Malinen  * @assocresp_ies: extra information element(s) to add into (Re)Association
7739946ecfbSJouni Malinen  *	Response frames or %NULL
7749946ecfbSJouni Malinen  * @assocresp_ies_len: length of assocresp_ies in octets
77500f740e1SArik Nemtsov  * @probe_resp_len: length of probe response template (@probe_resp)
77600f740e1SArik Nemtsov  * @probe_resp: probe response template (AP mode only)
77781e54d08SPradeep Kumar Chitrapu  * @ftm_responder: enable FTM responder functionality; -1 for no change
77881e54d08SPradeep Kumar Chitrapu  *	(which also implies no change in LCI/civic location data)
77930db641eSJohannes Berg  * @lci: Measurement Report element content, starting with Measurement Token
78030db641eSJohannes Berg  *	(measurement type 8)
78130db641eSJohannes Berg  * @civicloc: Measurement Report element content, starting with Measurement
78230db641eSJohannes Berg  *	Token (measurement type 11)
78381e54d08SPradeep Kumar Chitrapu  * @lci_len: LCI data length
78481e54d08SPradeep Kumar Chitrapu  * @civicloc_len: Civic location data length
785ed1b6cc7SJohannes Berg  */
7868860020eSJohannes Berg struct cfg80211_beacon_data {
7878860020eSJohannes Berg 	const u8 *head, *tail;
7888860020eSJohannes Berg 	const u8 *beacon_ies;
7898860020eSJohannes Berg 	const u8 *proberesp_ies;
7908860020eSJohannes Berg 	const u8 *assocresp_ies;
7918860020eSJohannes Berg 	const u8 *probe_resp;
79281e54d08SPradeep Kumar Chitrapu 	const u8 *lci;
79381e54d08SPradeep Kumar Chitrapu 	const u8 *civicloc;
79481e54d08SPradeep Kumar Chitrapu 	s8 ftm_responder;
7958860020eSJohannes Berg 
7968860020eSJohannes Berg 	size_t head_len, tail_len;
7978860020eSJohannes Berg 	size_t beacon_ies_len;
7988860020eSJohannes Berg 	size_t proberesp_ies_len;
7998860020eSJohannes Berg 	size_t assocresp_ies_len;
8008860020eSJohannes Berg 	size_t probe_resp_len;
80181e54d08SPradeep Kumar Chitrapu 	size_t lci_len;
80281e54d08SPradeep Kumar Chitrapu 	size_t civicloc_len;
8038860020eSJohannes Berg };
8048860020eSJohannes Berg 
8056d45a74bSVasanthakumar Thiagarajan struct mac_address {
8066d45a74bSVasanthakumar Thiagarajan 	u8 addr[ETH_ALEN];
8076d45a74bSVasanthakumar Thiagarajan };
8086d45a74bSVasanthakumar Thiagarajan 
8098860020eSJohannes Berg /**
81077765eafSVasanthakumar Thiagarajan  * struct cfg80211_acl_data - Access control list data
81177765eafSVasanthakumar Thiagarajan  *
81277765eafSVasanthakumar Thiagarajan  * @acl_policy: ACL policy to be applied on the station's
813077f897aSJohannes Berg  *	entry specified by mac_addr
81477765eafSVasanthakumar Thiagarajan  * @n_acl_entries: Number of MAC address entries passed
81577765eafSVasanthakumar Thiagarajan  * @mac_addrs: List of MAC addresses of stations to be used for ACL
81677765eafSVasanthakumar Thiagarajan  */
81777765eafSVasanthakumar Thiagarajan struct cfg80211_acl_data {
81877765eafSVasanthakumar Thiagarajan 	enum nl80211_acl_policy acl_policy;
81977765eafSVasanthakumar Thiagarajan 	int n_acl_entries;
82077765eafSVasanthakumar Thiagarajan 
82177765eafSVasanthakumar Thiagarajan 	/* Keep it last */
82277765eafSVasanthakumar Thiagarajan 	struct mac_address mac_addrs[];
82377765eafSVasanthakumar Thiagarajan };
82477765eafSVasanthakumar Thiagarajan 
825a7c7fbffSPurushottam Kushwaha /*
826a7c7fbffSPurushottam Kushwaha  * cfg80211_bitrate_mask - masks for bitrate control
827a7c7fbffSPurushottam Kushwaha  */
828a7c7fbffSPurushottam Kushwaha struct cfg80211_bitrate_mask {
829a7c7fbffSPurushottam Kushwaha 	struct {
830a7c7fbffSPurushottam Kushwaha 		u32 legacy;
831a7c7fbffSPurushottam Kushwaha 		u8 ht_mcs[IEEE80211_HT_MCS_MASK_LEN];
832a7c7fbffSPurushottam Kushwaha 		u16 vht_mcs[NL80211_VHT_NSS_MAX];
833a7c7fbffSPurushottam Kushwaha 		enum nl80211_txrate_gi gi;
834a7c7fbffSPurushottam Kushwaha 	} control[NUM_NL80211_BANDS];
835a7c7fbffSPurushottam Kushwaha };
836a7c7fbffSPurushottam Kushwaha 
8378860020eSJohannes Berg /**
838fe494370SSrinivas Dasari  * enum cfg80211_ap_settings_flags - AP settings flags
839fe494370SSrinivas Dasari  *
840fe494370SSrinivas Dasari  * Used by cfg80211_ap_settings
841fe494370SSrinivas Dasari  *
842fe494370SSrinivas Dasari  * @AP_SETTINGS_EXTERNAL_AUTH_SUPPORT: AP supports external authentication
843fe494370SSrinivas Dasari  */
844fe494370SSrinivas Dasari enum cfg80211_ap_settings_flags {
845fe494370SSrinivas Dasari 	AP_SETTINGS_EXTERNAL_AUTH_SUPPORT = BIT(0),
846fe494370SSrinivas Dasari };
847fe494370SSrinivas Dasari 
848fe494370SSrinivas Dasari /**
8498860020eSJohannes Berg  * struct cfg80211_ap_settings - AP configuration
8508860020eSJohannes Berg  *
8518860020eSJohannes Berg  * Used to configure an AP interface.
8528860020eSJohannes Berg  *
853683b6d3bSJohannes Berg  * @chandef: defines the channel to use
8548860020eSJohannes Berg  * @beacon: beacon data
8558860020eSJohannes Berg  * @beacon_interval: beacon interval
8568860020eSJohannes Berg  * @dtim_period: DTIM period
8578860020eSJohannes Berg  * @ssid: SSID to be used in the BSS (note: may be %NULL if not provided from
8588860020eSJohannes Berg  *	user space)
8598860020eSJohannes Berg  * @ssid_len: length of @ssid
8608860020eSJohannes Berg  * @hidden_ssid: whether to hide the SSID in Beacon/Probe Response frames
8618860020eSJohannes Berg  * @crypto: crypto settings
8628860020eSJohannes Berg  * @privacy: the BSS uses privacy
8638860020eSJohannes Berg  * @auth_type: Authentication type (algorithm)
86418998c38SEliad Peller  * @smps_mode: SMPS mode
8651b658f11SVasanthakumar Thiagarajan  * @inactivity_timeout: time in seconds to determine station's inactivity.
86653cabad7SJohannes Berg  * @p2p_ctwindow: P2P CT Window
86753cabad7SJohannes Berg  * @p2p_opp_ps: P2P opportunistic PS
86877765eafSVasanthakumar Thiagarajan  * @acl: ACL configuration used by the drivers which has support for
86977765eafSVasanthakumar Thiagarajan  *	MAC address based access control
87034d50519SLior David  * @pbss: If set, start as a PCP instead of AP. Relevant for DMG
87134d50519SLior David  *	networks.
8728564e382SJohannes Berg  * @beacon_rate: bitrate to be used for beacons
87366cd794eSJohannes Berg  * @ht_cap: HT capabilities (or %NULL if HT isn't enabled)
87466cd794eSJohannes Berg  * @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled)
875244eb9aeSShaul Triebitz  * @he_cap: HE capabilities (or %NULL if HE isn't enabled)
87666cd794eSJohannes Berg  * @ht_required: stations must support HT
87766cd794eSJohannes Berg  * @vht_required: stations must support VHT
878fe494370SSrinivas Dasari  * @flags: flags, as defined in enum cfg80211_ap_settings_flags
8798860020eSJohannes Berg  */
8808860020eSJohannes Berg struct cfg80211_ap_settings {
881683b6d3bSJohannes Berg 	struct cfg80211_chan_def chandef;
882aa430da4SJohannes Berg 
8838860020eSJohannes Berg 	struct cfg80211_beacon_data beacon;
8848860020eSJohannes Berg 
8858860020eSJohannes Berg 	int beacon_interval, dtim_period;
88632e9de84SJouni Malinen 	const u8 *ssid;
88732e9de84SJouni Malinen 	size_t ssid_len;
88832e9de84SJouni Malinen 	enum nl80211_hidden_ssid hidden_ssid;
8895fb628e9SJouni Malinen 	struct cfg80211_crypto_settings crypto;
8905fb628e9SJouni Malinen 	bool privacy;
8915fb628e9SJouni Malinen 	enum nl80211_auth_type auth_type;
89218998c38SEliad Peller 	enum nl80211_smps_mode smps_mode;
8931b658f11SVasanthakumar Thiagarajan 	int inactivity_timeout;
89453cabad7SJohannes Berg 	u8 p2p_ctwindow;
89553cabad7SJohannes Berg 	bool p2p_opp_ps;
89677765eafSVasanthakumar Thiagarajan 	const struct cfg80211_acl_data *acl;
89734d50519SLior David 	bool pbss;
898a7c7fbffSPurushottam Kushwaha 	struct cfg80211_bitrate_mask beacon_rate;
89966cd794eSJohannes Berg 
90066cd794eSJohannes Berg 	const struct ieee80211_ht_cap *ht_cap;
90166cd794eSJohannes Berg 	const struct ieee80211_vht_cap *vht_cap;
902244eb9aeSShaul Triebitz 	const struct ieee80211_he_cap_elem *he_cap;
90366cd794eSJohannes Berg 	bool ht_required, vht_required;
904fe494370SSrinivas Dasari 	u32 flags;
905ed1b6cc7SJohannes Berg };
906ed1b6cc7SJohannes Berg 
9075727ef1bSJohannes Berg /**
90816ef1fe2SSimon Wunderlich  * struct cfg80211_csa_settings - channel switch settings
90916ef1fe2SSimon Wunderlich  *
91016ef1fe2SSimon Wunderlich  * Used for channel switch
91116ef1fe2SSimon Wunderlich  *
91216ef1fe2SSimon Wunderlich  * @chandef: defines the channel to use after the switch
91316ef1fe2SSimon Wunderlich  * @beacon_csa: beacon data while performing the switch
9149a774c78SAndrei Otcheretianski  * @counter_offsets_beacon: offsets of the counters within the beacon (tail)
9159a774c78SAndrei Otcheretianski  * @counter_offsets_presp: offsets of the counters within the probe response
9169a774c78SAndrei Otcheretianski  * @n_counter_offsets_beacon: number of csa counters the beacon (tail)
9179a774c78SAndrei Otcheretianski  * @n_counter_offsets_presp: number of csa counters in the probe response
91816ef1fe2SSimon Wunderlich  * @beacon_after: beacon data to be used on the new channel
91916ef1fe2SSimon Wunderlich  * @radar_required: whether radar detection is required on the new channel
92016ef1fe2SSimon Wunderlich  * @block_tx: whether transmissions should be blocked while changing
92116ef1fe2SSimon Wunderlich  * @count: number of beacons until switch
92216ef1fe2SSimon Wunderlich  */
92316ef1fe2SSimon Wunderlich struct cfg80211_csa_settings {
92416ef1fe2SSimon Wunderlich 	struct cfg80211_chan_def chandef;
92516ef1fe2SSimon Wunderlich 	struct cfg80211_beacon_data beacon_csa;
9269a774c78SAndrei Otcheretianski 	const u16 *counter_offsets_beacon;
9279a774c78SAndrei Otcheretianski 	const u16 *counter_offsets_presp;
9289a774c78SAndrei Otcheretianski 	unsigned int n_counter_offsets_beacon;
9299a774c78SAndrei Otcheretianski 	unsigned int n_counter_offsets_presp;
93016ef1fe2SSimon Wunderlich 	struct cfg80211_beacon_data beacon_after;
93116ef1fe2SSimon Wunderlich 	bool radar_required;
93216ef1fe2SSimon Wunderlich 	bool block_tx;
93316ef1fe2SSimon Wunderlich 	u8 count;
93416ef1fe2SSimon Wunderlich };
93516ef1fe2SSimon Wunderlich 
93651a1aaa6SJohannes Berg #define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10
93751a1aaa6SJohannes Berg 
93816ef1fe2SSimon Wunderlich /**
939e227300cSPurushottam Kushwaha  * struct iface_combination_params - input parameters for interface combinations
940e227300cSPurushottam Kushwaha  *
941e227300cSPurushottam Kushwaha  * Used to pass interface combination parameters
942e227300cSPurushottam Kushwaha  *
943e227300cSPurushottam Kushwaha  * @num_different_channels: the number of different channels we want
944e227300cSPurushottam Kushwaha  *	to use for verification
945e227300cSPurushottam Kushwaha  * @radar_detect: a bitmap where each bit corresponds to a channel
946e227300cSPurushottam Kushwaha  *	width where radar detection is needed, as in the definition of
947e227300cSPurushottam Kushwaha  *	&struct ieee80211_iface_combination.@radar_detect_widths
948e227300cSPurushottam Kushwaha  * @iftype_num: array with the number of interfaces of each interface
949e227300cSPurushottam Kushwaha  *	type.  The index is the interface type as specified in &enum
950e227300cSPurushottam Kushwaha  *	nl80211_iftype.
9514c8dea63SJohannes Berg  * @new_beacon_int: set this to the beacon interval of a new interface
9524c8dea63SJohannes Berg  *	that's not operating yet, if such is to be checked as part of
9534c8dea63SJohannes Berg  *	the verification
954e227300cSPurushottam Kushwaha  */
955e227300cSPurushottam Kushwaha struct iface_combination_params {
956e227300cSPurushottam Kushwaha 	int num_different_channels;
957e227300cSPurushottam Kushwaha 	u8 radar_detect;
958e227300cSPurushottam Kushwaha 	int iftype_num[NUM_NL80211_IFTYPES];
9594c8dea63SJohannes Berg 	u32 new_beacon_int;
960e227300cSPurushottam Kushwaha };
961e227300cSPurushottam Kushwaha 
962e227300cSPurushottam Kushwaha /**
9633b9ce80cSJohannes Berg  * enum station_parameters_apply_mask - station parameter values to apply
9643b9ce80cSJohannes Berg  * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp)
9659d62a986SJouni Malinen  * @STATION_PARAM_APPLY_CAPABILITY: apply new capability
966f8bacc21SJohannes Berg  * @STATION_PARAM_APPLY_PLINK_STATE: apply new plink state
9673b9ce80cSJohannes Berg  *
9683b9ce80cSJohannes Berg  * Not all station parameters have in-band "no change" signalling,
9693b9ce80cSJohannes Berg  * for those that don't these flags will are used.
9703b9ce80cSJohannes Berg  */
9713b9ce80cSJohannes Berg enum station_parameters_apply_mask {
9723b9ce80cSJohannes Berg 	STATION_PARAM_APPLY_UAPSD = BIT(0),
9739d62a986SJouni Malinen 	STATION_PARAM_APPLY_CAPABILITY = BIT(1),
974f8bacc21SJohannes Berg 	STATION_PARAM_APPLY_PLINK_STATE = BIT(2),
975e96d1cd2SAshok Raj Nagarajan 	STATION_PARAM_APPLY_STA_TXPOWER = BIT(3),
976e96d1cd2SAshok Raj Nagarajan };
977e96d1cd2SAshok Raj Nagarajan 
978e96d1cd2SAshok Raj Nagarajan /**
979e96d1cd2SAshok Raj Nagarajan  * struct sta_txpwr - station txpower configuration
980e96d1cd2SAshok Raj Nagarajan  *
981e96d1cd2SAshok Raj Nagarajan  * Used to configure txpower for station.
982e96d1cd2SAshok Raj Nagarajan  *
983e96d1cd2SAshok Raj Nagarajan  * @power: tx power (in dBm) to be used for sending data traffic. If tx power
984e96d1cd2SAshok Raj Nagarajan  *	is not provided, the default per-interface tx power setting will be
985e96d1cd2SAshok Raj Nagarajan  *	overriding. Driver should be picking up the lowest tx power, either tx
986e96d1cd2SAshok Raj Nagarajan  *	power per-interface or per-station.
987e96d1cd2SAshok Raj Nagarajan  * @type: In particular if TPC %type is NL80211_TX_POWER_LIMITED then tx power
988e96d1cd2SAshok Raj Nagarajan  *	will be less than or equal to specified from userspace, whereas if TPC
989e96d1cd2SAshok Raj Nagarajan  *	%type is NL80211_TX_POWER_AUTOMATIC then it indicates default tx power.
990e96d1cd2SAshok Raj Nagarajan  *	NL80211_TX_POWER_FIXED is not a valid configuration option for
991e96d1cd2SAshok Raj Nagarajan  *	per peer TPC.
992e96d1cd2SAshok Raj Nagarajan  */
993e96d1cd2SAshok Raj Nagarajan struct sta_txpwr {
994e96d1cd2SAshok Raj Nagarajan 	s16 power;
995e96d1cd2SAshok Raj Nagarajan 	enum nl80211_tx_power_setting type;
9963b9ce80cSJohannes Berg };
9973b9ce80cSJohannes Berg 
9983b9ce80cSJohannes Berg /**
9995727ef1bSJohannes Berg  * struct station_parameters - station parameters
10005727ef1bSJohannes Berg  *
10015727ef1bSJohannes Berg  * Used to change and create a new station.
10025727ef1bSJohannes Berg  *
10035727ef1bSJohannes Berg  * @vlan: vlan interface station should belong to
10045727ef1bSJohannes Berg  * @supported_rates: supported rates in IEEE 802.11 format
10055727ef1bSJohannes Berg  *	(or NULL for no change)
10065727ef1bSJohannes Berg  * @supported_rates_len: number of supported rates
1007eccb8e8fSJohannes Berg  * @sta_flags_mask: station flags that changed
1008819bf593SJohannes Berg  *	(bitmask of BIT(%NL80211_STA_FLAG_...))
1009eccb8e8fSJohannes Berg  * @sta_flags_set: station flags values
1010819bf593SJohannes Berg  *	(bitmask of BIT(%NL80211_STA_FLAG_...))
10115727ef1bSJohannes Berg  * @listen_interval: listen interval or -1 for no change
10125727ef1bSJohannes Berg  * @aid: AID or zero for no change
10137d27a0baSMasashi Honma  * @peer_aid: mesh peer AID or zero for no change
1014abe37c4bSJohannes Berg  * @plink_action: plink action to take
10159c3990aaSJavier Cardona  * @plink_state: set the peer link state for a station
1016abe37c4bSJohannes Berg  * @ht_capa: HT capabilities of station
1017f461be3eSMahesh Palivela  * @vht_capa: VHT capabilities of station
1018910868dbSEliad Peller  * @uapsd_queues: bitmap of queues configured for uapsd. same format
1019910868dbSEliad Peller  *	as the AC bitmap in the QoS info field
1020910868dbSEliad Peller  * @max_sp: max Service Period. same format as the MAX_SP in the
1021910868dbSEliad Peller  *	QoS info field (but already shifted down)
1022c26887d2SJohannes Berg  * @sta_modify_mask: bitmap indicating which parameters changed
1023c26887d2SJohannes Berg  *	(for those that don't have a natural "no change" value),
1024c26887d2SJohannes Berg  *	see &enum station_parameters_apply_mask
10253b1c5a53SMarco Porsch  * @local_pm: local link-specific mesh power save mode (no change when set
10263b1c5a53SMarco Porsch  *	to unknown)
10279d62a986SJouni Malinen  * @capability: station capability
10289d62a986SJouni Malinen  * @ext_capab: extended capabilities of the station
10299d62a986SJouni Malinen  * @ext_capab_len: number of extended capabilities
1030c01fc9adSSunil Dutt  * @supported_channels: supported channels in IEEE 802.11 format
1031c01fc9adSSunil Dutt  * @supported_channels_len: number of supported channels
1032c01fc9adSSunil Dutt  * @supported_oper_classes: supported oper classes in IEEE 802.11 format
1033c01fc9adSSunil Dutt  * @supported_oper_classes_len: number of supported operating classes
103460f4a7b1SMarek Kwaczynski  * @opmode_notif: operating mode field from Operating Mode Notification
103560f4a7b1SMarek Kwaczynski  * @opmode_notif_used: information if operating mode field is used
103617b94247SAyala Beker  * @support_p2p_ps: information if station supports P2P PS mechanism
1037c4cbaf79SLuca Coelho  * @he_capa: HE capabilities of station
1038c4cbaf79SLuca Coelho  * @he_capa_len: the length of the HE capabilities
103936647055SToke Høiland-Jørgensen  * @airtime_weight: airtime scheduler weight for this station
10405727ef1bSJohannes Berg  */
10415727ef1bSJohannes Berg struct station_parameters {
10422c1aabf3SJohannes Berg 	const u8 *supported_rates;
10435727ef1bSJohannes Berg 	struct net_device *vlan;
1044eccb8e8fSJohannes Berg 	u32 sta_flags_mask, sta_flags_set;
10453b9ce80cSJohannes Berg 	u32 sta_modify_mask;
10465727ef1bSJohannes Berg 	int listen_interval;
10475727ef1bSJohannes Berg 	u16 aid;
10487d27a0baSMasashi Honma 	u16 peer_aid;
10495727ef1bSJohannes Berg 	u8 supported_rates_len;
10502ec600d6SLuis Carlos Cobo 	u8 plink_action;
10519c3990aaSJavier Cardona 	u8 plink_state;
10522c1aabf3SJohannes Berg 	const struct ieee80211_ht_cap *ht_capa;
10532c1aabf3SJohannes Berg 	const struct ieee80211_vht_cap *vht_capa;
1054c75786c9SEliad Peller 	u8 uapsd_queues;
1055c75786c9SEliad Peller 	u8 max_sp;
10563b1c5a53SMarco Porsch 	enum nl80211_mesh_power_mode local_pm;
10579d62a986SJouni Malinen 	u16 capability;
10582c1aabf3SJohannes Berg 	const u8 *ext_capab;
10599d62a986SJouni Malinen 	u8 ext_capab_len;
1060c01fc9adSSunil Dutt 	const u8 *supported_channels;
1061c01fc9adSSunil Dutt 	u8 supported_channels_len;
1062c01fc9adSSunil Dutt 	const u8 *supported_oper_classes;
1063c01fc9adSSunil Dutt 	u8 supported_oper_classes_len;
106460f4a7b1SMarek Kwaczynski 	u8 opmode_notif;
106560f4a7b1SMarek Kwaczynski 	bool opmode_notif_used;
106617b94247SAyala Beker 	int support_p2p_ps;
1067c4cbaf79SLuca Coelho 	const struct ieee80211_he_cap_elem *he_capa;
1068c4cbaf79SLuca Coelho 	u8 he_capa_len;
106936647055SToke Høiland-Jørgensen 	u16 airtime_weight;
1070e96d1cd2SAshok Raj Nagarajan 	struct sta_txpwr txpwr;
10715727ef1bSJohannes Berg };
10725727ef1bSJohannes Berg 
1073fd5b74dcSJohannes Berg /**
107489c771e5SJouni Malinen  * struct station_del_parameters - station deletion parameters
107589c771e5SJouni Malinen  *
107689c771e5SJouni Malinen  * Used to delete a station entry (or all stations).
107789c771e5SJouni Malinen  *
107889c771e5SJouni Malinen  * @mac: MAC address of the station to remove or NULL to remove all stations
107998856866SJouni Malinen  * @subtype: Management frame subtype to use for indicating removal
108098856866SJouni Malinen  *	(10 = Disassociation, 12 = Deauthentication)
108198856866SJouni Malinen  * @reason_code: Reason code for the Disassociation/Deauthentication frame
108289c771e5SJouni Malinen  */
108389c771e5SJouni Malinen struct station_del_parameters {
108489c771e5SJouni Malinen 	const u8 *mac;
108598856866SJouni Malinen 	u8 subtype;
108698856866SJouni Malinen 	u16 reason_code;
108789c771e5SJouni Malinen };
108889c771e5SJouni Malinen 
108989c771e5SJouni Malinen /**
109077ee7c89SJohannes Berg  * enum cfg80211_station_type - the type of station being modified
109177ee7c89SJohannes Berg  * @CFG80211_STA_AP_CLIENT: client of an AP interface
109247edb11bSAyala Beker  * @CFG80211_STA_AP_CLIENT_UNASSOC: client of an AP interface that is still
109347edb11bSAyala Beker  *	unassociated (update properties for this type of client is permitted)
109477ee7c89SJohannes Berg  * @CFG80211_STA_AP_MLME_CLIENT: client of an AP interface that has
109577ee7c89SJohannes Berg  *	the AP MLME in the device
109677ee7c89SJohannes Berg  * @CFG80211_STA_AP_STA: AP station on managed interface
109777ee7c89SJohannes Berg  * @CFG80211_STA_IBSS: IBSS station
109877ee7c89SJohannes Berg  * @CFG80211_STA_TDLS_PEER_SETUP: TDLS peer on managed interface (dummy entry
109977ee7c89SJohannes Berg  *	while TDLS setup is in progress, it moves out of this state when
110077ee7c89SJohannes Berg  *	being marked authorized; use this only if TDLS with external setup is
110177ee7c89SJohannes Berg  *	supported/used)
110277ee7c89SJohannes Berg  * @CFG80211_STA_TDLS_PEER_ACTIVE: TDLS peer on managed interface (active
110377ee7c89SJohannes Berg  *	entry that is operating, has been marked authorized by userspace)
1104eef941e6SThomas Pedersen  * @CFG80211_STA_MESH_PEER_KERNEL: peer on mesh interface (kernel managed)
1105eef941e6SThomas Pedersen  * @CFG80211_STA_MESH_PEER_USER: peer on mesh interface (user managed)
110677ee7c89SJohannes Berg  */
110777ee7c89SJohannes Berg enum cfg80211_station_type {
110877ee7c89SJohannes Berg 	CFG80211_STA_AP_CLIENT,
110947edb11bSAyala Beker 	CFG80211_STA_AP_CLIENT_UNASSOC,
111077ee7c89SJohannes Berg 	CFG80211_STA_AP_MLME_CLIENT,
111177ee7c89SJohannes Berg 	CFG80211_STA_AP_STA,
111277ee7c89SJohannes Berg 	CFG80211_STA_IBSS,
111377ee7c89SJohannes Berg 	CFG80211_STA_TDLS_PEER_SETUP,
111477ee7c89SJohannes Berg 	CFG80211_STA_TDLS_PEER_ACTIVE,
1115eef941e6SThomas Pedersen 	CFG80211_STA_MESH_PEER_KERNEL,
1116eef941e6SThomas Pedersen 	CFG80211_STA_MESH_PEER_USER,
111777ee7c89SJohannes Berg };
111877ee7c89SJohannes Berg 
111977ee7c89SJohannes Berg /**
112077ee7c89SJohannes Berg  * cfg80211_check_station_change - validate parameter changes
112177ee7c89SJohannes Berg  * @wiphy: the wiphy this operates on
112277ee7c89SJohannes Berg  * @params: the new parameters for a station
112377ee7c89SJohannes Berg  * @statype: the type of station being modified
112477ee7c89SJohannes Berg  *
112577ee7c89SJohannes Berg  * Utility function for the @change_station driver method. Call this function
112677ee7c89SJohannes Berg  * with the appropriate station type looking up the station (and checking that
112777ee7c89SJohannes Berg  * it exists). It will verify whether the station change is acceptable, and if
112877ee7c89SJohannes Berg  * not will return an error code. Note that it may modify the parameters for
112977ee7c89SJohannes Berg  * backward compatibility reasons, so don't use them before calling this.
113077ee7c89SJohannes Berg  */
113177ee7c89SJohannes Berg int cfg80211_check_station_change(struct wiphy *wiphy,
113277ee7c89SJohannes Berg 				  struct station_parameters *params,
113377ee7c89SJohannes Berg 				  enum cfg80211_station_type statype);
113477ee7c89SJohannes Berg 
113577ee7c89SJohannes Berg /**
1136420e7fabSHenning Rogge  * enum station_info_rate_flags - bitrate info flags
1137420e7fabSHenning Rogge  *
1138420e7fabSHenning Rogge  * Used by the driver to indicate the specific rate transmission
1139420e7fabSHenning Rogge  * type for 802.11n transmissions.
1140420e7fabSHenning Rogge  *
1141db9c64cfSJohannes Berg  * @RATE_INFO_FLAGS_MCS: mcs field filled with HT MCS
1142db9c64cfSJohannes Berg  * @RATE_INFO_FLAGS_VHT_MCS: mcs field filled with VHT MCS
1143420e7fabSHenning Rogge  * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
1144db9c64cfSJohannes Berg  * @RATE_INFO_FLAGS_60G: 60GHz MCS
1145c4cbaf79SLuca Coelho  * @RATE_INFO_FLAGS_HE_MCS: HE MCS information
1146420e7fabSHenning Rogge  */
1147420e7fabSHenning Rogge enum rate_info_flags {
1148db9c64cfSJohannes Berg 	RATE_INFO_FLAGS_MCS			= BIT(0),
1149db9c64cfSJohannes Berg 	RATE_INFO_FLAGS_VHT_MCS			= BIT(1),
1150b51f3beeSJohannes Berg 	RATE_INFO_FLAGS_SHORT_GI		= BIT(2),
1151b51f3beeSJohannes Berg 	RATE_INFO_FLAGS_60G			= BIT(3),
1152c4cbaf79SLuca Coelho 	RATE_INFO_FLAGS_HE_MCS			= BIT(4),
1153b51f3beeSJohannes Berg };
1154b51f3beeSJohannes Berg 
1155b51f3beeSJohannes Berg /**
1156b51f3beeSJohannes Berg  * enum rate_info_bw - rate bandwidth information
1157b51f3beeSJohannes Berg  *
1158b51f3beeSJohannes Berg  * Used by the driver to indicate the rate bandwidth.
1159b51f3beeSJohannes Berg  *
1160b51f3beeSJohannes Berg  * @RATE_INFO_BW_5: 5 MHz bandwidth
1161b51f3beeSJohannes Berg  * @RATE_INFO_BW_10: 10 MHz bandwidth
1162b51f3beeSJohannes Berg  * @RATE_INFO_BW_20: 20 MHz bandwidth
1163b51f3beeSJohannes Berg  * @RATE_INFO_BW_40: 40 MHz bandwidth
1164b51f3beeSJohannes Berg  * @RATE_INFO_BW_80: 80 MHz bandwidth
1165b51f3beeSJohannes Berg  * @RATE_INFO_BW_160: 160 MHz bandwidth
1166c4cbaf79SLuca Coelho  * @RATE_INFO_BW_HE_RU: bandwidth determined by HE RU allocation
1167b51f3beeSJohannes Berg  */
1168b51f3beeSJohannes Berg enum rate_info_bw {
1169842be75cSJohannes Berg 	RATE_INFO_BW_20 = 0,
1170b51f3beeSJohannes Berg 	RATE_INFO_BW_5,
1171b51f3beeSJohannes Berg 	RATE_INFO_BW_10,
1172b51f3beeSJohannes Berg 	RATE_INFO_BW_40,
1173b51f3beeSJohannes Berg 	RATE_INFO_BW_80,
1174b51f3beeSJohannes Berg 	RATE_INFO_BW_160,
1175c4cbaf79SLuca Coelho 	RATE_INFO_BW_HE_RU,
1176420e7fabSHenning Rogge };
1177420e7fabSHenning Rogge 
1178420e7fabSHenning Rogge /**
1179420e7fabSHenning Rogge  * struct rate_info - bitrate information
1180420e7fabSHenning Rogge  *
1181420e7fabSHenning Rogge  * Information about a receiving or transmitting bitrate
1182420e7fabSHenning Rogge  *
1183420e7fabSHenning Rogge  * @flags: bitflag of flags from &enum rate_info_flags
1184c4cbaf79SLuca Coelho  * @mcs: mcs index if struct describes an HT/VHT/HE rate
1185420e7fabSHenning Rogge  * @legacy: bitrate in 100kbit/s for 802.11abg
1186c4cbaf79SLuca Coelho  * @nss: number of streams (VHT & HE only)
1187b51f3beeSJohannes Berg  * @bw: bandwidth (from &enum rate_info_bw)
1188c4cbaf79SLuca Coelho  * @he_gi: HE guard interval (from &enum nl80211_he_gi)
1189c4cbaf79SLuca Coelho  * @he_dcm: HE DCM value
1190c4cbaf79SLuca Coelho  * @he_ru_alloc: HE RU allocation (from &enum nl80211_he_ru_alloc,
1191c4cbaf79SLuca Coelho  *	only valid if bw is %RATE_INFO_BW_HE_RU)
1192420e7fabSHenning Rogge  */
1193420e7fabSHenning Rogge struct rate_info {
1194420e7fabSHenning Rogge 	u8 flags;
1195420e7fabSHenning Rogge 	u8 mcs;
1196420e7fabSHenning Rogge 	u16 legacy;
1197db9c64cfSJohannes Berg 	u8 nss;
1198b51f3beeSJohannes Berg 	u8 bw;
1199c4cbaf79SLuca Coelho 	u8 he_gi;
1200c4cbaf79SLuca Coelho 	u8 he_dcm;
1201c4cbaf79SLuca Coelho 	u8 he_ru_alloc;
1202fd5b74dcSJohannes Berg };
1203fd5b74dcSJohannes Berg 
1204fd5b74dcSJohannes Berg /**
1205f4263c98SPaul Stewart  * enum station_info_rate_flags - bitrate info flags
1206f4263c98SPaul Stewart  *
1207f4263c98SPaul Stewart  * Used by the driver to indicate the specific rate transmission
1208f4263c98SPaul Stewart  * type for 802.11n transmissions.
1209f4263c98SPaul Stewart  *
1210f4263c98SPaul Stewart  * @BSS_PARAM_FLAGS_CTS_PROT: whether CTS protection is enabled
1211f4263c98SPaul Stewart  * @BSS_PARAM_FLAGS_SHORT_PREAMBLE: whether short preamble is enabled
1212f4263c98SPaul Stewart  * @BSS_PARAM_FLAGS_SHORT_SLOT_TIME: whether short slot time is enabled
1213f4263c98SPaul Stewart  */
1214f4263c98SPaul Stewart enum bss_param_flags {
1215f4263c98SPaul Stewart 	BSS_PARAM_FLAGS_CTS_PROT	= 1<<0,
1216f4263c98SPaul Stewart 	BSS_PARAM_FLAGS_SHORT_PREAMBLE	= 1<<1,
1217f4263c98SPaul Stewart 	BSS_PARAM_FLAGS_SHORT_SLOT_TIME	= 1<<2,
1218f4263c98SPaul Stewart };
1219f4263c98SPaul Stewart 
1220f4263c98SPaul Stewart /**
1221f4263c98SPaul Stewart  * struct sta_bss_parameters - BSS parameters for the attached station
1222f4263c98SPaul Stewart  *
1223f4263c98SPaul Stewart  * Information about the currently associated BSS
1224f4263c98SPaul Stewart  *
1225f4263c98SPaul Stewart  * @flags: bitflag of flags from &enum bss_param_flags
1226f4263c98SPaul Stewart  * @dtim_period: DTIM period for the BSS
1227f4263c98SPaul Stewart  * @beacon_interval: beacon interval
1228f4263c98SPaul Stewart  */
1229f4263c98SPaul Stewart struct sta_bss_parameters {
1230f4263c98SPaul Stewart 	u8 flags;
1231f4263c98SPaul Stewart 	u8 dtim_period;
1232f4263c98SPaul Stewart 	u16 beacon_interval;
1233f4263c98SPaul Stewart };
1234f4263c98SPaul Stewart 
12356de39808SJohannes Berg /**
123652539ca8SToke Høiland-Jørgensen  * struct cfg80211_txq_stats - TXQ statistics for this TID
123752539ca8SToke Høiland-Jørgensen  * @filled: bitmap of flags using the bits of &enum nl80211_txq_stats to
123852539ca8SToke Høiland-Jørgensen  *	indicate the relevant values in this struct are filled
123952539ca8SToke Høiland-Jørgensen  * @backlog_bytes: total number of bytes currently backlogged
124052539ca8SToke Høiland-Jørgensen  * @backlog_packets: total number of packets currently backlogged
124152539ca8SToke Høiland-Jørgensen  * @flows: number of new flows seen
124252539ca8SToke Høiland-Jørgensen  * @drops: total number of packets dropped
124352539ca8SToke Høiland-Jørgensen  * @ecn_marks: total number of packets marked with ECN CE
124452539ca8SToke Høiland-Jørgensen  * @overlimit: number of drops due to queue space overflow
124552539ca8SToke Høiland-Jørgensen  * @overmemory: number of drops due to memory limit overflow
124652539ca8SToke Høiland-Jørgensen  * @collisions: number of hash collisions
124752539ca8SToke Høiland-Jørgensen  * @tx_bytes: total number of bytes dequeued
124852539ca8SToke Høiland-Jørgensen  * @tx_packets: total number of packets dequeued
124952539ca8SToke Høiland-Jørgensen  * @max_flows: maximum number of flows supported
125052539ca8SToke Høiland-Jørgensen  */
125152539ca8SToke Høiland-Jørgensen struct cfg80211_txq_stats {
125252539ca8SToke Høiland-Jørgensen 	u32 filled;
125352539ca8SToke Høiland-Jørgensen 	u32 backlog_bytes;
125452539ca8SToke Høiland-Jørgensen 	u32 backlog_packets;
125552539ca8SToke Høiland-Jørgensen 	u32 flows;
125652539ca8SToke Høiland-Jørgensen 	u32 drops;
125752539ca8SToke Høiland-Jørgensen 	u32 ecn_marks;
125852539ca8SToke Høiland-Jørgensen 	u32 overlimit;
125952539ca8SToke Høiland-Jørgensen 	u32 overmemory;
126052539ca8SToke Høiland-Jørgensen 	u32 collisions;
126152539ca8SToke Høiland-Jørgensen 	u32 tx_bytes;
126252539ca8SToke Høiland-Jørgensen 	u32 tx_packets;
126352539ca8SToke Høiland-Jørgensen 	u32 max_flows;
126452539ca8SToke Høiland-Jørgensen };
126552539ca8SToke Høiland-Jørgensen 
126652539ca8SToke Høiland-Jørgensen /**
12676de39808SJohannes Berg  * struct cfg80211_tid_stats - per-TID statistics
12686de39808SJohannes Berg  * @filled: bitmap of flags using the bits of &enum nl80211_tid_stats to
12696de39808SJohannes Berg  *	indicate the relevant values in this struct are filled
12706de39808SJohannes Berg  * @rx_msdu: number of received MSDUs
12716de39808SJohannes Berg  * @tx_msdu: number of (attempted) transmitted MSDUs
12726de39808SJohannes Berg  * @tx_msdu_retries: number of retries (not counting the first) for
12736de39808SJohannes Berg  *	transmitted MSDUs
12746de39808SJohannes Berg  * @tx_msdu_failed: number of failed transmitted MSDUs
127552539ca8SToke Høiland-Jørgensen  * @txq_stats: TXQ statistics
12766de39808SJohannes Berg  */
12776de39808SJohannes Berg struct cfg80211_tid_stats {
12786de39808SJohannes Berg 	u32 filled;
12796de39808SJohannes Berg 	u64 rx_msdu;
12806de39808SJohannes Berg 	u64 tx_msdu;
12816de39808SJohannes Berg 	u64 tx_msdu_retries;
12826de39808SJohannes Berg 	u64 tx_msdu_failed;
128352539ca8SToke Høiland-Jørgensen 	struct cfg80211_txq_stats txq_stats;
12846de39808SJohannes Berg };
12856de39808SJohannes Berg 
1286119363c7SFelix Fietkau #define IEEE80211_MAX_CHAINS	4
1287119363c7SFelix Fietkau 
1288f4263c98SPaul Stewart /**
12892ec600d6SLuis Carlos Cobo  * struct station_info - station information
1290fd5b74dcSJohannes Berg  *
12912ec600d6SLuis Carlos Cobo  * Station information filled by driver for get_station() and dump_station.
1292fd5b74dcSJohannes Berg  *
1293319090bfSJohannes Berg  * @filled: bitflag of flags using the bits of &enum nl80211_sta_info to
1294319090bfSJohannes Berg  *	indicate the relevant values in this struct for them
1295ebe27c91SMohammed Shafi Shajakhan  * @connected_time: time(in secs) since a station is last connected
1296fd5b74dcSJohannes Berg  * @inactive_time: time since last station activity (tx/rx) in milliseconds
12978d791361SJohannes Berg  * @rx_bytes: bytes (size of MPDUs) received from this station
12988d791361SJohannes Berg  * @tx_bytes: bytes (size of MPDUs) transmitted to this station
12992ec600d6SLuis Carlos Cobo  * @llid: mesh local link id
13002ec600d6SLuis Carlos Cobo  * @plid: mesh peer link id
13012ec600d6SLuis Carlos Cobo  * @plink_state: mesh peer link state
130273c3df3bSJohannes Berg  * @signal: The signal strength, type depends on the wiphy's signal_type.
130373c3df3bSJohannes Berg  *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
130473c3df3bSJohannes Berg  * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
130573c3df3bSJohannes Berg  *	For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
1306119363c7SFelix Fietkau  * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
1307119363c7SFelix Fietkau  * @chain_signal: per-chain signal strength of last received packet in dBm
1308119363c7SFelix Fietkau  * @chain_signal_avg: per-chain signal strength average in dBm
1309858022aaSRandy Dunlap  * @txrate: current unicast bitrate from this station
1310858022aaSRandy Dunlap  * @rxrate: current unicast bitrate to this station
13118d791361SJohannes Berg  * @rx_packets: packets (MSDUs & MMPDUs) received from this station
13128d791361SJohannes Berg  * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station
13138d791361SJohannes Berg  * @tx_retries: cumulative retry counts (MPDUs)
13148d791361SJohannes Berg  * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK)
13155a5c731aSBen Greear  * @rx_dropped_misc:  Dropped for un-specified reason.
13161ba01458SRandy Dunlap  * @bss_param: current BSS parameters
1317f5ea9120SJohannes Berg  * @generation: generation number for nl80211 dumps.
1318f5ea9120SJohannes Berg  *	This number should increase every time the list of stations
1319f5ea9120SJohannes Berg  *	changes, i.e. when a station is added or removed, so that
1320f5ea9120SJohannes Berg  *	userspace can tell whether it got a consistent snapshot.
132150d3dfb7SJouni Malinen  * @assoc_req_ies: IEs from (Re)Association Request.
132250d3dfb7SJouni Malinen  *	This is used only when in AP mode with drivers that do not use
132350d3dfb7SJouni Malinen  *	user space MLME/SME implementation. The information is provided for
132450d3dfb7SJouni Malinen  *	the cfg80211_new_sta() calls to notify user space of the IEs.
132550d3dfb7SJouni Malinen  * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets.
1326c26887d2SJohannes Berg  * @sta_flags: station flags mask & values
1327a85e1d55SPaul Stewart  * @beacon_loss_count: Number of times beacon loss event has triggered.
1328d299a1f2SJavier Cardona  * @t_offset: Time offset of the station relative to this host.
13293b1c5a53SMarco Porsch  * @local_pm: local mesh STA power save mode
13303b1c5a53SMarco Porsch  * @peer_pm: peer mesh STA power save mode
13313b1c5a53SMarco Porsch  * @nonpeer_pm: non-peer mesh STA power save mode
1332867d849fSAntonio Quartulli  * @expected_throughput: expected throughput in kbps (including 802.11 headers)
1333867d849fSAntonio Quartulli  *	towards this station.
1334a76b1942SJohannes Berg  * @rx_beacon: number of beacons received from this peer
1335a76b1942SJohannes Berg  * @rx_beacon_signal_avg: signal strength average (in dBm) for beacons received
1336a76b1942SJohannes Berg  *	from this peer
1337dbdaee7aSBob Copeland  * @connected_to_gate: true if mesh STA has a path to mesh gate
1338739960f1SMohammed Shafi Shajakhan  * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
133936647055SToke Høiland-Jørgensen  * @tx_duration: aggregate PPDU duration(usecs) for all the frames to a peer
134036647055SToke Høiland-Jørgensen  * @airtime_weight: current airtime scheduling weight
13416de39808SJohannes Berg  * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
13426de39808SJohannes Berg  *	(IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
13438689c051SArend van Spriel  *	Note that this doesn't use the @filled bit, but is used if non-NULL.
1344c4b50cd3SVenkateswara Naralasetty  * @ack_signal: signal strength (in dBm) of the last ACK frame.
134581d5439dSBalaji Pothunoori  * @avg_ack_signal: average rssi value of ack packet for the no of msdu's has
134681d5439dSBalaji Pothunoori  *	been sent.
13470d4e14a3SAnkita Bajaj  * @rx_mpdu_count: number of MPDUs received from this station
13480d4e14a3SAnkita Bajaj  * @fcs_err_count: number of packets (MPDUs) received from this station with
13490d4e14a3SAnkita Bajaj  *	an FCS error. This counter should be incremented only when TA of the
13500d4e14a3SAnkita Bajaj  *	received packet with an FCS error matches the peer MAC address.
1351ab60633cSNarayanraddi Masti  * @airtime_link_metric: mesh airtime link metric.
1352fd5b74dcSJohannes Berg  */
13532ec600d6SLuis Carlos Cobo struct station_info {
1354739960f1SMohammed Shafi Shajakhan 	u64 filled;
1355ebe27c91SMohammed Shafi Shajakhan 	u32 connected_time;
1356fd5b74dcSJohannes Berg 	u32 inactive_time;
135742745e03SVladimir Kondratiev 	u64 rx_bytes;
135842745e03SVladimir Kondratiev 	u64 tx_bytes;
13592ec600d6SLuis Carlos Cobo 	u16 llid;
13602ec600d6SLuis Carlos Cobo 	u16 plid;
13612ec600d6SLuis Carlos Cobo 	u8 plink_state;
1362420e7fabSHenning Rogge 	s8 signal;
1363541a45a1SBruno Randolf 	s8 signal_avg;
1364119363c7SFelix Fietkau 
1365119363c7SFelix Fietkau 	u8 chains;
1366119363c7SFelix Fietkau 	s8 chain_signal[IEEE80211_MAX_CHAINS];
1367119363c7SFelix Fietkau 	s8 chain_signal_avg[IEEE80211_MAX_CHAINS];
1368119363c7SFelix Fietkau 
1369420e7fabSHenning Rogge 	struct rate_info txrate;
1370c8dcfd8aSFelix Fietkau 	struct rate_info rxrate;
137198c8a60aSJouni Malinen 	u32 rx_packets;
137298c8a60aSJouni Malinen 	u32 tx_packets;
1373b206b4efSBruno Randolf 	u32 tx_retries;
1374b206b4efSBruno Randolf 	u32 tx_failed;
13755a5c731aSBen Greear 	u32 rx_dropped_misc;
1376f4263c98SPaul Stewart 	struct sta_bss_parameters bss_param;
1377bb6e753eSHelmut Schaa 	struct nl80211_sta_flag_update sta_flags;
1378f5ea9120SJohannes Berg 
1379f5ea9120SJohannes Berg 	int generation;
138050d3dfb7SJouni Malinen 
138150d3dfb7SJouni Malinen 	const u8 *assoc_req_ies;
138250d3dfb7SJouni Malinen 	size_t assoc_req_ies_len;
1383f612cedfSJouni Malinen 
1384a85e1d55SPaul Stewart 	u32 beacon_loss_count;
1385d299a1f2SJavier Cardona 	s64 t_offset;
13863b1c5a53SMarco Porsch 	enum nl80211_mesh_power_mode local_pm;
13873b1c5a53SMarco Porsch 	enum nl80211_mesh_power_mode peer_pm;
13883b1c5a53SMarco Porsch 	enum nl80211_mesh_power_mode nonpeer_pm;
1389a85e1d55SPaul Stewart 
1390867d849fSAntonio Quartulli 	u32 expected_throughput;
1391a76b1942SJohannes Berg 
139236647055SToke Høiland-Jørgensen 	u64 tx_duration;
1393739960f1SMohammed Shafi Shajakhan 	u64 rx_duration;
139436647055SToke Høiland-Jørgensen 	u64 rx_beacon;
1395a76b1942SJohannes Berg 	u8 rx_beacon_signal_avg;
1396dbdaee7aSBob Copeland 	u8 connected_to_gate;
1397dbdaee7aSBob Copeland 
13988689c051SArend van Spriel 	struct cfg80211_tid_stats *pertid;
1399c4b50cd3SVenkateswara Naralasetty 	s8 ack_signal;
140081d5439dSBalaji Pothunoori 	s8 avg_ack_signal;
14010d4e14a3SAnkita Bajaj 
140236647055SToke Høiland-Jørgensen 	u16 airtime_weight;
140336647055SToke Høiland-Jørgensen 
14040d4e14a3SAnkita Bajaj 	u32 rx_mpdu_count;
14050d4e14a3SAnkita Bajaj 	u32 fcs_err_count;
1406ab60633cSNarayanraddi Masti 
1407ab60633cSNarayanraddi Masti 	u32 airtime_link_metric;
1408fd5b74dcSJohannes Berg };
1409fd5b74dcSJohannes Berg 
141061aaa0e8SLinus Lüssing #if IS_ENABLED(CONFIG_CFG80211)
141166f7ac50SMichael Wu /**
14127406353dSAntonio Quartulli  * cfg80211_get_station - retrieve information about a given station
14137406353dSAntonio Quartulli  * @dev: the device where the station is supposed to be connected to
14147406353dSAntonio Quartulli  * @mac_addr: the mac address of the station of interest
14157406353dSAntonio Quartulli  * @sinfo: pointer to the structure to fill with the information
14167406353dSAntonio Quartulli  *
14177406353dSAntonio Quartulli  * Returns 0 on success and sinfo is filled with the available information
14187406353dSAntonio Quartulli  * otherwise returns a negative error code and the content of sinfo has to be
14197406353dSAntonio Quartulli  * considered undefined.
14207406353dSAntonio Quartulli  */
14217406353dSAntonio Quartulli int cfg80211_get_station(struct net_device *dev, const u8 *mac_addr,
14227406353dSAntonio Quartulli 			 struct station_info *sinfo);
142361aaa0e8SLinus Lüssing #else
142461aaa0e8SLinus Lüssing static inline int cfg80211_get_station(struct net_device *dev,
142561aaa0e8SLinus Lüssing 				       const u8 *mac_addr,
142661aaa0e8SLinus Lüssing 				       struct station_info *sinfo)
142761aaa0e8SLinus Lüssing {
142861aaa0e8SLinus Lüssing 	return -ENOENT;
142961aaa0e8SLinus Lüssing }
143061aaa0e8SLinus Lüssing #endif
14317406353dSAntonio Quartulli 
14327406353dSAntonio Quartulli /**
143366f7ac50SMichael Wu  * enum monitor_flags - monitor flags
143466f7ac50SMichael Wu  *
143566f7ac50SMichael Wu  * Monitor interface configuration flags. Note that these must be the bits
143666f7ac50SMichael Wu  * according to the nl80211 flags.
143766f7ac50SMichael Wu  *
1438818a986eSJohannes Berg  * @MONITOR_FLAG_CHANGED: set if the flags were changed
143966f7ac50SMichael Wu  * @MONITOR_FLAG_FCSFAIL: pass frames with bad FCS
144066f7ac50SMichael Wu  * @MONITOR_FLAG_PLCPFAIL: pass frames with bad PLCP
144166f7ac50SMichael Wu  * @MONITOR_FLAG_CONTROL: pass control frames
144266f7ac50SMichael Wu  * @MONITOR_FLAG_OTHER_BSS: disable BSSID filtering
144366f7ac50SMichael Wu  * @MONITOR_FLAG_COOK_FRAMES: report frames after processing
1444e057d3c3SFelix Fietkau  * @MONITOR_FLAG_ACTIVE: active monitor, ACKs frames on its MAC address
144566f7ac50SMichael Wu  */
144666f7ac50SMichael Wu enum monitor_flags {
1447818a986eSJohannes Berg 	MONITOR_FLAG_CHANGED		= 1<<__NL80211_MNTR_FLAG_INVALID,
144866f7ac50SMichael Wu 	MONITOR_FLAG_FCSFAIL		= 1<<NL80211_MNTR_FLAG_FCSFAIL,
144966f7ac50SMichael Wu 	MONITOR_FLAG_PLCPFAIL		= 1<<NL80211_MNTR_FLAG_PLCPFAIL,
145066f7ac50SMichael Wu 	MONITOR_FLAG_CONTROL		= 1<<NL80211_MNTR_FLAG_CONTROL,
145166f7ac50SMichael Wu 	MONITOR_FLAG_OTHER_BSS		= 1<<NL80211_MNTR_FLAG_OTHER_BSS,
145266f7ac50SMichael Wu 	MONITOR_FLAG_COOK_FRAMES	= 1<<NL80211_MNTR_FLAG_COOK_FRAMES,
1453e057d3c3SFelix Fietkau 	MONITOR_FLAG_ACTIVE		= 1<<NL80211_MNTR_FLAG_ACTIVE,
145466f7ac50SMichael Wu };
145566f7ac50SMichael Wu 
14562ec600d6SLuis Carlos Cobo /**
14572ec600d6SLuis Carlos Cobo  * enum mpath_info_flags -  mesh path information flags
14582ec600d6SLuis Carlos Cobo  *
14592ec600d6SLuis Carlos Cobo  * Used by the driver to indicate which info in &struct mpath_info it has filled
14602ec600d6SLuis Carlos Cobo  * in during get_station() or dump_station().
14612ec600d6SLuis Carlos Cobo  *
1462abe37c4bSJohannes Berg  * @MPATH_INFO_FRAME_QLEN: @frame_qlen filled
1463abe37c4bSJohannes Berg  * @MPATH_INFO_SN: @sn filled
1464abe37c4bSJohannes Berg  * @MPATH_INFO_METRIC: @metric filled
1465abe37c4bSJohannes Berg  * @MPATH_INFO_EXPTIME: @exptime filled
1466abe37c4bSJohannes Berg  * @MPATH_INFO_DISCOVERY_TIMEOUT: @discovery_timeout filled
1467abe37c4bSJohannes Berg  * @MPATH_INFO_DISCOVERY_RETRIES: @discovery_retries filled
1468abe37c4bSJohannes Berg  * @MPATH_INFO_FLAGS: @flags filled
1469cc241636SJulan Hsu  * @MPATH_INFO_HOP_COUNT: @hop_count filled
14709874b71fSJohannes Berg  * @MPATH_INFO_PATH_CHANGE: @path_change_count filled
14712ec600d6SLuis Carlos Cobo  */
14722ec600d6SLuis Carlos Cobo enum mpath_info_flags {
14732ec600d6SLuis Carlos Cobo 	MPATH_INFO_FRAME_QLEN		= BIT(0),
1474d19b3bf6SRui Paulo 	MPATH_INFO_SN			= BIT(1),
14752ec600d6SLuis Carlos Cobo 	MPATH_INFO_METRIC		= BIT(2),
14762ec600d6SLuis Carlos Cobo 	MPATH_INFO_EXPTIME		= BIT(3),
14772ec600d6SLuis Carlos Cobo 	MPATH_INFO_DISCOVERY_TIMEOUT	= BIT(4),
14782ec600d6SLuis Carlos Cobo 	MPATH_INFO_DISCOVERY_RETRIES	= BIT(5),
14792ec600d6SLuis Carlos Cobo 	MPATH_INFO_FLAGS		= BIT(6),
1480540bbcb9SJulan Hsu 	MPATH_INFO_HOP_COUNT		= BIT(7),
1481540bbcb9SJulan Hsu 	MPATH_INFO_PATH_CHANGE		= BIT(8),
14822ec600d6SLuis Carlos Cobo };
14832ec600d6SLuis Carlos Cobo 
14842ec600d6SLuis Carlos Cobo /**
14852ec600d6SLuis Carlos Cobo  * struct mpath_info - mesh path information
14862ec600d6SLuis Carlos Cobo  *
14872ec600d6SLuis Carlos Cobo  * Mesh path information filled by driver for get_mpath() and dump_mpath().
14882ec600d6SLuis Carlos Cobo  *
14892ec600d6SLuis Carlos Cobo  * @filled: bitfield of flags from &enum mpath_info_flags
14902ec600d6SLuis Carlos Cobo  * @frame_qlen: number of queued frames for this destination
1491d19b3bf6SRui Paulo  * @sn: target sequence number
14922ec600d6SLuis Carlos Cobo  * @metric: metric (cost) of this mesh path
14932ec600d6SLuis Carlos Cobo  * @exptime: expiration time for the mesh path from now, in msecs
14942ec600d6SLuis Carlos Cobo  * @flags: mesh path flags
14952ec600d6SLuis Carlos Cobo  * @discovery_timeout: total mesh path discovery timeout, in msecs
14962ec600d6SLuis Carlos Cobo  * @discovery_retries: mesh path discovery retries
1497f5ea9120SJohannes Berg  * @generation: generation number for nl80211 dumps.
1498f5ea9120SJohannes Berg  *	This number should increase every time the list of mesh paths
1499f5ea9120SJohannes Berg  *	changes, i.e. when a station is added or removed, so that
1500f5ea9120SJohannes Berg  *	userspace can tell whether it got a consistent snapshot.
1501cc241636SJulan Hsu  * @hop_count: hops to destination
1502540bbcb9SJulan Hsu  * @path_change_count: total number of path changes to destination
15032ec600d6SLuis Carlos Cobo  */
15042ec600d6SLuis Carlos Cobo struct mpath_info {
15052ec600d6SLuis Carlos Cobo 	u32 filled;
15062ec600d6SLuis Carlos Cobo 	u32 frame_qlen;
1507d19b3bf6SRui Paulo 	u32 sn;
15082ec600d6SLuis Carlos Cobo 	u32 metric;
15092ec600d6SLuis Carlos Cobo 	u32 exptime;
15102ec600d6SLuis Carlos Cobo 	u32 discovery_timeout;
15112ec600d6SLuis Carlos Cobo 	u8 discovery_retries;
15122ec600d6SLuis Carlos Cobo 	u8 flags;
1513cc241636SJulan Hsu 	u8 hop_count;
1514540bbcb9SJulan Hsu 	u32 path_change_count;
1515f5ea9120SJohannes Berg 
1516f5ea9120SJohannes Berg 	int generation;
15172ec600d6SLuis Carlos Cobo };
15182ec600d6SLuis Carlos Cobo 
15199f1ba906SJouni Malinen /**
15209f1ba906SJouni Malinen  * struct bss_parameters - BSS parameters
15219f1ba906SJouni Malinen  *
15229f1ba906SJouni Malinen  * Used to change BSS parameters (mainly for AP mode).
15239f1ba906SJouni Malinen  *
15249f1ba906SJouni Malinen  * @use_cts_prot: Whether to use CTS protection
15259f1ba906SJouni Malinen  *	(0 = no, 1 = yes, -1 = do not change)
15269f1ba906SJouni Malinen  * @use_short_preamble: Whether the use of short preambles is allowed
15279f1ba906SJouni Malinen  *	(0 = no, 1 = yes, -1 = do not change)
15289f1ba906SJouni Malinen  * @use_short_slot_time: Whether the use of short slot time is allowed
15299f1ba906SJouni Malinen  *	(0 = no, 1 = yes, -1 = do not change)
153090c97a04SJouni Malinen  * @basic_rates: basic rates in IEEE 802.11 format
153190c97a04SJouni Malinen  *	(or NULL for no change)
153290c97a04SJouni Malinen  * @basic_rates_len: number of basic rates
1533fd8aaaf3SFelix Fietkau  * @ap_isolate: do not forward packets between connected stations
153450b12f59SHelmut Schaa  * @ht_opmode: HT Operation mode
153550b12f59SHelmut Schaa  * 	(u16 = opmode, -1 = do not change)
153653cabad7SJohannes Berg  * @p2p_ctwindow: P2P CT Window (-1 = no change)
153753cabad7SJohannes Berg  * @p2p_opp_ps: P2P opportunistic PS (-1 = no change)
15389f1ba906SJouni Malinen  */
15399f1ba906SJouni Malinen struct bss_parameters {
15409f1ba906SJouni Malinen 	int use_cts_prot;
15419f1ba906SJouni Malinen 	int use_short_preamble;
15429f1ba906SJouni Malinen 	int use_short_slot_time;
1543c1e5f471SJohannes Berg 	const u8 *basic_rates;
154490c97a04SJouni Malinen 	u8 basic_rates_len;
1545fd8aaaf3SFelix Fietkau 	int ap_isolate;
154650b12f59SHelmut Schaa 	int ht_opmode;
154753cabad7SJohannes Berg 	s8 p2p_ctwindow, p2p_opp_ps;
15489f1ba906SJouni Malinen };
15492ec600d6SLuis Carlos Cobo 
15503ddd53f3SChun-Yeow Yeoh /**
155129cbe68cSJohannes Berg  * struct mesh_config - 802.11s mesh configuration
155229cbe68cSJohannes Berg  *
155329cbe68cSJohannes Berg  * These parameters can be changed while the mesh is active.
15543ddd53f3SChun-Yeow Yeoh  *
15553ddd53f3SChun-Yeow Yeoh  * @dot11MeshRetryTimeout: the initial retry timeout in millisecond units used
15563ddd53f3SChun-Yeow Yeoh  *	by the Mesh Peering Open message
15573ddd53f3SChun-Yeow Yeoh  * @dot11MeshConfirmTimeout: the initial retry timeout in millisecond units
15583ddd53f3SChun-Yeow Yeoh  *	used by the Mesh Peering Open message
15593ddd53f3SChun-Yeow Yeoh  * @dot11MeshHoldingTimeout: the confirm timeout in millisecond units used by
15603ddd53f3SChun-Yeow Yeoh  *	the mesh peering management to close a mesh peering
15613ddd53f3SChun-Yeow Yeoh  * @dot11MeshMaxPeerLinks: the maximum number of peer links allowed on this
15623ddd53f3SChun-Yeow Yeoh  *	mesh interface
15633ddd53f3SChun-Yeow Yeoh  * @dot11MeshMaxRetries: the maximum number of peer link open retries that can
15643ddd53f3SChun-Yeow Yeoh  *	be sent to establish a new peer link instance in a mesh
15653ddd53f3SChun-Yeow Yeoh  * @dot11MeshTTL: the value of TTL field set at a source mesh STA
15663ddd53f3SChun-Yeow Yeoh  * @element_ttl: the value of TTL field set at a mesh STA for path selection
15673ddd53f3SChun-Yeow Yeoh  *	elements
15683ddd53f3SChun-Yeow Yeoh  * @auto_open_plinks: whether we should automatically open peer links when we
15693ddd53f3SChun-Yeow Yeoh  *	detect compatible mesh peers
15703ddd53f3SChun-Yeow Yeoh  * @dot11MeshNbrOffsetMaxNeighbor: the maximum number of neighbors to
15713ddd53f3SChun-Yeow Yeoh  *	synchronize to for 11s default synchronization method
15723ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPmaxPREQretries: the number of action frames containing a PREQ
15733ddd53f3SChun-Yeow Yeoh  *	that an originator mesh STA can send to a particular path target
15743ddd53f3SChun-Yeow Yeoh  * @path_refresh_time: how frequently to refresh mesh paths in milliseconds
15753ddd53f3SChun-Yeow Yeoh  * @min_discovery_timeout: the minimum length of time to wait until giving up on
15763ddd53f3SChun-Yeow Yeoh  *	a path discovery in milliseconds
15773ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPactivePathTimeout: the time (in TUs) for which mesh STAs
15783ddd53f3SChun-Yeow Yeoh  *	receiving a PREQ shall consider the forwarding information from the
15793ddd53f3SChun-Yeow Yeoh  *	root to be valid. (TU = time unit)
15803ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPpreqMinInterval: the minimum interval of time (in TUs) during
15813ddd53f3SChun-Yeow Yeoh  *	which a mesh STA can send only one action frame containing a PREQ
15823ddd53f3SChun-Yeow Yeoh  *	element
15833ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPperrMinInterval: the minimum interval of time (in TUs) during
15843ddd53f3SChun-Yeow Yeoh  *	which a mesh STA can send only one Action frame containing a PERR
15853ddd53f3SChun-Yeow Yeoh  *	element
15863ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPnetDiameterTraversalTime: the interval of time (in TUs) that
15873ddd53f3SChun-Yeow Yeoh  *	it takes for an HWMP information element to propagate across the mesh
15883ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPRootMode: the configuration of a mesh STA as root mesh STA
15893ddd53f3SChun-Yeow Yeoh  * @dot11MeshHWMPRannInterval: the interval of time (in TUs) between root
15903ddd53f3SChun-Yeow Yeoh  *	announcements are transmitted
15913ddd53f3SChun-Yeow Yeoh  * @dot11MeshGateAnnouncementProtocol: whether to advertise that this mesh
15923ddd53f3SChun-Yeow Yeoh  *	station has access to a broader network beyond the MBSS. (This is
15933ddd53f3SChun-Yeow Yeoh  *	missnamed in draft 12.0: dot11MeshGateAnnouncementProtocol set to true
15943ddd53f3SChun-Yeow Yeoh  *	only means that the station will announce others it's a mesh gate, but
15953ddd53f3SChun-Yeow Yeoh  *	not necessarily using the gate announcement protocol. Still keeping the
15963ddd53f3SChun-Yeow Yeoh  *	same nomenclature to be in sync with the spec)
15973ddd53f3SChun-Yeow Yeoh  * @dot11MeshForwarding: whether the Mesh STA is forwarding or non-forwarding
15983ddd53f3SChun-Yeow Yeoh  *	entity (default is TRUE - forwarding entity)
15993ddd53f3SChun-Yeow Yeoh  * @rssi_threshold: the threshold for average signal strength of candidate
16003ddd53f3SChun-Yeow Yeoh  *	station to establish a peer link
16013ddd53f3SChun-Yeow Yeoh  * @ht_opmode: mesh HT protection mode
1602ac1073a6SChun-Yeow Yeoh  *
1603ac1073a6SChun-Yeow Yeoh  * @dot11MeshHWMPactivePathToRootTimeout: The time (in TUs) for which mesh STAs
1604ac1073a6SChun-Yeow Yeoh  *	receiving a proactive PREQ shall consider the forwarding information to
1605ac1073a6SChun-Yeow Yeoh  *	the root mesh STA to be valid.
1606ac1073a6SChun-Yeow Yeoh  *
1607ac1073a6SChun-Yeow Yeoh  * @dot11MeshHWMProotInterval: The interval of time (in TUs) between proactive
1608ac1073a6SChun-Yeow Yeoh  *	PREQs are transmitted.
1609728b19e5SChun-Yeow Yeoh  * @dot11MeshHWMPconfirmationInterval: The minimum interval of time (in TUs)
1610728b19e5SChun-Yeow Yeoh  *	during which a mesh STA can send only one Action frame containing
1611728b19e5SChun-Yeow Yeoh  *	a PREQ element for root path confirmation.
16123b1c5a53SMarco Porsch  * @power_mode: The default mesh power save mode which will be the initial
16133b1c5a53SMarco Porsch  *	setting for new peer links.
16143b1c5a53SMarco Porsch  * @dot11MeshAwakeWindowDuration: The duration in TUs the STA will remain awake
16153b1c5a53SMarco Porsch  *	after transmitting its beacon.
16168e7c0538SColleen Twitty  * @plink_timeout: If no tx activity is seen from a STA we've established
16178e7c0538SColleen Twitty  *	peering with for longer than this time (in seconds), then remove it
16188e7c0538SColleen Twitty  *	from the STA's list of peers.  Default is 30 minutes.
161901d66fbdSBob Copeland  * @dot11MeshConnectedToMeshGate: if set to true, advertise that this STA is
162001d66fbdSBob Copeland  *      connected to a mesh gate in mesh formation info.  If false, the
162101d66fbdSBob Copeland  *      value in mesh formation is determined by the presence of root paths
162201d66fbdSBob Copeland  *      in the mesh path table
162329cbe68cSJohannes Berg  */
162493da9cc1Scolin@cozybit.com struct mesh_config {
162593da9cc1Scolin@cozybit.com 	u16 dot11MeshRetryTimeout;
162693da9cc1Scolin@cozybit.com 	u16 dot11MeshConfirmTimeout;
162793da9cc1Scolin@cozybit.com 	u16 dot11MeshHoldingTimeout;
162893da9cc1Scolin@cozybit.com 	u16 dot11MeshMaxPeerLinks;
162993da9cc1Scolin@cozybit.com 	u8 dot11MeshMaxRetries;
163093da9cc1Scolin@cozybit.com 	u8 dot11MeshTTL;
163145904f21SJavier Cardona 	u8 element_ttl;
163293da9cc1Scolin@cozybit.com 	bool auto_open_plinks;
1633d299a1f2SJavier Cardona 	u32 dot11MeshNbrOffsetMaxNeighbor;
163493da9cc1Scolin@cozybit.com 	u8 dot11MeshHWMPmaxPREQretries;
163593da9cc1Scolin@cozybit.com 	u32 path_refresh_time;
163693da9cc1Scolin@cozybit.com 	u16 min_discovery_timeout;
163793da9cc1Scolin@cozybit.com 	u32 dot11MeshHWMPactivePathTimeout;
163893da9cc1Scolin@cozybit.com 	u16 dot11MeshHWMPpreqMinInterval;
1639dca7e943SThomas Pedersen 	u16 dot11MeshHWMPperrMinInterval;
164093da9cc1Scolin@cozybit.com 	u16 dot11MeshHWMPnetDiameterTraversalTime;
164163c5723bSRui Paulo 	u8 dot11MeshHWMPRootMode;
164201d66fbdSBob Copeland 	bool dot11MeshConnectedToMeshGate;
16430507e159SJavier Cardona 	u16 dot11MeshHWMPRannInterval;
164416dd7267SJavier Cardona 	bool dot11MeshGateAnnouncementProtocol;
164594f90656SChun-Yeow Yeoh 	bool dot11MeshForwarding;
164655335137SAshok Nagarajan 	s32 rssi_threshold;
164770c33eaaSAshok Nagarajan 	u16 ht_opmode;
1648ac1073a6SChun-Yeow Yeoh 	u32 dot11MeshHWMPactivePathToRootTimeout;
1649ac1073a6SChun-Yeow Yeoh 	u16 dot11MeshHWMProotInterval;
1650728b19e5SChun-Yeow Yeoh 	u16 dot11MeshHWMPconfirmationInterval;
16513b1c5a53SMarco Porsch 	enum nl80211_mesh_power_mode power_mode;
16523b1c5a53SMarco Porsch 	u16 dot11MeshAwakeWindowDuration;
16538e7c0538SColleen Twitty 	u32 plink_timeout;
165493da9cc1Scolin@cozybit.com };
165593da9cc1Scolin@cozybit.com 
165631888487SJouni Malinen /**
165729cbe68cSJohannes Berg  * struct mesh_setup - 802.11s mesh setup configuration
1658683b6d3bSJohannes Berg  * @chandef: defines the channel to use
165929cbe68cSJohannes Berg  * @mesh_id: the mesh ID
166029cbe68cSJohannes Berg  * @mesh_id_len: length of the mesh ID, at least 1 and at most 32 bytes
1661d299a1f2SJavier Cardona  * @sync_method: which synchronization method to use
1662c80d545dSJavier Cardona  * @path_sel_proto: which path selection protocol to use
1663c80d545dSJavier Cardona  * @path_metric: which metric to use
16646e16d90bSColleen Twitty  * @auth_id: which authentication method this mesh is using
1665581a8b0fSJavier Cardona  * @ie: vendor information elements (optional)
1666581a8b0fSJavier Cardona  * @ie_len: length of vendor information elements
1667b130e5ceSJavier Cardona  * @is_authenticated: this mesh requires authentication
1668b130e5ceSJavier Cardona  * @is_secure: this mesh uses security
1669bb2798d4SThomas Pedersen  * @user_mpm: userspace handles all MPM functions
16709bdbf04dSMarco Porsch  * @dtim_period: DTIM period to use
16719bdbf04dSMarco Porsch  * @beacon_interval: beacon interval to use
16724bb62344SChun-Yeow Yeoh  * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
1673ffb3cf30SAshok Nagarajan  * @basic_rates: basic rates to use when creating the mesh
16748564e382SJohannes Berg  * @beacon_rate: bitrate to be used for beacons
1675d37d49c2SBenjamin Berg  * @userspace_handles_dfs: whether user space controls DFS operation, i.e.
1676d37d49c2SBenjamin Berg  *	changes the channel when a radar is detected. This is required
1677d37d49c2SBenjamin Berg  *	to operate on DFS channels.
16781224f583SDenis Kenzior  * @control_port_over_nl80211: TRUE if userspace expects to exchange control
16791224f583SDenis Kenzior  *	port frames over NL80211 instead of the network interface.
168029cbe68cSJohannes Berg  *
168129cbe68cSJohannes Berg  * These parameters are fixed when the mesh is created.
168229cbe68cSJohannes Berg  */
168329cbe68cSJohannes Berg struct mesh_setup {
1684683b6d3bSJohannes Berg 	struct cfg80211_chan_def chandef;
168529cbe68cSJohannes Berg 	const u8 *mesh_id;
168629cbe68cSJohannes Berg 	u8 mesh_id_len;
1687d299a1f2SJavier Cardona 	u8 sync_method;
1688c80d545dSJavier Cardona 	u8 path_sel_proto;
1689c80d545dSJavier Cardona 	u8 path_metric;
16906e16d90bSColleen Twitty 	u8 auth_id;
1691581a8b0fSJavier Cardona 	const u8 *ie;
1692581a8b0fSJavier Cardona 	u8 ie_len;
1693b130e5ceSJavier Cardona 	bool is_authenticated;
169415d5dda6SJavier Cardona 	bool is_secure;
1695bb2798d4SThomas Pedersen 	bool user_mpm;
16969bdbf04dSMarco Porsch 	u8 dtim_period;
16979bdbf04dSMarco Porsch 	u16 beacon_interval;
169857fbcce3SJohannes Berg 	int mcast_rate[NUM_NL80211_BANDS];
1699ffb3cf30SAshok Nagarajan 	u32 basic_rates;
17008564e382SJohannes Berg 	struct cfg80211_bitrate_mask beacon_rate;
1701d37d49c2SBenjamin Berg 	bool userspace_handles_dfs;
17021224f583SDenis Kenzior 	bool control_port_over_nl80211;
170329cbe68cSJohannes Berg };
170429cbe68cSJohannes Berg 
170529cbe68cSJohannes Berg /**
17066e0bd6c3SRostislav Lisovy  * struct ocb_setup - 802.11p OCB mode setup configuration
17076e0bd6c3SRostislav Lisovy  * @chandef: defines the channel to use
17086e0bd6c3SRostislav Lisovy  *
17096e0bd6c3SRostislav Lisovy  * These parameters are fixed when connecting to the network
17106e0bd6c3SRostislav Lisovy  */
17116e0bd6c3SRostislav Lisovy struct ocb_setup {
17126e0bd6c3SRostislav Lisovy 	struct cfg80211_chan_def chandef;
17136e0bd6c3SRostislav Lisovy };
17146e0bd6c3SRostislav Lisovy 
17156e0bd6c3SRostislav Lisovy /**
171631888487SJouni Malinen  * struct ieee80211_txq_params - TX queue parameters
1717a3304b0aSJohannes Berg  * @ac: AC identifier
171831888487SJouni Malinen  * @txop: Maximum burst time in units of 32 usecs, 0 meaning disabled
171931888487SJouni Malinen  * @cwmin: Minimum contention window [a value of the form 2^n-1 in the range
172031888487SJouni Malinen  *	1..32767]
172131888487SJouni Malinen  * @cwmax: Maximum contention window [a value of the form 2^n-1 in the range
172231888487SJouni Malinen  *	1..32767]
172331888487SJouni Malinen  * @aifs: Arbitration interframe space [0..255]
172431888487SJouni Malinen  */
172531888487SJouni Malinen struct ieee80211_txq_params {
1726a3304b0aSJohannes Berg 	enum nl80211_ac ac;
172731888487SJouni Malinen 	u16 txop;
172831888487SJouni Malinen 	u16 cwmin;
172931888487SJouni Malinen 	u16 cwmax;
173031888487SJouni Malinen 	u8 aifs;
173131888487SJouni Malinen };
173231888487SJouni Malinen 
1733d70e9693SJohannes Berg /**
1734d70e9693SJohannes Berg  * DOC: Scanning and BSS list handling
1735d70e9693SJohannes Berg  *
1736d70e9693SJohannes Berg  * The scanning process itself is fairly simple, but cfg80211 offers quite
1737d70e9693SJohannes Berg  * a bit of helper functionality. To start a scan, the scan operation will
1738d70e9693SJohannes Berg  * be invoked with a scan definition. This scan definition contains the
1739d70e9693SJohannes Berg  * channels to scan, and the SSIDs to send probe requests for (including the
1740d70e9693SJohannes Berg  * wildcard, if desired). A passive scan is indicated by having no SSIDs to
1741d70e9693SJohannes Berg  * probe. Additionally, a scan request may contain extra information elements
1742d70e9693SJohannes Berg  * that should be added to the probe request. The IEs are guaranteed to be
1743d70e9693SJohannes Berg  * well-formed, and will not exceed the maximum length the driver advertised
1744d70e9693SJohannes Berg  * in the wiphy structure.
1745d70e9693SJohannes Berg  *
1746d70e9693SJohannes Berg  * When scanning finds a BSS, cfg80211 needs to be notified of that, because
1747d70e9693SJohannes Berg  * it is responsible for maintaining the BSS list; the driver should not
1748d70e9693SJohannes Berg  * maintain a list itself. For this notification, various functions exist.
1749d70e9693SJohannes Berg  *
1750d70e9693SJohannes Berg  * Since drivers do not maintain a BSS list, there are also a number of
1751d70e9693SJohannes Berg  * functions to search for a BSS and obtain information about it from the
1752d70e9693SJohannes Berg  * BSS structure cfg80211 maintains. The BSS list is also made available
1753d70e9693SJohannes Berg  * to userspace.
1754d70e9693SJohannes Berg  */
175572bdcf34SJouni Malinen 
1756704232c2SJohannes Berg /**
17572a519311SJohannes Berg  * struct cfg80211_ssid - SSID description
17582a519311SJohannes Berg  * @ssid: the SSID
17592a519311SJohannes Berg  * @ssid_len: length of the ssid
17602a519311SJohannes Berg  */
17612a519311SJohannes Berg struct cfg80211_ssid {
17622a519311SJohannes Berg 	u8 ssid[IEEE80211_MAX_SSID_LEN];
17632a519311SJohannes Berg 	u8 ssid_len;
17642a519311SJohannes Berg };
17652a519311SJohannes Berg 
17662a519311SJohannes Berg /**
17671d76250bSAvraham Stern  * struct cfg80211_scan_info - information about completed scan
17681d76250bSAvraham Stern  * @scan_start_tsf: scan start time in terms of the TSF of the BSS that the
17691d76250bSAvraham Stern  *	wireless device that requested the scan is connected to. If this
17701d76250bSAvraham Stern  *	information is not available, this field is left zero.
17711d76250bSAvraham Stern  * @tsf_bssid: the BSSID according to which %scan_start_tsf is set.
17721d76250bSAvraham Stern  * @aborted: set to true if the scan was aborted for any reason,
17731d76250bSAvraham Stern  *	userspace will be notified of that
17741d76250bSAvraham Stern  */
17751d76250bSAvraham Stern struct cfg80211_scan_info {
17761d76250bSAvraham Stern 	u64 scan_start_tsf;
17771d76250bSAvraham Stern 	u8 tsf_bssid[ETH_ALEN] __aligned(2);
17781d76250bSAvraham Stern 	bool aborted;
17791d76250bSAvraham Stern };
17801d76250bSAvraham Stern 
17811d76250bSAvraham Stern /**
17822a519311SJohannes Berg  * struct cfg80211_scan_request - scan request description
17832a519311SJohannes Berg  *
17842a519311SJohannes Berg  * @ssids: SSIDs to scan for (active scan only)
17852a519311SJohannes Berg  * @n_ssids: number of SSIDs
17862a519311SJohannes Berg  * @channels: channels to scan on.
1787ca3dbc20SHelmut Schaa  * @n_channels: total number of channels to scan
1788dcd6eac1SSimon Wunderlich  * @scan_width: channel width for scanning
178970692ad2SJouni Malinen  * @ie: optional information element(s) to add into Probe Request or %NULL
179070692ad2SJouni Malinen  * @ie_len: length of ie in octets
17911d76250bSAvraham Stern  * @duration: how long to listen on each channel, in TUs. If
17921d76250bSAvraham Stern  *	%duration_mandatory is not set, this is the maximum dwell time and
17931d76250bSAvraham Stern  *	the actual dwell time may be shorter.
17941d76250bSAvraham Stern  * @duration_mandatory: if set, the scan duration must be as specified by the
17951d76250bSAvraham Stern  *	%duration field.
1796ed473771SSam Leffler  * @flags: bit field of flags controlling operation
179734850ab2SJohannes Berg  * @rates: bitmap of rates to advertise for each band
17982a519311SJohannes Berg  * @wiphy: the wiphy this was for
179915d6030bSSam Leffler  * @scan_start: time (in jiffies) when the scan started
1800fd014284SJohannes Berg  * @wdev: the wireless device to scan for
18011d76250bSAvraham Stern  * @info: (internal) information about completed scan
18025fe231e8SJohannes Berg  * @notified: (internal) scan request was notified as done or aborted
1803e9f935e3SRajkumar Manoharan  * @no_cck: used to send probe requests at non CCK rate in 2GHz band
1804ad2b26abSJohannes Berg  * @mac_addr: MAC address used with randomisation
1805ad2b26abSJohannes Berg  * @mac_addr_mask: MAC address mask used with randomisation, bits that
1806ad2b26abSJohannes Berg  *	are 0 in the mask should be randomised, bits that are 1 should
1807ad2b26abSJohannes Berg  *	be taken from the @mac_addr
1808818965d3SJouni Malinen  * @bssid: BSSID to scan for (most commonly, the wildcard BSSID)
18092a519311SJohannes Berg  */
18102a519311SJohannes Berg struct cfg80211_scan_request {
18112a519311SJohannes Berg 	struct cfg80211_ssid *ssids;
18122a519311SJohannes Berg 	int n_ssids;
18132a519311SJohannes Berg 	u32 n_channels;
1814dcd6eac1SSimon Wunderlich 	enum nl80211_bss_scan_width scan_width;
1815de95a54bSJohannes Berg 	const u8 *ie;
181670692ad2SJouni Malinen 	size_t ie_len;
18171d76250bSAvraham Stern 	u16 duration;
18181d76250bSAvraham Stern 	bool duration_mandatory;
1819ed473771SSam Leffler 	u32 flags;
18202a519311SJohannes Berg 
182157fbcce3SJohannes Berg 	u32 rates[NUM_NL80211_BANDS];
182234850ab2SJohannes Berg 
1823fd014284SJohannes Berg 	struct wireless_dev *wdev;
1824fd014284SJohannes Berg 
1825ad2b26abSJohannes Berg 	u8 mac_addr[ETH_ALEN] __aligned(2);
1826ad2b26abSJohannes Berg 	u8 mac_addr_mask[ETH_ALEN] __aligned(2);
1827818965d3SJouni Malinen 	u8 bssid[ETH_ALEN] __aligned(2);
1828ad2b26abSJohannes Berg 
18292a519311SJohannes Berg 	/* internal */
18302a519311SJohannes Berg 	struct wiphy *wiphy;
183115d6030bSSam Leffler 	unsigned long scan_start;
18321d76250bSAvraham Stern 	struct cfg80211_scan_info info;
18331d76250bSAvraham Stern 	bool notified;
1834e9f935e3SRajkumar Manoharan 	bool no_cck;
18355ba63533SJohannes Berg 
18365ba63533SJohannes Berg 	/* keep last */
18375ba63533SJohannes Berg 	struct ieee80211_channel *channels[0];
18382a519311SJohannes Berg };
18392a519311SJohannes Berg 
1840ad2b26abSJohannes Berg static inline void get_random_mask_addr(u8 *buf, const u8 *addr, const u8 *mask)
1841ad2b26abSJohannes Berg {
1842ad2b26abSJohannes Berg 	int i;
1843ad2b26abSJohannes Berg 
1844ad2b26abSJohannes Berg 	get_random_bytes(buf, ETH_ALEN);
1845ad2b26abSJohannes Berg 	for (i = 0; i < ETH_ALEN; i++) {
1846ad2b26abSJohannes Berg 		buf[i] &= ~mask[i];
1847ad2b26abSJohannes Berg 		buf[i] |= addr[i] & mask[i];
1848ad2b26abSJohannes Berg 	}
1849ad2b26abSJohannes Berg }
1850ad2b26abSJohannes Berg 
18512a519311SJohannes Berg /**
1852a1f1c21cSLuciano Coelho  * struct cfg80211_match_set - sets of attributes to match
1853a1f1c21cSLuciano Coelho  *
18543007e352SArend Van Spriel  * @ssid: SSID to be matched; may be zero-length in case of BSSID match
18553007e352SArend Van Spriel  *	or no match (RSSI only)
18563007e352SArend Van Spriel  * @bssid: BSSID to be matched; may be all-zero BSSID in case of SSID match
18573007e352SArend Van Spriel  *	or no match (RSSI only)
1858ea73cbceSJohannes Berg  * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
18591e1b11b6Svamsi krishna  * @per_band_rssi_thold: Minimum rssi threshold for each band to be applied
18601e1b11b6Svamsi krishna  *	for filtering out scan results received. Drivers advertize this support
18611e1b11b6Svamsi krishna  *	of band specific rssi based filtering through the feature capability
18621e1b11b6Svamsi krishna  *	%NL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD. These band
18631e1b11b6Svamsi krishna  *	specific rssi thresholds take precedence over rssi_thold, if specified.
18641e1b11b6Svamsi krishna  *	If not specified for any band, it will be assigned with rssi_thold of
18651e1b11b6Svamsi krishna  *	corresponding matchset.
1866a1f1c21cSLuciano Coelho  */
1867a1f1c21cSLuciano Coelho struct cfg80211_match_set {
1868a1f1c21cSLuciano Coelho 	struct cfg80211_ssid ssid;
18693007e352SArend Van Spriel 	u8 bssid[ETH_ALEN];
1870ea73cbceSJohannes Berg 	s32 rssi_thold;
18711e1b11b6Svamsi krishna 	s32 per_band_rssi_thold[NUM_NL80211_BANDS];
1872a1f1c21cSLuciano Coelho };
1873a1f1c21cSLuciano Coelho 
1874a1f1c21cSLuciano Coelho /**
18753b06d277SAvraham Stern  * struct cfg80211_sched_scan_plan - scan plan for scheduled scan
18763b06d277SAvraham Stern  *
18773b06d277SAvraham Stern  * @interval: interval between scheduled scan iterations. In seconds.
18783b06d277SAvraham Stern  * @iterations: number of scan iterations in this scan plan. Zero means
18793b06d277SAvraham Stern  *	infinite loop.
18803b06d277SAvraham Stern  *	The last scan plan will always have this parameter set to zero,
18813b06d277SAvraham Stern  *	all other scan plans will have a finite number of iterations.
18823b06d277SAvraham Stern  */
18833b06d277SAvraham Stern struct cfg80211_sched_scan_plan {
18843b06d277SAvraham Stern 	u32 interval;
18853b06d277SAvraham Stern 	u32 iterations;
18863b06d277SAvraham Stern };
18873b06d277SAvraham Stern 
18883b06d277SAvraham Stern /**
1889bf95ecdbSvamsi krishna  * struct cfg80211_bss_select_adjust - BSS selection with RSSI adjustment.
1890bf95ecdbSvamsi krishna  *
1891bf95ecdbSvamsi krishna  * @band: band of BSS which should match for RSSI level adjustment.
1892bf95ecdbSvamsi krishna  * @delta: value of RSSI level adjustment.
1893bf95ecdbSvamsi krishna  */
1894bf95ecdbSvamsi krishna struct cfg80211_bss_select_adjust {
1895bf95ecdbSvamsi krishna 	enum nl80211_band band;
1896bf95ecdbSvamsi krishna 	s8 delta;
1897bf95ecdbSvamsi krishna };
1898bf95ecdbSvamsi krishna 
1899bf95ecdbSvamsi krishna /**
1900807f8a8cSLuciano Coelho  * struct cfg80211_sched_scan_request - scheduled scan request description
1901807f8a8cSLuciano Coelho  *
190296b08fd6SArend Van Spriel  * @reqid: identifies this request.
1903807f8a8cSLuciano Coelho  * @ssids: SSIDs to scan for (passed in the probe_reqs in active scans)
1904807f8a8cSLuciano Coelho  * @n_ssids: number of SSIDs
1905807f8a8cSLuciano Coelho  * @n_channels: total number of channels to scan
1906dcd6eac1SSimon Wunderlich  * @scan_width: channel width for scanning
1907807f8a8cSLuciano Coelho  * @ie: optional information element(s) to add into Probe Request or %NULL
1908807f8a8cSLuciano Coelho  * @ie_len: length of ie in octets
1909ed473771SSam Leffler  * @flags: bit field of flags controlling operation
1910a1f1c21cSLuciano Coelho  * @match_sets: sets of parameters to be matched for a scan result
1911a1f1c21cSLuciano Coelho  * 	entry to be considered valid and to be passed to the host
1912a1f1c21cSLuciano Coelho  * 	(others are filtered out).
1913a1f1c21cSLuciano Coelho  *	If ommited, all results are passed.
1914a1f1c21cSLuciano Coelho  * @n_match_sets: number of match sets
19156406c919SJohannes Berg  * @report_results: indicates that results were reported for this request
1916807f8a8cSLuciano Coelho  * @wiphy: the wiphy this was for
1917807f8a8cSLuciano Coelho  * @dev: the interface
1918077f897aSJohannes Berg  * @scan_start: start time of the scheduled scan
1919807f8a8cSLuciano Coelho  * @channels: channels to scan
1920ea73cbceSJohannes Berg  * @min_rssi_thold: for drivers only supporting a single threshold, this
1921ea73cbceSJohannes Berg  *	contains the minimum over all matchsets
1922ad2b26abSJohannes Berg  * @mac_addr: MAC address used with randomisation
1923ad2b26abSJohannes Berg  * @mac_addr_mask: MAC address mask used with randomisation, bits that
1924ad2b26abSJohannes Berg  *	are 0 in the mask should be randomised, bits that are 1 should
1925ad2b26abSJohannes Berg  *	be taken from the @mac_addr
19263b06d277SAvraham Stern  * @scan_plans: scan plans to be executed in this scheduled scan. Lowest
19273b06d277SAvraham Stern  *	index must be executed first.
19283b06d277SAvraham Stern  * @n_scan_plans: number of scan plans, at least 1.
192931a60ed1SJukka Rissanen  * @rcu_head: RCU callback used to free the struct
193093a1e86cSJukka Rissanen  * @owner_nlportid: netlink portid of owner (if this should is a request
193193a1e86cSJukka Rissanen  *	owned by a particular socket)
1932ca986ad9SArend Van Spriel  * @nl_owner_dead: netlink owner socket was closed - this request be freed
1933ca986ad9SArend Van Spriel  * @list: for keeping list of requests.
19349c748934SLuciano Coelho  * @delay: delay in seconds to use before starting the first scan
19359c748934SLuciano Coelho  *	cycle.  The driver may ignore this parameter and start
19369c748934SLuciano Coelho  *	immediately (or at any other time), if this feature is not
19379c748934SLuciano Coelho  *	supported.
1938bf95ecdbSvamsi krishna  * @relative_rssi_set: Indicates whether @relative_rssi is set or not.
1939bf95ecdbSvamsi krishna  * @relative_rssi: Relative RSSI threshold in dB to restrict scan result
1940bf95ecdbSvamsi krishna  *	reporting in connected state to cases where a matching BSS is determined
1941bf95ecdbSvamsi krishna  *	to have better or slightly worse RSSI than the current connected BSS.
1942bf95ecdbSvamsi krishna  *	The relative RSSI threshold values are ignored in disconnected state.
1943bf95ecdbSvamsi krishna  * @rssi_adjust: delta dB of RSSI preference to be given to the BSSs that belong
1944bf95ecdbSvamsi krishna  *	to the specified band while deciding whether a better BSS is reported
1945bf95ecdbSvamsi krishna  *	using @relative_rssi. If delta is a negative number, the BSSs that
1946bf95ecdbSvamsi krishna  *	belong to the specified band will be penalized by delta dB in relative
1947bf95ecdbSvamsi krishna  *	comparisions.
1948807f8a8cSLuciano Coelho  */
1949807f8a8cSLuciano Coelho struct cfg80211_sched_scan_request {
195096b08fd6SArend Van Spriel 	u64 reqid;
1951807f8a8cSLuciano Coelho 	struct cfg80211_ssid *ssids;
1952807f8a8cSLuciano Coelho 	int n_ssids;
1953807f8a8cSLuciano Coelho 	u32 n_channels;
1954dcd6eac1SSimon Wunderlich 	enum nl80211_bss_scan_width scan_width;
1955807f8a8cSLuciano Coelho 	const u8 *ie;
1956807f8a8cSLuciano Coelho 	size_t ie_len;
1957ed473771SSam Leffler 	u32 flags;
1958a1f1c21cSLuciano Coelho 	struct cfg80211_match_set *match_sets;
1959a1f1c21cSLuciano Coelho 	int n_match_sets;
1960ea73cbceSJohannes Berg 	s32 min_rssi_thold;
19619c748934SLuciano Coelho 	u32 delay;
19623b06d277SAvraham Stern 	struct cfg80211_sched_scan_plan *scan_plans;
19633b06d277SAvraham Stern 	int n_scan_plans;
1964807f8a8cSLuciano Coelho 
1965ad2b26abSJohannes Berg 	u8 mac_addr[ETH_ALEN] __aligned(2);
1966ad2b26abSJohannes Berg 	u8 mac_addr_mask[ETH_ALEN] __aligned(2);
1967ad2b26abSJohannes Berg 
1968bf95ecdbSvamsi krishna 	bool relative_rssi_set;
1969bf95ecdbSvamsi krishna 	s8 relative_rssi;
1970bf95ecdbSvamsi krishna 	struct cfg80211_bss_select_adjust rssi_adjust;
1971bf95ecdbSvamsi krishna 
1972807f8a8cSLuciano Coelho 	/* internal */
1973807f8a8cSLuciano Coelho 	struct wiphy *wiphy;
1974807f8a8cSLuciano Coelho 	struct net_device *dev;
197515d6030bSSam Leffler 	unsigned long scan_start;
1976b34939b9SArend Van Spriel 	bool report_results;
197731a60ed1SJukka Rissanen 	struct rcu_head rcu_head;
197893a1e86cSJukka Rissanen 	u32 owner_nlportid;
1979ca986ad9SArend Van Spriel 	bool nl_owner_dead;
1980ca986ad9SArend Van Spriel 	struct list_head list;
1981807f8a8cSLuciano Coelho 
1982807f8a8cSLuciano Coelho 	/* keep last */
1983807f8a8cSLuciano Coelho 	struct ieee80211_channel *channels[0];
1984807f8a8cSLuciano Coelho };
1985807f8a8cSLuciano Coelho 
1986807f8a8cSLuciano Coelho /**
19872a519311SJohannes Berg  * enum cfg80211_signal_type - signal type
19882a519311SJohannes Berg  *
19892a519311SJohannes Berg  * @CFG80211_SIGNAL_TYPE_NONE: no signal strength information available
19902a519311SJohannes Berg  * @CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm)
19912a519311SJohannes Berg  * @CFG80211_SIGNAL_TYPE_UNSPEC: signal strength, increasing from 0 through 100
19922a519311SJohannes Berg  */
19932a519311SJohannes Berg enum cfg80211_signal_type {
19942a519311SJohannes Berg 	CFG80211_SIGNAL_TYPE_NONE,
19952a519311SJohannes Berg 	CFG80211_SIGNAL_TYPE_MBM,
19962a519311SJohannes Berg 	CFG80211_SIGNAL_TYPE_UNSPEC,
19972a519311SJohannes Berg };
19982a519311SJohannes Berg 
19992a519311SJohannes Berg /**
20006e19bc4bSDmitry Shmidt  * struct cfg80211_inform_bss - BSS inform data
20016e19bc4bSDmitry Shmidt  * @chan: channel the frame was received on
20026e19bc4bSDmitry Shmidt  * @scan_width: scan width that was used
20036e19bc4bSDmitry Shmidt  * @signal: signal strength value, according to the wiphy's
20046e19bc4bSDmitry Shmidt  *	signal type
20056e19bc4bSDmitry Shmidt  * @boottime_ns: timestamp (CLOCK_BOOTTIME) when the information was
20066e19bc4bSDmitry Shmidt  *	received; should match the time when the frame was actually
20076e19bc4bSDmitry Shmidt  *	received by the device (not just by the host, in case it was
20086e19bc4bSDmitry Shmidt  *	buffered on the device) and be accurate to about 10ms.
20096e19bc4bSDmitry Shmidt  *	If the frame isn't buffered, just passing the return value of
20106e19bc4bSDmitry Shmidt  *	ktime_get_boot_ns() is likely appropriate.
20111d76250bSAvraham Stern  * @parent_tsf: the time at the start of reception of the first octet of the
20121d76250bSAvraham Stern  *	timestamp field of the frame. The time is the TSF of the BSS specified
20131d76250bSAvraham Stern  *	by %parent_bssid.
20141d76250bSAvraham Stern  * @parent_bssid: the BSS according to which %parent_tsf is set. This is set to
20151d76250bSAvraham Stern  *	the BSS that requested the scan in which the beacon/probe was received.
2016983dafaaSSunil Dutt  * @chains: bitmask for filled values in @chain_signal.
2017983dafaaSSunil Dutt  * @chain_signal: per-chain signal strength of last received BSS in dBm.
20186e19bc4bSDmitry Shmidt  */
20196e19bc4bSDmitry Shmidt struct cfg80211_inform_bss {
20206e19bc4bSDmitry Shmidt 	struct ieee80211_channel *chan;
20216e19bc4bSDmitry Shmidt 	enum nl80211_bss_scan_width scan_width;
20226e19bc4bSDmitry Shmidt 	s32 signal;
20236e19bc4bSDmitry Shmidt 	u64 boottime_ns;
20241d76250bSAvraham Stern 	u64 parent_tsf;
20251d76250bSAvraham Stern 	u8 parent_bssid[ETH_ALEN] __aligned(2);
2026983dafaaSSunil Dutt 	u8 chains;
2027983dafaaSSunil Dutt 	s8 chain_signal[IEEE80211_MAX_CHAINS];
20286e19bc4bSDmitry Shmidt };
20296e19bc4bSDmitry Shmidt 
20306e19bc4bSDmitry Shmidt /**
20312aa4d456SAkira Moroo  * struct cfg80211_bss_ies - BSS entry IE data
20328cef2c9dSJohannes Berg  * @tsf: TSF contained in the frame that carried these IEs
20339caf0364SJohannes Berg  * @rcu_head: internal use, for freeing
20349caf0364SJohannes Berg  * @len: length of the IEs
20350e227084SJohannes Berg  * @from_beacon: these IEs are known to come from a beacon
20369caf0364SJohannes Berg  * @data: IE data
20379caf0364SJohannes Berg  */
20389caf0364SJohannes Berg struct cfg80211_bss_ies {
20398cef2c9dSJohannes Berg 	u64 tsf;
20409caf0364SJohannes Berg 	struct rcu_head rcu_head;
20419caf0364SJohannes Berg 	int len;
20420e227084SJohannes Berg 	bool from_beacon;
20439caf0364SJohannes Berg 	u8 data[];
20449caf0364SJohannes Berg };
20459caf0364SJohannes Berg 
20469caf0364SJohannes Berg /**
20472a519311SJohannes Berg  * struct cfg80211_bss - BSS description
20482a519311SJohannes Berg  *
20492a519311SJohannes Berg  * This structure describes a BSS (which may also be a mesh network)
20502a519311SJohannes Berg  * for use in scan results and similar.
20512a519311SJohannes Berg  *
2052abe37c4bSJohannes Berg  * @channel: channel this BSS is on
2053dcd6eac1SSimon Wunderlich  * @scan_width: width of the control channel
20542a519311SJohannes Berg  * @bssid: BSSID of the BSS
20552a519311SJohannes Berg  * @beacon_interval: the beacon interval as from the frame
20562a519311SJohannes Berg  * @capability: the capability field in host byte order
205783c7aa1aSJohannes Berg  * @ies: the information elements (Note that there is no guarantee that these
205883c7aa1aSJohannes Berg  *	are well-formed!); this is a pointer to either the beacon_ies or
205983c7aa1aSJohannes Berg  *	proberesp_ies depending on whether Probe Response frame has been
206083c7aa1aSJohannes Berg  *	received. It is always non-%NULL.
206134a6eddbSJouni Malinen  * @beacon_ies: the information elements from the last Beacon frame
2062776b3580SJohannes Berg  *	(implementation note: if @hidden_beacon_bss is set this struct doesn't
2063776b3580SJohannes Berg  *	own the beacon_ies, but they're just pointers to the ones from the
2064776b3580SJohannes Berg  *	@hidden_beacon_bss struct)
206534a6eddbSJouni Malinen  * @proberesp_ies: the information elements from the last Probe Response frame
2066776b3580SJohannes Berg  * @hidden_beacon_bss: in case this BSS struct represents a probe response from
2067776b3580SJohannes Berg  *	a BSS that hides the SSID in its beacon, this points to the BSS struct
2068776b3580SJohannes Berg  *	that holds the beacon data. @beacon_ies is still valid, of course, and
2069776b3580SJohannes Berg  *	points to the same data as hidden_beacon_bss->beacon_ies in that case.
2070851ae31dSJohannes Berg  * @transmitted_bss: pointer to the transmitted BSS, if this is a
2071851ae31dSJohannes Berg  *	non-transmitted one (multi-BSSID support)
2072851ae31dSJohannes Berg  * @nontrans_list: list of non-transmitted BSS, if this is a transmitted one
2073851ae31dSJohannes Berg  *	(multi-BSSID support)
207477965c97SJohannes Berg  * @signal: signal strength value (type depends on the wiphy's signal_type)
2075983dafaaSSunil Dutt  * @chains: bitmask for filled values in @chain_signal.
2076983dafaaSSunil Dutt  * @chain_signal: per-chain signal strength of last received BSS in dBm.
20770cd01efbSSara Sharon  * @bssid_index: index in the multiple BSS set
20780cd01efbSSara Sharon  * @max_bssid_indicator: max number of members in the BSS set
20792a519311SJohannes Berg  * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes
20802a519311SJohannes Berg  */
20812a519311SJohannes Berg struct cfg80211_bss {
20822a519311SJohannes Berg 	struct ieee80211_channel *channel;
2083dcd6eac1SSimon Wunderlich 	enum nl80211_bss_scan_width scan_width;
20842a519311SJohannes Berg 
20859caf0364SJohannes Berg 	const struct cfg80211_bss_ies __rcu *ies;
20869caf0364SJohannes Berg 	const struct cfg80211_bss_ies __rcu *beacon_ies;
20879caf0364SJohannes Berg 	const struct cfg80211_bss_ies __rcu *proberesp_ies;
20889caf0364SJohannes Berg 
2089776b3580SJohannes Berg 	struct cfg80211_bss *hidden_beacon_bss;
20907011ba58SSara Sharon 	struct cfg80211_bss *transmitted_bss;
20917011ba58SSara Sharon 	struct list_head nontrans_list;
20922a519311SJohannes Berg 
20932a519311SJohannes Berg 	s32 signal;
20942a519311SJohannes Berg 
20959caf0364SJohannes Berg 	u16 beacon_interval;
20969caf0364SJohannes Berg 	u16 capability;
20979caf0364SJohannes Berg 
20989caf0364SJohannes Berg 	u8 bssid[ETH_ALEN];
2099983dafaaSSunil Dutt 	u8 chains;
2100983dafaaSSunil Dutt 	s8 chain_signal[IEEE80211_MAX_CHAINS];
21019caf0364SJohannes Berg 
21020cd01efbSSara Sharon 	u8 bssid_index;
21030cd01efbSSara Sharon 	u8 max_bssid_indicator;
21040cd01efbSSara Sharon 
21051c06ef98SJohannes Berg 	u8 priv[0] __aligned(sizeof(void *));
21062a519311SJohannes Berg };
21072a519311SJohannes Berg 
21082a519311SJohannes Berg /**
210949a68e0dSJohannes Berg  * ieee80211_bss_get_elem - find element with given ID
2110517357c6SJohannes Berg  * @bss: the bss to search
211149a68e0dSJohannes Berg  * @id: the element ID
21129caf0364SJohannes Berg  *
21139caf0364SJohannes Berg  * Note that the return value is an RCU-protected pointer, so
21149caf0364SJohannes Berg  * rcu_read_lock() must be held when calling this function.
21150ae997dcSYacine Belkadi  * Return: %NULL if not found.
2116517357c6SJohannes Berg  */
211749a68e0dSJohannes Berg const struct element *ieee80211_bss_get_elem(struct cfg80211_bss *bss, u8 id);
211849a68e0dSJohannes Berg 
211949a68e0dSJohannes Berg /**
212049a68e0dSJohannes Berg  * ieee80211_bss_get_ie - find IE with given ID
212149a68e0dSJohannes Berg  * @bss: the bss to search
212249a68e0dSJohannes Berg  * @id: the element ID
212349a68e0dSJohannes Berg  *
212449a68e0dSJohannes Berg  * Note that the return value is an RCU-protected pointer, so
212549a68e0dSJohannes Berg  * rcu_read_lock() must be held when calling this function.
212649a68e0dSJohannes Berg  * Return: %NULL if not found.
212749a68e0dSJohannes Berg  */
212849a68e0dSJohannes Berg static inline const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 id)
212949a68e0dSJohannes Berg {
213049a68e0dSJohannes Berg 	return (void *)ieee80211_bss_get_elem(bss, id);
213149a68e0dSJohannes Berg }
2132517357c6SJohannes Berg 
2133517357c6SJohannes Berg 
2134517357c6SJohannes Berg /**
2135636a5d36SJouni Malinen  * struct cfg80211_auth_request - Authentication request data
2136636a5d36SJouni Malinen  *
2137636a5d36SJouni Malinen  * This structure provides information needed to complete IEEE 802.11
2138636a5d36SJouni Malinen  * authentication.
2139636a5d36SJouni Malinen  *
2140959867faSJohannes Berg  * @bss: The BSS to authenticate with, the callee must obtain a reference
2141959867faSJohannes Berg  *	to it if it needs to keep it.
2142636a5d36SJouni Malinen  * @auth_type: Authentication type (algorithm)
2143636a5d36SJouni Malinen  * @ie: Extra IEs to add to Authentication frame or %NULL
2144636a5d36SJouni Malinen  * @ie_len: Length of ie buffer in octets
2145fffd0934SJohannes Berg  * @key_len: length of WEP key for shared key authentication
2146fffd0934SJohannes Berg  * @key_idx: index of WEP key for shared key authentication
2147fffd0934SJohannes Berg  * @key: WEP key for shared key authentication
214811b6b5a4SJouni Malinen  * @auth_data: Fields and elements in Authentication frames. This contains
214911b6b5a4SJouni Malinen  *	the authentication frame body (non-IE and IE data), excluding the
215011b6b5a4SJouni Malinen  *	Authentication algorithm number, i.e., starting at the Authentication
215111b6b5a4SJouni Malinen  *	transaction sequence number field.
215211b6b5a4SJouni Malinen  * @auth_data_len: Length of auth_data buffer in octets
2153636a5d36SJouni Malinen  */
2154636a5d36SJouni Malinen struct cfg80211_auth_request {
215519957bb3SJohannes Berg 	struct cfg80211_bss *bss;
2156636a5d36SJouni Malinen 	const u8 *ie;
2157636a5d36SJouni Malinen 	size_t ie_len;
215819957bb3SJohannes Berg 	enum nl80211_auth_type auth_type;
2159fffd0934SJohannes Berg 	const u8 *key;
2160fffd0934SJohannes Berg 	u8 key_len, key_idx;
216111b6b5a4SJouni Malinen 	const u8 *auth_data;
216211b6b5a4SJouni Malinen 	size_t auth_data_len;
2163636a5d36SJouni Malinen };
2164636a5d36SJouni Malinen 
2165636a5d36SJouni Malinen /**
21667e7c8926SBen Greear  * enum cfg80211_assoc_req_flags - Over-ride default behaviour in association.
21677e7c8926SBen Greear  *
21687e7c8926SBen Greear  * @ASSOC_REQ_DISABLE_HT:  Disable HT (802.11n)
2169ee2aca34SJohannes Berg  * @ASSOC_REQ_DISABLE_VHT:  Disable VHT
2170bab5ab7dSAssaf Krauss  * @ASSOC_REQ_USE_RRM: Declare RRM capability in this association
217140cbfa90SSrinivas Dasari  * @CONNECT_REQ_EXTERNAL_AUTH_SUPPORT: User space indicates external
217240cbfa90SSrinivas Dasari  *	authentication capability. Drivers can offload authentication to
217340cbfa90SSrinivas Dasari  *	userspace if this flag is set. Only applicable for cfg80211_connect()
217440cbfa90SSrinivas Dasari  *	request (connect callback).
21757e7c8926SBen Greear  */
21767e7c8926SBen Greear enum cfg80211_assoc_req_flags {
21777e7c8926SBen Greear 	ASSOC_REQ_DISABLE_HT			= BIT(0),
2178ee2aca34SJohannes Berg 	ASSOC_REQ_DISABLE_VHT			= BIT(1),
2179bab5ab7dSAssaf Krauss 	ASSOC_REQ_USE_RRM			= BIT(2),
218040cbfa90SSrinivas Dasari 	CONNECT_REQ_EXTERNAL_AUTH_SUPPORT	= BIT(3),
21817e7c8926SBen Greear };
21827e7c8926SBen Greear 
21837e7c8926SBen Greear /**
2184636a5d36SJouni Malinen  * struct cfg80211_assoc_request - (Re)Association request data
2185636a5d36SJouni Malinen  *
2186636a5d36SJouni Malinen  * This structure provides information needed to complete IEEE 802.11
2187636a5d36SJouni Malinen  * (re)association.
2188959867faSJohannes Berg  * @bss: The BSS to associate with. If the call is successful the driver is
2189959867faSJohannes Berg  *	given a reference that it must give back to cfg80211_send_rx_assoc()
2190959867faSJohannes Berg  *	or to cfg80211_assoc_timeout(). To ensure proper refcounting, new
2191959867faSJohannes Berg  *	association requests while already associating must be rejected.
2192636a5d36SJouni Malinen  * @ie: Extra IEs to add to (Re)Association Request frame or %NULL
2193636a5d36SJouni Malinen  * @ie_len: Length of ie buffer in octets
2194dc6382ceSJouni Malinen  * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
2195b23aa676SSamuel Ortiz  * @crypto: crypto settings
219635eb8f7bSJouni Malinen  * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used
219735eb8f7bSJouni Malinen  *	to indicate a request to reassociate within the ESS instead of a request
219835eb8f7bSJouni Malinen  *	do the initial association with the ESS. When included, this is set to
219935eb8f7bSJouni Malinen  *	the BSSID of the current association, i.e., to the value that is
220035eb8f7bSJouni Malinen  *	included in the Current AP address field of the Reassociation Request
220135eb8f7bSJouni Malinen  *	frame.
22027e7c8926SBen Greear  * @flags:  See &enum cfg80211_assoc_req_flags
22037e7c8926SBen Greear  * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
22047e7c8926SBen Greear  *	will be used in ht_capa.  Un-supported values will be ignored.
22057e7c8926SBen Greear  * @ht_capa_mask:  The bits of ht_capa which are to be used.
2206ee2aca34SJohannes Berg  * @vht_capa: VHT capability override
2207ee2aca34SJohannes Berg  * @vht_capa_mask: VHT capability mask indicating which fields to use
2208348bd456SJouni Malinen  * @fils_kek: FILS KEK for protecting (Re)Association Request/Response frame or
2209348bd456SJouni Malinen  *	%NULL if FILS is not used.
2210348bd456SJouni Malinen  * @fils_kek_len: Length of fils_kek in octets
2211348bd456SJouni Malinen  * @fils_nonces: FILS nonces (part of AAD) for protecting (Re)Association
2212348bd456SJouni Malinen  *	Request/Response frame or %NULL if FILS is not used. This field starts
2213348bd456SJouni Malinen  *	with 16 octets of STA Nonce followed by 16 octets of AP Nonce.
2214636a5d36SJouni Malinen  */
2215636a5d36SJouni Malinen struct cfg80211_assoc_request {
221619957bb3SJohannes Berg 	struct cfg80211_bss *bss;
22173e5d7649SJohannes Berg 	const u8 *ie, *prev_bssid;
2218636a5d36SJouni Malinen 	size_t ie_len;
2219b23aa676SSamuel Ortiz 	struct cfg80211_crypto_settings crypto;
222019957bb3SJohannes Berg 	bool use_mfp;
22217e7c8926SBen Greear 	u32 flags;
22227e7c8926SBen Greear 	struct ieee80211_ht_cap ht_capa;
22237e7c8926SBen Greear 	struct ieee80211_ht_cap ht_capa_mask;
2224ee2aca34SJohannes Berg 	struct ieee80211_vht_cap vht_capa, vht_capa_mask;
2225348bd456SJouni Malinen 	const u8 *fils_kek;
2226348bd456SJouni Malinen 	size_t fils_kek_len;
2227348bd456SJouni Malinen 	const u8 *fils_nonces;
2228636a5d36SJouni Malinen };
2229636a5d36SJouni Malinen 
2230636a5d36SJouni Malinen /**
2231636a5d36SJouni Malinen  * struct cfg80211_deauth_request - Deauthentication request data
2232636a5d36SJouni Malinen  *
2233636a5d36SJouni Malinen  * This structure provides information needed to complete IEEE 802.11
2234636a5d36SJouni Malinen  * deauthentication.
2235636a5d36SJouni Malinen  *
223695de817bSJohannes Berg  * @bssid: the BSSID of the BSS to deauthenticate from
2237636a5d36SJouni Malinen  * @ie: Extra IEs to add to Deauthentication frame or %NULL
2238636a5d36SJouni Malinen  * @ie_len: Length of ie buffer in octets
223919957bb3SJohannes Berg  * @reason_code: The reason code for the deauthentication
2240077f897aSJohannes Berg  * @local_state_change: if set, change local state only and
2241077f897aSJohannes Berg  *	do not set a deauth frame
2242636a5d36SJouni Malinen  */
2243636a5d36SJouni Malinen struct cfg80211_deauth_request {
224495de817bSJohannes Berg 	const u8 *bssid;
2245636a5d36SJouni Malinen 	const u8 *ie;
2246636a5d36SJouni Malinen 	size_t ie_len;
224719957bb3SJohannes Berg 	u16 reason_code;
22486863255bSStanislaw Gruszka 	bool local_state_change;
2249636a5d36SJouni Malinen };
2250636a5d36SJouni Malinen 
2251636a5d36SJouni Malinen /**
2252636a5d36SJouni Malinen  * struct cfg80211_disassoc_request - Disassociation request data
2253636a5d36SJouni Malinen  *
2254636a5d36SJouni Malinen  * This structure provides information needed to complete IEEE 802.11
225566f00449SMasahiro Yamada  * disassociation.
2256636a5d36SJouni Malinen  *
225719957bb3SJohannes Berg  * @bss: the BSS to disassociate from
2258636a5d36SJouni Malinen  * @ie: Extra IEs to add to Disassociation frame or %NULL
2259636a5d36SJouni Malinen  * @ie_len: Length of ie buffer in octets
226019957bb3SJohannes Berg  * @reason_code: The reason code for the disassociation
2261d5cdfacbSJouni Malinen  * @local_state_change: This is a request for a local state only, i.e., no
2262d5cdfacbSJouni Malinen  *	Disassociation frame is to be transmitted.
2263636a5d36SJouni Malinen  */
2264636a5d36SJouni Malinen struct cfg80211_disassoc_request {
226519957bb3SJohannes Berg 	struct cfg80211_bss *bss;
2266636a5d36SJouni Malinen 	const u8 *ie;
2267636a5d36SJouni Malinen 	size_t ie_len;
226819957bb3SJohannes Berg 	u16 reason_code;
2269d5cdfacbSJouni Malinen 	bool local_state_change;
2270636a5d36SJouni Malinen };
2271636a5d36SJouni Malinen 
2272636a5d36SJouni Malinen /**
227304a773adSJohannes Berg  * struct cfg80211_ibss_params - IBSS parameters
227404a773adSJohannes Berg  *
227504a773adSJohannes Berg  * This structure defines the IBSS parameters for the join_ibss()
227604a773adSJohannes Berg  * method.
227704a773adSJohannes Berg  *
227804a773adSJohannes Berg  * @ssid: The SSID, will always be non-null.
227904a773adSJohannes Berg  * @ssid_len: The length of the SSID, will always be non-zero.
228004a773adSJohannes Berg  * @bssid: Fixed BSSID requested, maybe be %NULL, if set do not
228104a773adSJohannes Berg  *	search for IBSSs with a different BSSID.
2282683b6d3bSJohannes Berg  * @chandef: defines the channel to use if no other IBSS to join can be found
228304a773adSJohannes Berg  * @channel_fixed: The channel should be fixed -- do not search for
228404a773adSJohannes Berg  *	IBSSs to join on other channels.
228504a773adSJohannes Berg  * @ie: information element(s) to include in the beacon
228604a773adSJohannes Berg  * @ie_len: length of that
22878e30bc55SJohannes Berg  * @beacon_interval: beacon interval to use
2288fffd0934SJohannes Berg  * @privacy: this is a protected network, keys will be configured
2289fffd0934SJohannes Berg  *	after joining
2290267335d6SAntonio Quartulli  * @control_port: whether user space controls IEEE 802.1X port, i.e.,
2291267335d6SAntonio Quartulli  *	sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
2292267335d6SAntonio Quartulli  *	required to assume that the port is unauthorized until authorized by
2293267335d6SAntonio Quartulli  *	user space. Otherwise, port is marked authorized by default.
2294c3bfe1f6SDenis Kenzior  * @control_port_over_nl80211: TRUE if userspace expects to exchange control
2295c3bfe1f6SDenis Kenzior  *	port frames over NL80211 instead of the network interface.
22965336fa88SSimon Wunderlich  * @userspace_handles_dfs: whether user space controls DFS operation, i.e.
22975336fa88SSimon Wunderlich  *	changes the channel when a radar is detected. This is required
22985336fa88SSimon Wunderlich  *	to operate on DFS channels.
2299fbd2c8dcSTeemu Paasikivi  * @basic_rates: bitmap of basic rates to use when creating the IBSS
2300dd5b4cc7SFelix Fietkau  * @mcast_rate: per-band multicast rate index + 1 (0: disabled)
2301803768f5SSimon Wunderlich  * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
2302803768f5SSimon Wunderlich  *	will be used in ht_capa.  Un-supported values will be ignored.
2303803768f5SSimon Wunderlich  * @ht_capa_mask:  The bits of ht_capa which are to be used.
23049ae3b172STova Mussai  * @wep_keys: static WEP keys, if not NULL points to an array of
23059ae3b172STova Mussai  * 	CFG80211_MAX_WEP_KEYS WEP keys
23069ae3b172STova Mussai  * @wep_tx_key: key index (0..3) of the default TX static WEP key
230704a773adSJohannes Berg  */
230804a773adSJohannes Berg struct cfg80211_ibss_params {
2309c1e5f471SJohannes Berg 	const u8 *ssid;
2310c1e5f471SJohannes Berg 	const u8 *bssid;
2311683b6d3bSJohannes Berg 	struct cfg80211_chan_def chandef;
2312c1e5f471SJohannes Berg 	const u8 *ie;
231304a773adSJohannes Berg 	u8 ssid_len, ie_len;
23148e30bc55SJohannes Berg 	u16 beacon_interval;
2315fbd2c8dcSTeemu Paasikivi 	u32 basic_rates;
231604a773adSJohannes Berg 	bool channel_fixed;
2317fffd0934SJohannes Berg 	bool privacy;
2318267335d6SAntonio Quartulli 	bool control_port;
2319c3bfe1f6SDenis Kenzior 	bool control_port_over_nl80211;
23205336fa88SSimon Wunderlich 	bool userspace_handles_dfs;
232157fbcce3SJohannes Berg 	int mcast_rate[NUM_NL80211_BANDS];
2322803768f5SSimon Wunderlich 	struct ieee80211_ht_cap ht_capa;
2323803768f5SSimon Wunderlich 	struct ieee80211_ht_cap ht_capa_mask;
23249ae3b172STova Mussai 	struct key_params *wep_keys;
23259ae3b172STova Mussai 	int wep_tx_key;
232604a773adSJohannes Berg };
232704a773adSJohannes Berg 
232804a773adSJohannes Berg /**
232938de03d2SArend van Spriel  * struct cfg80211_bss_selection - connection parameters for BSS selection.
233038de03d2SArend van Spriel  *
233138de03d2SArend van Spriel  * @behaviour: requested BSS selection behaviour.
233238de03d2SArend van Spriel  * @param: parameters for requestion behaviour.
233338de03d2SArend van Spriel  * @band_pref: preferred band for %NL80211_BSS_SELECT_ATTR_BAND_PREF.
233438de03d2SArend van Spriel  * @adjust: parameters for %NL80211_BSS_SELECT_ATTR_RSSI_ADJUST.
233538de03d2SArend van Spriel  */
233638de03d2SArend van Spriel struct cfg80211_bss_selection {
233738de03d2SArend van Spriel 	enum nl80211_bss_select_attr behaviour;
233838de03d2SArend van Spriel 	union {
233957fbcce3SJohannes Berg 		enum nl80211_band band_pref;
234038de03d2SArend van Spriel 		struct cfg80211_bss_select_adjust adjust;
234138de03d2SArend van Spriel 	} param;
234238de03d2SArend van Spriel };
234338de03d2SArend van Spriel 
234438de03d2SArend van Spriel /**
2345b23aa676SSamuel Ortiz  * struct cfg80211_connect_params - Connection parameters
2346b23aa676SSamuel Ortiz  *
2347b23aa676SSamuel Ortiz  * This structure provides information needed to complete IEEE 802.11
2348b23aa676SSamuel Ortiz  * authentication and association.
2349b23aa676SSamuel Ortiz  *
2350b23aa676SSamuel Ortiz  * @channel: The channel to use or %NULL if not specified (auto-select based
2351b23aa676SSamuel Ortiz  *	on scan results)
23521df4a510SJouni Malinen  * @channel_hint: The channel of the recommended BSS for initial connection or
23531df4a510SJouni Malinen  *	%NULL if not specified
2354b23aa676SSamuel Ortiz  * @bssid: The AP BSSID or %NULL if not specified (auto-select based on scan
2355b23aa676SSamuel Ortiz  *	results)
23561df4a510SJouni Malinen  * @bssid_hint: The recommended AP BSSID for initial connection to the BSS or
23571df4a510SJouni Malinen  *	%NULL if not specified. Unlike the @bssid parameter, the driver is
23581df4a510SJouni Malinen  *	allowed to ignore this @bssid_hint if it has knowledge of a better BSS
23591df4a510SJouni Malinen  *	to use.
2360b23aa676SSamuel Ortiz  * @ssid: SSID
2361b23aa676SSamuel Ortiz  * @ssid_len: Length of ssid in octets
2362b23aa676SSamuel Ortiz  * @auth_type: Authentication type (algorithm)
2363abe37c4bSJohannes Berg  * @ie: IEs for association request
2364abe37c4bSJohannes Berg  * @ie_len: Length of assoc_ie in octets
2365b23aa676SSamuel Ortiz  * @privacy: indicates whether privacy-enabled APs should be used
2366cee00a95SJouni Malinen  * @mfp: indicate whether management frame protection is used
2367b23aa676SSamuel Ortiz  * @crypto: crypto settings
2368fffd0934SJohannes Berg  * @key_len: length of WEP key for shared key authentication
2369fffd0934SJohannes Berg  * @key_idx: index of WEP key for shared key authentication
2370fffd0934SJohannes Berg  * @key: WEP key for shared key authentication
23717e7c8926SBen Greear  * @flags:  See &enum cfg80211_assoc_req_flags
23724486ea98SBala Shanmugam  * @bg_scan_period:  Background scan period in seconds
23734486ea98SBala Shanmugam  *	or -1 to indicate that default value is to be used.
23747e7c8926SBen Greear  * @ht_capa:  HT Capabilities over-rides.  Values set in ht_capa_mask
23757e7c8926SBen Greear  *	will be used in ht_capa.  Un-supported values will be ignored.
23767e7c8926SBen Greear  * @ht_capa_mask:  The bits of ht_capa which are to be used.
2377ee2aca34SJohannes Berg  * @vht_capa:  VHT Capability overrides
2378ee2aca34SJohannes Berg  * @vht_capa_mask: The bits of vht_capa which are to be used.
237934d50519SLior David  * @pbss: if set, connect to a PCP instead of AP. Valid for DMG
238034d50519SLior David  *	networks.
238138de03d2SArend van Spriel  * @bss_select: criteria to be used for BSS selection.
238235eb8f7bSJouni Malinen  * @prev_bssid: previous BSSID, if not %NULL use reassociate frame. This is used
238335eb8f7bSJouni Malinen  *	to indicate a request to reassociate within the ESS instead of a request
238435eb8f7bSJouni Malinen  *	do the initial association with the ESS. When included, this is set to
238535eb8f7bSJouni Malinen  *	the BSSID of the current association, i.e., to the value that is
238635eb8f7bSJouni Malinen  *	included in the Current AP address field of the Reassociation Request
238735eb8f7bSJouni Malinen  *	frame.
2388a3caf744SVidyullatha Kanchanapally  * @fils_erp_username: EAP re-authentication protocol (ERP) username part of the
2389a3caf744SVidyullatha Kanchanapally  *	NAI or %NULL if not specified. This is used to construct FILS wrapped
2390a3caf744SVidyullatha Kanchanapally  *	data IE.
2391a3caf744SVidyullatha Kanchanapally  * @fils_erp_username_len: Length of @fils_erp_username in octets.
2392a3caf744SVidyullatha Kanchanapally  * @fils_erp_realm: EAP re-authentication protocol (ERP) realm part of NAI or
2393a3caf744SVidyullatha Kanchanapally  *	%NULL if not specified. This specifies the domain name of ER server and
2394a3caf744SVidyullatha Kanchanapally  *	is used to construct FILS wrapped data IE.
2395a3caf744SVidyullatha Kanchanapally  * @fils_erp_realm_len: Length of @fils_erp_realm in octets.
2396a3caf744SVidyullatha Kanchanapally  * @fils_erp_next_seq_num: The next sequence number to use in the FILS ERP
2397a3caf744SVidyullatha Kanchanapally  *	messages. This is also used to construct FILS wrapped data IE.
2398a3caf744SVidyullatha Kanchanapally  * @fils_erp_rrk: ERP re-authentication Root Key (rRK) used to derive additional
2399a3caf744SVidyullatha Kanchanapally  *	keys in FILS or %NULL if not specified.
2400a3caf744SVidyullatha Kanchanapally  * @fils_erp_rrk_len: Length of @fils_erp_rrk in octets.
24013a00df57SAvraham Stern  * @want_1x: indicates user-space supports and wants to use 802.1X driver
24023a00df57SAvraham Stern  *	offload of 4-way handshake.
2403b23aa676SSamuel Ortiz  */
2404b23aa676SSamuel Ortiz struct cfg80211_connect_params {
2405b23aa676SSamuel Ortiz 	struct ieee80211_channel *channel;
24061df4a510SJouni Malinen 	struct ieee80211_channel *channel_hint;
2407664834deSJouni Malinen 	const u8 *bssid;
24081df4a510SJouni Malinen 	const u8 *bssid_hint;
2409664834deSJouni Malinen 	const u8 *ssid;
2410b23aa676SSamuel Ortiz 	size_t ssid_len;
2411b23aa676SSamuel Ortiz 	enum nl80211_auth_type auth_type;
24124b5800feSJohannes Berg 	const u8 *ie;
2413b23aa676SSamuel Ortiz 	size_t ie_len;
2414b23aa676SSamuel Ortiz 	bool privacy;
2415cee00a95SJouni Malinen 	enum nl80211_mfp mfp;
2416b23aa676SSamuel Ortiz 	struct cfg80211_crypto_settings crypto;
2417fffd0934SJohannes Berg 	const u8 *key;
2418fffd0934SJohannes Berg 	u8 key_len, key_idx;
24197e7c8926SBen Greear 	u32 flags;
24204486ea98SBala Shanmugam 	int bg_scan_period;
24217e7c8926SBen Greear 	struct ieee80211_ht_cap ht_capa;
24227e7c8926SBen Greear 	struct ieee80211_ht_cap ht_capa_mask;
2423ee2aca34SJohannes Berg 	struct ieee80211_vht_cap vht_capa;
2424ee2aca34SJohannes Berg 	struct ieee80211_vht_cap vht_capa_mask;
242534d50519SLior David 	bool pbss;
242638de03d2SArend van Spriel 	struct cfg80211_bss_selection bss_select;
2427ba6fbacfSJouni Malinen 	const u8 *prev_bssid;
2428a3caf744SVidyullatha Kanchanapally 	const u8 *fils_erp_username;
2429a3caf744SVidyullatha Kanchanapally 	size_t fils_erp_username_len;
2430a3caf744SVidyullatha Kanchanapally 	const u8 *fils_erp_realm;
2431a3caf744SVidyullatha Kanchanapally 	size_t fils_erp_realm_len;
2432a3caf744SVidyullatha Kanchanapally 	u16 fils_erp_next_seq_num;
2433a3caf744SVidyullatha Kanchanapally 	const u8 *fils_erp_rrk;
2434a3caf744SVidyullatha Kanchanapally 	size_t fils_erp_rrk_len;
24353a00df57SAvraham Stern 	bool want_1x;
2436b23aa676SSamuel Ortiz };
2437b23aa676SSamuel Ortiz 
2438b23aa676SSamuel Ortiz /**
2439088e8df8Svamsi krishna  * enum cfg80211_connect_params_changed - Connection parameters being updated
2440088e8df8Svamsi krishna  *
2441088e8df8Svamsi krishna  * This enum provides information of all connect parameters that
2442088e8df8Svamsi krishna  * have to be updated as part of update_connect_params() call.
2443088e8df8Svamsi krishna  *
2444088e8df8Svamsi krishna  * @UPDATE_ASSOC_IES: Indicates whether association request IEs are updated
24457f9a3e15SVidyullatha Kanchanapally  * @UPDATE_FILS_ERP_INFO: Indicates that FILS connection parameters (realm,
24467f9a3e15SVidyullatha Kanchanapally  *	username, erp sequence number and rrk) are updated
24477f9a3e15SVidyullatha Kanchanapally  * @UPDATE_AUTH_TYPE: Indicates that authentication type is updated
2448088e8df8Svamsi krishna  */
2449088e8df8Svamsi krishna enum cfg80211_connect_params_changed {
2450088e8df8Svamsi krishna 	UPDATE_ASSOC_IES		= BIT(0),
24517f9a3e15SVidyullatha Kanchanapally 	UPDATE_FILS_ERP_INFO		= BIT(1),
24527f9a3e15SVidyullatha Kanchanapally 	UPDATE_AUTH_TYPE		= BIT(2),
2453088e8df8Svamsi krishna };
2454088e8df8Svamsi krishna 
2455088e8df8Svamsi krishna /**
2456b9a5f8caSJouni Malinen  * enum wiphy_params_flags - set_wiphy_params bitfield values
2457abe37c4bSJohannes Berg  * @WIPHY_PARAM_RETRY_SHORT: wiphy->retry_short has changed
2458abe37c4bSJohannes Berg  * @WIPHY_PARAM_RETRY_LONG: wiphy->retry_long has changed
2459abe37c4bSJohannes Berg  * @WIPHY_PARAM_FRAG_THRESHOLD: wiphy->frag_threshold has changed
2460abe37c4bSJohannes Berg  * @WIPHY_PARAM_RTS_THRESHOLD: wiphy->rts_threshold has changed
2461abe37c4bSJohannes Berg  * @WIPHY_PARAM_COVERAGE_CLASS: coverage class changed
24623057dbfdSLorenzo Bianconi  * @WIPHY_PARAM_DYN_ACK: dynack has been enabled
246352539ca8SToke Høiland-Jørgensen  * @WIPHY_PARAM_TXQ_LIMIT: TXQ packet limit has been changed
246452539ca8SToke Høiland-Jørgensen  * @WIPHY_PARAM_TXQ_MEMORY_LIMIT: TXQ memory limit has been changed
246552539ca8SToke Høiland-Jørgensen  * @WIPHY_PARAM_TXQ_QUANTUM: TXQ scheduler quantum
2466b9a5f8caSJouni Malinen  */
2467b9a5f8caSJouni Malinen enum wiphy_params_flags {
2468b9a5f8caSJouni Malinen 	WIPHY_PARAM_RETRY_SHORT		= 1 << 0,
2469b9a5f8caSJouni Malinen 	WIPHY_PARAM_RETRY_LONG		= 1 << 1,
2470b9a5f8caSJouni Malinen 	WIPHY_PARAM_FRAG_THRESHOLD	= 1 << 2,
2471b9a5f8caSJouni Malinen 	WIPHY_PARAM_RTS_THRESHOLD	= 1 << 3,
247281077e82SLukáš Turek 	WIPHY_PARAM_COVERAGE_CLASS	= 1 << 4,
24733057dbfdSLorenzo Bianconi 	WIPHY_PARAM_DYN_ACK		= 1 << 5,
247452539ca8SToke Høiland-Jørgensen 	WIPHY_PARAM_TXQ_LIMIT		= 1 << 6,
247552539ca8SToke Høiland-Jørgensen 	WIPHY_PARAM_TXQ_MEMORY_LIMIT	= 1 << 7,
247652539ca8SToke Høiland-Jørgensen 	WIPHY_PARAM_TXQ_QUANTUM		= 1 << 8,
2477b9a5f8caSJouni Malinen };
2478b9a5f8caSJouni Malinen 
247936647055SToke Høiland-Jørgensen #define IEEE80211_DEFAULT_AIRTIME_WEIGHT	256
248036647055SToke Høiland-Jørgensen 
248167fbb16bSSamuel Ortiz /**
248267fbb16bSSamuel Ortiz  * struct cfg80211_pmksa - PMK Security Association
248367fbb16bSSamuel Ortiz  *
248467fbb16bSSamuel Ortiz  * This structure is passed to the set/del_pmksa() method for PMKSA
248567fbb16bSSamuel Ortiz  * caching.
248667fbb16bSSamuel Ortiz  *
2487a3caf744SVidyullatha Kanchanapally  * @bssid: The AP's BSSID (may be %NULL).
2488a3caf744SVidyullatha Kanchanapally  * @pmkid: The identifier to refer a PMKSA.
2489a3caf744SVidyullatha Kanchanapally  * @pmk: The PMK for the PMKSA identified by @pmkid. This is used for key
2490a3caf744SVidyullatha Kanchanapally  *	derivation by a FILS STA. Otherwise, %NULL.
2491a3caf744SVidyullatha Kanchanapally  * @pmk_len: Length of the @pmk. The length of @pmk can differ depending on
2492a3caf744SVidyullatha Kanchanapally  *	the hash algorithm used to generate this.
2493a3caf744SVidyullatha Kanchanapally  * @ssid: SSID to specify the ESS within which a PMKSA is valid when using FILS
2494a3caf744SVidyullatha Kanchanapally  *	cache identifier (may be %NULL).
2495a3caf744SVidyullatha Kanchanapally  * @ssid_len: Length of the @ssid in octets.
2496a3caf744SVidyullatha Kanchanapally  * @cache_id: 2-octet cache identifier advertized by a FILS AP identifying the
2497a3caf744SVidyullatha Kanchanapally  *	scope of PMKSA. This is valid only if @ssid_len is non-zero (may be
2498a3caf744SVidyullatha Kanchanapally  *	%NULL).
249967fbb16bSSamuel Ortiz  */
250067fbb16bSSamuel Ortiz struct cfg80211_pmksa {
2501c1e5f471SJohannes Berg 	const u8 *bssid;
2502c1e5f471SJohannes Berg 	const u8 *pmkid;
2503a3caf744SVidyullatha Kanchanapally 	const u8 *pmk;
2504a3caf744SVidyullatha Kanchanapally 	size_t pmk_len;
2505a3caf744SVidyullatha Kanchanapally 	const u8 *ssid;
2506a3caf744SVidyullatha Kanchanapally 	size_t ssid_len;
2507a3caf744SVidyullatha Kanchanapally 	const u8 *cache_id;
250867fbb16bSSamuel Ortiz };
25099930380fSJohannes Berg 
25107643a2c3SJohannes Berg /**
251150ac6607SAmitkumar Karwar  * struct cfg80211_pkt_pattern - packet pattern
2512ff1b6e69SJohannes Berg  * @mask: bitmask where to match pattern and where to ignore bytes,
2513ff1b6e69SJohannes Berg  *	one bit per byte, in same format as nl80211
2514ff1b6e69SJohannes Berg  * @pattern: bytes to match where bitmask is 1
2515ff1b6e69SJohannes Berg  * @pattern_len: length of pattern (in bytes)
2516bb92d199SAmitkumar Karwar  * @pkt_offset: packet offset (in bytes)
2517ff1b6e69SJohannes Berg  *
2518ff1b6e69SJohannes Berg  * Internal note: @mask and @pattern are allocated in one chunk of
2519ff1b6e69SJohannes Berg  * memory, free @mask only!
2520ff1b6e69SJohannes Berg  */
252150ac6607SAmitkumar Karwar struct cfg80211_pkt_pattern {
2522922bd80fSJohannes Berg 	const u8 *mask, *pattern;
2523ff1b6e69SJohannes Berg 	int pattern_len;
2524bb92d199SAmitkumar Karwar 	int pkt_offset;
2525ff1b6e69SJohannes Berg };
2526ff1b6e69SJohannes Berg 
2527ff1b6e69SJohannes Berg /**
25282a0e047eSJohannes Berg  * struct cfg80211_wowlan_tcp - TCP connection parameters
25292a0e047eSJohannes Berg  *
25302a0e047eSJohannes Berg  * @sock: (internal) socket for source port allocation
25312a0e047eSJohannes Berg  * @src: source IP address
25322a0e047eSJohannes Berg  * @dst: destination IP address
25332a0e047eSJohannes Berg  * @dst_mac: destination MAC address
25342a0e047eSJohannes Berg  * @src_port: source port
25352a0e047eSJohannes Berg  * @dst_port: destination port
25362a0e047eSJohannes Berg  * @payload_len: data payload length
25372a0e047eSJohannes Berg  * @payload: data payload buffer
25382a0e047eSJohannes Berg  * @payload_seq: payload sequence stamping configuration
25392a0e047eSJohannes Berg  * @data_interval: interval at which to send data packets
25402a0e047eSJohannes Berg  * @wake_len: wakeup payload match length
25412a0e047eSJohannes Berg  * @wake_data: wakeup payload match data
25422a0e047eSJohannes Berg  * @wake_mask: wakeup payload match mask
25432a0e047eSJohannes Berg  * @tokens_size: length of the tokens buffer
25442a0e047eSJohannes Berg  * @payload_tok: payload token usage configuration
25452a0e047eSJohannes Berg  */
25462a0e047eSJohannes Berg struct cfg80211_wowlan_tcp {
25472a0e047eSJohannes Berg 	struct socket *sock;
25482a0e047eSJohannes Berg 	__be32 src, dst;
25492a0e047eSJohannes Berg 	u16 src_port, dst_port;
25502a0e047eSJohannes Berg 	u8 dst_mac[ETH_ALEN];
25512a0e047eSJohannes Berg 	int payload_len;
25522a0e047eSJohannes Berg 	const u8 *payload;
25532a0e047eSJohannes Berg 	struct nl80211_wowlan_tcp_data_seq payload_seq;
25542a0e047eSJohannes Berg 	u32 data_interval;
25552a0e047eSJohannes Berg 	u32 wake_len;
25562a0e047eSJohannes Berg 	const u8 *wake_data, *wake_mask;
25572a0e047eSJohannes Berg 	u32 tokens_size;
25582a0e047eSJohannes Berg 	/* must be last, variable member */
25592a0e047eSJohannes Berg 	struct nl80211_wowlan_tcp_data_token payload_tok;
2560ff1b6e69SJohannes Berg };
2561ff1b6e69SJohannes Berg 
2562ff1b6e69SJohannes Berg /**
2563ff1b6e69SJohannes Berg  * struct cfg80211_wowlan - Wake on Wireless-LAN support info
2564ff1b6e69SJohannes Berg  *
2565ff1b6e69SJohannes Berg  * This structure defines the enabled WoWLAN triggers for the device.
2566ff1b6e69SJohannes Berg  * @any: wake up on any activity -- special trigger if device continues
2567ff1b6e69SJohannes Berg  *	operating as normal during suspend
2568ff1b6e69SJohannes Berg  * @disconnect: wake up if getting disconnected
2569ff1b6e69SJohannes Berg  * @magic_pkt: wake up on receiving magic packet
2570ff1b6e69SJohannes Berg  * @patterns: wake up on receiving packet matching a pattern
2571ff1b6e69SJohannes Berg  * @n_patterns: number of patterns
257277dbbb13SJohannes Berg  * @gtk_rekey_failure: wake up on GTK rekey failure
257377dbbb13SJohannes Berg  * @eap_identity_req: wake up on EAP identity request packet
257477dbbb13SJohannes Berg  * @four_way_handshake: wake up on 4-way handshake
257577dbbb13SJohannes Berg  * @rfkill_release: wake up when rfkill is released
25762a0e047eSJohannes Berg  * @tcp: TCP connection establishment/wakeup parameters, see nl80211.h.
25772a0e047eSJohannes Berg  *	NULL if not configured.
25788cd4d456SLuciano Coelho  * @nd_config: configuration for the scan to be used for net detect wake.
2579ff1b6e69SJohannes Berg  */
2580ff1b6e69SJohannes Berg struct cfg80211_wowlan {
258177dbbb13SJohannes Berg 	bool any, disconnect, magic_pkt, gtk_rekey_failure,
258277dbbb13SJohannes Berg 	     eap_identity_req, four_way_handshake,
258377dbbb13SJohannes Berg 	     rfkill_release;
258450ac6607SAmitkumar Karwar 	struct cfg80211_pkt_pattern *patterns;
25852a0e047eSJohannes Berg 	struct cfg80211_wowlan_tcp *tcp;
2586ff1b6e69SJohannes Berg 	int n_patterns;
25878cd4d456SLuciano Coelho 	struct cfg80211_sched_scan_request *nd_config;
2588ff1b6e69SJohannes Berg };
2589ff1b6e69SJohannes Berg 
2590ff1b6e69SJohannes Berg /**
2591be29b99aSAmitkumar Karwar  * struct cfg80211_coalesce_rules - Coalesce rule parameters
2592be29b99aSAmitkumar Karwar  *
2593be29b99aSAmitkumar Karwar  * This structure defines coalesce rule for the device.
2594be29b99aSAmitkumar Karwar  * @delay: maximum coalescing delay in msecs.
2595be29b99aSAmitkumar Karwar  * @condition: condition for packet coalescence.
2596be29b99aSAmitkumar Karwar  *	see &enum nl80211_coalesce_condition.
2597be29b99aSAmitkumar Karwar  * @patterns: array of packet patterns
2598be29b99aSAmitkumar Karwar  * @n_patterns: number of patterns
2599be29b99aSAmitkumar Karwar  */
2600be29b99aSAmitkumar Karwar struct cfg80211_coalesce_rules {
2601be29b99aSAmitkumar Karwar 	int delay;
2602be29b99aSAmitkumar Karwar 	enum nl80211_coalesce_condition condition;
2603be29b99aSAmitkumar Karwar 	struct cfg80211_pkt_pattern *patterns;
2604be29b99aSAmitkumar Karwar 	int n_patterns;
2605be29b99aSAmitkumar Karwar };
2606be29b99aSAmitkumar Karwar 
2607be29b99aSAmitkumar Karwar /**
2608be29b99aSAmitkumar Karwar  * struct cfg80211_coalesce - Packet coalescing settings
2609be29b99aSAmitkumar Karwar  *
2610be29b99aSAmitkumar Karwar  * This structure defines coalescing settings.
2611be29b99aSAmitkumar Karwar  * @rules: array of coalesce rules
2612be29b99aSAmitkumar Karwar  * @n_rules: number of rules
2613be29b99aSAmitkumar Karwar  */
2614be29b99aSAmitkumar Karwar struct cfg80211_coalesce {
2615be29b99aSAmitkumar Karwar 	struct cfg80211_coalesce_rules *rules;
2616be29b99aSAmitkumar Karwar 	int n_rules;
2617be29b99aSAmitkumar Karwar };
2618be29b99aSAmitkumar Karwar 
2619be29b99aSAmitkumar Karwar /**
26208cd4d456SLuciano Coelho  * struct cfg80211_wowlan_nd_match - information about the match
26218cd4d456SLuciano Coelho  *
26228cd4d456SLuciano Coelho  * @ssid: SSID of the match that triggered the wake up
26238cd4d456SLuciano Coelho  * @n_channels: Number of channels where the match occurred.  This
26248cd4d456SLuciano Coelho  *	value may be zero if the driver can't report the channels.
26258cd4d456SLuciano Coelho  * @channels: center frequencies of the channels where a match
26268cd4d456SLuciano Coelho  *	occurred (in MHz)
26278cd4d456SLuciano Coelho  */
26288cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_match {
26298cd4d456SLuciano Coelho 	struct cfg80211_ssid ssid;
26308cd4d456SLuciano Coelho 	int n_channels;
26318cd4d456SLuciano Coelho 	u32 channels[];
26328cd4d456SLuciano Coelho };
26338cd4d456SLuciano Coelho 
26348cd4d456SLuciano Coelho /**
26358cd4d456SLuciano Coelho  * struct cfg80211_wowlan_nd_info - net detect wake up information
26368cd4d456SLuciano Coelho  *
26378cd4d456SLuciano Coelho  * @n_matches: Number of match information instances provided in
26388cd4d456SLuciano Coelho  *	@matches.  This value may be zero if the driver can't provide
26398cd4d456SLuciano Coelho  *	match information.
26408cd4d456SLuciano Coelho  * @matches: Array of pointers to matches containing information about
26418cd4d456SLuciano Coelho  *	the matches that triggered the wake up.
26428cd4d456SLuciano Coelho  */
26438cd4d456SLuciano Coelho struct cfg80211_wowlan_nd_info {
26448cd4d456SLuciano Coelho 	int n_matches;
26458cd4d456SLuciano Coelho 	struct cfg80211_wowlan_nd_match *matches[];
26468cd4d456SLuciano Coelho };
26478cd4d456SLuciano Coelho 
26488cd4d456SLuciano Coelho /**
2649cd8f7cb4SJohannes Berg  * struct cfg80211_wowlan_wakeup - wakeup report
2650cd8f7cb4SJohannes Berg  * @disconnect: woke up by getting disconnected
2651cd8f7cb4SJohannes Berg  * @magic_pkt: woke up by receiving magic packet
2652cd8f7cb4SJohannes Berg  * @gtk_rekey_failure: woke up by GTK rekey failure
2653cd8f7cb4SJohannes Berg  * @eap_identity_req: woke up by EAP identity request packet
2654cd8f7cb4SJohannes Berg  * @four_way_handshake: woke up by 4-way handshake
2655cd8f7cb4SJohannes Berg  * @rfkill_release: woke up by rfkill being released
2656cd8f7cb4SJohannes Berg  * @pattern_idx: pattern that caused wakeup, -1 if not due to pattern
2657cd8f7cb4SJohannes Berg  * @packet_present_len: copied wakeup packet data
2658cd8f7cb4SJohannes Berg  * @packet_len: original wakeup packet length
2659cd8f7cb4SJohannes Berg  * @packet: The packet causing the wakeup, if any.
2660cd8f7cb4SJohannes Berg  * @packet_80211:  For pattern match, magic packet and other data
2661cd8f7cb4SJohannes Berg  *	frame triggers an 802.3 frame should be reported, for
2662cd8f7cb4SJohannes Berg  *	disconnect due to deauth 802.11 frame. This indicates which
2663cd8f7cb4SJohannes Berg  *	it is.
26642a0e047eSJohannes Berg  * @tcp_match: TCP wakeup packet received
26652a0e047eSJohannes Berg  * @tcp_connlost: TCP connection lost or failed to establish
26662a0e047eSJohannes Berg  * @tcp_nomoretokens: TCP data ran out of tokens
26678cd4d456SLuciano Coelho  * @net_detect: if not %NULL, woke up because of net detect
2668cd8f7cb4SJohannes Berg  */
2669cd8f7cb4SJohannes Berg struct cfg80211_wowlan_wakeup {
2670cd8f7cb4SJohannes Berg 	bool disconnect, magic_pkt, gtk_rekey_failure,
2671cd8f7cb4SJohannes Berg 	     eap_identity_req, four_way_handshake,
26722a0e047eSJohannes Berg 	     rfkill_release, packet_80211,
26732a0e047eSJohannes Berg 	     tcp_match, tcp_connlost, tcp_nomoretokens;
2674cd8f7cb4SJohannes Berg 	s32 pattern_idx;
2675cd8f7cb4SJohannes Berg 	u32 packet_present_len, packet_len;
2676cd8f7cb4SJohannes Berg 	const void *packet;
26778cd4d456SLuciano Coelho 	struct cfg80211_wowlan_nd_info *net_detect;
2678cd8f7cb4SJohannes Berg };
2679cd8f7cb4SJohannes Berg 
2680cd8f7cb4SJohannes Berg /**
2681e5497d76SJohannes Berg  * struct cfg80211_gtk_rekey_data - rekey data
268278f686caSJohannes Berg  * @kek: key encryption key (NL80211_KEK_LEN bytes)
268378f686caSJohannes Berg  * @kck: key confirmation key (NL80211_KCK_LEN bytes)
268478f686caSJohannes Berg  * @replay_ctr: replay counter (NL80211_REPLAY_CTR_LEN bytes)
2685e5497d76SJohannes Berg  */
2686e5497d76SJohannes Berg struct cfg80211_gtk_rekey_data {
268778f686caSJohannes Berg 	const u8 *kek, *kck, *replay_ctr;
2688e5497d76SJohannes Berg };
2689e5497d76SJohannes Berg 
2690e5497d76SJohannes Berg /**
2691355199e0SJouni Malinen  * struct cfg80211_update_ft_ies_params - FT IE Information
2692355199e0SJouni Malinen  *
2693355199e0SJouni Malinen  * This structure provides information needed to update the fast transition IE
2694355199e0SJouni Malinen  *
2695355199e0SJouni Malinen  * @md: The Mobility Domain ID, 2 Octet value
2696355199e0SJouni Malinen  * @ie: Fast Transition IEs
2697355199e0SJouni Malinen  * @ie_len: Length of ft_ie in octets
2698355199e0SJouni Malinen  */
2699355199e0SJouni Malinen struct cfg80211_update_ft_ies_params {
2700355199e0SJouni Malinen 	u16 md;
2701355199e0SJouni Malinen 	const u8 *ie;
2702355199e0SJouni Malinen 	size_t ie_len;
2703355199e0SJouni Malinen };
2704355199e0SJouni Malinen 
2705355199e0SJouni Malinen /**
2706b176e629SAndrei Otcheretianski  * struct cfg80211_mgmt_tx_params - mgmt tx parameters
2707b176e629SAndrei Otcheretianski  *
2708b176e629SAndrei Otcheretianski  * This structure provides information needed to transmit a mgmt frame
2709b176e629SAndrei Otcheretianski  *
2710b176e629SAndrei Otcheretianski  * @chan: channel to use
2711b176e629SAndrei Otcheretianski  * @offchan: indicates wether off channel operation is required
2712b176e629SAndrei Otcheretianski  * @wait: duration for ROC
2713b176e629SAndrei Otcheretianski  * @buf: buffer to transmit
2714b176e629SAndrei Otcheretianski  * @len: buffer length
2715b176e629SAndrei Otcheretianski  * @no_cck: don't use cck rates for this frame
2716b176e629SAndrei Otcheretianski  * @dont_wait_for_ack: tells the low level not to wait for an ack
271734d22ce2SAndrei Otcheretianski  * @n_csa_offsets: length of csa_offsets array
271834d22ce2SAndrei Otcheretianski  * @csa_offsets: array of all the csa offsets in the frame
2719b176e629SAndrei Otcheretianski  */
2720b176e629SAndrei Otcheretianski struct cfg80211_mgmt_tx_params {
2721b176e629SAndrei Otcheretianski 	struct ieee80211_channel *chan;
2722b176e629SAndrei Otcheretianski 	bool offchan;
2723b176e629SAndrei Otcheretianski 	unsigned int wait;
2724b176e629SAndrei Otcheretianski 	const u8 *buf;
2725b176e629SAndrei Otcheretianski 	size_t len;
2726b176e629SAndrei Otcheretianski 	bool no_cck;
2727b176e629SAndrei Otcheretianski 	bool dont_wait_for_ack;
272834d22ce2SAndrei Otcheretianski 	int n_csa_offsets;
272934d22ce2SAndrei Otcheretianski 	const u16 *csa_offsets;
2730b176e629SAndrei Otcheretianski };
2731b176e629SAndrei Otcheretianski 
2732b176e629SAndrei Otcheretianski /**
2733fa9ffc74SKyeyoon Park  * struct cfg80211_dscp_exception - DSCP exception
2734fa9ffc74SKyeyoon Park  *
2735fa9ffc74SKyeyoon Park  * @dscp: DSCP value that does not adhere to the user priority range definition
2736fa9ffc74SKyeyoon Park  * @up: user priority value to which the corresponding DSCP value belongs
2737fa9ffc74SKyeyoon Park  */
2738fa9ffc74SKyeyoon Park struct cfg80211_dscp_exception {
2739fa9ffc74SKyeyoon Park 	u8 dscp;
2740fa9ffc74SKyeyoon Park 	u8 up;
2741fa9ffc74SKyeyoon Park };
2742fa9ffc74SKyeyoon Park 
2743fa9ffc74SKyeyoon Park /**
2744fa9ffc74SKyeyoon Park  * struct cfg80211_dscp_range - DSCP range definition for user priority
2745fa9ffc74SKyeyoon Park  *
2746fa9ffc74SKyeyoon Park  * @low: lowest DSCP value of this user priority range, inclusive
2747fa9ffc74SKyeyoon Park  * @high: highest DSCP value of this user priority range, inclusive
2748fa9ffc74SKyeyoon Park  */
2749fa9ffc74SKyeyoon Park struct cfg80211_dscp_range {
2750fa9ffc74SKyeyoon Park 	u8 low;
2751fa9ffc74SKyeyoon Park 	u8 high;
2752fa9ffc74SKyeyoon Park };
2753fa9ffc74SKyeyoon Park 
2754fa9ffc74SKyeyoon Park /* QoS Map Set element length defined in IEEE Std 802.11-2012, 8.4.2.97 */
2755fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_MAX_EX	21
2756fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_LEN_MIN	16
2757fa9ffc74SKyeyoon Park #define IEEE80211_QOS_MAP_LEN_MAX \
2758fa9ffc74SKyeyoon Park 	(IEEE80211_QOS_MAP_LEN_MIN + 2 * IEEE80211_QOS_MAP_MAX_EX)
2759fa9ffc74SKyeyoon Park 
2760fa9ffc74SKyeyoon Park /**
2761fa9ffc74SKyeyoon Park  * struct cfg80211_qos_map - QoS Map Information
2762fa9ffc74SKyeyoon Park  *
2763fa9ffc74SKyeyoon Park  * This struct defines the Interworking QoS map setting for DSCP values
2764fa9ffc74SKyeyoon Park  *
2765fa9ffc74SKyeyoon Park  * @num_des: number of DSCP exceptions (0..21)
2766fa9ffc74SKyeyoon Park  * @dscp_exception: optionally up to maximum of 21 DSCP exceptions from
2767fa9ffc74SKyeyoon Park  *	the user priority DSCP range definition
2768fa9ffc74SKyeyoon Park  * @up: DSCP range definition for a particular user priority
2769fa9ffc74SKyeyoon Park  */
2770fa9ffc74SKyeyoon Park struct cfg80211_qos_map {
2771fa9ffc74SKyeyoon Park 	u8 num_des;
2772fa9ffc74SKyeyoon Park 	struct cfg80211_dscp_exception dscp_exception[IEEE80211_QOS_MAP_MAX_EX];
2773fa9ffc74SKyeyoon Park 	struct cfg80211_dscp_range up[8];
2774fa9ffc74SKyeyoon Park };
2775fa9ffc74SKyeyoon Park 
2776fa9ffc74SKyeyoon Park /**
2777cb3b7d87SAyala Beker  * struct cfg80211_nan_conf - NAN configuration
2778cb3b7d87SAyala Beker  *
2779cb3b7d87SAyala Beker  * This struct defines NAN configuration parameters
2780cb3b7d87SAyala Beker  *
2781cb3b7d87SAyala Beker  * @master_pref: master preference (1 - 255)
27828585989dSLuca Coelho  * @bands: operating bands, a bitmap of &enum nl80211_band values.
27838585989dSLuca Coelho  *	For instance, for NL80211_BAND_2GHZ, bit 0 would be set
27848585989dSLuca Coelho  *	(i.e. BIT(NL80211_BAND_2GHZ)).
2785cb3b7d87SAyala Beker  */
2786cb3b7d87SAyala Beker struct cfg80211_nan_conf {
2787cb3b7d87SAyala Beker 	u8 master_pref;
27888585989dSLuca Coelho 	u8 bands;
2789cb3b7d87SAyala Beker };
2790cb3b7d87SAyala Beker 
2791cb3b7d87SAyala Beker /**
2792a5a9dcf2SAyala Beker  * enum cfg80211_nan_conf_changes - indicates changed fields in NAN
2793a5a9dcf2SAyala Beker  * configuration
2794a5a9dcf2SAyala Beker  *
2795a5a9dcf2SAyala Beker  * @CFG80211_NAN_CONF_CHANGED_PREF: master preference
27968585989dSLuca Coelho  * @CFG80211_NAN_CONF_CHANGED_BANDS: operating bands
2797a5a9dcf2SAyala Beker  */
2798a5a9dcf2SAyala Beker enum cfg80211_nan_conf_changes {
2799a5a9dcf2SAyala Beker 	CFG80211_NAN_CONF_CHANGED_PREF = BIT(0),
28008585989dSLuca Coelho 	CFG80211_NAN_CONF_CHANGED_BANDS = BIT(1),
2801a5a9dcf2SAyala Beker };
2802a5a9dcf2SAyala Beker 
2803a5a9dcf2SAyala Beker /**
2804a442b761SAyala Beker  * struct cfg80211_nan_func_filter - a NAN function Rx / Tx filter
2805a442b761SAyala Beker  *
2806a442b761SAyala Beker  * @filter: the content of the filter
2807a442b761SAyala Beker  * @len: the length of the filter
2808a442b761SAyala Beker  */
2809a442b761SAyala Beker struct cfg80211_nan_func_filter {
2810a442b761SAyala Beker 	const u8 *filter;
2811a442b761SAyala Beker 	u8 len;
2812a442b761SAyala Beker };
2813a442b761SAyala Beker 
2814a442b761SAyala Beker /**
2815a442b761SAyala Beker  * struct cfg80211_nan_func - a NAN function
2816a442b761SAyala Beker  *
2817a442b761SAyala Beker  * @type: &enum nl80211_nan_function_type
2818a442b761SAyala Beker  * @service_id: the service ID of the function
2819a442b761SAyala Beker  * @publish_type: &nl80211_nan_publish_type
2820a442b761SAyala Beker  * @close_range: if true, the range should be limited. Threshold is
2821a442b761SAyala Beker  *	implementation specific.
2822a442b761SAyala Beker  * @publish_bcast: if true, the solicited publish should be broadcasted
2823a442b761SAyala Beker  * @subscribe_active: if true, the subscribe is active
2824a442b761SAyala Beker  * @followup_id: the instance ID for follow up
2825a442b761SAyala Beker  * @followup_reqid: the requestor instance ID for follow up
2826a442b761SAyala Beker  * @followup_dest: MAC address of the recipient of the follow up
2827a442b761SAyala Beker  * @ttl: time to live counter in DW.
2828a442b761SAyala Beker  * @serv_spec_info: Service Specific Info
2829a442b761SAyala Beker  * @serv_spec_info_len: Service Specific Info length
2830a442b761SAyala Beker  * @srf_include: if true, SRF is inclusive
2831a442b761SAyala Beker  * @srf_bf: Bloom Filter
2832a442b761SAyala Beker  * @srf_bf_len: Bloom Filter length
2833a442b761SAyala Beker  * @srf_bf_idx: Bloom Filter index
2834a442b761SAyala Beker  * @srf_macs: SRF MAC addresses
2835a442b761SAyala Beker  * @srf_num_macs: number of MAC addresses in SRF
2836a442b761SAyala Beker  * @rx_filters: rx filters that are matched with corresponding peer's tx_filter
2837a442b761SAyala Beker  * @tx_filters: filters that should be transmitted in the SDF.
2838a442b761SAyala Beker  * @num_rx_filters: length of &rx_filters.
2839a442b761SAyala Beker  * @num_tx_filters: length of &tx_filters.
2840a442b761SAyala Beker  * @instance_id: driver allocated id of the function.
2841a442b761SAyala Beker  * @cookie: unique NAN function identifier.
2842a442b761SAyala Beker  */
2843a442b761SAyala Beker struct cfg80211_nan_func {
2844a442b761SAyala Beker 	enum nl80211_nan_function_type type;
2845a442b761SAyala Beker 	u8 service_id[NL80211_NAN_FUNC_SERVICE_ID_LEN];
2846a442b761SAyala Beker 	u8 publish_type;
2847a442b761SAyala Beker 	bool close_range;
2848a442b761SAyala Beker 	bool publish_bcast;
2849a442b761SAyala Beker 	bool subscribe_active;
2850a442b761SAyala Beker 	u8 followup_id;
2851a442b761SAyala Beker 	u8 followup_reqid;
2852a442b761SAyala Beker 	struct mac_address followup_dest;
2853a442b761SAyala Beker 	u32 ttl;
2854a442b761SAyala Beker 	const u8 *serv_spec_info;
2855a442b761SAyala Beker 	u8 serv_spec_info_len;
2856a442b761SAyala Beker 	bool srf_include;
2857a442b761SAyala Beker 	const u8 *srf_bf;
2858a442b761SAyala Beker 	u8 srf_bf_len;
2859a442b761SAyala Beker 	u8 srf_bf_idx;
2860a442b761SAyala Beker 	struct mac_address *srf_macs;
2861a442b761SAyala Beker 	int srf_num_macs;
2862a442b761SAyala Beker 	struct cfg80211_nan_func_filter *rx_filters;
2863a442b761SAyala Beker 	struct cfg80211_nan_func_filter *tx_filters;
2864a442b761SAyala Beker 	u8 num_tx_filters;
2865a442b761SAyala Beker 	u8 num_rx_filters;
2866a442b761SAyala Beker 	u8 instance_id;
2867a442b761SAyala Beker 	u64 cookie;
2868a442b761SAyala Beker };
2869a442b761SAyala Beker 
2870a442b761SAyala Beker /**
28713a00df57SAvraham Stern  * struct cfg80211_pmk_conf - PMK configuration
28723a00df57SAvraham Stern  *
28733a00df57SAvraham Stern  * @aa: authenticator address
28743a00df57SAvraham Stern  * @pmk_len: PMK length in bytes.
28753a00df57SAvraham Stern  * @pmk: the PMK material
28763a00df57SAvraham Stern  * @pmk_r0_name: PMK-R0 Name. NULL if not applicable (i.e., the PMK
28773a00df57SAvraham Stern  *	is not PMK-R0). When pmk_r0_name is not NULL, the pmk field
28783a00df57SAvraham Stern  *	holds PMK-R0.
28793a00df57SAvraham Stern  */
28803a00df57SAvraham Stern struct cfg80211_pmk_conf {
28813a00df57SAvraham Stern 	const u8 *aa;
28823a00df57SAvraham Stern 	u8 pmk_len;
28833a00df57SAvraham Stern 	const u8 *pmk;
28843a00df57SAvraham Stern 	const u8 *pmk_r0_name;
28853a00df57SAvraham Stern };
28863a00df57SAvraham Stern 
28873a00df57SAvraham Stern /**
288840cbfa90SSrinivas Dasari  * struct cfg80211_external_auth_params - Trigger External authentication.
288940cbfa90SSrinivas Dasari  *
289040cbfa90SSrinivas Dasari  * Commonly used across the external auth request and event interfaces.
289140cbfa90SSrinivas Dasari  *
289240cbfa90SSrinivas Dasari  * @action: action type / trigger for external authentication. Only significant
289340cbfa90SSrinivas Dasari  *	for the authentication request event interface (driver to user space).
289440cbfa90SSrinivas Dasari  * @bssid: BSSID of the peer with which the authentication has
289540cbfa90SSrinivas Dasari  *	to happen. Used by both the authentication request event and
289640cbfa90SSrinivas Dasari  *	authentication response command interface.
289740cbfa90SSrinivas Dasari  * @ssid: SSID of the AP.  Used by both the authentication request event and
289840cbfa90SSrinivas Dasari  *	authentication response command interface.
289940cbfa90SSrinivas Dasari  * @key_mgmt_suite: AKM suite of the respective authentication. Used by the
290040cbfa90SSrinivas Dasari  *	authentication request event interface.
290140cbfa90SSrinivas Dasari  * @status: status code, %WLAN_STATUS_SUCCESS for successful authentication,
290240cbfa90SSrinivas Dasari  *	use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space cannot give you
290340cbfa90SSrinivas Dasari  *	the real status code for failures. Used only for the authentication
290440cbfa90SSrinivas Dasari  *	response command interface (user space to driver).
2905fe494370SSrinivas Dasari  * @pmkid: The identifier to refer a PMKSA.
290640cbfa90SSrinivas Dasari  */
290740cbfa90SSrinivas Dasari struct cfg80211_external_auth_params {
290840cbfa90SSrinivas Dasari 	enum nl80211_external_auth_action action;
290940cbfa90SSrinivas Dasari 	u8 bssid[ETH_ALEN] __aligned(2);
291040cbfa90SSrinivas Dasari 	struct cfg80211_ssid ssid;
291140cbfa90SSrinivas Dasari 	unsigned int key_mgmt_suite;
291240cbfa90SSrinivas Dasari 	u16 status;
2913fe494370SSrinivas Dasari 	const u8 *pmkid;
291440cbfa90SSrinivas Dasari };
291540cbfa90SSrinivas Dasari 
291640cbfa90SSrinivas Dasari /**
29173453de98SRandy Dunlap  * struct cfg80211_ftm_responder_stats - FTM responder statistics
291881e54d08SPradeep Kumar Chitrapu  *
291981e54d08SPradeep Kumar Chitrapu  * @filled: bitflag of flags using the bits of &enum nl80211_ftm_stats to
292081e54d08SPradeep Kumar Chitrapu  *	indicate the relevant values in this struct for them
292181e54d08SPradeep Kumar Chitrapu  * @success_num: number of FTM sessions in which all frames were successfully
292281e54d08SPradeep Kumar Chitrapu  *	answered
292381e54d08SPradeep Kumar Chitrapu  * @partial_num: number of FTM sessions in which part of frames were
292481e54d08SPradeep Kumar Chitrapu  *	successfully answered
292581e54d08SPradeep Kumar Chitrapu  * @failed_num: number of failed FTM sessions
292681e54d08SPradeep Kumar Chitrapu  * @asap_num: number of ASAP FTM sessions
292781e54d08SPradeep Kumar Chitrapu  * @non_asap_num: number of  non-ASAP FTM sessions
292881e54d08SPradeep Kumar Chitrapu  * @total_duration_ms: total sessions durations - gives an indication
292981e54d08SPradeep Kumar Chitrapu  *	of how much time the responder was busy
293081e54d08SPradeep Kumar Chitrapu  * @unknown_triggers_num: number of unknown FTM triggers - triggers from
293181e54d08SPradeep Kumar Chitrapu  *	initiators that didn't finish successfully the negotiation phase with
293281e54d08SPradeep Kumar Chitrapu  *	the responder
293381e54d08SPradeep Kumar Chitrapu  * @reschedule_requests_num: number of FTM reschedule requests - initiator asks
293481e54d08SPradeep Kumar Chitrapu  *	for a new scheduling although it already has scheduled FTM slot
293581e54d08SPradeep Kumar Chitrapu  * @out_of_window_triggers_num: total FTM triggers out of scheduled window
293681e54d08SPradeep Kumar Chitrapu  */
293781e54d08SPradeep Kumar Chitrapu struct cfg80211_ftm_responder_stats {
293881e54d08SPradeep Kumar Chitrapu 	u32 filled;
293981e54d08SPradeep Kumar Chitrapu 	u32 success_num;
294081e54d08SPradeep Kumar Chitrapu 	u32 partial_num;
294181e54d08SPradeep Kumar Chitrapu 	u32 failed_num;
294281e54d08SPradeep Kumar Chitrapu 	u32 asap_num;
294381e54d08SPradeep Kumar Chitrapu 	u32 non_asap_num;
294481e54d08SPradeep Kumar Chitrapu 	u64 total_duration_ms;
294581e54d08SPradeep Kumar Chitrapu 	u32 unknown_triggers_num;
294681e54d08SPradeep Kumar Chitrapu 	u32 reschedule_requests_num;
294781e54d08SPradeep Kumar Chitrapu 	u32 out_of_window_triggers_num;
294881e54d08SPradeep Kumar Chitrapu };
294981e54d08SPradeep Kumar Chitrapu 
295081e54d08SPradeep Kumar Chitrapu /**
29519bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_ftm_result - FTM result
29529bb7e0f2SJohannes Berg  * @failure_reason: if this measurement failed (PMSR status is
29539bb7e0f2SJohannes Berg  *	%NL80211_PMSR_STATUS_FAILURE), this gives a more precise
29549bb7e0f2SJohannes Berg  *	reason than just "failure"
29559bb7e0f2SJohannes Berg  * @burst_index: if reporting partial results, this is the index
29569bb7e0f2SJohannes Berg  *	in [0 .. num_bursts-1] of the burst that's being reported
29579bb7e0f2SJohannes Berg  * @num_ftmr_attempts: number of FTM request frames transmitted
29589bb7e0f2SJohannes Berg  * @num_ftmr_successes: number of FTM request frames acked
29599bb7e0f2SJohannes Berg  * @busy_retry_time: if failure_reason is %NL80211_PMSR_FTM_FAILURE_PEER_BUSY,
29609bb7e0f2SJohannes Berg  *	fill this to indicate in how many seconds a retry is deemed possible
29619bb7e0f2SJohannes Berg  *	by the responder
29629bb7e0f2SJohannes Berg  * @num_bursts_exp: actual number of bursts exponent negotiated
29639bb7e0f2SJohannes Berg  * @burst_duration: actual burst duration negotiated
29649bb7e0f2SJohannes Berg  * @ftms_per_burst: actual FTMs per burst negotiated
29659bb7e0f2SJohannes Berg  * @lci_len: length of LCI information (if present)
29669bb7e0f2SJohannes Berg  * @civicloc_len: length of civic location information (if present)
29679bb7e0f2SJohannes Berg  * @lci: LCI data (may be %NULL)
29689bb7e0f2SJohannes Berg  * @civicloc: civic location data (may be %NULL)
29699bb7e0f2SJohannes Berg  * @rssi_avg: average RSSI over FTM action frames reported
29709bb7e0f2SJohannes Berg  * @rssi_spread: spread of the RSSI over FTM action frames reported
29719bb7e0f2SJohannes Berg  * @tx_rate: bitrate for transmitted FTM action frame response
29729bb7e0f2SJohannes Berg  * @rx_rate: bitrate of received FTM action frame
29739bb7e0f2SJohannes Berg  * @rtt_avg: average of RTTs measured (must have either this or @dist_avg)
29749bb7e0f2SJohannes Berg  * @rtt_variance: variance of RTTs measured (note that standard deviation is
29759bb7e0f2SJohannes Berg  *	the square root of the variance)
29769bb7e0f2SJohannes Berg  * @rtt_spread: spread of the RTTs measured
29779bb7e0f2SJohannes Berg  * @dist_avg: average of distances (mm) measured
29789bb7e0f2SJohannes Berg  *	(must have either this or @rtt_avg)
29799bb7e0f2SJohannes Berg  * @dist_variance: variance of distances measured (see also @rtt_variance)
29809bb7e0f2SJohannes Berg  * @dist_spread: spread of distances measured (see also @rtt_spread)
29819bb7e0f2SJohannes Berg  * @num_ftmr_attempts_valid: @num_ftmr_attempts is valid
29829bb7e0f2SJohannes Berg  * @num_ftmr_successes_valid: @num_ftmr_successes is valid
29839bb7e0f2SJohannes Berg  * @rssi_avg_valid: @rssi_avg is valid
29849bb7e0f2SJohannes Berg  * @rssi_spread_valid: @rssi_spread is valid
29859bb7e0f2SJohannes Berg  * @tx_rate_valid: @tx_rate is valid
29869bb7e0f2SJohannes Berg  * @rx_rate_valid: @rx_rate is valid
29879bb7e0f2SJohannes Berg  * @rtt_avg_valid: @rtt_avg is valid
29889bb7e0f2SJohannes Berg  * @rtt_variance_valid: @rtt_variance is valid
29899bb7e0f2SJohannes Berg  * @rtt_spread_valid: @rtt_spread is valid
29909bb7e0f2SJohannes Berg  * @dist_avg_valid: @dist_avg is valid
29919bb7e0f2SJohannes Berg  * @dist_variance_valid: @dist_variance is valid
29929bb7e0f2SJohannes Berg  * @dist_spread_valid: @dist_spread is valid
29939bb7e0f2SJohannes Berg  */
29949bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_result {
29959bb7e0f2SJohannes Berg 	const u8 *lci;
29969bb7e0f2SJohannes Berg 	const u8 *civicloc;
29979bb7e0f2SJohannes Berg 	unsigned int lci_len;
29989bb7e0f2SJohannes Berg 	unsigned int civicloc_len;
29999bb7e0f2SJohannes Berg 	enum nl80211_peer_measurement_ftm_failure_reasons failure_reason;
30009bb7e0f2SJohannes Berg 	u32 num_ftmr_attempts, num_ftmr_successes;
30019bb7e0f2SJohannes Berg 	s16 burst_index;
30029bb7e0f2SJohannes Berg 	u8 busy_retry_time;
30039bb7e0f2SJohannes Berg 	u8 num_bursts_exp;
30049bb7e0f2SJohannes Berg 	u8 burst_duration;
30059bb7e0f2SJohannes Berg 	u8 ftms_per_burst;
30069bb7e0f2SJohannes Berg 	s32 rssi_avg;
30079bb7e0f2SJohannes Berg 	s32 rssi_spread;
30089bb7e0f2SJohannes Berg 	struct rate_info tx_rate, rx_rate;
30099bb7e0f2SJohannes Berg 	s64 rtt_avg;
30109bb7e0f2SJohannes Berg 	s64 rtt_variance;
30119bb7e0f2SJohannes Berg 	s64 rtt_spread;
30129bb7e0f2SJohannes Berg 	s64 dist_avg;
30139bb7e0f2SJohannes Berg 	s64 dist_variance;
30149bb7e0f2SJohannes Berg 	s64 dist_spread;
30159bb7e0f2SJohannes Berg 
30169bb7e0f2SJohannes Berg 	u16 num_ftmr_attempts_valid:1,
30179bb7e0f2SJohannes Berg 	    num_ftmr_successes_valid:1,
30189bb7e0f2SJohannes Berg 	    rssi_avg_valid:1,
30199bb7e0f2SJohannes Berg 	    rssi_spread_valid:1,
30209bb7e0f2SJohannes Berg 	    tx_rate_valid:1,
30219bb7e0f2SJohannes Berg 	    rx_rate_valid:1,
30229bb7e0f2SJohannes Berg 	    rtt_avg_valid:1,
30239bb7e0f2SJohannes Berg 	    rtt_variance_valid:1,
30249bb7e0f2SJohannes Berg 	    rtt_spread_valid:1,
30259bb7e0f2SJohannes Berg 	    dist_avg_valid:1,
30269bb7e0f2SJohannes Berg 	    dist_variance_valid:1,
30279bb7e0f2SJohannes Berg 	    dist_spread_valid:1;
30289bb7e0f2SJohannes Berg };
30299bb7e0f2SJohannes Berg 
30309bb7e0f2SJohannes Berg /**
30319bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_result - peer measurement result
30329bb7e0f2SJohannes Berg  * @addr: address of the peer
30339bb7e0f2SJohannes Berg  * @host_time: host time (use ktime_get_boottime() adjust to the time when the
30349bb7e0f2SJohannes Berg  *	measurement was made)
30359bb7e0f2SJohannes Berg  * @ap_tsf: AP's TSF at measurement time
30369bb7e0f2SJohannes Berg  * @status: status of the measurement
30379bb7e0f2SJohannes Berg  * @final: if reporting partial results, mark this as the last one; if not
30389bb7e0f2SJohannes Berg  *	reporting partial results always set this flag
30399bb7e0f2SJohannes Berg  * @ap_tsf_valid: indicates the @ap_tsf value is valid
30409bb7e0f2SJohannes Berg  * @type: type of the measurement reported, note that we only support reporting
30419bb7e0f2SJohannes Berg  *	one type at a time, but you can report multiple results separately and
30429bb7e0f2SJohannes Berg  *	they're all aggregated for userspace.
30439bb7e0f2SJohannes Berg  */
30449bb7e0f2SJohannes Berg struct cfg80211_pmsr_result {
30459bb7e0f2SJohannes Berg 	u64 host_time, ap_tsf;
30469bb7e0f2SJohannes Berg 	enum nl80211_peer_measurement_status status;
30479bb7e0f2SJohannes Berg 
30489bb7e0f2SJohannes Berg 	u8 addr[ETH_ALEN];
30499bb7e0f2SJohannes Berg 
30509bb7e0f2SJohannes Berg 	u8 final:1,
30519bb7e0f2SJohannes Berg 	   ap_tsf_valid:1;
30529bb7e0f2SJohannes Berg 
30539bb7e0f2SJohannes Berg 	enum nl80211_peer_measurement_type type;
30549bb7e0f2SJohannes Berg 
30559bb7e0f2SJohannes Berg 	union {
30569bb7e0f2SJohannes Berg 		struct cfg80211_pmsr_ftm_result ftm;
30579bb7e0f2SJohannes Berg 	};
30589bb7e0f2SJohannes Berg };
30599bb7e0f2SJohannes Berg 
30609bb7e0f2SJohannes Berg /**
30619bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_ftm_request_peer - FTM request data
30629bb7e0f2SJohannes Berg  * @requested: indicates FTM is requested
30639bb7e0f2SJohannes Berg  * @preamble: frame preamble to use
30649bb7e0f2SJohannes Berg  * @burst_period: burst period to use
30659bb7e0f2SJohannes Berg  * @asap: indicates to use ASAP mode
30669bb7e0f2SJohannes Berg  * @num_bursts_exp: number of bursts exponent
30679bb7e0f2SJohannes Berg  * @burst_duration: burst duration
30689bb7e0f2SJohannes Berg  * @ftms_per_burst: number of FTMs per burst
30699bb7e0f2SJohannes Berg  * @ftmr_retries: number of retries for FTM request
30709bb7e0f2SJohannes Berg  * @request_lci: request LCI information
30719bb7e0f2SJohannes Berg  * @request_civicloc: request civic location information
30729bb7e0f2SJohannes Berg  *
30739bb7e0f2SJohannes Berg  * See also nl80211 for the respective attribute documentation.
30749bb7e0f2SJohannes Berg  */
30759bb7e0f2SJohannes Berg struct cfg80211_pmsr_ftm_request_peer {
30769bb7e0f2SJohannes Berg 	enum nl80211_preamble preamble;
30779bb7e0f2SJohannes Berg 	u16 burst_period;
30789bb7e0f2SJohannes Berg 	u8 requested:1,
30799bb7e0f2SJohannes Berg 	   asap:1,
30809bb7e0f2SJohannes Berg 	   request_lci:1,
30819bb7e0f2SJohannes Berg 	   request_civicloc:1;
30829bb7e0f2SJohannes Berg 	u8 num_bursts_exp;
30839bb7e0f2SJohannes Berg 	u8 burst_duration;
30849bb7e0f2SJohannes Berg 	u8 ftms_per_burst;
30859bb7e0f2SJohannes Berg 	u8 ftmr_retries;
30869bb7e0f2SJohannes Berg };
30879bb7e0f2SJohannes Berg 
30889bb7e0f2SJohannes Berg /**
30899bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_request_peer - peer data for a peer measurement request
30909bb7e0f2SJohannes Berg  * @addr: MAC address
30919bb7e0f2SJohannes Berg  * @chandef: channel to use
30929bb7e0f2SJohannes Berg  * @report_ap_tsf: report the associated AP's TSF
30939bb7e0f2SJohannes Berg  * @ftm: FTM data, see &struct cfg80211_pmsr_ftm_request_peer
30949bb7e0f2SJohannes Berg  */
30959bb7e0f2SJohannes Berg struct cfg80211_pmsr_request_peer {
30969bb7e0f2SJohannes Berg 	u8 addr[ETH_ALEN];
30979bb7e0f2SJohannes Berg 	struct cfg80211_chan_def chandef;
30989bb7e0f2SJohannes Berg 	u8 report_ap_tsf:1;
30999bb7e0f2SJohannes Berg 	struct cfg80211_pmsr_ftm_request_peer ftm;
31009bb7e0f2SJohannes Berg };
31019bb7e0f2SJohannes Berg 
31029bb7e0f2SJohannes Berg /**
31039bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_request - peer measurement request
31049bb7e0f2SJohannes Berg  * @cookie: cookie, set by cfg80211
31059bb7e0f2SJohannes Berg  * @nl_portid: netlink portid - used by cfg80211
31069bb7e0f2SJohannes Berg  * @drv_data: driver data for this request, if required for aborting,
31079bb7e0f2SJohannes Berg  *	not otherwise freed or anything by cfg80211
31089bb7e0f2SJohannes Berg  * @mac_addr: MAC address used for (randomised) request
31099bb7e0f2SJohannes Berg  * @mac_addr_mask: MAC address mask used for randomisation, bits that
31109bb7e0f2SJohannes Berg  *	are 0 in the mask should be randomised, bits that are 1 should
31119bb7e0f2SJohannes Berg  *	be taken from the @mac_addr
31129bb7e0f2SJohannes Berg  * @list: used by cfg80211 to hold on to the request
31139bb7e0f2SJohannes Berg  * @timeout: timeout (in milliseconds) for the whole operation, if
31149bb7e0f2SJohannes Berg  *	zero it means there's no timeout
31159bb7e0f2SJohannes Berg  * @n_peers: number of peers to do measurements with
31169bb7e0f2SJohannes Berg  * @peers: per-peer measurement request data
31179bb7e0f2SJohannes Berg  */
31189bb7e0f2SJohannes Berg struct cfg80211_pmsr_request {
31199bb7e0f2SJohannes Berg 	u64 cookie;
31209bb7e0f2SJohannes Berg 	void *drv_data;
31219bb7e0f2SJohannes Berg 	u32 n_peers;
31229bb7e0f2SJohannes Berg 	u32 nl_portid;
31239bb7e0f2SJohannes Berg 
31249bb7e0f2SJohannes Berg 	u32 timeout;
31259bb7e0f2SJohannes Berg 
31269bb7e0f2SJohannes Berg 	u8 mac_addr[ETH_ALEN] __aligned(2);
31279bb7e0f2SJohannes Berg 	u8 mac_addr_mask[ETH_ALEN] __aligned(2);
31289bb7e0f2SJohannes Berg 
31299bb7e0f2SJohannes Berg 	struct list_head list;
31309bb7e0f2SJohannes Berg 
31319bb7e0f2SJohannes Berg 	struct cfg80211_pmsr_request_peer peers[];
31329bb7e0f2SJohannes Berg };
31339bb7e0f2SJohannes Berg 
31349bb7e0f2SJohannes Berg /**
3135cb74e977SSunil Dutt  * struct cfg80211_update_owe_info - OWE Information
3136cb74e977SSunil Dutt  *
3137cb74e977SSunil Dutt  * This structure provides information needed for the drivers to offload OWE
3138cb74e977SSunil Dutt  * (Opportunistic Wireless Encryption) processing to the user space.
3139cb74e977SSunil Dutt  *
3140cb74e977SSunil Dutt  * Commonly used across update_owe_info request and event interfaces.
3141cb74e977SSunil Dutt  *
3142cb74e977SSunil Dutt  * @peer: MAC address of the peer device for which the OWE processing
3143cb74e977SSunil Dutt  *	has to be done.
3144cb74e977SSunil Dutt  * @status: status code, %WLAN_STATUS_SUCCESS for successful OWE info
3145cb74e977SSunil Dutt  *	processing, use %WLAN_STATUS_UNSPECIFIED_FAILURE if user space
3146cb74e977SSunil Dutt  *	cannot give you the real status code for failures. Used only for
3147cb74e977SSunil Dutt  *	OWE update request command interface (user space to driver).
3148cb74e977SSunil Dutt  * @ie: IEs obtained from the peer or constructed by the user space. These are
3149cb74e977SSunil Dutt  *	the IEs of the remote peer in the event from the host driver and
3150cb74e977SSunil Dutt  *	the constructed IEs by the user space in the request interface.
3151cb74e977SSunil Dutt  * @ie_len: Length of IEs in octets.
3152cb74e977SSunil Dutt  */
3153cb74e977SSunil Dutt struct cfg80211_update_owe_info {
3154cb74e977SSunil Dutt 	u8 peer[ETH_ALEN] __aligned(2);
3155cb74e977SSunil Dutt 	u16 status;
3156cb74e977SSunil Dutt 	const u8 *ie;
3157cb74e977SSunil Dutt 	size_t ie_len;
3158cb74e977SSunil Dutt };
3159cb74e977SSunil Dutt 
3160cb74e977SSunil Dutt /**
3161704232c2SJohannes Berg  * struct cfg80211_ops - backend description for wireless configuration
3162704232c2SJohannes Berg  *
3163704232c2SJohannes Berg  * This struct is registered by fullmac card drivers and/or wireless stacks
3164704232c2SJohannes Berg  * in order to handle configuration requests on their interfaces.
3165704232c2SJohannes Berg  *
3166704232c2SJohannes Berg  * All callbacks except where otherwise noted should return 0
3167704232c2SJohannes Berg  * on success or a negative error code.
3168704232c2SJohannes Berg  *
316943fb45cbSJohannes Berg  * All operations are currently invoked under rtnl for consistency with the
317043fb45cbSJohannes Berg  * wireless extensions but this is subject to reevaluation as soon as this
317143fb45cbSJohannes Berg  * code is used more widely and we have a first user without wext.
317243fb45cbSJohannes Berg  *
3173ff1b6e69SJohannes Berg  * @suspend: wiphy device needs to be suspended. The variable @wow will
3174ff1b6e69SJohannes Berg  *	be %NULL or contain the enabled Wake-on-Wireless triggers that are
3175ff1b6e69SJohannes Berg  *	configured for the device.
31760378b3f1SJohannes Berg  * @resume: wiphy device needs to be resumed
31776d52563fSJohannes Berg  * @set_wakeup: Called when WoWLAN is enabled/disabled, use this callback
31786d52563fSJohannes Berg  *	to call device_set_wakeup_enable() to enable/disable wakeup from
31796d52563fSJohannes Berg  *	the device.
31800378b3f1SJohannes Berg  *
318160719ffdSJohannes Berg  * @add_virtual_intf: create a new virtual interface with the given name,
3182463d0183SJohannes Berg  *	must set the struct wireless_dev's iftype. Beware: You must create
318384efbb84SJohannes Berg  *	the new netdev in the wiphy's network namespace! Returns the struct
318498104fdeSJohannes Berg  *	wireless_dev, or an ERR_PTR. For P2P device wdevs, the driver must
318598104fdeSJohannes Berg  *	also set the address member in the wdev.
3186704232c2SJohannes Berg  *
318784efbb84SJohannes Berg  * @del_virtual_intf: remove the virtual interface
318855682965SJohannes Berg  *
318960719ffdSJohannes Berg  * @change_virtual_intf: change type/configuration of virtual interface,
319060719ffdSJohannes Berg  *	keep the struct wireless_dev's iftype updated.
319155682965SJohannes Berg  *
319241ade00fSJohannes Berg  * @add_key: add a key with the given parameters. @mac_addr will be %NULL
319341ade00fSJohannes Berg  *	when adding a group key.
319441ade00fSJohannes Berg  *
319541ade00fSJohannes Berg  * @get_key: get information about the key with the given parameters.
319641ade00fSJohannes Berg  *	@mac_addr will be %NULL when requesting information for a group
319741ade00fSJohannes Berg  *	key. All pointers given to the @callback function need not be valid
3198e3da574aSJohannes Berg  *	after it returns. This function should return an error if it is
3199e3da574aSJohannes Berg  *	not possible to retrieve the key, -ENOENT if it doesn't exist.
320041ade00fSJohannes Berg  *
320141ade00fSJohannes Berg  * @del_key: remove a key given the @mac_addr (%NULL for a group key)
3202e3da574aSJohannes Berg  *	and @key_index, return -ENOENT if the key doesn't exist.
320341ade00fSJohannes Berg  *
320441ade00fSJohannes Berg  * @set_default_key: set the default key on an interface
3205ed1b6cc7SJohannes Berg  *
32063cfcf6acSJouni Malinen  * @set_default_mgmt_key: set the default management frame key on an interface
32073cfcf6acSJouni Malinen  *
3208e5497d76SJohannes Berg  * @set_rekey_data: give the data necessary for GTK rekeying to the driver
3209e5497d76SJohannes Berg  *
3210c04a4ff7SJohannes Berg  * @start_ap: Start acting in AP mode defined by the parameters.
3211c04a4ff7SJohannes Berg  * @change_beacon: Change the beacon parameters for an access point mode
3212c04a4ff7SJohannes Berg  *	interface. This should reject the call when AP mode wasn't started.
3213c04a4ff7SJohannes Berg  * @stop_ap: Stop being an AP, including stopping beaconing.
32145727ef1bSJohannes Berg  *
32155727ef1bSJohannes Berg  * @add_station: Add a new station.
321689c771e5SJouni Malinen  * @del_station: Remove a station
3217bdd90d5eSJohannes Berg  * @change_station: Modify a given station. Note that flags changes are not much
3218bdd90d5eSJohannes Berg  *	validated in cfg80211, in particular the auth/assoc/authorized flags
3219bdd90d5eSJohannes Berg  *	might come to the driver in invalid combinations -- make sure to check
322077ee7c89SJohannes Berg  *	them, also against the existing state! Drivers must call
322177ee7c89SJohannes Berg  *	cfg80211_check_station_change() to validate the information.
3222abe37c4bSJohannes Berg  * @get_station: get station information for the station identified by @mac
3223abe37c4bSJohannes Berg  * @dump_station: dump station callback -- resume dump at index @idx
3224abe37c4bSJohannes Berg  *
3225abe37c4bSJohannes Berg  * @add_mpath: add a fixed mesh path
3226abe37c4bSJohannes Berg  * @del_mpath: delete a given mesh path
3227abe37c4bSJohannes Berg  * @change_mpath: change a given mesh path
3228abe37c4bSJohannes Berg  * @get_mpath: get a mesh path for the given parameters
3229abe37c4bSJohannes Berg  * @dump_mpath: dump mesh path callback -- resume dump at index @idx
323066be7d2bSHenning Rogge  * @get_mpp: get a mesh proxy path for the given parameters
323166be7d2bSHenning Rogge  * @dump_mpp: dump mesh proxy path callback -- resume dump at index @idx
3232f52555a4SJohannes Berg  * @join_mesh: join the mesh network with the specified parameters
32338d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
3234f52555a4SJohannes Berg  * @leave_mesh: leave the current mesh network
32358d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
32362ec600d6SLuis Carlos Cobo  *
323724bdd9f4SJavier Cardona  * @get_mesh_config: Get the current mesh configuration
323893da9cc1Scolin@cozybit.com  *
323924bdd9f4SJavier Cardona  * @update_mesh_config: Update mesh parameters on a running mesh.
324093da9cc1Scolin@cozybit.com  *	The mask is a bitfield which tells us which parameters to
324193da9cc1Scolin@cozybit.com  *	set, and which to leave alone.
324293da9cc1Scolin@cozybit.com  *
32439f1ba906SJouni Malinen  * @change_bss: Modify parameters for a given BSS.
324431888487SJouni Malinen  *
324531888487SJouni Malinen  * @set_txq_params: Set TX queue parameters
324672bdcf34SJouni Malinen  *
3247e8c9bd5bSJohannes Berg  * @libertas_set_mesh_channel: Only for backward compatibility for libertas,
3248e8c9bd5bSJohannes Berg  *	as it doesn't implement join_mesh and needs to set the channel to
3249e8c9bd5bSJohannes Berg  *	join the mesh instead.
3250e8c9bd5bSJohannes Berg  *
3251e8c9bd5bSJohannes Berg  * @set_monitor_channel: Set the monitor mode channel for the device. If other
3252e8c9bd5bSJohannes Berg  *	interfaces are active this callback should reject the configuration.
3253e8c9bd5bSJohannes Berg  *	If no interfaces are active or the device is down, the channel should
3254e8c9bd5bSJohannes Berg  *	be stored for when a monitor interface becomes active.
32559aed3cc1SJouni Malinen  *
32562a519311SJohannes Berg  * @scan: Request to do a scan. If returning zero, the scan request is given
32572a519311SJohannes Berg  *	the driver, and will be valid until passed to cfg80211_scan_done().
32582a519311SJohannes Berg  *	For scan results, call cfg80211_inform_bss(); you can call this outside
32592a519311SJohannes Berg  *	the scan/scan_done bracket too.
326091d3ab46SVidyullatha Kanchanapally  * @abort_scan: Tell the driver to abort an ongoing scan. The driver shall
326191d3ab46SVidyullatha Kanchanapally  *	indicate the status of the scan through cfg80211_scan_done().
3262636a5d36SJouni Malinen  *
3263636a5d36SJouni Malinen  * @auth: Request to authenticate with the specified peer
32648d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
3265636a5d36SJouni Malinen  * @assoc: Request to (re)associate with the specified peer
32668d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
3267636a5d36SJouni Malinen  * @deauth: Request to deauthenticate from the specified peer
32688d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
3269636a5d36SJouni Malinen  * @disassoc: Request to disassociate from the specified peer
32708d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
327104a773adSJohannes Berg  *
3272b23aa676SSamuel Ortiz  * @connect: Connect to the ESS with the specified parameters. When connected,
3273bf1ecd21SJouni Malinen  *	call cfg80211_connect_result()/cfg80211_connect_bss() with status code
3274bf1ecd21SJouni Malinen  *	%WLAN_STATUS_SUCCESS. If the connection fails for some reason, call
3275bf1ecd21SJouni Malinen  *	cfg80211_connect_result()/cfg80211_connect_bss() with the status code
3276bf1ecd21SJouni Malinen  *	from the AP or cfg80211_connect_timeout() if no frame with status code
3277bf1ecd21SJouni Malinen  *	was received.
3278bf1ecd21SJouni Malinen  *	The driver is allowed to roam to other BSSes within the ESS when the
3279bf1ecd21SJouni Malinen  *	other BSS matches the connect parameters. When such roaming is initiated
3280bf1ecd21SJouni Malinen  *	by the driver, the driver is expected to verify that the target matches
3281bf1ecd21SJouni Malinen  *	the configured security parameters and to use Reassociation Request
3282bf1ecd21SJouni Malinen  *	frame instead of Association Request frame.
3283bf1ecd21SJouni Malinen  *	The connect function can also be used to request the driver to perform a
3284bf1ecd21SJouni Malinen  *	specific roam when connected to an ESS. In that case, the prev_bssid
328535eb8f7bSJouni Malinen  *	parameter is set to the BSSID of the currently associated BSS as an
3286bf1ecd21SJouni Malinen  *	indication of requesting reassociation.
3287bf1ecd21SJouni Malinen  *	In both the driver-initiated and new connect() call initiated roaming
3288bf1ecd21SJouni Malinen  *	cases, the result of roaming is indicated with a call to
328929ce6ecbSAvraham Stern  *	cfg80211_roamed(). (invoked with the wireless_dev mutex held)
3290088e8df8Svamsi krishna  * @update_connect_params: Update the connect parameters while connected to a
3291088e8df8Svamsi krishna  *	BSS. The updated parameters can be used by driver/firmware for
3292088e8df8Svamsi krishna  *	subsequent BSS selection (roaming) decisions and to form the
3293088e8df8Svamsi krishna  *	Authentication/(Re)Association Request frames. This call does not
3294088e8df8Svamsi krishna  *	request an immediate disassociation or reassociation with the current
3295088e8df8Svamsi krishna  *	BSS, i.e., this impacts only subsequent (re)associations. The bits in
3296088e8df8Svamsi krishna  *	changed are defined in &enum cfg80211_connect_params_changed.
3297088e8df8Svamsi krishna  *	(invoked with the wireless_dev mutex held)
32980711d638SIlan Peer  * @disconnect: Disconnect from the BSS/ESS or stop connection attempts if
32990711d638SIlan Peer  *      connection is in progress. Once done, call cfg80211_disconnected() in
33000711d638SIlan Peer  *      case connection was already established (invoked with the
33010711d638SIlan Peer  *      wireless_dev mutex held), otherwise call cfg80211_connect_timeout().
3302b23aa676SSamuel Ortiz  *
330304a773adSJohannes Berg  * @join_ibss: Join the specified IBSS (or create if necessary). Once done, call
330404a773adSJohannes Berg  *	cfg80211_ibss_joined(), also call that function when changing BSSID due
330504a773adSJohannes Berg  *	to a merge.
33068d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
330704a773adSJohannes Berg  * @leave_ibss: Leave the IBSS.
33088d61ffa5SJohannes Berg  *	(invoked with the wireless_dev mutex held)
3309b9a5f8caSJouni Malinen  *
3310f4e583c8SAntonio Quartulli  * @set_mcast_rate: Set the specified multicast rate (only if vif is in ADHOC or
3311f4e583c8SAntonio Quartulli  *	MESH mode)
3312f4e583c8SAntonio Quartulli  *
3313b9a5f8caSJouni Malinen  * @set_wiphy_params: Notify that wiphy parameters have changed;
3314b9a5f8caSJouni Malinen  *	@changed bitfield (see &enum wiphy_params_flags) describes which values
3315b9a5f8caSJouni Malinen  *	have changed. The actual parameter values are available in
3316b9a5f8caSJouni Malinen  *	struct wiphy. If returning an error, no value should be changed.
33177643a2c3SJohannes Berg  *
33181432de07SLuis R. Rodriguez  * @set_tx_power: set the transmit power according to the parameters,
3319c8442118SJohannes Berg  *	the power passed is in mBm, to get dBm use MBM_TO_DBM(). The
3320c8442118SJohannes Berg  *	wdev may be %NULL if power was set for the wiphy, and will
3321c8442118SJohannes Berg  *	always be %NULL unless the driver supports per-vif TX power
3322c8442118SJohannes Berg  *	(as advertised by the nl80211 feature flag.)
33237643a2c3SJohannes Berg  * @get_tx_power: store the current TX power into the dbm variable;
33241f87f7d3SJohannes Berg  *	return 0 if successful
33251f87f7d3SJohannes Berg  *
3326abe37c4bSJohannes Berg  * @set_wds_peer: set the WDS peer for a WDS interface
3327abe37c4bSJohannes Berg  *
33281f87f7d3SJohannes Berg  * @rfkill_poll: polls the hw rfkill line, use cfg80211 reporting
33291f87f7d3SJohannes Berg  *	functions to adjust rfkill hw state
3330aff89a9bSJohannes Berg  *
333161fa713cSHolger Schurig  * @dump_survey: get site survey information.
333261fa713cSHolger Schurig  *
33339588bbd5SJouni Malinen  * @remain_on_channel: Request the driver to remain awake on the specified
33349588bbd5SJouni Malinen  *	channel for the specified duration to complete an off-channel
33359588bbd5SJouni Malinen  *	operation (e.g., public action frame exchange). When the driver is
33369588bbd5SJouni Malinen  *	ready on the requested channel, it must indicate this with an event
33379588bbd5SJouni Malinen  *	notification by calling cfg80211_ready_on_channel().
33389588bbd5SJouni Malinen  * @cancel_remain_on_channel: Cancel an on-going remain-on-channel operation.
33399588bbd5SJouni Malinen  *	This allows the operation to be terminated prior to timeout based on
33409588bbd5SJouni Malinen  *	the duration value.
3341f7ca38dfSJohannes Berg  * @mgmt_tx: Transmit a management frame.
3342f7ca38dfSJohannes Berg  * @mgmt_tx_cancel_wait: Cancel the wait time from transmitting a management
3343f7ca38dfSJohannes Berg  *	frame on another channel
33449588bbd5SJouni Malinen  *
3345fc73f11fSDavid Spinadel  * @testmode_cmd: run a test mode command; @wdev may be %NULL
334671063f0eSWey-Yi Guy  * @testmode_dump: Implement a test mode dump. The cb->args[2] and up may be
334771063f0eSWey-Yi Guy  *	used by the function, but 0 and 1 must not be touched. Additionally,
334871063f0eSWey-Yi Guy  *	return error codes other than -ENOBUFS and -ENOENT will terminate the
334971063f0eSWey-Yi Guy  *	dump and return to userspace with an error, so be careful. If any data
335071063f0eSWey-Yi Guy  *	was passed in from userspace then the data/len arguments will be present
335171063f0eSWey-Yi Guy  *	and point to the data contained in %NL80211_ATTR_TESTDATA.
335267fbb16bSSamuel Ortiz  *
3353abe37c4bSJohannes Berg  * @set_bitrate_mask: set the bitrate mask configuration
3354abe37c4bSJohannes Berg  *
335567fbb16bSSamuel Ortiz  * @set_pmksa: Cache a PMKID for a BSSID. This is mostly useful for fullmac
335667fbb16bSSamuel Ortiz  *	devices running firmwares capable of generating the (re) association
335767fbb16bSSamuel Ortiz  *	RSN IE. It allows for faster roaming between WPA2 BSSIDs.
335867fbb16bSSamuel Ortiz  * @del_pmksa: Delete a cached PMKID.
335967fbb16bSSamuel Ortiz  * @flush_pmksa: Flush all cached PMKIDs.
33609043f3b8SJuuso Oikarinen  * @set_power_mgmt: Configure WLAN power management. A timeout value of -1
33619043f3b8SJuuso Oikarinen  *	allows the driver to adjust the dynamic ps timeout value.
3362d6dc1a38SJuuso Oikarinen  * @set_cqm_rssi_config: Configure connection quality monitor RSSI threshold.
3363e86abc68SJohannes Berg  *	After configuration, the driver should (soon) send an event indicating
3364e86abc68SJohannes Berg  *	the current level is above/below the configured threshold; this may
3365e86abc68SJohannes Berg  *	need some care when the configuration is changed (without first being
3366e86abc68SJohannes Berg  *	disabled.)
33674a4b8169SAndrew Zaborowski  * @set_cqm_rssi_range_config: Configure two RSSI thresholds in the
33684a4b8169SAndrew Zaborowski  *	connection quality monitor.  An event is to be sent only when the
33694a4b8169SAndrew Zaborowski  *	signal level is found to be outside the two values.  The driver should
33704a4b8169SAndrew Zaborowski  *	set %NL80211_EXT_FEATURE_CQM_RSSI_LIST if this method is implemented.
33714a4b8169SAndrew Zaborowski  *	If it is provided then there's no point providing @set_cqm_rssi_config.
337284f10708SThomas Pedersen  * @set_cqm_txe_config: Configure connection quality monitor TX error
337384f10708SThomas Pedersen  *	thresholds.
3374807f8a8cSLuciano Coelho  * @sched_scan_start: Tell the driver to start a scheduled scan.
33753a3ecf1dSArend Van Spriel  * @sched_scan_stop: Tell the driver to stop an ongoing scheduled scan with
33763a3ecf1dSArend Van Spriel  *	given request id. This call must stop the scheduled scan and be ready
33773a3ecf1dSArend Van Spriel  *	for starting a new one before it returns, i.e. @sched_scan_start may be
33783a3ecf1dSArend Van Spriel  *	called immediately after that again and should not fail in that case.
33793a3ecf1dSArend Van Spriel  *	The driver should not call cfg80211_sched_scan_stopped() for a requested
33803a3ecf1dSArend Van Spriel  *	stop (when this method returns 0).
338167fbb16bSSamuel Ortiz  *
3382271733cfSJohannes Berg  * @mgmt_frame_register: Notify driver that a management frame type was
338333d8783cSJohannes Berg  *	registered. The callback is allowed to sleep.
3384547025d5SBruno Randolf  *
3385547025d5SBruno Randolf  * @set_antenna: Set antenna configuration (tx_ant, rx_ant) on the device.
3386547025d5SBruno Randolf  *	Parameters are bitmaps of allowed antennas to use for TX/RX. Drivers may
3387547025d5SBruno Randolf  *	reject TX/RX mask combinations they cannot support by returning -EINVAL
3388547025d5SBruno Randolf  *	(also see nl80211.h @NL80211_ATTR_WIPHY_ANTENNA_TX).
3389547025d5SBruno Randolf  *
3390547025d5SBruno Randolf  * @get_antenna: Get current antenna configuration from device (tx_ant, rx_ant).
33913677713bSJohn W. Linville  *
3392109086ceSArik Nemtsov  * @tdls_mgmt: Transmit a TDLS management frame.
3393109086ceSArik Nemtsov  * @tdls_oper: Perform a high-level TDLS operation (e.g. TDLS link setup).
33947f6cf311SJohannes Berg  *
33957f6cf311SJohannes Berg  * @probe_client: probe an associated client, must return a cookie that it
33967f6cf311SJohannes Berg  *	later passes to cfg80211_probe_status().
33971d9d9213SSimon Wunderlich  *
33981d9d9213SSimon Wunderlich  * @set_noack_map: Set the NoAck Map for the TIDs.
3399d6199218SBen Greear  *
34005b7ccaf3SJohannes Berg  * @get_channel: Get the current operating channel for the virtual interface.
34015b7ccaf3SJohannes Berg  *	For monitor interfaces, it should return %NULL unless there's a single
34025b7ccaf3SJohannes Berg  *	current monitoring channel.
340398104fdeSJohannes Berg  *
340498104fdeSJohannes Berg  * @start_p2p_device: Start the given P2P device.
340598104fdeSJohannes Berg  * @stop_p2p_device: Stop the given P2P device.
340677765eafSVasanthakumar Thiagarajan  *
340777765eafSVasanthakumar Thiagarajan  * @set_mac_acl: Sets MAC address control list in AP and P2P GO mode.
340877765eafSVasanthakumar Thiagarajan  *	Parameters include ACL policy, an array of MAC address of stations
340977765eafSVasanthakumar Thiagarajan  *	and the number of MAC addresses. If there is already a list in driver
341077765eafSVasanthakumar Thiagarajan  *	this new list replaces the existing one. Driver has to clear its ACL
341177765eafSVasanthakumar Thiagarajan  *	when number of MAC addresses entries is passed as 0. Drivers which
341277765eafSVasanthakumar Thiagarajan  *	advertise the support for MAC based ACL have to implement this callback.
341304f39047SSimon Wunderlich  *
341404f39047SSimon Wunderlich  * @start_radar_detection: Start radar detection in the driver.
34158bf24293SJouni Malinen  *
34168bf24293SJouni Malinen  * @update_ft_ies: Provide updated Fast BSS Transition information to the
34178bf24293SJouni Malinen  *	driver. If the SME is in the driver/firmware, this information can be
34188bf24293SJouni Malinen  *	used in building Authentication and Reassociation Request frames.
34195de17984SArend van Spriel  *
34205de17984SArend van Spriel  * @crit_proto_start: Indicates a critical protocol needs more link reliability
34215de17984SArend van Spriel  *	for a given duration (milliseconds). The protocol is provided so the
34225de17984SArend van Spriel  *	driver can take the most appropriate actions.
34235de17984SArend van Spriel  * @crit_proto_stop: Indicates critical protocol no longer needs increased link
34245de17984SArend van Spriel  *	reliability. This operation can not fail.
3425be29b99aSAmitkumar Karwar  * @set_coalesce: Set coalesce parameters.
342616ef1fe2SSimon Wunderlich  *
342797dc94f1SMichal Kazior  * @channel_switch: initiate channel-switch procedure (with CSA). Driver is
342897dc94f1SMichal Kazior  *	responsible for veryfing if the switch is possible. Since this is
342997dc94f1SMichal Kazior  *	inherently tricky driver may decide to disconnect an interface later
343097dc94f1SMichal Kazior  *	with cfg80211_stop_iface(). This doesn't mean driver can accept
343197dc94f1SMichal Kazior  *	everything. It should do it's best to verify requests and reject them
343297dc94f1SMichal Kazior  *	as soon as possible.
3433fa9ffc74SKyeyoon Park  *
3434fa9ffc74SKyeyoon Park  * @set_qos_map: Set QoS mapping information to the driver
3435e16821bcSJouni Malinen  *
3436e16821bcSJouni Malinen  * @set_ap_chanwidth: Set the AP (including P2P GO) mode channel width for the
3437e16821bcSJouni Malinen  *	given interface This is used e.g. for dynamic HT 20/40 MHz channel width
3438e16821bcSJouni Malinen  *	changes during the lifetime of the BSS.
3439960d01acSJohannes Berg  *
3440960d01acSJohannes Berg  * @add_tx_ts: validate (if admitted_time is 0) or add a TX TS to the device
3441960d01acSJohannes Berg  *	with the given parameters; action frame exchange has been handled by
3442960d01acSJohannes Berg  *	userspace so this just has to modify the TX path to take the TS into
3443960d01acSJohannes Berg  *	account.
3444960d01acSJohannes Berg  *	If the admitted time is 0 just validate the parameters to make sure
3445960d01acSJohannes Berg  *	the session can be created at all; it is valid to just always return
3446960d01acSJohannes Berg  *	success for that but that may result in inefficient behaviour (handshake
3447960d01acSJohannes Berg  *	with the peer followed by immediate teardown when the addition is later
3448960d01acSJohannes Berg  *	rejected)
3449960d01acSJohannes Berg  * @del_tx_ts: remove an existing TX TS
34506e0bd6c3SRostislav Lisovy  *
34516e0bd6c3SRostislav Lisovy  * @join_ocb: join the OCB network with the specified parameters
34526e0bd6c3SRostislav Lisovy  *	(invoked with the wireless_dev mutex held)
34536e0bd6c3SRostislav Lisovy  * @leave_ocb: leave the current OCB network
34546e0bd6c3SRostislav Lisovy  *	(invoked with the wireless_dev mutex held)
34551057d35eSArik Nemtsov  *
34561057d35eSArik Nemtsov  * @tdls_channel_switch: Start channel-switching with a TDLS peer. The driver
34571057d35eSArik Nemtsov  *	is responsible for continually initiating channel-switching operations
34581057d35eSArik Nemtsov  *	and returning to the base channel for communication with the AP.
34591057d35eSArik Nemtsov  * @tdls_cancel_channel_switch: Stop channel-switching with a TDLS peer. Both
34601057d35eSArik Nemtsov  *	peers must be on the base channel when the call completes.
3461cb3b7d87SAyala Beker  * @start_nan: Start the NAN interface.
3462cb3b7d87SAyala Beker  * @stop_nan: Stop the NAN interface.
3463a442b761SAyala Beker  * @add_nan_func: Add a NAN function. Returns negative value on failure.
3464a442b761SAyala Beker  *	On success @nan_func ownership is transferred to the driver and
3465a442b761SAyala Beker  *	it may access it outside of the scope of this function. The driver
3466a442b761SAyala Beker  *	should free the @nan_func when no longer needed by calling
3467a442b761SAyala Beker  *	cfg80211_free_nan_func().
3468a442b761SAyala Beker  *	On success the driver should assign an instance_id in the
3469a442b761SAyala Beker  *	provided @nan_func.
3470a442b761SAyala Beker  * @del_nan_func: Delete a NAN function.
3471a5a9dcf2SAyala Beker  * @nan_change_conf: changes NAN configuration. The changed parameters must
3472a5a9dcf2SAyala Beker  *	be specified in @changes (using &enum cfg80211_nan_conf_changes);
3473a5a9dcf2SAyala Beker  *	All other parameters must be ignored.
3474ce0ce13aSMichael Braun  *
3475ce0ce13aSMichael Braun  * @set_multicast_to_unicast: configure multicast to unicast conversion for BSS
34763a00df57SAvraham Stern  *
347752539ca8SToke Høiland-Jørgensen  * @get_txq_stats: Get TXQ stats for interface or phy. If wdev is %NULL, this
347852539ca8SToke Høiland-Jørgensen  *      function should return phy stats, and interface stats otherwise.
347952539ca8SToke Høiland-Jørgensen  *
34803a00df57SAvraham Stern  * @set_pmk: configure the PMK to be used for offloaded 802.1X 4-Way handshake.
34813a00df57SAvraham Stern  *	If not deleted through @del_pmk the PMK remains valid until disconnect
34823a00df57SAvraham Stern  *	upon which the driver should clear it.
34833a00df57SAvraham Stern  *	(invoked with the wireless_dev mutex held)
34843a00df57SAvraham Stern  * @del_pmk: delete the previously configured PMK for the given authenticator.
34853a00df57SAvraham Stern  *	(invoked with the wireless_dev mutex held)
348640cbfa90SSrinivas Dasari  *
348740cbfa90SSrinivas Dasari  * @external_auth: indicates result of offloaded authentication processing from
348840cbfa90SSrinivas Dasari  *     user space
34892576a9acSDenis Kenzior  *
34902576a9acSDenis Kenzior  * @tx_control_port: TX a control port frame (EAPoL).  The noencrypt parameter
34912576a9acSDenis Kenzior  *	tells the driver that the frame should not be encrypted.
349281e54d08SPradeep Kumar Chitrapu  *
349381e54d08SPradeep Kumar Chitrapu  * @get_ftm_responder_stats: Retrieve FTM responder statistics, if available.
349481e54d08SPradeep Kumar Chitrapu  *	Statistics should be cumulative, currently no way to reset is provided.
34959bb7e0f2SJohannes Berg  * @start_pmsr: start peer measurement (e.g. FTM)
34969bb7e0f2SJohannes Berg  * @abort_pmsr: abort peer measurement
3497cb74e977SSunil Dutt  *
3498cb74e977SSunil Dutt  * @update_owe_info: Provide updated OWE info to driver. Driver implementing SME
3499cb74e977SSunil Dutt  *	but offloading OWE processing to the user space will get the updated
3500cb74e977SSunil Dutt  *	DH IE through this interface.
35015ab92e7fSRajkumar Manoharan  *
35025ab92e7fSRajkumar Manoharan  * @probe_mesh_link: Probe direct Mesh peer's link quality by sending data frame
35035ab92e7fSRajkumar Manoharan  *	and overrule HWMP path selection algorithm.
3504704232c2SJohannes Berg  */
3505704232c2SJohannes Berg struct cfg80211_ops {
3506ff1b6e69SJohannes Berg 	int	(*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow);
35070378b3f1SJohannes Berg 	int	(*resume)(struct wiphy *wiphy);
35086d52563fSJohannes Berg 	void	(*set_wakeup)(struct wiphy *wiphy, bool enabled);
35090378b3f1SJohannes Berg 
351084efbb84SJohannes Berg 	struct wireless_dev * (*add_virtual_intf)(struct wiphy *wiphy,
3511552bff0cSJohannes Berg 						  const char *name,
35126bab2e19STom Gundersen 						  unsigned char name_assign_type,
3513f9e10ce4SJohannes Berg 						  enum nl80211_iftype type,
35142ec600d6SLuis Carlos Cobo 						  struct vif_params *params);
351584efbb84SJohannes Berg 	int	(*del_virtual_intf)(struct wiphy *wiphy,
351684efbb84SJohannes Berg 				    struct wireless_dev *wdev);
3517e36d56b6SJohannes Berg 	int	(*change_virtual_intf)(struct wiphy *wiphy,
3518e36d56b6SJohannes Berg 				       struct net_device *dev,
3519818a986eSJohannes Berg 				       enum nl80211_iftype type,
35202ec600d6SLuis Carlos Cobo 				       struct vif_params *params);
352141ade00fSJohannes Berg 
352241ade00fSJohannes Berg 	int	(*add_key)(struct wiphy *wiphy, struct net_device *netdev,
3523e31b8213SJohannes Berg 			   u8 key_index, bool pairwise, const u8 *mac_addr,
352441ade00fSJohannes Berg 			   struct key_params *params);
352541ade00fSJohannes Berg 	int	(*get_key)(struct wiphy *wiphy, struct net_device *netdev,
3526e31b8213SJohannes Berg 			   u8 key_index, bool pairwise, const u8 *mac_addr,
3527e31b8213SJohannes Berg 			   void *cookie,
352841ade00fSJohannes Berg 			   void (*callback)(void *cookie, struct key_params*));
352941ade00fSJohannes Berg 	int	(*del_key)(struct wiphy *wiphy, struct net_device *netdev,
3530e31b8213SJohannes Berg 			   u8 key_index, bool pairwise, const u8 *mac_addr);
353141ade00fSJohannes Berg 	int	(*set_default_key)(struct wiphy *wiphy,
353241ade00fSJohannes Berg 				   struct net_device *netdev,
3533dbd2fd65SJohannes Berg 				   u8 key_index, bool unicast, bool multicast);
35343cfcf6acSJouni Malinen 	int	(*set_default_mgmt_key)(struct wiphy *wiphy,
35353cfcf6acSJouni Malinen 					struct net_device *netdev,
35363cfcf6acSJouni Malinen 					u8 key_index);
3537ed1b6cc7SJohannes Berg 
35388860020eSJohannes Berg 	int	(*start_ap)(struct wiphy *wiphy, struct net_device *dev,
35398860020eSJohannes Berg 			    struct cfg80211_ap_settings *settings);
35408860020eSJohannes Berg 	int	(*change_beacon)(struct wiphy *wiphy, struct net_device *dev,
35418860020eSJohannes Berg 				 struct cfg80211_beacon_data *info);
35428860020eSJohannes Berg 	int	(*stop_ap)(struct wiphy *wiphy, struct net_device *dev);
35435727ef1bSJohannes Berg 
35445727ef1bSJohannes Berg 
35455727ef1bSJohannes Berg 	int	(*add_station)(struct wiphy *wiphy, struct net_device *dev,
35463b3a0162SJohannes Berg 			       const u8 *mac,
35473b3a0162SJohannes Berg 			       struct station_parameters *params);
35485727ef1bSJohannes Berg 	int	(*del_station)(struct wiphy *wiphy, struct net_device *dev,
354989c771e5SJouni Malinen 			       struct station_del_parameters *params);
35505727ef1bSJohannes Berg 	int	(*change_station)(struct wiphy *wiphy, struct net_device *dev,
35513b3a0162SJohannes Berg 				  const u8 *mac,
35523b3a0162SJohannes Berg 				  struct station_parameters *params);
3553fd5b74dcSJohannes Berg 	int	(*get_station)(struct wiphy *wiphy, struct net_device *dev,
35543b3a0162SJohannes Berg 			       const u8 *mac, struct station_info *sinfo);
35552ec600d6SLuis Carlos Cobo 	int	(*dump_station)(struct wiphy *wiphy, struct net_device *dev,
35562ec600d6SLuis Carlos Cobo 				int idx, u8 *mac, struct station_info *sinfo);
35572ec600d6SLuis Carlos Cobo 
35582ec600d6SLuis Carlos Cobo 	int	(*add_mpath)(struct wiphy *wiphy, struct net_device *dev,
35593b3a0162SJohannes Berg 			       const u8 *dst, const u8 *next_hop);
35602ec600d6SLuis Carlos Cobo 	int	(*del_mpath)(struct wiphy *wiphy, struct net_device *dev,
35613b3a0162SJohannes Berg 			       const u8 *dst);
35622ec600d6SLuis Carlos Cobo 	int	(*change_mpath)(struct wiphy *wiphy, struct net_device *dev,
35633b3a0162SJohannes Berg 				  const u8 *dst, const u8 *next_hop);
35642ec600d6SLuis Carlos Cobo 	int	(*get_mpath)(struct wiphy *wiphy, struct net_device *dev,
35653b3a0162SJohannes Berg 			     u8 *dst, u8 *next_hop, struct mpath_info *pinfo);
35662ec600d6SLuis Carlos Cobo 	int	(*dump_mpath)(struct wiphy *wiphy, struct net_device *dev,
35672ec600d6SLuis Carlos Cobo 			      int idx, u8 *dst, u8 *next_hop,
35682ec600d6SLuis Carlos Cobo 			      struct mpath_info *pinfo);
356966be7d2bSHenning Rogge 	int	(*get_mpp)(struct wiphy *wiphy, struct net_device *dev,
357066be7d2bSHenning Rogge 			   u8 *dst, u8 *mpp, struct mpath_info *pinfo);
357166be7d2bSHenning Rogge 	int	(*dump_mpp)(struct wiphy *wiphy, struct net_device *dev,
357266be7d2bSHenning Rogge 			    int idx, u8 *dst, u8 *mpp,
357366be7d2bSHenning Rogge 			    struct mpath_info *pinfo);
357424bdd9f4SJavier Cardona 	int	(*get_mesh_config)(struct wiphy *wiphy,
357593da9cc1Scolin@cozybit.com 				struct net_device *dev,
357693da9cc1Scolin@cozybit.com 				struct mesh_config *conf);
357724bdd9f4SJavier Cardona 	int	(*update_mesh_config)(struct wiphy *wiphy,
357829cbe68cSJohannes Berg 				      struct net_device *dev, u32 mask,
357929cbe68cSJohannes Berg 				      const struct mesh_config *nconf);
358029cbe68cSJohannes Berg 	int	(*join_mesh)(struct wiphy *wiphy, struct net_device *dev,
358129cbe68cSJohannes Berg 			     const struct mesh_config *conf,
358229cbe68cSJohannes Berg 			     const struct mesh_setup *setup);
358329cbe68cSJohannes Berg 	int	(*leave_mesh)(struct wiphy *wiphy, struct net_device *dev);
358429cbe68cSJohannes Berg 
35856e0bd6c3SRostislav Lisovy 	int	(*join_ocb)(struct wiphy *wiphy, struct net_device *dev,
35866e0bd6c3SRostislav Lisovy 			    struct ocb_setup *setup);
35876e0bd6c3SRostislav Lisovy 	int	(*leave_ocb)(struct wiphy *wiphy, struct net_device *dev);
35886e0bd6c3SRostislav Lisovy 
35899f1ba906SJouni Malinen 	int	(*change_bss)(struct wiphy *wiphy, struct net_device *dev,
35909f1ba906SJouni Malinen 			      struct bss_parameters *params);
359131888487SJouni Malinen 
3592f70f01c2SEliad Peller 	int	(*set_txq_params)(struct wiphy *wiphy, struct net_device *dev,
359331888487SJouni Malinen 				  struct ieee80211_txq_params *params);
359472bdcf34SJouni Malinen 
3595e8c9bd5bSJohannes Berg 	int	(*libertas_set_mesh_channel)(struct wiphy *wiphy,
3596e8c9bd5bSJohannes Berg 					     struct net_device *dev,
3597e8c9bd5bSJohannes Berg 					     struct ieee80211_channel *chan);
3598e8c9bd5bSJohannes Berg 
3599e8c9bd5bSJohannes Berg 	int	(*set_monitor_channel)(struct wiphy *wiphy,
3600683b6d3bSJohannes Berg 				       struct cfg80211_chan_def *chandef);
36019aed3cc1SJouni Malinen 
3602fd014284SJohannes Berg 	int	(*scan)(struct wiphy *wiphy,
36032a519311SJohannes Berg 			struct cfg80211_scan_request *request);
360491d3ab46SVidyullatha Kanchanapally 	void	(*abort_scan)(struct wiphy *wiphy, struct wireless_dev *wdev);
3605636a5d36SJouni Malinen 
3606636a5d36SJouni Malinen 	int	(*auth)(struct wiphy *wiphy, struct net_device *dev,
3607636a5d36SJouni Malinen 			struct cfg80211_auth_request *req);
3608636a5d36SJouni Malinen 	int	(*assoc)(struct wiphy *wiphy, struct net_device *dev,
3609636a5d36SJouni Malinen 			 struct cfg80211_assoc_request *req);
3610636a5d36SJouni Malinen 	int	(*deauth)(struct wiphy *wiphy, struct net_device *dev,
361163c9c5e7SJohannes Berg 			  struct cfg80211_deauth_request *req);
3612636a5d36SJouni Malinen 	int	(*disassoc)(struct wiphy *wiphy, struct net_device *dev,
361363c9c5e7SJohannes Berg 			    struct cfg80211_disassoc_request *req);
361404a773adSJohannes Berg 
3615b23aa676SSamuel Ortiz 	int	(*connect)(struct wiphy *wiphy, struct net_device *dev,
3616b23aa676SSamuel Ortiz 			   struct cfg80211_connect_params *sme);
3617088e8df8Svamsi krishna 	int	(*update_connect_params)(struct wiphy *wiphy,
3618088e8df8Svamsi krishna 					 struct net_device *dev,
3619088e8df8Svamsi krishna 					 struct cfg80211_connect_params *sme,
3620088e8df8Svamsi krishna 					 u32 changed);
3621b23aa676SSamuel Ortiz 	int	(*disconnect)(struct wiphy *wiphy, struct net_device *dev,
3622b23aa676SSamuel Ortiz 			      u16 reason_code);
3623b23aa676SSamuel Ortiz 
362404a773adSJohannes Berg 	int	(*join_ibss)(struct wiphy *wiphy, struct net_device *dev,
362504a773adSJohannes Berg 			     struct cfg80211_ibss_params *params);
362604a773adSJohannes Berg 	int	(*leave_ibss)(struct wiphy *wiphy, struct net_device *dev);
3627b9a5f8caSJouni Malinen 
3628f4e583c8SAntonio Quartulli 	int	(*set_mcast_rate)(struct wiphy *wiphy, struct net_device *dev,
362957fbcce3SJohannes Berg 				  int rate[NUM_NL80211_BANDS]);
3630f4e583c8SAntonio Quartulli 
3631b9a5f8caSJouni Malinen 	int	(*set_wiphy_params)(struct wiphy *wiphy, u32 changed);
36327643a2c3SJohannes Berg 
3633c8442118SJohannes Berg 	int	(*set_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
3634fa61cf70SJuuso Oikarinen 				enum nl80211_tx_power_setting type, int mbm);
3635c8442118SJohannes Berg 	int	(*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
3636c8442118SJohannes Berg 				int *dbm);
36371f87f7d3SJohannes Berg 
3638ab737a4fSJohannes Berg 	int	(*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev,
3639388ac775SJohannes Berg 				const u8 *addr);
3640ab737a4fSJohannes Berg 
36411f87f7d3SJohannes Berg 	void	(*rfkill_poll)(struct wiphy *wiphy);
3642aff89a9bSJohannes Berg 
3643aff89a9bSJohannes Berg #ifdef CONFIG_NL80211_TESTMODE
3644fc73f11fSDavid Spinadel 	int	(*testmode_cmd)(struct wiphy *wiphy, struct wireless_dev *wdev,
3645fc73f11fSDavid Spinadel 				void *data, int len);
364671063f0eSWey-Yi Guy 	int	(*testmode_dump)(struct wiphy *wiphy, struct sk_buff *skb,
364771063f0eSWey-Yi Guy 				 struct netlink_callback *cb,
364871063f0eSWey-Yi Guy 				 void *data, int len);
3649aff89a9bSJohannes Berg #endif
3650bc92afd9SJohannes Berg 
36519930380fSJohannes Berg 	int	(*set_bitrate_mask)(struct wiphy *wiphy,
36529930380fSJohannes Berg 				    struct net_device *dev,
36539930380fSJohannes Berg 				    const u8 *peer,
36549930380fSJohannes Berg 				    const struct cfg80211_bitrate_mask *mask);
36559930380fSJohannes Berg 
365661fa713cSHolger Schurig 	int	(*dump_survey)(struct wiphy *wiphy, struct net_device *netdev,
365761fa713cSHolger Schurig 			int idx, struct survey_info *info);
365861fa713cSHolger Schurig 
365967fbb16bSSamuel Ortiz 	int	(*set_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
366067fbb16bSSamuel Ortiz 			     struct cfg80211_pmksa *pmksa);
366167fbb16bSSamuel Ortiz 	int	(*del_pmksa)(struct wiphy *wiphy, struct net_device *netdev,
366267fbb16bSSamuel Ortiz 			     struct cfg80211_pmksa *pmksa);
366367fbb16bSSamuel Ortiz 	int	(*flush_pmksa)(struct wiphy *wiphy, struct net_device *netdev);
366467fbb16bSSamuel Ortiz 
36659588bbd5SJouni Malinen 	int	(*remain_on_channel)(struct wiphy *wiphy,
366671bbc994SJohannes Berg 				     struct wireless_dev *wdev,
36679588bbd5SJouni Malinen 				     struct ieee80211_channel *chan,
36689588bbd5SJouni Malinen 				     unsigned int duration,
36699588bbd5SJouni Malinen 				     u64 *cookie);
36709588bbd5SJouni Malinen 	int	(*cancel_remain_on_channel)(struct wiphy *wiphy,
367171bbc994SJohannes Berg 					    struct wireless_dev *wdev,
36729588bbd5SJouni Malinen 					    u64 cookie);
36739588bbd5SJouni Malinen 
367471bbc994SJohannes Berg 	int	(*mgmt_tx)(struct wiphy *wiphy, struct wireless_dev *wdev,
3675b176e629SAndrei Otcheretianski 			   struct cfg80211_mgmt_tx_params *params,
3676b176e629SAndrei Otcheretianski 			   u64 *cookie);
3677f7ca38dfSJohannes Berg 	int	(*mgmt_tx_cancel_wait)(struct wiphy *wiphy,
367871bbc994SJohannes Berg 				       struct wireless_dev *wdev,
3679f7ca38dfSJohannes Berg 				       u64 cookie);
3680026331c4SJouni Malinen 
3681bc92afd9SJohannes Berg 	int	(*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,
3682bc92afd9SJohannes Berg 				  bool enabled, int timeout);
3683d6dc1a38SJuuso Oikarinen 
3684d6dc1a38SJuuso Oikarinen 	int	(*set_cqm_rssi_config)(struct wiphy *wiphy,
3685d6dc1a38SJuuso Oikarinen 				       struct net_device *dev,
3686d6dc1a38SJuuso Oikarinen 				       s32 rssi_thold, u32 rssi_hyst);
3687271733cfSJohannes Berg 
36884a4b8169SAndrew Zaborowski 	int	(*set_cqm_rssi_range_config)(struct wiphy *wiphy,
36894a4b8169SAndrew Zaborowski 					     struct net_device *dev,
36904a4b8169SAndrew Zaborowski 					     s32 rssi_low, s32 rssi_high);
36914a4b8169SAndrew Zaborowski 
369284f10708SThomas Pedersen 	int	(*set_cqm_txe_config)(struct wiphy *wiphy,
369384f10708SThomas Pedersen 				      struct net_device *dev,
369484f10708SThomas Pedersen 				      u32 rate, u32 pkts, u32 intvl);
369584f10708SThomas Pedersen 
3696271733cfSJohannes Berg 	void	(*mgmt_frame_register)(struct wiphy *wiphy,
369771bbc994SJohannes Berg 				       struct wireless_dev *wdev,
3698271733cfSJohannes Berg 				       u16 frame_type, bool reg);
3699afe0cbf8SBruno Randolf 
3700afe0cbf8SBruno Randolf 	int	(*set_antenna)(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant);
3701afe0cbf8SBruno Randolf 	int	(*get_antenna)(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant);
37023677713bSJohn W. Linville 
3703807f8a8cSLuciano Coelho 	int	(*sched_scan_start)(struct wiphy *wiphy,
3704807f8a8cSLuciano Coelho 				struct net_device *dev,
3705807f8a8cSLuciano Coelho 				struct cfg80211_sched_scan_request *request);
37063a3ecf1dSArend Van Spriel 	int	(*sched_scan_stop)(struct wiphy *wiphy, struct net_device *dev,
37073a3ecf1dSArend Van Spriel 				   u64 reqid);
3708e5497d76SJohannes Berg 
3709e5497d76SJohannes Berg 	int	(*set_rekey_data)(struct wiphy *wiphy, struct net_device *dev,
3710e5497d76SJohannes Berg 				  struct cfg80211_gtk_rekey_data *data);
3711109086ceSArik Nemtsov 
3712109086ceSArik Nemtsov 	int	(*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,
37133b3a0162SJohannes Berg 			     const u8 *peer, u8 action_code,  u8 dialog_token,
3714df942e7bSSunil Dutt Undekari 			     u16 status_code, u32 peer_capability,
371531fa97c5SArik Nemtsov 			     bool initiator, const u8 *buf, size_t len);
3716109086ceSArik Nemtsov 	int	(*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,
37173b3a0162SJohannes Berg 			     const u8 *peer, enum nl80211_tdls_operation oper);
37187f6cf311SJohannes Berg 
37197f6cf311SJohannes Berg 	int	(*probe_client)(struct wiphy *wiphy, struct net_device *dev,
37207f6cf311SJohannes Berg 				const u8 *peer, u64 *cookie);
3721e999882aSJohannes Berg 
37221d9d9213SSimon Wunderlich 	int	(*set_noack_map)(struct wiphy *wiphy,
37231d9d9213SSimon Wunderlich 				  struct net_device *dev,
37241d9d9213SSimon Wunderlich 				  u16 noack_map);
37251d9d9213SSimon Wunderlich 
3726683b6d3bSJohannes Berg 	int	(*get_channel)(struct wiphy *wiphy,
37275b7ccaf3SJohannes Berg 			       struct wireless_dev *wdev,
3728683b6d3bSJohannes Berg 			       struct cfg80211_chan_def *chandef);
372998104fdeSJohannes Berg 
373098104fdeSJohannes Berg 	int	(*start_p2p_device)(struct wiphy *wiphy,
373198104fdeSJohannes Berg 				    struct wireless_dev *wdev);
373298104fdeSJohannes Berg 	void	(*stop_p2p_device)(struct wiphy *wiphy,
373398104fdeSJohannes Berg 				   struct wireless_dev *wdev);
373477765eafSVasanthakumar Thiagarajan 
373577765eafSVasanthakumar Thiagarajan 	int	(*set_mac_acl)(struct wiphy *wiphy, struct net_device *dev,
373677765eafSVasanthakumar Thiagarajan 			       const struct cfg80211_acl_data *params);
373704f39047SSimon Wunderlich 
373804f39047SSimon Wunderlich 	int	(*start_radar_detection)(struct wiphy *wiphy,
373904f39047SSimon Wunderlich 					 struct net_device *dev,
374031559f35SJanusz Dziedzic 					 struct cfg80211_chan_def *chandef,
374131559f35SJanusz Dziedzic 					 u32 cac_time_ms);
3742355199e0SJouni Malinen 	int	(*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
3743355199e0SJouni Malinen 				 struct cfg80211_update_ft_ies_params *ftie);
37445de17984SArend van Spriel 	int	(*crit_proto_start)(struct wiphy *wiphy,
37455de17984SArend van Spriel 				    struct wireless_dev *wdev,
37465de17984SArend van Spriel 				    enum nl80211_crit_proto_id protocol,
37475de17984SArend van Spriel 				    u16 duration);
37485de17984SArend van Spriel 	void	(*crit_proto_stop)(struct wiphy *wiphy,
37495de17984SArend van Spriel 				   struct wireless_dev *wdev);
3750be29b99aSAmitkumar Karwar 	int	(*set_coalesce)(struct wiphy *wiphy,
3751be29b99aSAmitkumar Karwar 				struct cfg80211_coalesce *coalesce);
375216ef1fe2SSimon Wunderlich 
375316ef1fe2SSimon Wunderlich 	int	(*channel_switch)(struct wiphy *wiphy,
375416ef1fe2SSimon Wunderlich 				  struct net_device *dev,
375516ef1fe2SSimon Wunderlich 				  struct cfg80211_csa_settings *params);
3756e16821bcSJouni Malinen 
3757fa9ffc74SKyeyoon Park 	int     (*set_qos_map)(struct wiphy *wiphy,
3758fa9ffc74SKyeyoon Park 			       struct net_device *dev,
3759fa9ffc74SKyeyoon Park 			       struct cfg80211_qos_map *qos_map);
3760e16821bcSJouni Malinen 
3761e16821bcSJouni Malinen 	int	(*set_ap_chanwidth)(struct wiphy *wiphy, struct net_device *dev,
3762e16821bcSJouni Malinen 				    struct cfg80211_chan_def *chandef);
3763960d01acSJohannes Berg 
3764960d01acSJohannes Berg 	int	(*add_tx_ts)(struct wiphy *wiphy, struct net_device *dev,
3765960d01acSJohannes Berg 			     u8 tsid, const u8 *peer, u8 user_prio,
3766960d01acSJohannes Berg 			     u16 admitted_time);
3767960d01acSJohannes Berg 	int	(*del_tx_ts)(struct wiphy *wiphy, struct net_device *dev,
3768960d01acSJohannes Berg 			     u8 tsid, const u8 *peer);
37691057d35eSArik Nemtsov 
37701057d35eSArik Nemtsov 	int	(*tdls_channel_switch)(struct wiphy *wiphy,
37711057d35eSArik Nemtsov 				       struct net_device *dev,
37721057d35eSArik Nemtsov 				       const u8 *addr, u8 oper_class,
37731057d35eSArik Nemtsov 				       struct cfg80211_chan_def *chandef);
37741057d35eSArik Nemtsov 	void	(*tdls_cancel_channel_switch)(struct wiphy *wiphy,
37751057d35eSArik Nemtsov 					      struct net_device *dev,
37761057d35eSArik Nemtsov 					      const u8 *addr);
3777cb3b7d87SAyala Beker 	int	(*start_nan)(struct wiphy *wiphy, struct wireless_dev *wdev,
3778cb3b7d87SAyala Beker 			     struct cfg80211_nan_conf *conf);
3779cb3b7d87SAyala Beker 	void	(*stop_nan)(struct wiphy *wiphy, struct wireless_dev *wdev);
3780a442b761SAyala Beker 	int	(*add_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
3781a442b761SAyala Beker 				struct cfg80211_nan_func *nan_func);
3782a442b761SAyala Beker 	void	(*del_nan_func)(struct wiphy *wiphy, struct wireless_dev *wdev,
3783a442b761SAyala Beker 			       u64 cookie);
3784a5a9dcf2SAyala Beker 	int	(*nan_change_conf)(struct wiphy *wiphy,
3785a5a9dcf2SAyala Beker 				   struct wireless_dev *wdev,
3786a5a9dcf2SAyala Beker 				   struct cfg80211_nan_conf *conf,
3787a5a9dcf2SAyala Beker 				   u32 changes);
3788ce0ce13aSMichael Braun 
3789ce0ce13aSMichael Braun 	int	(*set_multicast_to_unicast)(struct wiphy *wiphy,
3790ce0ce13aSMichael Braun 					    struct net_device *dev,
3791ce0ce13aSMichael Braun 					    const bool enabled);
37923a00df57SAvraham Stern 
379352539ca8SToke Høiland-Jørgensen 	int	(*get_txq_stats)(struct wiphy *wiphy,
379452539ca8SToke Høiland-Jørgensen 				 struct wireless_dev *wdev,
379552539ca8SToke Høiland-Jørgensen 				 struct cfg80211_txq_stats *txqstats);
379652539ca8SToke Høiland-Jørgensen 
37973a00df57SAvraham Stern 	int	(*set_pmk)(struct wiphy *wiphy, struct net_device *dev,
37983a00df57SAvraham Stern 			   const struct cfg80211_pmk_conf *conf);
37993a00df57SAvraham Stern 	int	(*del_pmk)(struct wiphy *wiphy, struct net_device *dev,
38003a00df57SAvraham Stern 			   const u8 *aa);
380140cbfa90SSrinivas Dasari 	int     (*external_auth)(struct wiphy *wiphy, struct net_device *dev,
380240cbfa90SSrinivas Dasari 				 struct cfg80211_external_auth_params *params);
38032576a9acSDenis Kenzior 
38042576a9acSDenis Kenzior 	int	(*tx_control_port)(struct wiphy *wiphy,
38052576a9acSDenis Kenzior 				   struct net_device *dev,
38062576a9acSDenis Kenzior 				   const u8 *buf, size_t len,
38072576a9acSDenis Kenzior 				   const u8 *dest, const __be16 proto,
38082576a9acSDenis Kenzior 				   const bool noencrypt);
380981e54d08SPradeep Kumar Chitrapu 
381081e54d08SPradeep Kumar Chitrapu 	int	(*get_ftm_responder_stats)(struct wiphy *wiphy,
381181e54d08SPradeep Kumar Chitrapu 				struct net_device *dev,
381281e54d08SPradeep Kumar Chitrapu 				struct cfg80211_ftm_responder_stats *ftm_stats);
38139bb7e0f2SJohannes Berg 
38149bb7e0f2SJohannes Berg 	int	(*start_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
38159bb7e0f2SJohannes Berg 			      struct cfg80211_pmsr_request *request);
38169bb7e0f2SJohannes Berg 	void	(*abort_pmsr)(struct wiphy *wiphy, struct wireless_dev *wdev,
38179bb7e0f2SJohannes Berg 			      struct cfg80211_pmsr_request *request);
3818cb74e977SSunil Dutt 	int	(*update_owe_info)(struct wiphy *wiphy, struct net_device *dev,
3819cb74e977SSunil Dutt 				   struct cfg80211_update_owe_info *owe_info);
38205ab92e7fSRajkumar Manoharan 	int	(*probe_mesh_link)(struct wiphy *wiphy, struct net_device *dev,
38215ab92e7fSRajkumar Manoharan 				   const u8 *buf, size_t len);
3822704232c2SJohannes Berg };
3823704232c2SJohannes Berg 
3824d3236553SJohannes Berg /*
3825d3236553SJohannes Berg  * wireless hardware and networking interfaces structures
3826d3236553SJohannes Berg  * and registration/helper functions
3827d3236553SJohannes Berg  */
3828d3236553SJohannes Berg 
3829d3236553SJohannes Berg /**
38305be83de5SJohannes Berg  * enum wiphy_flags - wiphy capability flags
38315be83de5SJohannes Berg  *
38325be83de5SJohannes Berg  * @WIPHY_FLAG_NETNS_OK: if not set, do not allow changing the netns of this
38335be83de5SJohannes Berg  *	wiphy at all
38345be83de5SJohannes Berg  * @WIPHY_FLAG_PS_ON_BY_DEFAULT: if set to true, powersave will be enabled
38355be83de5SJohannes Berg  *	by default -- this flag will be set depending on the kernel's default
38365be83de5SJohannes Berg  *	on wiphy_new(), but can be changed by the driver if it has a good
38375be83de5SJohannes Berg  *	reason to override the default
38389bc383deSJohannes Berg  * @WIPHY_FLAG_4ADDR_AP: supports 4addr mode even on AP (with a single station
38399bc383deSJohannes Berg  *	on a VLAN interface)
38409bc383deSJohannes Berg  * @WIPHY_FLAG_4ADDR_STATION: supports 4addr mode even as a station
3841c0692b8fSJohannes Berg  * @WIPHY_FLAG_CONTROL_PORT_PROTOCOL: This device supports setting the
3842c0692b8fSJohannes Berg  *	control port protocol ethertype. The device also honours the
3843c0692b8fSJohannes Berg  *	control_port_no_encrypt flag.
3844e31b8213SJohannes Berg  * @WIPHY_FLAG_IBSS_RSN: The device supports IBSS RSN.
384515d5dda6SJavier Cardona  * @WIPHY_FLAG_MESH_AUTH: The device supports mesh authentication by routing
384615d5dda6SJavier Cardona  *	auth frames to userspace. See @NL80211_MESH_SETUP_USERSPACE_AUTH.
3847f4b34b55SVivek Natarajan  * @WIPHY_FLAG_SUPPORTS_FW_ROAM: The device supports roaming feature in the
3848f4b34b55SVivek Natarajan  *	firmware.
3849cedb5412SEliad Peller  * @WIPHY_FLAG_AP_UAPSD: The device supports uapsd on AP.
3850109086ceSArik Nemtsov  * @WIPHY_FLAG_SUPPORTS_TDLS: The device supports TDLS (802.11z) operation.
3851109086ceSArik Nemtsov  * @WIPHY_FLAG_TDLS_EXTERNAL_SETUP: The device does not handle TDLS (802.11z)
3852109086ceSArik Nemtsov  *	link setup/discovery operations internally. Setup, discovery and
3853109086ceSArik Nemtsov  *	teardown packets should be sent through the @NL80211_CMD_TDLS_MGMT
3854109086ceSArik Nemtsov  *	command. When this flag is not set, @NL80211_CMD_TDLS_OPER should be
3855109086ceSArik Nemtsov  *	used for asking the driver/firmware to perform a TDLS operation.
3856562a7480SJohannes Berg  * @WIPHY_FLAG_HAVE_AP_SME: device integrates AP SME
38575e760230SJohannes Berg  * @WIPHY_FLAG_REPORTS_OBSS: the device will report beacons from other BSSes
38585e760230SJohannes Berg  *	when there are virtual interfaces in AP mode by calling
38595e760230SJohannes Berg  *	cfg80211_report_obss_beacon().
386087bbbe22SArik Nemtsov  * @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD: When operating as an AP, the device
386187bbbe22SArik Nemtsov  *	responds to probe-requests in hardware.
38627c4ef712SJohannes Berg  * @WIPHY_FLAG_OFFCHAN_TX: Device supports direct off-channel TX.
38637c4ef712SJohannes Berg  * @WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL: Device supports remain-on-channel call.
38642f301ab2SSimon Wunderlich  * @WIPHY_FLAG_SUPPORTS_5_10_MHZ: Device supports 5 MHz and 10 MHz channels.
386516ef1fe2SSimon Wunderlich  * @WIPHY_FLAG_HAS_CHANNEL_SWITCH: Device supports channel switch in
386616ef1fe2SSimon Wunderlich  *	beaconing mode (AP, IBSS, Mesh, ...).
3867b8676221SDavid Spinadel  * @WIPHY_FLAG_HAS_STATIC_WEP: The device supports static WEP key installation
3868b8676221SDavid Spinadel  *	before connection.
38695be83de5SJohannes Berg  */
38705be83de5SJohannes Berg enum wiphy_flags {
3871723e73acSJohannes Berg 	/* use hole at 0 */
3872a2f73b6cSLuis R. Rodriguez 	/* use hole at 1 */
3873a2f73b6cSLuis R. Rodriguez 	/* use hole at 2 */
38745be83de5SJohannes Berg 	WIPHY_FLAG_NETNS_OK			= BIT(3),
38755be83de5SJohannes Berg 	WIPHY_FLAG_PS_ON_BY_DEFAULT		= BIT(4),
38769bc383deSJohannes Berg 	WIPHY_FLAG_4ADDR_AP			= BIT(5),
38779bc383deSJohannes Berg 	WIPHY_FLAG_4ADDR_STATION		= BIT(6),
3878c0692b8fSJohannes Berg 	WIPHY_FLAG_CONTROL_PORT_PROTOCOL	= BIT(7),
3879309075cfSJussi Kivilinna 	WIPHY_FLAG_IBSS_RSN			= BIT(8),
388015d5dda6SJavier Cardona 	WIPHY_FLAG_MESH_AUTH			= BIT(10),
3881ca986ad9SArend Van Spriel 	/* use hole at 11 */
38828e8b41f9SJohannes Berg 	/* use hole at 12 */
3883f4b34b55SVivek Natarajan 	WIPHY_FLAG_SUPPORTS_FW_ROAM		= BIT(13),
3884cedb5412SEliad Peller 	WIPHY_FLAG_AP_UAPSD			= BIT(14),
3885109086ceSArik Nemtsov 	WIPHY_FLAG_SUPPORTS_TDLS		= BIT(15),
3886109086ceSArik Nemtsov 	WIPHY_FLAG_TDLS_EXTERNAL_SETUP		= BIT(16),
3887562a7480SJohannes Berg 	WIPHY_FLAG_HAVE_AP_SME			= BIT(17),
38885e760230SJohannes Berg 	WIPHY_FLAG_REPORTS_OBSS			= BIT(18),
388987bbbe22SArik Nemtsov 	WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD	= BIT(19),
38907c4ef712SJohannes Berg 	WIPHY_FLAG_OFFCHAN_TX			= BIT(20),
38917c4ef712SJohannes Berg 	WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL	= BIT(21),
38922f301ab2SSimon Wunderlich 	WIPHY_FLAG_SUPPORTS_5_10_MHZ		= BIT(22),
389316ef1fe2SSimon Wunderlich 	WIPHY_FLAG_HAS_CHANNEL_SWITCH		= BIT(23),
3894b8676221SDavid Spinadel 	WIPHY_FLAG_HAS_STATIC_WEP		= BIT(24),
38957527a782SJohannes Berg };
38967527a782SJohannes Berg 
38977527a782SJohannes Berg /**
38987527a782SJohannes Berg  * struct ieee80211_iface_limit - limit on certain interface types
38997527a782SJohannes Berg  * @max: maximum number of interfaces of these types
39007527a782SJohannes Berg  * @types: interface types (bits)
39017527a782SJohannes Berg  */
39027527a782SJohannes Berg struct ieee80211_iface_limit {
39037527a782SJohannes Berg 	u16 max;
39047527a782SJohannes Berg 	u16 types;
39057527a782SJohannes Berg };
39067527a782SJohannes Berg 
39077527a782SJohannes Berg /**
39087527a782SJohannes Berg  * struct ieee80211_iface_combination - possible interface combination
39097527a782SJohannes Berg  *
3910b80edbc1SLuciano Coelho  * With this structure the driver can describe which interface
3911b80edbc1SLuciano Coelho  * combinations it supports concurrently.
39127527a782SJohannes Berg  *
3913b80edbc1SLuciano Coelho  * Examples:
3914b80edbc1SLuciano Coelho  *
3915b80edbc1SLuciano Coelho  * 1. Allow #STA <= 1, #AP <= 1, matching BI, channels = 1, 2 total:
39167527a782SJohannes Berg  *
3917819bf593SJohannes Berg  *    .. code-block:: c
3918819bf593SJohannes Berg  *
39197527a782SJohannes Berg  *	struct ieee80211_iface_limit limits1[] = {
39207527a782SJohannes Berg  *		{ .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
39217527a782SJohannes Berg  *		{ .max = 1, .types = BIT(NL80211_IFTYPE_AP}, },
39227527a782SJohannes Berg  *	};
39237527a782SJohannes Berg  *	struct ieee80211_iface_combination combination1 = {
39247527a782SJohannes Berg  *		.limits = limits1,
39257527a782SJohannes Berg  *		.n_limits = ARRAY_SIZE(limits1),
39267527a782SJohannes Berg  *		.max_interfaces = 2,
39277527a782SJohannes Berg  *		.beacon_int_infra_match = true,
39287527a782SJohannes Berg  *	};
39297527a782SJohannes Berg  *
39307527a782SJohannes Berg  *
3931b80edbc1SLuciano Coelho  * 2. Allow #{AP, P2P-GO} <= 8, channels = 1, 8 total:
39327527a782SJohannes Berg  *
3933819bf593SJohannes Berg  *    .. code-block:: c
3934819bf593SJohannes Berg  *
39357527a782SJohannes Berg  *	struct ieee80211_iface_limit limits2[] = {
39367527a782SJohannes Berg  *		{ .max = 8, .types = BIT(NL80211_IFTYPE_AP) |
39377527a782SJohannes Berg  *				     BIT(NL80211_IFTYPE_P2P_GO), },
39387527a782SJohannes Berg  *	};
39397527a782SJohannes Berg  *	struct ieee80211_iface_combination combination2 = {
39407527a782SJohannes Berg  *		.limits = limits2,
39417527a782SJohannes Berg  *		.n_limits = ARRAY_SIZE(limits2),
39427527a782SJohannes Berg  *		.max_interfaces = 8,
39437527a782SJohannes Berg  *		.num_different_channels = 1,
39447527a782SJohannes Berg  *	};
39457527a782SJohannes Berg  *
39467527a782SJohannes Berg  *
3947b80edbc1SLuciano Coelho  * 3. Allow #STA <= 1, #{P2P-client,P2P-GO} <= 3 on two channels, 4 total.
3948b80edbc1SLuciano Coelho  *
39497527a782SJohannes Berg  *    This allows for an infrastructure connection and three P2P connections.
39507527a782SJohannes Berg  *
3951819bf593SJohannes Berg  *    .. code-block:: c
3952819bf593SJohannes Berg  *
39537527a782SJohannes Berg  *	struct ieee80211_iface_limit limits3[] = {
39547527a782SJohannes Berg  *		{ .max = 1, .types = BIT(NL80211_IFTYPE_STATION), },
39557527a782SJohannes Berg  *		{ .max = 3, .types = BIT(NL80211_IFTYPE_P2P_GO) |
39567527a782SJohannes Berg  *				     BIT(NL80211_IFTYPE_P2P_CLIENT), },
39577527a782SJohannes Berg  *	};
39587527a782SJohannes Berg  *	struct ieee80211_iface_combination combination3 = {
39597527a782SJohannes Berg  *		.limits = limits3,
39607527a782SJohannes Berg  *		.n_limits = ARRAY_SIZE(limits3),
39617527a782SJohannes Berg  *		.max_interfaces = 4,
39627527a782SJohannes Berg  *		.num_different_channels = 2,
39637527a782SJohannes Berg  *	};
3964819bf593SJohannes Berg  *
39657527a782SJohannes Berg  */
39667527a782SJohannes Berg struct ieee80211_iface_combination {
3967c6c94aeaSJohannes Berg 	/**
3968c6c94aeaSJohannes Berg 	 * @limits:
3969c6c94aeaSJohannes Berg 	 * limits for the given interface types
3970c6c94aeaSJohannes Berg 	 */
39717527a782SJohannes Berg 	const struct ieee80211_iface_limit *limits;
3972c6c94aeaSJohannes Berg 
3973c6c94aeaSJohannes Berg 	/**
3974c6c94aeaSJohannes Berg 	 * @num_different_channels:
3975c6c94aeaSJohannes Berg 	 * can use up to this many different channels
3976c6c94aeaSJohannes Berg 	 */
39777527a782SJohannes Berg 	u32 num_different_channels;
3978c6c94aeaSJohannes Berg 
3979c6c94aeaSJohannes Berg 	/**
3980c6c94aeaSJohannes Berg 	 * @max_interfaces:
3981c6c94aeaSJohannes Berg 	 * maximum number of interfaces in total allowed in this group
3982c6c94aeaSJohannes Berg 	 */
39837527a782SJohannes Berg 	u16 max_interfaces;
3984c6c94aeaSJohannes Berg 
3985c6c94aeaSJohannes Berg 	/**
3986c6c94aeaSJohannes Berg 	 * @n_limits:
3987c6c94aeaSJohannes Berg 	 * number of limitations
3988c6c94aeaSJohannes Berg 	 */
39897527a782SJohannes Berg 	u8 n_limits;
3990c6c94aeaSJohannes Berg 
3991c6c94aeaSJohannes Berg 	/**
3992c6c94aeaSJohannes Berg 	 * @beacon_int_infra_match:
3993c6c94aeaSJohannes Berg 	 * In this combination, the beacon intervals between infrastructure
3994c6c94aeaSJohannes Berg 	 * and AP types must match. This is required only in special cases.
3995c6c94aeaSJohannes Berg 	 */
39967527a782SJohannes Berg 	bool beacon_int_infra_match;
3997c6c94aeaSJohannes Berg 
3998c6c94aeaSJohannes Berg 	/**
3999c6c94aeaSJohannes Berg 	 * @radar_detect_widths:
4000c6c94aeaSJohannes Berg 	 * bitmap of channel widths supported for radar detection
4001c6c94aeaSJohannes Berg 	 */
400211c4a075SSimon Wunderlich 	u8 radar_detect_widths;
4003c6c94aeaSJohannes Berg 
4004c6c94aeaSJohannes Berg 	/**
4005c6c94aeaSJohannes Berg 	 * @radar_detect_regions:
4006c6c94aeaSJohannes Berg 	 * bitmap of regions supported for radar detection
4007c6c94aeaSJohannes Berg 	 */
40088c48b50aSFelix Fietkau 	u8 radar_detect_regions;
4009c6c94aeaSJohannes Berg 
4010c6c94aeaSJohannes Berg 	/**
4011c6c94aeaSJohannes Berg 	 * @beacon_int_min_gcd:
4012c6c94aeaSJohannes Berg 	 * This interface combination supports different beacon intervals.
4013c6c94aeaSJohannes Berg 	 *
4014c6c94aeaSJohannes Berg 	 * = 0
4015c6c94aeaSJohannes Berg 	 *   all beacon intervals for different interface must be same.
4016c6c94aeaSJohannes Berg 	 * > 0
4017c6c94aeaSJohannes Berg 	 *   any beacon interval for the interface part of this combination AND
4018c6c94aeaSJohannes Berg 	 *   GCD of all beacon intervals from beaconing interfaces of this
4019c6c94aeaSJohannes Berg 	 *   combination must be greater or equal to this value.
4020c6c94aeaSJohannes Berg 	 */
40210c317a02SPurushottam Kushwaha 	u32 beacon_int_min_gcd;
40225be83de5SJohannes Berg };
40235be83de5SJohannes Berg 
40242e161f78SJohannes Berg struct ieee80211_txrx_stypes {
40252e161f78SJohannes Berg 	u16 tx, rx;
40262e161f78SJohannes Berg };
40272e161f78SJohannes Berg 
40285be83de5SJohannes Berg /**
4029ff1b6e69SJohannes Berg  * enum wiphy_wowlan_support_flags - WoWLAN support flags
4030ff1b6e69SJohannes Berg  * @WIPHY_WOWLAN_ANY: supports wakeup for the special "any"
4031ff1b6e69SJohannes Berg  *	trigger that keeps the device operating as-is and
4032ff1b6e69SJohannes Berg  *	wakes up the host on any activity, for example a
4033ff1b6e69SJohannes Berg  *	received packet that passed filtering; note that the
4034ff1b6e69SJohannes Berg  *	packet should be preserved in that case
4035ff1b6e69SJohannes Berg  * @WIPHY_WOWLAN_MAGIC_PKT: supports wakeup on magic packet
4036ff1b6e69SJohannes Berg  *	(see nl80211.h)
4037ff1b6e69SJohannes Berg  * @WIPHY_WOWLAN_DISCONNECT: supports wakeup on disconnect
403877dbbb13SJohannes Berg  * @WIPHY_WOWLAN_SUPPORTS_GTK_REKEY: supports GTK rekeying while asleep
403977dbbb13SJohannes Berg  * @WIPHY_WOWLAN_GTK_REKEY_FAILURE: supports wakeup on GTK rekey failure
404077dbbb13SJohannes Berg  * @WIPHY_WOWLAN_EAP_IDENTITY_REQ: supports wakeup on EAP identity request
404177dbbb13SJohannes Berg  * @WIPHY_WOWLAN_4WAY_HANDSHAKE: supports wakeup on 4-way handshake failure
404277dbbb13SJohannes Berg  * @WIPHY_WOWLAN_RFKILL_RELEASE: supports wakeup on RF-kill release
40438cd4d456SLuciano Coelho  * @WIPHY_WOWLAN_NET_DETECT: supports wakeup on network detection
4044ff1b6e69SJohannes Berg  */
4045ff1b6e69SJohannes Berg enum wiphy_wowlan_support_flags {
4046ff1b6e69SJohannes Berg 	WIPHY_WOWLAN_ANY		= BIT(0),
4047ff1b6e69SJohannes Berg 	WIPHY_WOWLAN_MAGIC_PKT		= BIT(1),
4048ff1b6e69SJohannes Berg 	WIPHY_WOWLAN_DISCONNECT		= BIT(2),
404977dbbb13SJohannes Berg 	WIPHY_WOWLAN_SUPPORTS_GTK_REKEY	= BIT(3),
405077dbbb13SJohannes Berg 	WIPHY_WOWLAN_GTK_REKEY_FAILURE	= BIT(4),
405177dbbb13SJohannes Berg 	WIPHY_WOWLAN_EAP_IDENTITY_REQ	= BIT(5),
405277dbbb13SJohannes Berg 	WIPHY_WOWLAN_4WAY_HANDSHAKE	= BIT(6),
405377dbbb13SJohannes Berg 	WIPHY_WOWLAN_RFKILL_RELEASE	= BIT(7),
40548cd4d456SLuciano Coelho 	WIPHY_WOWLAN_NET_DETECT		= BIT(8),
4055ff1b6e69SJohannes Berg };
4056ff1b6e69SJohannes Berg 
40572a0e047eSJohannes Berg struct wiphy_wowlan_tcp_support {
40582a0e047eSJohannes Berg 	const struct nl80211_wowlan_tcp_data_token_feature *tok;
40592a0e047eSJohannes Berg 	u32 data_payload_max;
40602a0e047eSJohannes Berg 	u32 data_interval_max;
40612a0e047eSJohannes Berg 	u32 wake_payload_max;
40622a0e047eSJohannes Berg 	bool seq;
40632a0e047eSJohannes Berg };
40642a0e047eSJohannes Berg 
4065ff1b6e69SJohannes Berg /**
4066ff1b6e69SJohannes Berg  * struct wiphy_wowlan_support - WoWLAN support data
4067ff1b6e69SJohannes Berg  * @flags: see &enum wiphy_wowlan_support_flags
4068ff1b6e69SJohannes Berg  * @n_patterns: number of supported wakeup patterns
4069ff1b6e69SJohannes Berg  *	(see nl80211.h for the pattern definition)
4070ff1b6e69SJohannes Berg  * @pattern_max_len: maximum length of each pattern
4071ff1b6e69SJohannes Berg  * @pattern_min_len: minimum length of each pattern
4072bb92d199SAmitkumar Karwar  * @max_pkt_offset: maximum Rx packet offset
40738cd4d456SLuciano Coelho  * @max_nd_match_sets: maximum number of matchsets for net-detect,
40748cd4d456SLuciano Coelho  *	similar, but not necessarily identical, to max_match_sets for
40758cd4d456SLuciano Coelho  *	scheduled scans.
40768cd4d456SLuciano Coelho  *	See &struct cfg80211_sched_scan_request.@match_sets for more
40778cd4d456SLuciano Coelho  *	details.
40782a0e047eSJohannes Berg  * @tcp: TCP wakeup support information
4079ff1b6e69SJohannes Berg  */
4080ff1b6e69SJohannes Berg struct wiphy_wowlan_support {
4081ff1b6e69SJohannes Berg 	u32 flags;
4082ff1b6e69SJohannes Berg 	int n_patterns;
4083ff1b6e69SJohannes Berg 	int pattern_max_len;
4084ff1b6e69SJohannes Berg 	int pattern_min_len;
4085bb92d199SAmitkumar Karwar 	int max_pkt_offset;
40868cd4d456SLuciano Coelho 	int max_nd_match_sets;
40872a0e047eSJohannes Berg 	const struct wiphy_wowlan_tcp_support *tcp;
4088ff1b6e69SJohannes Berg };
4089ff1b6e69SJohannes Berg 
4090ff1b6e69SJohannes Berg /**
4091be29b99aSAmitkumar Karwar  * struct wiphy_coalesce_support - coalesce support data
4092be29b99aSAmitkumar Karwar  * @n_rules: maximum number of coalesce rules
4093be29b99aSAmitkumar Karwar  * @max_delay: maximum supported coalescing delay in msecs
4094be29b99aSAmitkumar Karwar  * @n_patterns: number of supported patterns in a rule
4095be29b99aSAmitkumar Karwar  *	(see nl80211.h for the pattern definition)
4096be29b99aSAmitkumar Karwar  * @pattern_max_len: maximum length of each pattern
4097be29b99aSAmitkumar Karwar  * @pattern_min_len: minimum length of each pattern
4098be29b99aSAmitkumar Karwar  * @max_pkt_offset: maximum Rx packet offset
4099be29b99aSAmitkumar Karwar  */
4100be29b99aSAmitkumar Karwar struct wiphy_coalesce_support {
4101be29b99aSAmitkumar Karwar 	int n_rules;
4102be29b99aSAmitkumar Karwar 	int max_delay;
4103be29b99aSAmitkumar Karwar 	int n_patterns;
4104be29b99aSAmitkumar Karwar 	int pattern_max_len;
4105be29b99aSAmitkumar Karwar 	int pattern_min_len;
4106be29b99aSAmitkumar Karwar 	int max_pkt_offset;
4107be29b99aSAmitkumar Karwar };
4108be29b99aSAmitkumar Karwar 
4109be29b99aSAmitkumar Karwar /**
4110ad7e718cSJohannes Berg  * enum wiphy_vendor_command_flags - validation flags for vendor commands
4111ad7e718cSJohannes Berg  * @WIPHY_VENDOR_CMD_NEED_WDEV: vendor command requires wdev
4112ad7e718cSJohannes Berg  * @WIPHY_VENDOR_CMD_NEED_NETDEV: vendor command requires netdev
4113ad7e718cSJohannes Berg  * @WIPHY_VENDOR_CMD_NEED_RUNNING: interface/wdev must be up & running
4114ad7e718cSJohannes Berg  *	(must be combined with %_WDEV or %_NETDEV)
4115ad7e718cSJohannes Berg  */
4116ad7e718cSJohannes Berg enum wiphy_vendor_command_flags {
4117ad7e718cSJohannes Berg 	WIPHY_VENDOR_CMD_NEED_WDEV = BIT(0),
4118ad7e718cSJohannes Berg 	WIPHY_VENDOR_CMD_NEED_NETDEV = BIT(1),
4119ad7e718cSJohannes Berg 	WIPHY_VENDOR_CMD_NEED_RUNNING = BIT(2),
4120ad7e718cSJohannes Berg };
4121ad7e718cSJohannes Berg 
4122ad7e718cSJohannes Berg /**
4123466b9936Stamizhr@codeaurora.org  * enum wiphy_opmode_flag - Station's ht/vht operation mode information flags
4124466b9936Stamizhr@codeaurora.org  *
4125466b9936Stamizhr@codeaurora.org  * @STA_OPMODE_MAX_BW_CHANGED: Max Bandwidth changed
4126466b9936Stamizhr@codeaurora.org  * @STA_OPMODE_SMPS_MODE_CHANGED: SMPS mode changed
4127466b9936Stamizhr@codeaurora.org  * @STA_OPMODE_N_SS_CHANGED: max N_SS (number of spatial streams) changed
4128466b9936Stamizhr@codeaurora.org  *
4129466b9936Stamizhr@codeaurora.org  */
4130466b9936Stamizhr@codeaurora.org enum wiphy_opmode_flag {
4131466b9936Stamizhr@codeaurora.org 	STA_OPMODE_MAX_BW_CHANGED	= BIT(0),
4132466b9936Stamizhr@codeaurora.org 	STA_OPMODE_SMPS_MODE_CHANGED	= BIT(1),
4133466b9936Stamizhr@codeaurora.org 	STA_OPMODE_N_SS_CHANGED		= BIT(2),
4134466b9936Stamizhr@codeaurora.org };
4135466b9936Stamizhr@codeaurora.org 
4136466b9936Stamizhr@codeaurora.org /**
4137466b9936Stamizhr@codeaurora.org  * struct sta_opmode_info - Station's ht/vht operation mode information
4138466b9936Stamizhr@codeaurora.org  * @changed: contains value from &enum wiphy_opmode_flag
41395e78abd0Stamizhr@codeaurora.org  * @smps_mode: New SMPS mode value from &enum nl80211_smps_mode of a station
41405e78abd0Stamizhr@codeaurora.org  * @bw: new max bandwidth value from &enum nl80211_chan_width of a station
4141466b9936Stamizhr@codeaurora.org  * @rx_nss: new rx_nss value of a station
4142466b9936Stamizhr@codeaurora.org  */
4143466b9936Stamizhr@codeaurora.org 
4144466b9936Stamizhr@codeaurora.org struct sta_opmode_info {
4145466b9936Stamizhr@codeaurora.org 	u32 changed;
41465e78abd0Stamizhr@codeaurora.org 	enum nl80211_smps_mode smps_mode;
41475e78abd0Stamizhr@codeaurora.org 	enum nl80211_chan_width bw;
4148466b9936Stamizhr@codeaurora.org 	u8 rx_nss;
4149466b9936Stamizhr@codeaurora.org };
4150466b9936Stamizhr@codeaurora.org 
4151466b9936Stamizhr@codeaurora.org /**
4152ad7e718cSJohannes Berg  * struct wiphy_vendor_command - vendor command definition
4153ad7e718cSJohannes Berg  * @info: vendor command identifying information, as used in nl80211
4154ad7e718cSJohannes Berg  * @flags: flags, see &enum wiphy_vendor_command_flags
4155ad7e718cSJohannes Berg  * @doit: callback for the operation, note that wdev is %NULL if the
4156ad7e718cSJohannes Berg  *	flags didn't ask for a wdev and non-%NULL otherwise; the data
4157ad7e718cSJohannes Berg  *	pointer may be %NULL if userspace provided no data at all
41587bdbe400SJohannes Berg  * @dumpit: dump callback, for transferring bigger/multiple items. The
41597bdbe400SJohannes Berg  *	@storage points to cb->args[5], ie. is preserved over the multiple
41607bdbe400SJohannes Berg  *	dumpit calls.
41617bdbe400SJohannes Berg  * It's recommended to not have the same sub command with both @doit and
41627bdbe400SJohannes Berg  * @dumpit, so that userspace can assume certain ones are get and others
41637bdbe400SJohannes Berg  * are used with dump requests.
4164ad7e718cSJohannes Berg  */
4165ad7e718cSJohannes Berg struct wiphy_vendor_command {
4166ad7e718cSJohannes Berg 	struct nl80211_vendor_cmd_info info;
4167ad7e718cSJohannes Berg 	u32 flags;
4168ad7e718cSJohannes Berg 	int (*doit)(struct wiphy *wiphy, struct wireless_dev *wdev,
4169ad7e718cSJohannes Berg 		    const void *data, int data_len);
41707bdbe400SJohannes Berg 	int (*dumpit)(struct wiphy *wiphy, struct wireless_dev *wdev,
41717bdbe400SJohannes Berg 		      struct sk_buff *skb, const void *data, int data_len,
41727bdbe400SJohannes Berg 		      unsigned long *storage);
4173ad7e718cSJohannes Berg };
4174ad7e718cSJohannes Berg 
4175ad7e718cSJohannes Berg /**
4176019ae3a9SKanchanapally, Vidyullatha  * struct wiphy_iftype_ext_capab - extended capabilities per interface type
4177019ae3a9SKanchanapally, Vidyullatha  * @iftype: interface type
4178019ae3a9SKanchanapally, Vidyullatha  * @extended_capabilities: extended capabilities supported by the driver,
4179019ae3a9SKanchanapally, Vidyullatha  *	additional capabilities might be supported by userspace; these are the
4180019ae3a9SKanchanapally, Vidyullatha  *	802.11 extended capabilities ("Extended Capabilities element") and are
4181019ae3a9SKanchanapally, Vidyullatha  *	in the same format as in the information element. See IEEE Std
4182019ae3a9SKanchanapally, Vidyullatha  *	802.11-2012 8.4.2.29 for the defined fields.
4183019ae3a9SKanchanapally, Vidyullatha  * @extended_capabilities_mask: mask of the valid values
4184019ae3a9SKanchanapally, Vidyullatha  * @extended_capabilities_len: length of the extended capabilities
4185019ae3a9SKanchanapally, Vidyullatha  */
4186019ae3a9SKanchanapally, Vidyullatha struct wiphy_iftype_ext_capab {
4187019ae3a9SKanchanapally, Vidyullatha 	enum nl80211_iftype iftype;
4188019ae3a9SKanchanapally, Vidyullatha 	const u8 *extended_capabilities;
4189019ae3a9SKanchanapally, Vidyullatha 	const u8 *extended_capabilities_mask;
4190019ae3a9SKanchanapally, Vidyullatha 	u8 extended_capabilities_len;
4191019ae3a9SKanchanapally, Vidyullatha };
4192019ae3a9SKanchanapally, Vidyullatha 
4193019ae3a9SKanchanapally, Vidyullatha /**
41949bb7e0f2SJohannes Berg  * struct cfg80211_pmsr_capabilities - cfg80211 peer measurement capabilities
41959bb7e0f2SJohannes Berg  * @max_peers: maximum number of peers in a single measurement
41969bb7e0f2SJohannes Berg  * @report_ap_tsf: can report assoc AP's TSF for radio resource measurement
41979bb7e0f2SJohannes Berg  * @randomize_mac_addr: can randomize MAC address for measurement
41989bb7e0f2SJohannes Berg  * @ftm.supported: FTM measurement is supported
41999bb7e0f2SJohannes Berg  * @ftm.asap: ASAP-mode is supported
42009bb7e0f2SJohannes Berg  * @ftm.non_asap: non-ASAP-mode is supported
42019bb7e0f2SJohannes Berg  * @ftm.request_lci: can request LCI data
42029bb7e0f2SJohannes Berg  * @ftm.request_civicloc: can request civic location data
42039bb7e0f2SJohannes Berg  * @ftm.preambles: bitmap of preambles supported (&enum nl80211_preamble)
42049bb7e0f2SJohannes Berg  * @ftm.bandwidths: bitmap of bandwidths supported (&enum nl80211_chan_width)
42059bb7e0f2SJohannes Berg  * @ftm.max_bursts_exponent: maximum burst exponent supported
42069bb7e0f2SJohannes Berg  *	(set to -1 if not limited; note that setting this will necessarily
42079bb7e0f2SJohannes Berg  *	forbid using the value 15 to let the responder pick)
42089bb7e0f2SJohannes Berg  * @ftm.max_ftms_per_burst: maximum FTMs per burst supported (set to 0 if
42099bb7e0f2SJohannes Berg  *	not limited)
42109bb7e0f2SJohannes Berg  */
42119bb7e0f2SJohannes Berg struct cfg80211_pmsr_capabilities {
42129bb7e0f2SJohannes Berg 	unsigned int max_peers;
42139bb7e0f2SJohannes Berg 	u8 report_ap_tsf:1,
42149bb7e0f2SJohannes Berg 	   randomize_mac_addr:1;
42159bb7e0f2SJohannes Berg 
42169bb7e0f2SJohannes Berg 	struct {
42179bb7e0f2SJohannes Berg 		u32 preambles;
42189bb7e0f2SJohannes Berg 		u32 bandwidths;
42199bb7e0f2SJohannes Berg 		s8 max_bursts_exponent;
42209bb7e0f2SJohannes Berg 		u8 max_ftms_per_burst;
42219bb7e0f2SJohannes Berg 		u8 supported:1,
42229bb7e0f2SJohannes Berg 		   asap:1,
42239bb7e0f2SJohannes Berg 		   non_asap:1,
42249bb7e0f2SJohannes Berg 		   request_lci:1,
42259bb7e0f2SJohannes Berg 		   request_civicloc:1;
42269bb7e0f2SJohannes Berg 	} ftm;
42279bb7e0f2SJohannes Berg };
42289bb7e0f2SJohannes Berg 
42299bb7e0f2SJohannes Berg /**
42305be83de5SJohannes Berg  * struct wiphy - wireless hardware description
42312784fe91SLuis R. Rodriguez  * @reg_notifier: the driver's regulatory notification callback,
42322784fe91SLuis R. Rodriguez  *	note that if your driver uses wiphy_apply_custom_regulatory()
42332784fe91SLuis R. Rodriguez  *	the reg_notifier's request can be passed as NULL
4234d3236553SJohannes Berg  * @regd: the driver's regulatory domain, if one was requested via
4235d3236553SJohannes Berg  * 	the regulatory_hint() API. This can be used by the driver
4236d3236553SJohannes Berg  *	on the reg_notifier() if it chooses to ignore future
4237d3236553SJohannes Berg  *	regulatory domain changes caused by other drivers.
4238d3236553SJohannes Berg  * @signal_type: signal type reported in &struct cfg80211_bss.
4239d3236553SJohannes Berg  * @cipher_suites: supported cipher suites
4240d3236553SJohannes Berg  * @n_cipher_suites: number of supported cipher suites
4241ab4dfa20SVeerendranath Jakkam  * @akm_suites: supported AKM suites
4242ab4dfa20SVeerendranath Jakkam  * @n_akm_suites: number of supported AKM suites
4243b9a5f8caSJouni Malinen  * @retry_short: Retry limit for short frames (dot11ShortRetryLimit)
4244b9a5f8caSJouni Malinen  * @retry_long: Retry limit for long frames (dot11LongRetryLimit)
4245b9a5f8caSJouni Malinen  * @frag_threshold: Fragmentation threshold (dot11FragmentationThreshold);
4246b9a5f8caSJouni Malinen  *	-1 = fragmentation disabled, only odd values >= 256 used
4247b9a5f8caSJouni Malinen  * @rts_threshold: RTS threshold (dot11RTSThreshold); -1 = RTS/CTS disabled
4248abe37c4bSJohannes Berg  * @_net: the network namespace this wiphy currently lives in
4249ef15aac6SJohannes Berg  * @perm_addr: permanent MAC address of this device
4250ef15aac6SJohannes Berg  * @addr_mask: If the device supports multiple MAC addresses by masking,
4251ef15aac6SJohannes Berg  *	set this to a mask with variable bits set to 1, e.g. if the last
42520fcf8ac5SLuciano Coelho  *	four bits are variable then set it to 00-00-00-00-00-0f. The actual
4253ef15aac6SJohannes Berg  *	variable bits shall be determined by the interfaces added, with
4254ef15aac6SJohannes Berg  *	interfaces not matching the mask being rejected to be brought up.
4255ef15aac6SJohannes Berg  * @n_addresses: number of addresses in @addresses.
4256ef15aac6SJohannes Berg  * @addresses: If the device has more than one address, set this pointer
4257ef15aac6SJohannes Berg  *	to a list of addresses (6 bytes each). The first one will be used
4258ef15aac6SJohannes Berg  *	by default for perm_addr. In this case, the mask should be set to
4259ef15aac6SJohannes Berg  *	all-zeroes. In this case it is assumed that the device can handle
4260ef15aac6SJohannes Berg  *	the same number of arbitrary MAC addresses.
4261fd235913SRandy Dunlap  * @registered: protects ->resume and ->suspend sysfs callbacks against
4262fd235913SRandy Dunlap  *	unregister hardware
4263abe37c4bSJohannes Berg  * @debugfsdir: debugfs directory used for this wiphy, will be renamed
4264abe37c4bSJohannes Berg  *	automatically on wiphy renames
4265abe37c4bSJohannes Berg  * @dev: (virtual) struct device for this wiphy
42664a711a85SStanislaw Gruszka  * @registered: helps synchronize suspend/resume with wiphy unregister
4267abe37c4bSJohannes Berg  * @wext: wireless extension handlers
4268abe37c4bSJohannes Berg  * @priv: driver private data (sized according to wiphy_new() parameter)
4269abe37c4bSJohannes Berg  * @interface_modes: bitmask of interfaces types valid for this wiphy,
4270abe37c4bSJohannes Berg  *	must be set by driver
42717527a782SJohannes Berg  * @iface_combinations: Valid interface combinations array, should not
42727527a782SJohannes Berg  *	list single interface types.
42737527a782SJohannes Berg  * @n_iface_combinations: number of entries in @iface_combinations array.
42747527a782SJohannes Berg  * @software_iftypes: bitmask of software interface types, these are not
42757527a782SJohannes Berg  *	subject to any restrictions since they are purely managed in SW.
4276abe37c4bSJohannes Berg  * @flags: wiphy flags, see &enum wiphy_flags
4277a2f73b6cSLuis R. Rodriguez  * @regulatory_flags: wiphy regulatory flags, see
4278a2f73b6cSLuis R. Rodriguez  *	&enum ieee80211_regulatory_flags
42791f074bd8SJohannes Berg  * @features: features advertised to nl80211, see &enum nl80211_feature_flags.
4280d75bb06bSGautam Kumar Shukla  * @ext_features: extended features advertised to nl80211, see
4281d75bb06bSGautam Kumar Shukla  *	&enum nl80211_ext_feature_index.
4282abe37c4bSJohannes Berg  * @bss_priv_size: each BSS struct has private data allocated with it,
4283abe37c4bSJohannes Berg  *	this variable determines its size
4284abe37c4bSJohannes Berg  * @max_scan_ssids: maximum number of SSIDs the device can scan for in
4285abe37c4bSJohannes Berg  *	any given scan
4286ca986ad9SArend Van Spriel  * @max_sched_scan_reqs: maximum number of scheduled scan requests that
4287ca986ad9SArend Van Spriel  *	the device can run concurrently.
428893b6aa69SLuciano Coelho  * @max_sched_scan_ssids: maximum number of SSIDs the device can scan
428993b6aa69SLuciano Coelho  *	for in any given scheduled scan
4290a1f1c21cSLuciano Coelho  * @max_match_sets: maximum number of match sets the device can handle
4291a1f1c21cSLuciano Coelho  *	when performing a scheduled scan, 0 if filtering is not
4292a1f1c21cSLuciano Coelho  *	supported.
4293abe37c4bSJohannes Berg  * @max_scan_ie_len: maximum length of user-controlled IEs device can
4294abe37c4bSJohannes Berg  *	add to probe request frames transmitted during a scan, must not
4295abe37c4bSJohannes Berg  *	include fixed IEs like supported rates
42965a865badSLuciano Coelho  * @max_sched_scan_ie_len: same as max_scan_ie_len, but for scheduled
42975a865badSLuciano Coelho  *	scans
42983b06d277SAvraham Stern  * @max_sched_scan_plans: maximum number of scan plans (scan interval and number
42993b06d277SAvraham Stern  *	of iterations) for scheduled scan supported by the device.
43003b06d277SAvraham Stern  * @max_sched_scan_plan_interval: maximum interval (in seconds) for a
43013b06d277SAvraham Stern  *	single scan plan supported by the device.
43023b06d277SAvraham Stern  * @max_sched_scan_plan_iterations: maximum number of iterations for a single
43033b06d277SAvraham Stern  *	scan plan supported by the device.
4304abe37c4bSJohannes Berg  * @coverage_class: current coverage class
4305abe37c4bSJohannes Berg  * @fw_version: firmware version for ethtool reporting
4306abe37c4bSJohannes Berg  * @hw_version: hardware version for ethtool reporting
4307abe37c4bSJohannes Berg  * @max_num_pmkids: maximum number of PMKIDs supported by device
4308abe37c4bSJohannes Berg  * @privid: a pointer that drivers can use to identify if an arbitrary
4309abe37c4bSJohannes Berg  *	wiphy is theirs, e.g. in global notifiers
4310abe37c4bSJohannes Berg  * @bands: information about bands/channels supported by this device
43112e161f78SJohannes Berg  *
43122e161f78SJohannes Berg  * @mgmt_stypes: bitmasks of frame subtypes that can be subscribed to or
43132e161f78SJohannes Berg  *	transmitted through nl80211, points to an array indexed by interface
43142e161f78SJohannes Berg  *	type
4315a7ffac95SBruno Randolf  *
43167f531e03SBruno Randolf  * @available_antennas_tx: bitmap of antennas which are available to be
43177f531e03SBruno Randolf  *	configured as TX antennas. Antenna configuration commands will be
43187f531e03SBruno Randolf  *	rejected unless this or @available_antennas_rx is set.
43197f531e03SBruno Randolf  *
43207f531e03SBruno Randolf  * @available_antennas_rx: bitmap of antennas which are available to be
43217f531e03SBruno Randolf  *	configured as RX antennas. Antenna configuration commands will be
43227f531e03SBruno Randolf  *	rejected unless this or @available_antennas_tx is set.
4323a293911dSJohannes Berg  *
432415f0ebc2SRandy Dunlap  * @probe_resp_offload:
432515f0ebc2SRandy Dunlap  *	 Bitmap of supported protocols for probe response offloading.
432615f0ebc2SRandy Dunlap  *	 See &enum nl80211_probe_resp_offload_support_attr. Only valid
432715f0ebc2SRandy Dunlap  *	 when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set.
432815f0ebc2SRandy Dunlap  *
4329a293911dSJohannes Berg  * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation
4330a293911dSJohannes Berg  *	may request, if implemented.
4331ff1b6e69SJohannes Berg  *
4332ff1b6e69SJohannes Berg  * @wowlan: WoWLAN support information
43336abb9cb9SJohannes Berg  * @wowlan_config: current WoWLAN configuration; this should usually not be
43346abb9cb9SJohannes Berg  *	used since access to it is necessarily racy, use the parameter passed
43356abb9cb9SJohannes Berg  *	to the suspend() operation instead.
4336562a7480SJohannes Berg  *
4337562a7480SJohannes Berg  * @ap_sme_capa: AP SME capabilities, flags from &enum nl80211_ap_sme_features.
43387e7c8926SBen Greear  * @ht_capa_mod_mask:  Specify what ht_cap values can be over-ridden.
43397e7c8926SBen Greear  *	If null, then none can be over-ridden.
4340ee2aca34SJohannes Berg  * @vht_capa_mod_mask:  Specify what VHT capabilities can be over-ridden.
4341ee2aca34SJohannes Berg  *	If null, then none can be over-ridden.
434277765eafSVasanthakumar Thiagarajan  *
434353873f13SJohannes Berg  * @wdev_list: the list of associated (virtual) interfaces; this list must
434453873f13SJohannes Berg  *	not be modified by the driver, but can be read with RTNL/RCU protection.
434553873f13SJohannes Berg  *
434677765eafSVasanthakumar Thiagarajan  * @max_acl_mac_addrs: Maximum number of MAC addresses that the device
434777765eafSVasanthakumar Thiagarajan  *	supports for ACL.
4348a50df0c4SJohannes Berg  *
4349a50df0c4SJohannes Berg  * @extended_capabilities: extended capabilities supported by the driver,
4350a50df0c4SJohannes Berg  *	additional capabilities might be supported by userspace; these are
4351a50df0c4SJohannes Berg  *	the 802.11 extended capabilities ("Extended Capabilities element")
4352a50df0c4SJohannes Berg  *	and are in the same format as in the information element. See
4353019ae3a9SKanchanapally, Vidyullatha  *	802.11-2012 8.4.2.29 for the defined fields. These are the default
4354019ae3a9SKanchanapally, Vidyullatha  *	extended capabilities to be used if the capabilities are not specified
4355019ae3a9SKanchanapally, Vidyullatha  *	for a specific interface type in iftype_ext_capab.
4356a50df0c4SJohannes Berg  * @extended_capabilities_mask: mask of the valid values
4357a50df0c4SJohannes Berg  * @extended_capabilities_len: length of the extended capabilities
4358019ae3a9SKanchanapally, Vidyullatha  * @iftype_ext_capab: array of extended capabilities per interface type
4359019ae3a9SKanchanapally, Vidyullatha  * @num_iftype_ext_capab: number of interface types for which extended
4360019ae3a9SKanchanapally, Vidyullatha  *	capabilities are specified separately.
4361be29b99aSAmitkumar Karwar  * @coalesce: packet coalescing support information
4362ad7e718cSJohannes Berg  *
4363ad7e718cSJohannes Berg  * @vendor_commands: array of vendor commands supported by the hardware
4364ad7e718cSJohannes Berg  * @n_vendor_commands: number of vendor commands
4365567ffc35SJohannes Berg  * @vendor_events: array of vendor events supported by the hardware
4366567ffc35SJohannes Berg  * @n_vendor_events: number of vendor events
4367b43504cfSJouni Malinen  *
4368b43504cfSJouni Malinen  * @max_ap_assoc_sta: maximum number of associated stations supported in AP mode
4369b43504cfSJouni Malinen  *	(including P2P GO) or 0 to indicate no such limit is advertised. The
4370b43504cfSJouni Malinen  *	driver is allowed to advertise a theoretical limit that it can reach in
4371b43504cfSJouni Malinen  *	some cases, but may not always reach.
4372c2e4323bSLuciano Coelho  *
4373c2e4323bSLuciano Coelho  * @max_num_csa_counters: Number of supported csa_counters in beacons
4374c2e4323bSLuciano Coelho  *	and probe responses.  This value should be set if the driver
4375c2e4323bSLuciano Coelho  *	wishes to limit the number of csa counters. Default (0) means
4376c2e4323bSLuciano Coelho  *	infinite.
437767af9811SEmmanuel Grumbach  * @max_adj_channel_rssi_comp: max offset of between the channel on which the
437867af9811SEmmanuel Grumbach  *	frame was sent and the channel on which the frame was heard for which
437967af9811SEmmanuel Grumbach  *	the reported rssi is still valid. If a driver is able to compensate the
438067af9811SEmmanuel Grumbach  *	low rssi when a frame is heard on different channel, then it should set
438167af9811SEmmanuel Grumbach  *	this variable to the maximal offset for which it can compensate.
438267af9811SEmmanuel Grumbach  *	This value should be set in MHz.
438338de03d2SArend van Spriel  * @bss_select_support: bitmask indicating the BSS selection criteria supported
438438de03d2SArend van Spriel  *	by the driver in the .connect() callback. The bit position maps to the
438538de03d2SArend van Spriel  *	attribute indices defined in &enum nl80211_bss_select_attr.
4386a442b761SAyala Beker  *
43878585989dSLuca Coelho  * @nan_supported_bands: bands supported by the device in NAN mode, a
43888585989dSLuca Coelho  *	bitmap of &enum nl80211_band values.  For instance, for
43898585989dSLuca Coelho  *	NL80211_BAND_2GHZ, bit 0 would be set
43908585989dSLuca Coelho  *	(i.e. BIT(NL80211_BAND_2GHZ)).
4391f3a7ca64SJohannes Berg  *
4392f3a7ca64SJohannes Berg  * @txq_limit: configuration of internal TX queue frame limit
4393f3a7ca64SJohannes Berg  * @txq_memory_limit: configuration internal TX queue memory limit
4394f3a7ca64SJohannes Berg  * @txq_quantum: configuration of internal TX queue scheduler quantum
43959bb7e0f2SJohannes Berg  *
4396213ed579SSara Sharon  * @support_mbssid: can HW support association with nontransmitted AP
4397213ed579SSara Sharon  * @support_only_he_mbssid: don't parse MBSSID elements if it is not
4398213ed579SSara Sharon  *	HE AP, in order to avoid compatibility issues.
4399213ed579SSara Sharon  *	@support_mbssid must be set for this to have any effect.
4400213ed579SSara Sharon  *
44019bb7e0f2SJohannes Berg  * @pmsr_capa: peer measurement capabilities
4402d3236553SJohannes Berg  */
4403d3236553SJohannes Berg struct wiphy {
4404d3236553SJohannes Berg 	/* assign these fields before you register the wiphy */
4405d3236553SJohannes Berg 
4406ef15aac6SJohannes Berg 	/* permanent MAC address(es) */
4407d3236553SJohannes Berg 	u8 perm_addr[ETH_ALEN];
4408ef15aac6SJohannes Berg 	u8 addr_mask[ETH_ALEN];
4409ef15aac6SJohannes Berg 
4410ef15aac6SJohannes Berg 	struct mac_address *addresses;
4411d3236553SJohannes Berg 
44122e161f78SJohannes Berg 	const struct ieee80211_txrx_stypes *mgmt_stypes;
44132e161f78SJohannes Berg 
44147527a782SJohannes Berg 	const struct ieee80211_iface_combination *iface_combinations;
44157527a782SJohannes Berg 	int n_iface_combinations;
44167527a782SJohannes Berg 	u16 software_iftypes;
44177527a782SJohannes Berg 
44182e161f78SJohannes Berg 	u16 n_addresses;
44192e161f78SJohannes Berg 
4420d3236553SJohannes Berg 	/* Supported interface modes, OR together BIT(NL80211_IFTYPE_...) */
4421d3236553SJohannes Berg 	u16 interface_modes;
4422d3236553SJohannes Berg 
442377765eafSVasanthakumar Thiagarajan 	u16 max_acl_mac_addrs;
442477765eafSVasanthakumar Thiagarajan 
4425a2f73b6cSLuis R. Rodriguez 	u32 flags, regulatory_flags, features;
4426d75bb06bSGautam Kumar Shukla 	u8 ext_features[DIV_ROUND_UP(NUM_NL80211_EXT_FEATURES, 8)];
4427463d0183SJohannes Berg 
4428562a7480SJohannes Berg 	u32 ap_sme_capa;
4429562a7480SJohannes Berg 
4430d3236553SJohannes Berg 	enum cfg80211_signal_type signal_type;
4431d3236553SJohannes Berg 
4432d3236553SJohannes Berg 	int bss_priv_size;
4433d3236553SJohannes Berg 	u8 max_scan_ssids;
4434ca986ad9SArend Van Spriel 	u8 max_sched_scan_reqs;
443593b6aa69SLuciano Coelho 	u8 max_sched_scan_ssids;
4436a1f1c21cSLuciano Coelho 	u8 max_match_sets;
4437d3236553SJohannes Berg 	u16 max_scan_ie_len;
44385a865badSLuciano Coelho 	u16 max_sched_scan_ie_len;
44393b06d277SAvraham Stern 	u32 max_sched_scan_plans;
44403b06d277SAvraham Stern 	u32 max_sched_scan_plan_interval;
44413b06d277SAvraham Stern 	u32 max_sched_scan_plan_iterations;
4442d3236553SJohannes Berg 
4443d3236553SJohannes Berg 	int n_cipher_suites;
4444d3236553SJohannes Berg 	const u32 *cipher_suites;
4445d3236553SJohannes Berg 
4446ab4dfa20SVeerendranath Jakkam 	int n_akm_suites;
4447ab4dfa20SVeerendranath Jakkam 	const u32 *akm_suites;
4448ab4dfa20SVeerendranath Jakkam 
4449b9a5f8caSJouni Malinen 	u8 retry_short;
4450b9a5f8caSJouni Malinen 	u8 retry_long;
4451b9a5f8caSJouni Malinen 	u32 frag_threshold;
4452b9a5f8caSJouni Malinen 	u32 rts_threshold;
445381077e82SLukáš Turek 	u8 coverage_class;
4454b9a5f8caSJouni Malinen 
445581135548SJiri Pirko 	char fw_version[ETHTOOL_FWVERS_LEN];
4456dfce95f5SKalle Valo 	u32 hw_version;
4457dfce95f5SKalle Valo 
4458dfb89c56SJohannes Berg #ifdef CONFIG_PM
4459964dc9e2SJohannes Berg 	const struct wiphy_wowlan_support *wowlan;
44606abb9cb9SJohannes Berg 	struct cfg80211_wowlan *wowlan_config;
4461dfb89c56SJohannes Berg #endif
4462ff1b6e69SJohannes Berg 
4463a293911dSJohannes Berg 	u16 max_remain_on_channel_duration;
4464a293911dSJohannes Berg 
446567fbb16bSSamuel Ortiz 	u8 max_num_pmkids;
446667fbb16bSSamuel Ortiz 
44677f531e03SBruno Randolf 	u32 available_antennas_tx;
44687f531e03SBruno Randolf 	u32 available_antennas_rx;
4469a7ffac95SBruno Randolf 
447087bbbe22SArik Nemtsov 	/*
447187bbbe22SArik Nemtsov 	 * Bitmap of supported protocols for probe response offloading
447287bbbe22SArik Nemtsov 	 * see &enum nl80211_probe_resp_offload_support_attr. Only valid
447387bbbe22SArik Nemtsov 	 * when the wiphy flag @WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD is set.
447487bbbe22SArik Nemtsov 	 */
447587bbbe22SArik Nemtsov 	u32 probe_resp_offload;
447687bbbe22SArik Nemtsov 
4477a50df0c4SJohannes Berg 	const u8 *extended_capabilities, *extended_capabilities_mask;
4478a50df0c4SJohannes Berg 	u8 extended_capabilities_len;
4479a50df0c4SJohannes Berg 
4480019ae3a9SKanchanapally, Vidyullatha 	const struct wiphy_iftype_ext_capab *iftype_ext_capab;
4481019ae3a9SKanchanapally, Vidyullatha 	unsigned int num_iftype_ext_capab;
4482019ae3a9SKanchanapally, Vidyullatha 
4483d3236553SJohannes Berg 	/* If multiple wiphys are registered and you're handed e.g.
4484d3236553SJohannes Berg 	 * a regular netdev with assigned ieee80211_ptr, you won't
4485d3236553SJohannes Berg 	 * know whether it points to a wiphy your driver has registered
4486d3236553SJohannes Berg 	 * or not. Assign this to something global to your driver to
4487d3236553SJohannes Berg 	 * help determine whether you own this wiphy or not. */
4488cf5aa2f1SDavid Kilroy 	const void *privid;
4489d3236553SJohannes Berg 
449057fbcce3SJohannes Berg 	struct ieee80211_supported_band *bands[NUM_NL80211_BANDS];
4491d3236553SJohannes Berg 
4492d3236553SJohannes Berg 	/* Lets us get back the wiphy on the callback */
44930c0280bdSLuis R. Rodriguez 	void (*reg_notifier)(struct wiphy *wiphy,
4494d3236553SJohannes Berg 			     struct regulatory_request *request);
4495d3236553SJohannes Berg 
4496d3236553SJohannes Berg 	/* fields below are read-only, assigned by cfg80211 */
4497d3236553SJohannes Berg 
4498458f4f9eSJohannes Berg 	const struct ieee80211_regdomain __rcu *regd;
4499d3236553SJohannes Berg 
4500d3236553SJohannes Berg 	/* the item in /sys/class/ieee80211/ points to this,
4501d3236553SJohannes Berg 	 * you need use set_wiphy_dev() (see below) */
4502d3236553SJohannes Berg 	struct device dev;
4503d3236553SJohannes Berg 
4504ecb44335SStanislaw Gruszka 	/* protects ->resume, ->suspend sysfs callbacks against unregister hw */
4505ecb44335SStanislaw Gruszka 	bool registered;
4506ecb44335SStanislaw Gruszka 
4507d3236553SJohannes Berg 	/* dir in debugfs: ieee80211/<wiphyname> */
4508d3236553SJohannes Berg 	struct dentry *debugfsdir;
4509d3236553SJohannes Berg 
45107e7c8926SBen Greear 	const struct ieee80211_ht_cap *ht_capa_mod_mask;
4511ee2aca34SJohannes Berg 	const struct ieee80211_vht_cap *vht_capa_mod_mask;
45127e7c8926SBen Greear 
451353873f13SJohannes Berg 	struct list_head wdev_list;
451453873f13SJohannes Berg 
4515463d0183SJohannes Berg 	/* the network namespace this phy lives in currently */
45160c5c9fb5SEric W. Biederman 	possible_net_t _net;
4517463d0183SJohannes Berg 
45183d23e349SJohannes Berg #ifdef CONFIG_CFG80211_WEXT
45193d23e349SJohannes Berg 	const struct iw_handler_def *wext;
45203d23e349SJohannes Berg #endif
45213d23e349SJohannes Berg 
4522be29b99aSAmitkumar Karwar 	const struct wiphy_coalesce_support *coalesce;
4523be29b99aSAmitkumar Karwar 
4524ad7e718cSJohannes Berg 	const struct wiphy_vendor_command *vendor_commands;
4525567ffc35SJohannes Berg 	const struct nl80211_vendor_cmd_info *vendor_events;
4526567ffc35SJohannes Berg 	int n_vendor_commands, n_vendor_events;
4527ad7e718cSJohannes Berg 
4528b43504cfSJouni Malinen 	u16 max_ap_assoc_sta;
4529b43504cfSJouni Malinen 
45309a774c78SAndrei Otcheretianski 	u8 max_num_csa_counters;
453167af9811SEmmanuel Grumbach 	u8 max_adj_channel_rssi_comp;
45329a774c78SAndrei Otcheretianski 
453338de03d2SArend van Spriel 	u32 bss_select_support;
453438de03d2SArend van Spriel 
45358585989dSLuca Coelho 	u8 nan_supported_bands;
45368585989dSLuca Coelho 
453752539ca8SToke Høiland-Jørgensen 	u32 txq_limit;
453852539ca8SToke Høiland-Jørgensen 	u32 txq_memory_limit;
453952539ca8SToke Høiland-Jørgensen 	u32 txq_quantum;
454052539ca8SToke Høiland-Jørgensen 
4541213ed579SSara Sharon 	u8 support_mbssid:1,
4542213ed579SSara Sharon 	   support_only_he_mbssid:1;
4543213ed579SSara Sharon 
45449bb7e0f2SJohannes Berg 	const struct cfg80211_pmsr_capabilities *pmsr_capa;
45459bb7e0f2SJohannes Berg 
45461c06ef98SJohannes Berg 	char priv[0] __aligned(NETDEV_ALIGN);
4547d3236553SJohannes Berg };
4548d3236553SJohannes Berg 
4549463d0183SJohannes Berg static inline struct net *wiphy_net(struct wiphy *wiphy)
4550463d0183SJohannes Berg {
4551c2d9ba9bSEric Dumazet 	return read_pnet(&wiphy->_net);
4552463d0183SJohannes Berg }
4553463d0183SJohannes Berg 
4554463d0183SJohannes Berg static inline void wiphy_net_set(struct wiphy *wiphy, struct net *net)
4555463d0183SJohannes Berg {
4556c2d9ba9bSEric Dumazet 	write_pnet(&wiphy->_net, net);
4557463d0183SJohannes Berg }
4558463d0183SJohannes Berg 
4559d3236553SJohannes Berg /**
4560d3236553SJohannes Berg  * wiphy_priv - return priv from wiphy
4561d3236553SJohannes Berg  *
4562d3236553SJohannes Berg  * @wiphy: the wiphy whose priv pointer to return
45630ae997dcSYacine Belkadi  * Return: The priv of @wiphy.
4564d3236553SJohannes Berg  */
4565d3236553SJohannes Berg static inline void *wiphy_priv(struct wiphy *wiphy)
4566d3236553SJohannes Berg {
4567d3236553SJohannes Berg 	BUG_ON(!wiphy);
4568d3236553SJohannes Berg 	return &wiphy->priv;
4569d3236553SJohannes Berg }
4570d3236553SJohannes Berg 
4571d3236553SJohannes Berg /**
4572f1f74825SDavid Kilroy  * priv_to_wiphy - return the wiphy containing the priv
4573f1f74825SDavid Kilroy  *
4574f1f74825SDavid Kilroy  * @priv: a pointer previously returned by wiphy_priv
45750ae997dcSYacine Belkadi  * Return: The wiphy of @priv.
4576f1f74825SDavid Kilroy  */
4577f1f74825SDavid Kilroy static inline struct wiphy *priv_to_wiphy(void *priv)
4578f1f74825SDavid Kilroy {
4579f1f74825SDavid Kilroy 	BUG_ON(!priv);
4580f1f74825SDavid Kilroy 	return container_of(priv, struct wiphy, priv);
4581f1f74825SDavid Kilroy }
4582f1f74825SDavid Kilroy 
4583f1f74825SDavid Kilroy /**
4584d3236553SJohannes Berg  * set_wiphy_dev - set device pointer for wiphy
4585d3236553SJohannes Berg  *
4586d3236553SJohannes Berg  * @wiphy: The wiphy whose device to bind
4587d3236553SJohannes Berg  * @dev: The device to parent it to
4588d3236553SJohannes Berg  */
4589d3236553SJohannes Berg static inline void set_wiphy_dev(struct wiphy *wiphy, struct device *dev)
4590d3236553SJohannes Berg {
4591d3236553SJohannes Berg 	wiphy->dev.parent = dev;
4592d3236553SJohannes Berg }
4593d3236553SJohannes Berg 
4594d3236553SJohannes Berg /**
4595d3236553SJohannes Berg  * wiphy_dev - get wiphy dev pointer
4596d3236553SJohannes Berg  *
4597d3236553SJohannes Berg  * @wiphy: The wiphy whose device struct to look up
45980ae997dcSYacine Belkadi  * Return: The dev of @wiphy.
4599d3236553SJohannes Berg  */
4600d3236553SJohannes Berg static inline struct device *wiphy_dev(struct wiphy *wiphy)
4601d3236553SJohannes Berg {
4602d3236553SJohannes Berg 	return wiphy->dev.parent;
4603d3236553SJohannes Berg }
4604d3236553SJohannes Berg 
4605d3236553SJohannes Berg /**
4606d3236553SJohannes Berg  * wiphy_name - get wiphy name
4607d3236553SJohannes Berg  *
4608d3236553SJohannes Berg  * @wiphy: The wiphy whose name to return
46090ae997dcSYacine Belkadi  * Return: The name of @wiphy.
4610d3236553SJohannes Berg  */
4611e1db74fcSJoe Perches static inline const char *wiphy_name(const struct wiphy *wiphy)
4612d3236553SJohannes Berg {
4613d3236553SJohannes Berg 	return dev_name(&wiphy->dev);
4614d3236553SJohannes Berg }
4615d3236553SJohannes Berg 
4616d3236553SJohannes Berg /**
46171998d90aSBen Greear  * wiphy_new_nm - create a new wiphy for use with cfg80211
46181998d90aSBen Greear  *
46191998d90aSBen Greear  * @ops: The configuration operations for this device
46201998d90aSBen Greear  * @sizeof_priv: The size of the private area to allocate
46211998d90aSBen Greear  * @requested_name: Request a particular name.
46221998d90aSBen Greear  *	NULL is valid value, and means use the default phy%d naming.
46231998d90aSBen Greear  *
46241998d90aSBen Greear  * Create a new wiphy and associate the given operations with it.
46251998d90aSBen Greear  * @sizeof_priv bytes are allocated for private use.
46261998d90aSBen Greear  *
46271998d90aSBen Greear  * Return: A pointer to the new wiphy. This pointer must be
46281998d90aSBen Greear  * assigned to each netdev's ieee80211_ptr for proper operation.
46291998d90aSBen Greear  */
46301998d90aSBen Greear struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
46311998d90aSBen Greear 			   const char *requested_name);
46321998d90aSBen Greear 
46331998d90aSBen Greear /**
4634d3236553SJohannes Berg  * wiphy_new - create a new wiphy for use with cfg80211
4635d3236553SJohannes Berg  *
4636d3236553SJohannes Berg  * @ops: The configuration operations for this device
4637d3236553SJohannes Berg  * @sizeof_priv: The size of the private area to allocate
4638d3236553SJohannes Berg  *
4639d3236553SJohannes Berg  * Create a new wiphy and associate the given operations with it.
4640d3236553SJohannes Berg  * @sizeof_priv bytes are allocated for private use.
4641d3236553SJohannes Berg  *
46420ae997dcSYacine Belkadi  * Return: A pointer to the new wiphy. This pointer must be
46430ae997dcSYacine Belkadi  * assigned to each netdev's ieee80211_ptr for proper operation.
4644d3236553SJohannes Berg  */
46451998d90aSBen Greear static inline struct wiphy *wiphy_new(const struct cfg80211_ops *ops,
46461998d90aSBen Greear 				      int sizeof_priv)
46471998d90aSBen Greear {
46481998d90aSBen Greear 	return wiphy_new_nm(ops, sizeof_priv, NULL);
46491998d90aSBen Greear }
4650d3236553SJohannes Berg 
4651d3236553SJohannes Berg /**
4652d3236553SJohannes Berg  * wiphy_register - register a wiphy with cfg80211
4653d3236553SJohannes Berg  *
4654d3236553SJohannes Berg  * @wiphy: The wiphy to register.
4655d3236553SJohannes Berg  *
46560ae997dcSYacine Belkadi  * Return: A non-negative wiphy index or a negative error code.
4657d3236553SJohannes Berg  */
465810dd9b7cSJoe Perches int wiphy_register(struct wiphy *wiphy);
4659d3236553SJohannes Berg 
4660d3236553SJohannes Berg /**
4661d3236553SJohannes Berg  * wiphy_unregister - deregister a wiphy from cfg80211
4662d3236553SJohannes Berg  *
4663d3236553SJohannes Berg  * @wiphy: The wiphy to unregister.
4664d3236553SJohannes Berg  *
4665d3236553SJohannes Berg  * After this call, no more requests can be made with this priv
4666d3236553SJohannes Berg  * pointer, but the call may sleep to wait for an outstanding
4667d3236553SJohannes Berg  * request that is being handled.
4668d3236553SJohannes Berg  */
466910dd9b7cSJoe Perches void wiphy_unregister(struct wiphy *wiphy);
4670d3236553SJohannes Berg 
4671d3236553SJohannes Berg /**
4672d3236553SJohannes Berg  * wiphy_free - free wiphy
4673d3236553SJohannes Berg  *
4674d3236553SJohannes Berg  * @wiphy: The wiphy to free
4675d3236553SJohannes Berg  */
467610dd9b7cSJoe Perches void wiphy_free(struct wiphy *wiphy);
4677d3236553SJohannes Berg 
4678fffd0934SJohannes Berg /* internal structs */
46796829c878SJohannes Berg struct cfg80211_conn;
468019957bb3SJohannes Berg struct cfg80211_internal_bss;
4681fffd0934SJohannes Berg struct cfg80211_cached_keys;
46824a4b8169SAndrew Zaborowski struct cfg80211_cqm_config;
468319957bb3SJohannes Berg 
4684d3236553SJohannes Berg /**
468589a54e48SJohannes Berg  * struct wireless_dev - wireless device state
4686d3236553SJohannes Berg  *
468789a54e48SJohannes Berg  * For netdevs, this structure must be allocated by the driver
468889a54e48SJohannes Berg  * that uses the ieee80211_ptr field in struct net_device (this
468989a54e48SJohannes Berg  * is intentional so it can be allocated along with the netdev.)
469089a54e48SJohannes Berg  * It need not be registered then as netdev registration will
469189a54e48SJohannes Berg  * be intercepted by cfg80211 to see the new wireless device.
469289a54e48SJohannes Berg  *
469389a54e48SJohannes Berg  * For non-netdev uses, it must also be allocated by the driver
469489a54e48SJohannes Berg  * in response to the cfg80211 callbacks that require it, as
469589a54e48SJohannes Berg  * there's no netdev registration in that case it may not be
469689a54e48SJohannes Berg  * allocated outside of callback operations that return it.
4697d3236553SJohannes Berg  *
4698d3236553SJohannes Berg  * @wiphy: pointer to hardware description
4699d3236553SJohannes Berg  * @iftype: interface type
4700d3236553SJohannes Berg  * @list: (private) Used to collect the interfaces
470189a54e48SJohannes Berg  * @netdev: (private) Used to reference back to the netdev, may be %NULL
470289a54e48SJohannes Berg  * @identifier: (private) Identifier used in nl80211 to identify this
470389a54e48SJohannes Berg  *	wireless device if it has no netdev
4704d3236553SJohannes Berg  * @current_bss: (private) Used by the internal configuration code
47059e0e2961SMichal Kazior  * @chandef: (private) Used by the internal configuration code to track
47069e0e2961SMichal Kazior  *	the user-set channel definition.
4707780b40dfSJohannes Berg  * @preset_chandef: (private) Used by the internal configuration code to
4708aa430da4SJohannes Berg  *	track the channel to be used for AP later
4709d3236553SJohannes Berg  * @bssid: (private) Used by the internal configuration code
4710d3236553SJohannes Berg  * @ssid: (private) Used by the internal configuration code
4711d3236553SJohannes Berg  * @ssid_len: (private) Used by the internal configuration code
471229cbe68cSJohannes Berg  * @mesh_id_len: (private) Used by the internal configuration code
471329cbe68cSJohannes Berg  * @mesh_id_up_len: (private) Used by the internal configuration code
4714d3236553SJohannes Berg  * @wext: (private) Used by the internal wireless extensions compat code
47159874b71fSJohannes Berg  * @wext.ibss: (private) IBSS data part of wext handling
47169874b71fSJohannes Berg  * @wext.connect: (private) connection handling data
47179874b71fSJohannes Berg  * @wext.keys: (private) (WEP) key data
47189874b71fSJohannes Berg  * @wext.ie: (private) extra elements for association
47199874b71fSJohannes Berg  * @wext.ie_len: (private) length of extra elements
47209874b71fSJohannes Berg  * @wext.bssid: (private) selected network BSSID
47219874b71fSJohannes Berg  * @wext.ssid: (private) selected network SSID
47229874b71fSJohannes Berg  * @wext.default_key: (private) selected default key index
47239874b71fSJohannes Berg  * @wext.default_mgmt_key: (private) selected default management key index
47249874b71fSJohannes Berg  * @wext.prev_bssid: (private) previous BSSID for reassociation
47259874b71fSJohannes Berg  * @wext.prev_bssid_valid: (private) previous BSSID validity
47269bc383deSJohannes Berg  * @use_4addr: indicates 4addr mode is used on this interface, must be
47279bc383deSJohannes Berg  *	set by driver (if supported) on add_interface BEFORE registering the
47289bc383deSJohannes Berg  *	netdev and may otherwise be used by driver read-only, will be update
47299bc383deSJohannes Berg  *	by cfg80211 on change_interface
47302e161f78SJohannes Berg  * @mgmt_registrations: list of registrations for management frames
47312e161f78SJohannes Berg  * @mgmt_registrations_lock: lock for the list
47328d61ffa5SJohannes Berg  * @mtx: mutex used to lock data in this struct, may be used by drivers
47338d61ffa5SJohannes Berg  *	and some API functions require it held
473456d1893dSJohannes Berg  * @beacon_interval: beacon interval used on this device for transmitting
473556d1893dSJohannes Berg  *	beacons, 0 when not valid
473698104fdeSJohannes Berg  * @address: The address for this device, valid only if @netdev is %NULL
473773c7da3dSArend Van Spriel  * @is_running: true if this is a non-netdev device that has been started, e.g.
473873c7da3dSArend Van Spriel  *	the P2P Device.
473904f39047SSimon Wunderlich  * @cac_started: true if DFS channel availability check has been started
474004f39047SSimon Wunderlich  * @cac_start_time: timestamp (jiffies) when the dfs state was entered.
474131559f35SJanusz Dziedzic  * @cac_time_ms: CAC time in ms
4742780b40dfSJohannes Berg  * @ps: powersave mode is enabled
4743780b40dfSJohannes Berg  * @ps_timeout: dynamic powersave timeout
4744780b40dfSJohannes Berg  * @ap_unexpected_nlportid: (private) netlink port ID of application
4745780b40dfSJohannes Berg  *	registered for unexpected class 3 frames (AP mode)
4746780b40dfSJohannes Berg  * @conn: (private) cfg80211 software SME connection state machine data
4747780b40dfSJohannes Berg  * @connect_keys: (private) keys to set after connection is established
474834d50519SLior David  * @conn_bss_type: connecting/connected BSS type
4749bd2522b1SAndrzej Zaborowski  * @conn_owner_nlportid: (private) connection owner socket port ID
4750bd2522b1SAndrzej Zaborowski  * @disconnect_wk: (private) auto-disconnect work
4751bd2522b1SAndrzej Zaborowski  * @disconnect_bssid: (private) the BSSID to use for auto-disconnect
4752780b40dfSJohannes Berg  * @ibss_fixed: (private) IBSS is using fixed BSSID
47535336fa88SSimon Wunderlich  * @ibss_dfs_possible: (private) IBSS may change to a DFS channel
4754780b40dfSJohannes Berg  * @event_list: (private) list for internal event processing
4755780b40dfSJohannes Berg  * @event_lock: (private) lock for event list
475678f22b6aSJohannes Berg  * @owner_nlportid: (private) owner socket port ID
4757ab81007aSJohannes Berg  * @nl_owner_dead: (private) owner socket went away
47584a4b8169SAndrew Zaborowski  * @cqm_config: (private) nl80211 RSSI monitor state
47599bb7e0f2SJohannes Berg  * @pmsr_list: (private) peer measurement requests
47609bb7e0f2SJohannes Berg  * @pmsr_lock: (private) peer measurements requests/results lock
47619bb7e0f2SJohannes Berg  * @pmsr_free_wk: (private) peer measurements cleanup work
4762d3236553SJohannes Berg  */
4763d3236553SJohannes Berg struct wireless_dev {
4764d3236553SJohannes Berg 	struct wiphy *wiphy;
4765d3236553SJohannes Berg 	enum nl80211_iftype iftype;
4766d3236553SJohannes Berg 
4767667503ddSJohannes Berg 	/* the remainder of this struct should be private to cfg80211 */
4768d3236553SJohannes Berg 	struct list_head list;
4769d3236553SJohannes Berg 	struct net_device *netdev;
4770d3236553SJohannes Berg 
477189a54e48SJohannes Berg 	u32 identifier;
477289a54e48SJohannes Berg 
47732e161f78SJohannes Berg 	struct list_head mgmt_registrations;
47742e161f78SJohannes Berg 	spinlock_t mgmt_registrations_lock;
4775026331c4SJouni Malinen 
4776667503ddSJohannes Berg 	struct mutex mtx;
4777667503ddSJohannes Berg 
477873c7da3dSArend Van Spriel 	bool use_4addr, is_running;
477998104fdeSJohannes Berg 
478098104fdeSJohannes Berg 	u8 address[ETH_ALEN] __aligned(sizeof(u16));
47819bc383deSJohannes Berg 
4782b23aa676SSamuel Ortiz 	/* currently used for IBSS and SME - might be rearranged later */
4783d3236553SJohannes Berg 	u8 ssid[IEEE80211_MAX_SSID_LEN];
478429cbe68cSJohannes Berg 	u8 ssid_len, mesh_id_len, mesh_id_up_len;
47856829c878SJohannes Berg 	struct cfg80211_conn *conn;
4786fffd0934SJohannes Berg 	struct cfg80211_cached_keys *connect_keys;
478734d50519SLior David 	enum ieee80211_bss_type conn_bss_type;
4788bd2522b1SAndrzej Zaborowski 	u32 conn_owner_nlportid;
4789bd2522b1SAndrzej Zaborowski 
4790bd2522b1SAndrzej Zaborowski 	struct work_struct disconnect_wk;
4791bd2522b1SAndrzej Zaborowski 	u8 disconnect_bssid[ETH_ALEN];
4792d3236553SJohannes Berg 
4793667503ddSJohannes Berg 	struct list_head event_list;
4794667503ddSJohannes Berg 	spinlock_t event_lock;
4795667503ddSJohannes Berg 
479619957bb3SJohannes Berg 	struct cfg80211_internal_bss *current_bss; /* associated / joined */
4797683b6d3bSJohannes Berg 	struct cfg80211_chan_def preset_chandef;
47989e0e2961SMichal Kazior 	struct cfg80211_chan_def chandef;
4799f4489ebeSMichal Kazior 
4800c30a3d38SMichal Kazior 	bool ibss_fixed;
48015336fa88SSimon Wunderlich 	bool ibss_dfs_possible;
4802c30a3d38SMichal Kazior 
4803ffb9eb3dSKalle Valo 	bool ps;
4804ffb9eb3dSKalle Valo 	int ps_timeout;
4805ffb9eb3dSKalle Valo 
480656d1893dSJohannes Berg 	int beacon_interval;
480756d1893dSJohannes Berg 
480815e47304SEric W. Biederman 	u32 ap_unexpected_nlportid;
480928946da7SJohannes Berg 
4810ab81007aSJohannes Berg 	u32 owner_nlportid;
4811ab81007aSJohannes Berg 	bool nl_owner_dead;
4812ab81007aSJohannes Berg 
481304f39047SSimon Wunderlich 	bool cac_started;
481404f39047SSimon Wunderlich 	unsigned long cac_start_time;
481531559f35SJanusz Dziedzic 	unsigned int cac_time_ms;
481604f39047SSimon Wunderlich 
48173d23e349SJohannes Berg #ifdef CONFIG_CFG80211_WEXT
4818d3236553SJohannes Berg 	/* wext data */
4819cbe8fa9cSJohannes Berg 	struct {
4820cbe8fa9cSJohannes Berg 		struct cfg80211_ibss_params ibss;
4821f2129354SJohannes Berg 		struct cfg80211_connect_params connect;
4822fffd0934SJohannes Berg 		struct cfg80211_cached_keys *keys;
4823c1e5f471SJohannes Berg 		const u8 *ie;
4824f2129354SJohannes Berg 		size_t ie_len;
48259874b71fSJohannes Berg 		u8 bssid[ETH_ALEN];
48269874b71fSJohannes Berg 		u8 prev_bssid[ETH_ALEN];
4827f2129354SJohannes Berg 		u8 ssid[IEEE80211_MAX_SSID_LEN];
482808645126SJohannes Berg 		s8 default_key, default_mgmt_key;
4829ffb9eb3dSKalle Valo 		bool prev_bssid_valid;
4830cbe8fa9cSJohannes Berg 	} wext;
4831d3236553SJohannes Berg #endif
48324a4b8169SAndrew Zaborowski 
48334a4b8169SAndrew Zaborowski 	struct cfg80211_cqm_config *cqm_config;
48349bb7e0f2SJohannes Berg 
48359bb7e0f2SJohannes Berg 	struct list_head pmsr_list;
48369bb7e0f2SJohannes Berg 	spinlock_t pmsr_lock;
48379bb7e0f2SJohannes Berg 	struct work_struct pmsr_free_wk;
4838d3236553SJohannes Berg };
4839d3236553SJohannes Berg 
484098104fdeSJohannes Berg static inline u8 *wdev_address(struct wireless_dev *wdev)
484198104fdeSJohannes Berg {
484298104fdeSJohannes Berg 	if (wdev->netdev)
484398104fdeSJohannes Berg 		return wdev->netdev->dev_addr;
484498104fdeSJohannes Berg 	return wdev->address;
484598104fdeSJohannes Berg }
484698104fdeSJohannes Berg 
484773c7da3dSArend Van Spriel static inline bool wdev_running(struct wireless_dev *wdev)
484873c7da3dSArend Van Spriel {
484973c7da3dSArend Van Spriel 	if (wdev->netdev)
485073c7da3dSArend Van Spriel 		return netif_running(wdev->netdev);
485173c7da3dSArend Van Spriel 	return wdev->is_running;
485273c7da3dSArend Van Spriel }
485373c7da3dSArend Van Spriel 
4854d3236553SJohannes Berg /**
4855d3236553SJohannes Berg  * wdev_priv - return wiphy priv from wireless_dev
4856d3236553SJohannes Berg  *
4857d3236553SJohannes Berg  * @wdev: The wireless device whose wiphy's priv pointer to return
48580ae997dcSYacine Belkadi  * Return: The wiphy priv of @wdev.
4859d3236553SJohannes Berg  */
4860d3236553SJohannes Berg static inline void *wdev_priv(struct wireless_dev *wdev)
4861d3236553SJohannes Berg {
4862d3236553SJohannes Berg 	BUG_ON(!wdev);
4863d3236553SJohannes Berg 	return wiphy_priv(wdev->wiphy);
4864d3236553SJohannes Berg }
4865d3236553SJohannes Berg 
4866d70e9693SJohannes Berg /**
4867d70e9693SJohannes Berg  * DOC: Utility functions
4868d70e9693SJohannes Berg  *
4869d70e9693SJohannes Berg  * cfg80211 offers a number of utility functions that can be useful.
4870d3236553SJohannes Berg  */
4871d3236553SJohannes Berg 
4872d3236553SJohannes Berg /**
4873d3236553SJohannes Berg  * ieee80211_channel_to_frequency - convert channel number to frequency
4874abe37c4bSJohannes Berg  * @chan: channel number
487559eb21a6SBruno Randolf  * @band: band, necessary due to channel number overlap
48760ae997dcSYacine Belkadi  * Return: The corresponding frequency (in MHz), or 0 if the conversion failed.
4877d3236553SJohannes Berg  */
487857fbcce3SJohannes Berg int ieee80211_channel_to_frequency(int chan, enum nl80211_band band);
4879d3236553SJohannes Berg 
4880d3236553SJohannes Berg /**
4881d3236553SJohannes Berg  * ieee80211_frequency_to_channel - convert frequency to channel number
4882abe37c4bSJohannes Berg  * @freq: center frequency
48830ae997dcSYacine Belkadi  * Return: The corresponding channel, or 0 if the conversion failed.
4884d3236553SJohannes Berg  */
488510dd9b7cSJoe Perches int ieee80211_frequency_to_channel(int freq);
4886d3236553SJohannes Berg 
4887d3236553SJohannes Berg /**
4888d3236553SJohannes Berg  * ieee80211_get_channel - get channel struct from wiphy for specified frequency
4889543b921bSArend Van Spriel  *
4890abe37c4bSJohannes Berg  * @wiphy: the struct wiphy to get the channel for
4891abe37c4bSJohannes Berg  * @freq: the center frequency of the channel
4892543b921bSArend Van Spriel  *
48930ae997dcSYacine Belkadi  * Return: The channel struct from @wiphy at @freq.
4894d3236553SJohannes Berg  */
4895543b921bSArend Van Spriel struct ieee80211_channel *ieee80211_get_channel(struct wiphy *wiphy, int freq);
4896d3236553SJohannes Berg 
4897d3236553SJohannes Berg /**
4898d3236553SJohannes Berg  * ieee80211_get_response_rate - get basic rate for a given rate
4899d3236553SJohannes Berg  *
4900d3236553SJohannes Berg  * @sband: the band to look for rates in
4901d3236553SJohannes Berg  * @basic_rates: bitmap of basic rates
4902d3236553SJohannes Berg  * @bitrate: the bitrate for which to find the basic rate
4903d3236553SJohannes Berg  *
49040ae997dcSYacine Belkadi  * Return: The basic rate corresponding to a given bitrate, that
49050ae997dcSYacine Belkadi  * is the next lower bitrate contained in the basic rate map,
49060ae997dcSYacine Belkadi  * which is, for this function, given as a bitmap of indices of
49070ae997dcSYacine Belkadi  * rates in the band's bitrate table.
4908d3236553SJohannes Berg  */
4909d3236553SJohannes Berg struct ieee80211_rate *
4910d3236553SJohannes Berg ieee80211_get_response_rate(struct ieee80211_supported_band *sband,
4911d3236553SJohannes Berg 			    u32 basic_rates, int bitrate);
4912d3236553SJohannes Berg 
4913b422c6cdSAshok Nagarajan /**
4914b422c6cdSAshok Nagarajan  * ieee80211_mandatory_rates - get mandatory rates for a given band
4915b422c6cdSAshok Nagarajan  * @sband: the band to look for rates in
491674608acaSSimon Wunderlich  * @scan_width: width of the control channel
4917b422c6cdSAshok Nagarajan  *
4918b422c6cdSAshok Nagarajan  * This function returns a bitmap of the mandatory rates for the given
4919b422c6cdSAshok Nagarajan  * band, bits are set according to the rate position in the bitrates array.
4920b422c6cdSAshok Nagarajan  */
492174608acaSSimon Wunderlich u32 ieee80211_mandatory_rates(struct ieee80211_supported_band *sband,
492274608acaSSimon Wunderlich 			      enum nl80211_bss_scan_width scan_width);
4923b422c6cdSAshok Nagarajan 
4924d3236553SJohannes Berg /*
4925d3236553SJohannes Berg  * Radiotap parsing functions -- for controlled injection support
4926d3236553SJohannes Berg  *
4927d3236553SJohannes Berg  * Implemented in net/wireless/radiotap.c
4928d3236553SJohannes Berg  * Documentation in Documentation/networking/radiotap-headers.txt
4929d3236553SJohannes Berg  */
4930d3236553SJohannes Berg 
493133e5a2f7SJohannes Berg struct radiotap_align_size {
493233e5a2f7SJohannes Berg 	uint8_t align:4, size:4;
493333e5a2f7SJohannes Berg };
493433e5a2f7SJohannes Berg 
493533e5a2f7SJohannes Berg struct ieee80211_radiotap_namespace {
493633e5a2f7SJohannes Berg 	const struct radiotap_align_size *align_size;
493733e5a2f7SJohannes Berg 	int n_bits;
493833e5a2f7SJohannes Berg 	uint32_t oui;
493933e5a2f7SJohannes Berg 	uint8_t subns;
494033e5a2f7SJohannes Berg };
494133e5a2f7SJohannes Berg 
494233e5a2f7SJohannes Berg struct ieee80211_radiotap_vendor_namespaces {
494333e5a2f7SJohannes Berg 	const struct ieee80211_radiotap_namespace *ns;
494433e5a2f7SJohannes Berg 	int n_ns;
494533e5a2f7SJohannes Berg };
494633e5a2f7SJohannes Berg 
4947d3236553SJohannes Berg /**
4948d3236553SJohannes Berg  * struct ieee80211_radiotap_iterator - tracks walk thru present radiotap args
494933e5a2f7SJohannes Berg  * @this_arg_index: index of current arg, valid after each successful call
495033e5a2f7SJohannes Berg  *	to ieee80211_radiotap_iterator_next()
495133e5a2f7SJohannes Berg  * @this_arg: pointer to current radiotap arg; it is valid after each
495233e5a2f7SJohannes Berg  *	call to ieee80211_radiotap_iterator_next() but also after
495333e5a2f7SJohannes Berg  *	ieee80211_radiotap_iterator_init() where it will point to
495433e5a2f7SJohannes Berg  *	the beginning of the actual data portion
495533e5a2f7SJohannes Berg  * @this_arg_size: length of the current arg, for convenience
495633e5a2f7SJohannes Berg  * @current_namespace: pointer to the current namespace definition
495733e5a2f7SJohannes Berg  *	(or internally %NULL if the current namespace is unknown)
495833e5a2f7SJohannes Berg  * @is_radiotap_ns: indicates whether the current namespace is the default
495933e5a2f7SJohannes Berg  *	radiotap namespace or not
496033e5a2f7SJohannes Berg  *
496133e5a2f7SJohannes Berg  * @_rtheader: pointer to the radiotap header we are walking through
496233e5a2f7SJohannes Berg  * @_max_length: length of radiotap header in cpu byte ordering
496333e5a2f7SJohannes Berg  * @_arg_index: next argument index
496433e5a2f7SJohannes Berg  * @_arg: next argument pointer
496533e5a2f7SJohannes Berg  * @_next_bitmap: internal pointer to next present u32
496633e5a2f7SJohannes Berg  * @_bitmap_shifter: internal shifter for curr u32 bitmap, b0 set == arg present
496733e5a2f7SJohannes Berg  * @_vns: vendor namespace definitions
496833e5a2f7SJohannes Berg  * @_next_ns_data: beginning of the next namespace's data
496933e5a2f7SJohannes Berg  * @_reset_on_ext: internal; reset the arg index to 0 when going to the
497033e5a2f7SJohannes Berg  *	next bitmap word
497133e5a2f7SJohannes Berg  *
497233e5a2f7SJohannes Berg  * Describes the radiotap parser state. Fields prefixed with an underscore
497333e5a2f7SJohannes Berg  * must not be used by users of the parser, only by the parser internally.
4974d3236553SJohannes Berg  */
4975d3236553SJohannes Berg 
4976d3236553SJohannes Berg struct ieee80211_radiotap_iterator {
497733e5a2f7SJohannes Berg 	struct ieee80211_radiotap_header *_rtheader;
497833e5a2f7SJohannes Berg 	const struct ieee80211_radiotap_vendor_namespaces *_vns;
497933e5a2f7SJohannes Berg 	const struct ieee80211_radiotap_namespace *current_namespace;
4980d3236553SJohannes Berg 
498133e5a2f7SJohannes Berg 	unsigned char *_arg, *_next_ns_data;
498267272440SJohannes Berg 	__le32 *_next_bitmap;
498333e5a2f7SJohannes Berg 
498433e5a2f7SJohannes Berg 	unsigned char *this_arg;
498533e5a2f7SJohannes Berg 	int this_arg_index;
498633e5a2f7SJohannes Berg 	int this_arg_size;
498733e5a2f7SJohannes Berg 
498833e5a2f7SJohannes Berg 	int is_radiotap_ns;
498933e5a2f7SJohannes Berg 
499033e5a2f7SJohannes Berg 	int _max_length;
499133e5a2f7SJohannes Berg 	int _arg_index;
499233e5a2f7SJohannes Berg 	uint32_t _bitmap_shifter;
499333e5a2f7SJohannes Berg 	int _reset_on_ext;
4994d3236553SJohannes Berg };
4995d3236553SJohannes Berg 
499610dd9b7cSJoe Perches int
499710dd9b7cSJoe Perches ieee80211_radiotap_iterator_init(struct ieee80211_radiotap_iterator *iterator,
4998d3236553SJohannes Berg 				 struct ieee80211_radiotap_header *radiotap_header,
499910dd9b7cSJoe Perches 				 int max_length,
500010dd9b7cSJoe Perches 				 const struct ieee80211_radiotap_vendor_namespaces *vns);
5001d3236553SJohannes Berg 
500210dd9b7cSJoe Perches int
500310dd9b7cSJoe Perches ieee80211_radiotap_iterator_next(struct ieee80211_radiotap_iterator *iterator);
5004d3236553SJohannes Berg 
500533e5a2f7SJohannes Berg 
5006e31a16d6SZhu Yi extern const unsigned char rfc1042_header[6];
5007e31a16d6SZhu Yi extern const unsigned char bridge_tunnel_header[6];
5008e31a16d6SZhu Yi 
5009e31a16d6SZhu Yi /**
5010e31a16d6SZhu Yi  * ieee80211_get_hdrlen_from_skb - get header length from data
5011e31a16d6SZhu Yi  *
5012e31a16d6SZhu Yi  * @skb: the frame
50130ae997dcSYacine Belkadi  *
50140ae997dcSYacine Belkadi  * Given an skb with a raw 802.11 header at the data pointer this function
50150ae997dcSYacine Belkadi  * returns the 802.11 header length.
50160ae997dcSYacine Belkadi  *
50170ae997dcSYacine Belkadi  * Return: The 802.11 header length in bytes (not including encryption
50180ae997dcSYacine Belkadi  * headers). Or 0 if the data in the sk_buff is too short to contain a valid
50190ae997dcSYacine Belkadi  * 802.11 header.
5020e31a16d6SZhu Yi  */
5021e31a16d6SZhu Yi unsigned int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb);
5022e31a16d6SZhu Yi 
5023e31a16d6SZhu Yi /**
5024e31a16d6SZhu Yi  * ieee80211_hdrlen - get header length in bytes from frame control
5025e31a16d6SZhu Yi  * @fc: frame control field in little-endian format
50260ae997dcSYacine Belkadi  * Return: The header length in bytes.
5027e31a16d6SZhu Yi  */
5028633adf1aSJohannes Berg unsigned int __attribute_const__ ieee80211_hdrlen(__le16 fc);
5029e31a16d6SZhu Yi 
5030e31a16d6SZhu Yi /**
50319b395bc3SJohannes Berg  * ieee80211_get_mesh_hdrlen - get mesh extension header length
50329b395bc3SJohannes Berg  * @meshhdr: the mesh extension header, only the flags field
50339b395bc3SJohannes Berg  *	(first byte) will be accessed
50340ae997dcSYacine Belkadi  * Return: The length of the extension header, which is always at
50359b395bc3SJohannes Berg  * least 6 bytes and at most 18 if address 5 and 6 are present.
50369b395bc3SJohannes Berg  */
50379b395bc3SJohannes Berg unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr);
50389b395bc3SJohannes Berg 
50399b395bc3SJohannes Berg /**
5040d70e9693SJohannes Berg  * DOC: Data path helpers
5041d70e9693SJohannes Berg  *
5042d70e9693SJohannes Berg  * In addition to generic utilities, cfg80211 also offers
5043d70e9693SJohannes Berg  * functions that help implement the data path for devices
5044d70e9693SJohannes Berg  * that do not do the 802.11/802.3 conversion on the device.
5045d70e9693SJohannes Berg  */
5046d70e9693SJohannes Berg 
5047d70e9693SJohannes Berg /**
50487f6990c8SJohannes Berg  * ieee80211_data_to_8023_exthdr - convert an 802.11 data frame to 802.3
50497f6990c8SJohannes Berg  * @skb: the 802.11 data frame
50507f6990c8SJohannes Berg  * @ehdr: pointer to a &struct ethhdr that will get the header, instead
50517f6990c8SJohannes Berg  *	of it being pushed into the SKB
50527f6990c8SJohannes Berg  * @addr: the device MAC address
50537f6990c8SJohannes Berg  * @iftype: the virtual interface type
505424bba078SFelix Fietkau  * @data_offset: offset of payload after the 802.11 header
50557f6990c8SJohannes Berg  * Return: 0 on success. Non-zero on error.
50567f6990c8SJohannes Berg  */
50577f6990c8SJohannes Berg int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr,
505824bba078SFelix Fietkau 				  const u8 *addr, enum nl80211_iftype iftype,
505924bba078SFelix Fietkau 				  u8 data_offset);
50607f6990c8SJohannes Berg 
50617f6990c8SJohannes Berg /**
5062e31a16d6SZhu Yi  * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3
5063e31a16d6SZhu Yi  * @skb: the 802.11 data frame
5064e31a16d6SZhu Yi  * @addr: the device MAC address
5065e31a16d6SZhu Yi  * @iftype: the virtual interface type
50660ae997dcSYacine Belkadi  * Return: 0 on success. Non-zero on error.
5067e31a16d6SZhu Yi  */
50687f6990c8SJohannes Berg static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr,
50697f6990c8SJohannes Berg 					 enum nl80211_iftype iftype)
50707f6990c8SJohannes Berg {
507124bba078SFelix Fietkau 	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0);
50727f6990c8SJohannes Berg }
5073e31a16d6SZhu Yi 
5074e31a16d6SZhu Yi /**
5075eaf85ca7SZhu Yi  * ieee80211_amsdu_to_8023s - decode an IEEE 802.11n A-MSDU frame
5076eaf85ca7SZhu Yi  *
50777f6990c8SJohannes Berg  * Decode an IEEE 802.11 A-MSDU and convert it to a list of 802.3 frames.
50787f6990c8SJohannes Berg  * The @list will be empty if the decode fails. The @skb must be fully
50797f6990c8SJohannes Berg  * header-less before being passed in here; it is freed in this function.
5080eaf85ca7SZhu Yi  *
50817f6990c8SJohannes Berg  * @skb: The input A-MSDU frame without any headers.
5082eaf85ca7SZhu Yi  * @list: The output list of 802.3 frames. It must be allocated and
5083eaf85ca7SZhu Yi  *	initialized by by the caller.
5084eaf85ca7SZhu Yi  * @addr: The device MAC address.
5085eaf85ca7SZhu Yi  * @iftype: The device interface type.
5086eaf85ca7SZhu Yi  * @extra_headroom: The hardware extra headroom for SKBs in the @list.
50878b935ee2SJohannes Berg  * @check_da: DA to check in the inner ethernet header, or NULL
50888b935ee2SJohannes Berg  * @check_sa: SA to check in the inner ethernet header, or NULL
5089eaf85ca7SZhu Yi  */
5090eaf85ca7SZhu Yi void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list,
5091eaf85ca7SZhu Yi 			      const u8 *addr, enum nl80211_iftype iftype,
50928b3becadSYogesh Ashok Powar 			      const unsigned int extra_headroom,
50938b935ee2SJohannes Berg 			      const u8 *check_da, const u8 *check_sa);
5094eaf85ca7SZhu Yi 
5095eaf85ca7SZhu Yi /**
5096e31a16d6SZhu Yi  * cfg80211_classify8021d - determine the 802.1p/1d tag for a data frame
5097e31a16d6SZhu Yi  * @skb: the data frame
5098fa9ffc74SKyeyoon Park  * @qos_map: Interworking QoS mapping or %NULL if not in use
50990ae997dcSYacine Belkadi  * Return: The 802.1p/1d tag.
5100e31a16d6SZhu Yi  */
5101fa9ffc74SKyeyoon Park unsigned int cfg80211_classify8021d(struct sk_buff *skb,
5102fa9ffc74SKyeyoon Park 				    struct cfg80211_qos_map *qos_map);
5103e31a16d6SZhu Yi 
5104c21dbf92SJohannes Berg /**
510549a68e0dSJohannes Berg  * cfg80211_find_elem_match - match information element and byte array in data
510649a68e0dSJohannes Berg  *
510749a68e0dSJohannes Berg  * @eid: element ID
510849a68e0dSJohannes Berg  * @ies: data consisting of IEs
510949a68e0dSJohannes Berg  * @len: length of data
511049a68e0dSJohannes Berg  * @match: byte array to match
511149a68e0dSJohannes Berg  * @match_len: number of bytes in the match array
511249a68e0dSJohannes Berg  * @match_offset: offset in the IE data where the byte array should match.
511349a68e0dSJohannes Berg  *	Note the difference to cfg80211_find_ie_match() which considers
511449a68e0dSJohannes Berg  *	the offset to start from the element ID byte, but here we take
511549a68e0dSJohannes Berg  *	the data portion instead.
511649a68e0dSJohannes Berg  *
511749a68e0dSJohannes Berg  * Return: %NULL if the element ID could not be found or if
511849a68e0dSJohannes Berg  * the element is invalid (claims to be longer than the given
511949a68e0dSJohannes Berg  * data) or if the byte array doesn't match; otherwise return the
512049a68e0dSJohannes Berg  * requested element struct.
512149a68e0dSJohannes Berg  *
512249a68e0dSJohannes Berg  * Note: There are no checks on the element length other than
512349a68e0dSJohannes Berg  * having to fit into the given data and being large enough for the
512449a68e0dSJohannes Berg  * byte array to match.
512549a68e0dSJohannes Berg  */
512649a68e0dSJohannes Berg const struct element *
512749a68e0dSJohannes Berg cfg80211_find_elem_match(u8 eid, const u8 *ies, unsigned int len,
512849a68e0dSJohannes Berg 			 const u8 *match, unsigned int match_len,
512949a68e0dSJohannes Berg 			 unsigned int match_offset);
513049a68e0dSJohannes Berg 
513149a68e0dSJohannes Berg /**
5132fbd05e4aSLuca Coelho  * cfg80211_find_ie_match - match information element and byte array in data
5133fbd05e4aSLuca Coelho  *
5134fbd05e4aSLuca Coelho  * @eid: element ID
5135fbd05e4aSLuca Coelho  * @ies: data consisting of IEs
5136fbd05e4aSLuca Coelho  * @len: length of data
5137fbd05e4aSLuca Coelho  * @match: byte array to match
5138fbd05e4aSLuca Coelho  * @match_len: number of bytes in the match array
5139fbd05e4aSLuca Coelho  * @match_offset: offset in the IE where the byte array should match.
5140fbd05e4aSLuca Coelho  *	If match_len is zero, this must also be set to zero.
5141fbd05e4aSLuca Coelho  *	Otherwise this must be set to 2 or more, because the first
5142fbd05e4aSLuca Coelho  *	byte is the element id, which is already compared to eid, and
5143fbd05e4aSLuca Coelho  *	the second byte is the IE length.
5144fbd05e4aSLuca Coelho  *
5145fbd05e4aSLuca Coelho  * Return: %NULL if the element ID could not be found or if
5146fbd05e4aSLuca Coelho  * the element is invalid (claims to be longer than the given
5147fbd05e4aSLuca Coelho  * data) or if the byte array doesn't match, or a pointer to the first
5148fbd05e4aSLuca Coelho  * byte of the requested element, that is the byte containing the
5149fbd05e4aSLuca Coelho  * element ID.
5150fbd05e4aSLuca Coelho  *
5151fbd05e4aSLuca Coelho  * Note: There are no checks on the element length other than
5152fbd05e4aSLuca Coelho  * having to fit into the given data and being large enough for the
5153fbd05e4aSLuca Coelho  * byte array to match.
5154fbd05e4aSLuca Coelho  */
515549a68e0dSJohannes Berg static inline const u8 *
515649a68e0dSJohannes Berg cfg80211_find_ie_match(u8 eid, const u8 *ies, unsigned int len,
515749a68e0dSJohannes Berg 		       const u8 *match, unsigned int match_len,
515849a68e0dSJohannes Berg 		       unsigned int match_offset)
515949a68e0dSJohannes Berg {
516049a68e0dSJohannes Berg 	/* match_offset can't be smaller than 2, unless match_len is
516149a68e0dSJohannes Berg 	 * zero, in which case match_offset must be zero as well.
516249a68e0dSJohannes Berg 	 */
516349a68e0dSJohannes Berg 	if (WARN_ON((match_len && match_offset < 2) ||
516449a68e0dSJohannes Berg 		    (!match_len && match_offset)))
516549a68e0dSJohannes Berg 		return NULL;
516649a68e0dSJohannes Berg 
516749a68e0dSJohannes Berg 	return (void *)cfg80211_find_elem_match(eid, ies, len,
516849a68e0dSJohannes Berg 						match, match_len,
516949a68e0dSJohannes Berg 						match_offset ?
517049a68e0dSJohannes Berg 							match_offset - 2 : 0);
517149a68e0dSJohannes Berg }
517249a68e0dSJohannes Berg 
517349a68e0dSJohannes Berg /**
517449a68e0dSJohannes Berg  * cfg80211_find_elem - find information element in data
517549a68e0dSJohannes Berg  *
517649a68e0dSJohannes Berg  * @eid: element ID
517749a68e0dSJohannes Berg  * @ies: data consisting of IEs
517849a68e0dSJohannes Berg  * @len: length of data
517949a68e0dSJohannes Berg  *
518049a68e0dSJohannes Berg  * Return: %NULL if the element ID could not be found or if
518149a68e0dSJohannes Berg  * the element is invalid (claims to be longer than the given
518249a68e0dSJohannes Berg  * data) or if the byte array doesn't match; otherwise return the
518349a68e0dSJohannes Berg  * requested element struct.
518449a68e0dSJohannes Berg  *
518549a68e0dSJohannes Berg  * Note: There are no checks on the element length other than
518649a68e0dSJohannes Berg  * having to fit into the given data.
518749a68e0dSJohannes Berg  */
518849a68e0dSJohannes Berg static inline const struct element *
518949a68e0dSJohannes Berg cfg80211_find_elem(u8 eid, const u8 *ies, int len)
519049a68e0dSJohannes Berg {
519149a68e0dSJohannes Berg 	return cfg80211_find_elem_match(eid, ies, len, NULL, 0, 0);
519249a68e0dSJohannes Berg }
5193fbd05e4aSLuca Coelho 
5194fbd05e4aSLuca Coelho /**
5195c21dbf92SJohannes Berg  * cfg80211_find_ie - find information element in data
5196c21dbf92SJohannes Berg  *
5197c21dbf92SJohannes Berg  * @eid: element ID
5198c21dbf92SJohannes Berg  * @ies: data consisting of IEs
5199c21dbf92SJohannes Berg  * @len: length of data
5200c21dbf92SJohannes Berg  *
52010ae997dcSYacine Belkadi  * Return: %NULL if the element ID could not be found or if
52020ae997dcSYacine Belkadi  * the element is invalid (claims to be longer than the given
52030ae997dcSYacine Belkadi  * data), or a pointer to the first byte of the requested
52040ae997dcSYacine Belkadi  * element, that is the byte containing the element ID.
52050ae997dcSYacine Belkadi  *
52060ae997dcSYacine Belkadi  * Note: There are no checks on the element length other than
52070ae997dcSYacine Belkadi  * having to fit into the given data.
5208c21dbf92SJohannes Berg  */
5209fbd05e4aSLuca Coelho static inline const u8 *cfg80211_find_ie(u8 eid, const u8 *ies, int len)
5210fbd05e4aSLuca Coelho {
5211fbd05e4aSLuca Coelho 	return cfg80211_find_ie_match(eid, ies, len, NULL, 0, 0);
5212fbd05e4aSLuca Coelho }
5213c21dbf92SJohannes Berg 
5214d70e9693SJohannes Berg /**
521549a68e0dSJohannes Berg  * cfg80211_find_ext_elem - find information element with EID Extension in data
521649a68e0dSJohannes Berg  *
521749a68e0dSJohannes Berg  * @ext_eid: element ID Extension
521849a68e0dSJohannes Berg  * @ies: data consisting of IEs
521949a68e0dSJohannes Berg  * @len: length of data
522049a68e0dSJohannes Berg  *
522149a68e0dSJohannes Berg  * Return: %NULL if the etended element could not be found or if
522249a68e0dSJohannes Berg  * the element is invalid (claims to be longer than the given
522349a68e0dSJohannes Berg  * data) or if the byte array doesn't match; otherwise return the
522449a68e0dSJohannes Berg  * requested element struct.
522549a68e0dSJohannes Berg  *
522649a68e0dSJohannes Berg  * Note: There are no checks on the element length other than
522749a68e0dSJohannes Berg  * having to fit into the given data.
522849a68e0dSJohannes Berg  */
522949a68e0dSJohannes Berg static inline const struct element *
523049a68e0dSJohannes Berg cfg80211_find_ext_elem(u8 ext_eid, const u8 *ies, int len)
523149a68e0dSJohannes Berg {
523249a68e0dSJohannes Berg 	return cfg80211_find_elem_match(WLAN_EID_EXTENSION, ies, len,
523349a68e0dSJohannes Berg 					&ext_eid, 1, 0);
523449a68e0dSJohannes Berg }
523549a68e0dSJohannes Berg 
523649a68e0dSJohannes Berg /**
52373f817fe7SJouni Malinen  * cfg80211_find_ext_ie - find information element with EID Extension in data
52383f817fe7SJouni Malinen  *
52393f817fe7SJouni Malinen  * @ext_eid: element ID Extension
52403f817fe7SJouni Malinen  * @ies: data consisting of IEs
52413f817fe7SJouni Malinen  * @len: length of data
52423f817fe7SJouni Malinen  *
52433f817fe7SJouni Malinen  * Return: %NULL if the extended element ID could not be found or if
52443f817fe7SJouni Malinen  * the element is invalid (claims to be longer than the given
52453f817fe7SJouni Malinen  * data), or a pointer to the first byte of the requested
52463f817fe7SJouni Malinen  * element, that is the byte containing the element ID.
52473f817fe7SJouni Malinen  *
52483f817fe7SJouni Malinen  * Note: There are no checks on the element length other than
52493f817fe7SJouni Malinen  * having to fit into the given data.
52503f817fe7SJouni Malinen  */
52513f817fe7SJouni Malinen static inline const u8 *cfg80211_find_ext_ie(u8 ext_eid, const u8 *ies, int len)
52523f817fe7SJouni Malinen {
52533f817fe7SJouni Malinen 	return cfg80211_find_ie_match(WLAN_EID_EXTENSION, ies, len,
52543f817fe7SJouni Malinen 				      &ext_eid, 1, 2);
52553f817fe7SJouni Malinen }
52563f817fe7SJouni Malinen 
52573f817fe7SJouni Malinen /**
525849a68e0dSJohannes Berg  * cfg80211_find_vendor_elem - find vendor specific information element in data
525949a68e0dSJohannes Berg  *
526049a68e0dSJohannes Berg  * @oui: vendor OUI
526149a68e0dSJohannes Berg  * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any
526249a68e0dSJohannes Berg  * @ies: data consisting of IEs
526349a68e0dSJohannes Berg  * @len: length of data
526449a68e0dSJohannes Berg  *
526549a68e0dSJohannes Berg  * Return: %NULL if the vendor specific element ID could not be found or if the
526649a68e0dSJohannes Berg  * element is invalid (claims to be longer than the given data); otherwise
526749a68e0dSJohannes Berg  * return the element structure for the requested element.
526849a68e0dSJohannes Berg  *
526949a68e0dSJohannes Berg  * Note: There are no checks on the element length other than having to fit into
527049a68e0dSJohannes Berg  * the given data.
527149a68e0dSJohannes Berg  */
527249a68e0dSJohannes Berg const struct element *cfg80211_find_vendor_elem(unsigned int oui, int oui_type,
527349a68e0dSJohannes Berg 						const u8 *ies,
527449a68e0dSJohannes Berg 						unsigned int len);
527549a68e0dSJohannes Berg 
527649a68e0dSJohannes Berg /**
52770c28ec58SEliad Peller  * cfg80211_find_vendor_ie - find vendor specific information element in data
52780c28ec58SEliad Peller  *
52790c28ec58SEliad Peller  * @oui: vendor OUI
52809e9ea439SEmmanuel Grumbach  * @oui_type: vendor-specific OUI type (must be < 0xff), negative means any
52810c28ec58SEliad Peller  * @ies: data consisting of IEs
52820c28ec58SEliad Peller  * @len: length of data
52830c28ec58SEliad Peller  *
52840ae997dcSYacine Belkadi  * Return: %NULL if the vendor specific element ID could not be found or if the
52850ae997dcSYacine Belkadi  * element is invalid (claims to be longer than the given data), or a pointer to
52860ae997dcSYacine Belkadi  * the first byte of the requested element, that is the byte containing the
52870ae997dcSYacine Belkadi  * element ID.
52880ae997dcSYacine Belkadi  *
52890ae997dcSYacine Belkadi  * Note: There are no checks on the element length other than having to fit into
52900ae997dcSYacine Belkadi  * the given data.
52910c28ec58SEliad Peller  */
529249a68e0dSJohannes Berg static inline const u8 *
529349a68e0dSJohannes Berg cfg80211_find_vendor_ie(unsigned int oui, int oui_type,
529449a68e0dSJohannes Berg 			const u8 *ies, unsigned int len)
529549a68e0dSJohannes Berg {
529649a68e0dSJohannes Berg 	return (void *)cfg80211_find_vendor_elem(oui, oui_type, ies, len);
529749a68e0dSJohannes Berg }
52980c28ec58SEliad Peller 
52990c28ec58SEliad Peller /**
530030ca1aa5SDedy Lansky  * cfg80211_send_layer2_update - send layer 2 update frame
530130ca1aa5SDedy Lansky  *
530230ca1aa5SDedy Lansky  * @dev: network device
530330ca1aa5SDedy Lansky  * @addr: STA MAC address
530430ca1aa5SDedy Lansky  *
530530ca1aa5SDedy Lansky  * Wireless drivers can use this function to update forwarding tables in bridge
530630ca1aa5SDedy Lansky  * devices upon STA association.
530730ca1aa5SDedy Lansky  */
530830ca1aa5SDedy Lansky void cfg80211_send_layer2_update(struct net_device *dev, const u8 *addr);
530930ca1aa5SDedy Lansky 
531030ca1aa5SDedy Lansky /**
5311d70e9693SJohannes Berg  * DOC: Regulatory enforcement infrastructure
5312d70e9693SJohannes Berg  *
5313d70e9693SJohannes Berg  * TODO
5314d3236553SJohannes Berg  */
5315d3236553SJohannes Berg 
5316d3236553SJohannes Berg /**
5317d3236553SJohannes Berg  * regulatory_hint - driver hint to the wireless core a regulatory domain
5318d3236553SJohannes Berg  * @wiphy: the wireless device giving the hint (used only for reporting
5319d3236553SJohannes Berg  *	conflicts)
5320d3236553SJohannes Berg  * @alpha2: the ISO/IEC 3166 alpha2 the driver claims its regulatory domain
5321d3236553SJohannes Berg  * 	should be in. If @rd is set this should be NULL. Note that if you
5322d3236553SJohannes Berg  * 	set this to NULL you should still set rd->alpha2 to some accepted
5323d3236553SJohannes Berg  * 	alpha2.
5324d3236553SJohannes Berg  *
5325d3236553SJohannes Berg  * Wireless drivers can use this function to hint to the wireless core
5326d3236553SJohannes Berg  * what it believes should be the current regulatory domain by
5327d3236553SJohannes Berg  * giving it an ISO/IEC 3166 alpha2 country code it knows its regulatory
5328d3236553SJohannes Berg  * domain should be in or by providing a completely build regulatory domain.
5329d3236553SJohannes Berg  * If the driver provides an ISO/IEC 3166 alpha2 userspace will be queried
5330d3236553SJohannes Berg  * for a regulatory domain structure for the respective country.
5331d3236553SJohannes Berg  *
5332d3236553SJohannes Berg  * The wiphy must have been registered to cfg80211 prior to this call.
5333d3236553SJohannes Berg  * For cfg80211 drivers this means you must first use wiphy_register(),
5334d3236553SJohannes Berg  * for mac80211 drivers you must first use ieee80211_register_hw().
5335d3236553SJohannes Berg  *
5336d3236553SJohannes Berg  * Drivers should check the return value, its possible you can get
5337d3236553SJohannes Berg  * an -ENOMEM.
53380ae997dcSYacine Belkadi  *
53390ae997dcSYacine Belkadi  * Return: 0 on success. -ENOMEM.
5340d3236553SJohannes Berg  */
534110dd9b7cSJoe Perches int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
5342d3236553SJohannes Berg 
5343d3236553SJohannes Berg /**
5344b0d7aa59SJonathan Doron  * regulatory_set_wiphy_regd - set regdom info for self managed drivers
5345b0d7aa59SJonathan Doron  * @wiphy: the wireless device we want to process the regulatory domain on
5346b0d7aa59SJonathan Doron  * @rd: the regulatory domain informatoin to use for this wiphy
5347b0d7aa59SJonathan Doron  *
5348b0d7aa59SJonathan Doron  * Set the regulatory domain information for self-managed wiphys, only they
5349b0d7aa59SJonathan Doron  * may use this function. See %REGULATORY_WIPHY_SELF_MANAGED for more
5350b0d7aa59SJonathan Doron  * information.
5351b0d7aa59SJonathan Doron  *
5352b0d7aa59SJonathan Doron  * Return: 0 on success. -EINVAL, -EPERM
5353b0d7aa59SJonathan Doron  */
5354b0d7aa59SJonathan Doron int regulatory_set_wiphy_regd(struct wiphy *wiphy,
5355b0d7aa59SJonathan Doron 			      struct ieee80211_regdomain *rd);
5356b0d7aa59SJonathan Doron 
5357b0d7aa59SJonathan Doron /**
53582c3e861cSArik Nemtsov  * regulatory_set_wiphy_regd_sync_rtnl - set regdom for self-managed drivers
53592c3e861cSArik Nemtsov  * @wiphy: the wireless device we want to process the regulatory domain on
53602c3e861cSArik Nemtsov  * @rd: the regulatory domain information to use for this wiphy
53612c3e861cSArik Nemtsov  *
53622c3e861cSArik Nemtsov  * This functions requires the RTNL to be held and applies the new regdomain
53632c3e861cSArik Nemtsov  * synchronously to this wiphy. For more details see
53642c3e861cSArik Nemtsov  * regulatory_set_wiphy_regd().
53652c3e861cSArik Nemtsov  *
53662c3e861cSArik Nemtsov  * Return: 0 on success. -EINVAL, -EPERM
53672c3e861cSArik Nemtsov  */
53682c3e861cSArik Nemtsov int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy,
53692c3e861cSArik Nemtsov 					struct ieee80211_regdomain *rd);
53702c3e861cSArik Nemtsov 
53712c3e861cSArik Nemtsov /**
5372d3236553SJohannes Berg  * wiphy_apply_custom_regulatory - apply a custom driver regulatory domain
5373d3236553SJohannes Berg  * @wiphy: the wireless device we want to process the regulatory domain on
5374d3236553SJohannes Berg  * @regd: the custom regulatory domain to use for this wiphy
5375d3236553SJohannes Berg  *
5376d3236553SJohannes Berg  * Drivers can sometimes have custom regulatory domains which do not apply
5377d3236553SJohannes Berg  * to a specific country. Drivers can use this to apply such custom regulatory
5378d3236553SJohannes Berg  * domains. This routine must be called prior to wiphy registration. The
5379d3236553SJohannes Berg  * custom regulatory domain will be trusted completely and as such previous
5380d3236553SJohannes Berg  * default channel settings will be disregarded. If no rule is found for a
5381d3236553SJohannes Berg  * channel on the regulatory domain the channel will be disabled.
5382222ea581SLuis R. Rodriguez  * Drivers using this for a wiphy should also set the wiphy flag
5383ce26151bSKalle Valo  * REGULATORY_CUSTOM_REG or cfg80211 will set it for the wiphy
5384222ea581SLuis R. Rodriguez  * that called this helper.
5385d3236553SJohannes Berg  */
538610dd9b7cSJoe Perches void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
5387d3236553SJohannes Berg 				   const struct ieee80211_regdomain *regd);
5388d3236553SJohannes Berg 
5389d3236553SJohannes Berg /**
5390d3236553SJohannes Berg  * freq_reg_info - get regulatory information for the given frequency
5391d3236553SJohannes Berg  * @wiphy: the wiphy for which we want to process this rule for
5392d3236553SJohannes Berg  * @center_freq: Frequency in KHz for which we want regulatory information for
5393d3236553SJohannes Berg  *
5394d3236553SJohannes Berg  * Use this function to get the regulatory rule for a specific frequency on
5395d3236553SJohannes Berg  * a given wireless device. If the device has a specific regulatory domain
5396d3236553SJohannes Berg  * it wants to follow we respect that unless a country IE has been received
5397d3236553SJohannes Berg  * and processed already.
5398d3236553SJohannes Berg  *
53990ae997dcSYacine Belkadi  * Return: A valid pointer, or, when an error occurs, for example if no rule
54000ae997dcSYacine Belkadi  * can be found, the return value is encoded using ERR_PTR(). Use IS_ERR() to
54010ae997dcSYacine Belkadi  * check and PTR_ERR() to obtain the numeric return value. The numeric return
54020ae997dcSYacine Belkadi  * value will be -ERANGE if we determine the given center_freq does not even
54030ae997dcSYacine Belkadi  * have a regulatory rule for a frequency range in the center_freq's band.
54040ae997dcSYacine Belkadi  * See freq_in_rule_band() for our current definition of a band -- this is
54050ae997dcSYacine Belkadi  * purely subjective and right now it's 802.11 specific.
5406d3236553SJohannes Berg  */
5407361c9c8bSJohannes Berg const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
5408361c9c8bSJohannes Berg 					       u32 center_freq);
5409d3236553SJohannes Berg 
5410034c6d6eSLuis R. Rodriguez /**
5411034c6d6eSLuis R. Rodriguez  * reg_initiator_name - map regulatory request initiator enum to name
5412034c6d6eSLuis R. Rodriguez  * @initiator: the regulatory request initiator
5413034c6d6eSLuis R. Rodriguez  *
5414034c6d6eSLuis R. Rodriguez  * You can use this to map the regulatory request initiator enum to a
5415034c6d6eSLuis R. Rodriguez  * proper string representation.
5416034c6d6eSLuis R. Rodriguez  */
5417034c6d6eSLuis R. Rodriguez const char *reg_initiator_name(enum nl80211_reg_initiator initiator);
5418034c6d6eSLuis R. Rodriguez 
541919d3577eSHaim Dreyfuss /**
542019d3577eSHaim Dreyfuss  * DOC: Internal regulatory db functions
542119d3577eSHaim Dreyfuss  *
542219d3577eSHaim Dreyfuss  */
542319d3577eSHaim Dreyfuss 
542419d3577eSHaim Dreyfuss /**
542519d3577eSHaim Dreyfuss  * reg_query_regdb_wmm -  Query internal regulatory db for wmm rule
542619d3577eSHaim Dreyfuss  * Regulatory self-managed driver can use it to proactively
542719d3577eSHaim Dreyfuss  *
542819d3577eSHaim Dreyfuss  * @alpha2: the ISO/IEC 3166 alpha2 wmm rule to be queried.
542919d3577eSHaim Dreyfuss  * @freq: the freqency(in MHz) to be queried.
543019d3577eSHaim Dreyfuss  * @rule: pointer to store the wmm rule from the regulatory db.
543119d3577eSHaim Dreyfuss  *
543219d3577eSHaim Dreyfuss  * Self-managed wireless drivers can use this function to  query
543319d3577eSHaim Dreyfuss  * the internal regulatory database to check whether the given
543419d3577eSHaim Dreyfuss  * ISO/IEC 3166 alpha2 country and freq have wmm rule limitations.
543519d3577eSHaim Dreyfuss  *
543619d3577eSHaim Dreyfuss  * Drivers should check the return value, its possible you can get
543719d3577eSHaim Dreyfuss  * an -ENODATA.
543819d3577eSHaim Dreyfuss  *
543919d3577eSHaim Dreyfuss  * Return: 0 on success. -ENODATA.
544019d3577eSHaim Dreyfuss  */
544138cb87eeSStanislaw Gruszka int reg_query_regdb_wmm(char *alpha2, int freq,
544238cb87eeSStanislaw Gruszka 			struct ieee80211_reg_rule *rule);
544319d3577eSHaim Dreyfuss 
5444d3236553SJohannes Berg /*
5445d3236553SJohannes Berg  * callbacks for asynchronous cfg80211 methods, notification
5446d3236553SJohannes Berg  * functions and BSS handling helpers
5447d3236553SJohannes Berg  */
5448d3236553SJohannes Berg 
54492a519311SJohannes Berg /**
54502a519311SJohannes Berg  * cfg80211_scan_done - notify that scan finished
54512a519311SJohannes Berg  *
54522a519311SJohannes Berg  * @request: the corresponding scan request
54531d76250bSAvraham Stern  * @info: information about the completed scan
54542a519311SJohannes Berg  */
54551d76250bSAvraham Stern void cfg80211_scan_done(struct cfg80211_scan_request *request,
54561d76250bSAvraham Stern 			struct cfg80211_scan_info *info);
54572a519311SJohannes Berg 
54582a519311SJohannes Berg /**
5459807f8a8cSLuciano Coelho  * cfg80211_sched_scan_results - notify that new scan results are available
5460807f8a8cSLuciano Coelho  *
5461807f8a8cSLuciano Coelho  * @wiphy: the wiphy which got scheduled scan results
5462b34939b9SArend Van Spriel  * @reqid: identifier for the related scheduled scan request
5463807f8a8cSLuciano Coelho  */
5464b34939b9SArend Van Spriel void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid);
5465807f8a8cSLuciano Coelho 
5466807f8a8cSLuciano Coelho /**
5467807f8a8cSLuciano Coelho  * cfg80211_sched_scan_stopped - notify that the scheduled scan has stopped
5468807f8a8cSLuciano Coelho  *
5469807f8a8cSLuciano Coelho  * @wiphy: the wiphy on which the scheduled scan stopped
5470b34939b9SArend Van Spriel  * @reqid: identifier for the related scheduled scan request
5471807f8a8cSLuciano Coelho  *
5472807f8a8cSLuciano Coelho  * The driver can call this function to inform cfg80211 that the
5473807f8a8cSLuciano Coelho  * scheduled scan had to be stopped, for whatever reason.  The driver
5474807f8a8cSLuciano Coelho  * is then called back via the sched_scan_stop operation when done.
5475807f8a8cSLuciano Coelho  */
5476b34939b9SArend Van Spriel void cfg80211_sched_scan_stopped(struct wiphy *wiphy, u64 reqid);
5477807f8a8cSLuciano Coelho 
5478807f8a8cSLuciano Coelho /**
5479792e6aa7SEliad Peller  * cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped
5480792e6aa7SEliad Peller  *
5481792e6aa7SEliad Peller  * @wiphy: the wiphy on which the scheduled scan stopped
5482b34939b9SArend Van Spriel  * @reqid: identifier for the related scheduled scan request
5483792e6aa7SEliad Peller  *
5484792e6aa7SEliad Peller  * The driver can call this function to inform cfg80211 that the
5485792e6aa7SEliad Peller  * scheduled scan had to be stopped, for whatever reason.  The driver
5486792e6aa7SEliad Peller  * is then called back via the sched_scan_stop operation when done.
5487792e6aa7SEliad Peller  * This function should be called with rtnl locked.
5488792e6aa7SEliad Peller  */
5489b34939b9SArend Van Spriel void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy, u64 reqid);
5490792e6aa7SEliad Peller 
5491792e6aa7SEliad Peller /**
54926e19bc4bSDmitry Shmidt  * cfg80211_inform_bss_frame_data - inform cfg80211 of a received BSS frame
54932a519311SJohannes Berg  * @wiphy: the wiphy reporting the BSS
54946e19bc4bSDmitry Shmidt  * @data: the BSS metadata
5495abe37c4bSJohannes Berg  * @mgmt: the management frame (probe response or beacon)
5496abe37c4bSJohannes Berg  * @len: length of the management frame
54972a519311SJohannes Berg  * @gfp: context flags
54982a519311SJohannes Berg  *
54992a519311SJohannes Berg  * This informs cfg80211 that BSS information was found and
55002a519311SJohannes Berg  * the BSS should be updated/added.
5501ef100682SJohannes Berg  *
55020ae997dcSYacine Belkadi  * Return: A referenced struct, must be released with cfg80211_put_bss()!
55030ae997dcSYacine Belkadi  * Or %NULL on error.
55042a519311SJohannes Berg  */
5505ef100682SJohannes Berg struct cfg80211_bss * __must_check
55066e19bc4bSDmitry Shmidt cfg80211_inform_bss_frame_data(struct wiphy *wiphy,
55076e19bc4bSDmitry Shmidt 			       struct cfg80211_inform_bss *data,
55086e19bc4bSDmitry Shmidt 			       struct ieee80211_mgmt *mgmt, size_t len,
55096e19bc4bSDmitry Shmidt 			       gfp_t gfp);
55106e19bc4bSDmitry Shmidt 
55116e19bc4bSDmitry Shmidt static inline struct cfg80211_bss * __must_check
5512dcd6eac1SSimon Wunderlich cfg80211_inform_bss_width_frame(struct wiphy *wiphy,
55133afc2167SEmmanuel Grumbach 				struct ieee80211_channel *rx_channel,
5514dcd6eac1SSimon Wunderlich 				enum nl80211_bss_scan_width scan_width,
5515dcd6eac1SSimon Wunderlich 				struct ieee80211_mgmt *mgmt, size_t len,
55166e19bc4bSDmitry Shmidt 				s32 signal, gfp_t gfp)
55176e19bc4bSDmitry Shmidt {
55186e19bc4bSDmitry Shmidt 	struct cfg80211_inform_bss data = {
55196e19bc4bSDmitry Shmidt 		.chan = rx_channel,
55206e19bc4bSDmitry Shmidt 		.scan_width = scan_width,
55216e19bc4bSDmitry Shmidt 		.signal = signal,
55226e19bc4bSDmitry Shmidt 	};
55236e19bc4bSDmitry Shmidt 
55246e19bc4bSDmitry Shmidt 	return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp);
55256e19bc4bSDmitry Shmidt }
5526dcd6eac1SSimon Wunderlich 
5527dcd6eac1SSimon Wunderlich static inline struct cfg80211_bss * __must_check
55282a519311SJohannes Berg cfg80211_inform_bss_frame(struct wiphy *wiphy,
55293afc2167SEmmanuel Grumbach 			  struct ieee80211_channel *rx_channel,
55302a519311SJohannes Berg 			  struct ieee80211_mgmt *mgmt, size_t len,
5531dcd6eac1SSimon Wunderlich 			  s32 signal, gfp_t gfp)
5532dcd6eac1SSimon Wunderlich {
55336e19bc4bSDmitry Shmidt 	struct cfg80211_inform_bss data = {
55346e19bc4bSDmitry Shmidt 		.chan = rx_channel,
55356e19bc4bSDmitry Shmidt 		.scan_width = NL80211_BSS_CHAN_WIDTH_20,
55366e19bc4bSDmitry Shmidt 		.signal = signal,
55376e19bc4bSDmitry Shmidt 	};
55386e19bc4bSDmitry Shmidt 
55396e19bc4bSDmitry Shmidt 	return cfg80211_inform_bss_frame_data(wiphy, &data, mgmt, len, gfp);
5540dcd6eac1SSimon Wunderlich }
55412a519311SJohannes Berg 
5542abe37c4bSJohannes Berg /**
55437ece9c37SSara Sharon  * cfg80211_gen_new_bssid - generate a nontransmitted BSSID for multi-BSSID
55447ece9c37SSara Sharon  * @bssid: transmitter BSSID
55457ece9c37SSara Sharon  * @max_bssid: max BSSID indicator, taken from Multiple BSSID element
55467ece9c37SSara Sharon  * @mbssid_index: BSSID index, taken from Multiple BSSID index element
55475d4071abSJohannes Berg  * @new_bssid: calculated nontransmitted BSSID
55487ece9c37SSara Sharon  */
55497ece9c37SSara Sharon static inline void cfg80211_gen_new_bssid(const u8 *bssid, u8 max_bssid,
55505d4071abSJohannes Berg 					  u8 mbssid_index, u8 *new_bssid)
55517ece9c37SSara Sharon {
55525d4071abSJohannes Berg 	u64 bssid_u64 = ether_addr_to_u64(bssid);
55535d4071abSJohannes Berg 	u64 mask = GENMASK_ULL(max_bssid - 1, 0);
55545d4071abSJohannes Berg 	u64 new_bssid_u64;
55557ece9c37SSara Sharon 
55565d4071abSJohannes Berg 	new_bssid_u64 = bssid_u64 & ~mask;
55577ece9c37SSara Sharon 
55585d4071abSJohannes Berg 	new_bssid_u64 |= ((bssid_u64 & mask) + mbssid_index) & mask;
55597ece9c37SSara Sharon 
55605d4071abSJohannes Berg 	u64_to_ether_addr(new_bssid_u64, new_bssid);
55617ece9c37SSara Sharon }
55627ece9c37SSara Sharon 
55637ece9c37SSara Sharon /**
5564f7dacfb1SSara Sharon  * cfg80211_is_element_inherited - returns if element ID should be inherited
5565f7dacfb1SSara Sharon  * @element: element to check
5566f7dacfb1SSara Sharon  * @non_inherit_element: non inheritance element
5567f7dacfb1SSara Sharon  */
5568f7dacfb1SSara Sharon bool cfg80211_is_element_inherited(const struct element *element,
5569f7dacfb1SSara Sharon 				   const struct element *non_inherit_element);
5570f7dacfb1SSara Sharon 
5571f7dacfb1SSara Sharon /**
5572fe806e49SSara Sharon  * cfg80211_merge_profile - merges a MBSSID profile if it is split between IEs
5573fe806e49SSara Sharon  * @ie: ies
5574fe806e49SSara Sharon  * @ielen: length of IEs
5575fe806e49SSara Sharon  * @mbssid_elem: current MBSSID element
5576fe806e49SSara Sharon  * @sub_elem: current MBSSID subelement (profile)
5577fe806e49SSara Sharon  * @merged_ie: location of the merged profile
5578fe806e49SSara Sharon  * @max_copy_len: max merged profile length
5579fe806e49SSara Sharon  */
5580fe806e49SSara Sharon size_t cfg80211_merge_profile(const u8 *ie, size_t ielen,
5581fe806e49SSara Sharon 			      const struct element *mbssid_elem,
5582fe806e49SSara Sharon 			      const struct element *sub_elem,
55835809a5d5SDan Carpenter 			      u8 *merged_ie, size_t max_copy_len);
5584fe806e49SSara Sharon 
5585fe806e49SSara Sharon /**
55865bc8c1f2SJohannes Berg  * enum cfg80211_bss_frame_type - frame type that the BSS data came from
55875bc8c1f2SJohannes Berg  * @CFG80211_BSS_FTYPE_UNKNOWN: driver doesn't know whether the data is
55885bc8c1f2SJohannes Berg  *	from a beacon or probe response
55895bc8c1f2SJohannes Berg  * @CFG80211_BSS_FTYPE_BEACON: data comes from a beacon
55905bc8c1f2SJohannes Berg  * @CFG80211_BSS_FTYPE_PRESP: data comes from a probe response
55915bc8c1f2SJohannes Berg  */
55925bc8c1f2SJohannes Berg enum cfg80211_bss_frame_type {
55935bc8c1f2SJohannes Berg 	CFG80211_BSS_FTYPE_UNKNOWN,
55945bc8c1f2SJohannes Berg 	CFG80211_BSS_FTYPE_BEACON,
55955bc8c1f2SJohannes Berg 	CFG80211_BSS_FTYPE_PRESP,
55965bc8c1f2SJohannes Berg };
55975bc8c1f2SJohannes Berg 
55985bc8c1f2SJohannes Berg /**
55996e19bc4bSDmitry Shmidt  * cfg80211_inform_bss_data - inform cfg80211 of a new BSS
5600abe37c4bSJohannes Berg  *
5601abe37c4bSJohannes Berg  * @wiphy: the wiphy reporting the BSS
56026e19bc4bSDmitry Shmidt  * @data: the BSS metadata
56035bc8c1f2SJohannes Berg  * @ftype: frame type (if known)
5604abe37c4bSJohannes Berg  * @bssid: the BSSID of the BSS
56057b8bcff2SJohannes Berg  * @tsf: the TSF sent by the peer in the beacon/probe response (or 0)
5606abe37c4bSJohannes Berg  * @capability: the capability field sent by the peer
5607abe37c4bSJohannes Berg  * @beacon_interval: the beacon interval announced by the peer
5608abe37c4bSJohannes Berg  * @ie: additional IEs sent by the peer
5609abe37c4bSJohannes Berg  * @ielen: length of the additional IEs
5610abe37c4bSJohannes Berg  * @gfp: context flags
5611abe37c4bSJohannes Berg  *
5612abe37c4bSJohannes Berg  * This informs cfg80211 that BSS information was found and
5613abe37c4bSJohannes Berg  * the BSS should be updated/added.
5614ef100682SJohannes Berg  *
56150ae997dcSYacine Belkadi  * Return: A referenced struct, must be released with cfg80211_put_bss()!
56160ae997dcSYacine Belkadi  * Or %NULL on error.
5617abe37c4bSJohannes Berg  */
5618ef100682SJohannes Berg struct cfg80211_bss * __must_check
56196e19bc4bSDmitry Shmidt cfg80211_inform_bss_data(struct wiphy *wiphy,
56206e19bc4bSDmitry Shmidt 			 struct cfg80211_inform_bss *data,
56216e19bc4bSDmitry Shmidt 			 enum cfg80211_bss_frame_type ftype,
56226e19bc4bSDmitry Shmidt 			 const u8 *bssid, u64 tsf, u16 capability,
56236e19bc4bSDmitry Shmidt 			 u16 beacon_interval, const u8 *ie, size_t ielen,
56246e19bc4bSDmitry Shmidt 			 gfp_t gfp);
56256e19bc4bSDmitry Shmidt 
56266e19bc4bSDmitry Shmidt static inline struct cfg80211_bss * __must_check
5627dcd6eac1SSimon Wunderlich cfg80211_inform_bss_width(struct wiphy *wiphy,
56283afc2167SEmmanuel Grumbach 			  struct ieee80211_channel *rx_channel,
5629dcd6eac1SSimon Wunderlich 			  enum nl80211_bss_scan_width scan_width,
56305bc8c1f2SJohannes Berg 			  enum cfg80211_bss_frame_type ftype,
5631dcd6eac1SSimon Wunderlich 			  const u8 *bssid, u64 tsf, u16 capability,
5632dcd6eac1SSimon Wunderlich 			  u16 beacon_interval, const u8 *ie, size_t ielen,
56336e19bc4bSDmitry Shmidt 			  s32 signal, gfp_t gfp)
56346e19bc4bSDmitry Shmidt {
56356e19bc4bSDmitry Shmidt 	struct cfg80211_inform_bss data = {
56366e19bc4bSDmitry Shmidt 		.chan = rx_channel,
56376e19bc4bSDmitry Shmidt 		.scan_width = scan_width,
56386e19bc4bSDmitry Shmidt 		.signal = signal,
56396e19bc4bSDmitry Shmidt 	};
56406e19bc4bSDmitry Shmidt 
56416e19bc4bSDmitry Shmidt 	return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf,
56426e19bc4bSDmitry Shmidt 					capability, beacon_interval, ie, ielen,
56436e19bc4bSDmitry Shmidt 					gfp);
56446e19bc4bSDmitry Shmidt }
5645dcd6eac1SSimon Wunderlich 
5646dcd6eac1SSimon Wunderlich static inline struct cfg80211_bss * __must_check
564706aa7afaSJussi Kivilinna cfg80211_inform_bss(struct wiphy *wiphy,
56483afc2167SEmmanuel Grumbach 		    struct ieee80211_channel *rx_channel,
56495bc8c1f2SJohannes Berg 		    enum cfg80211_bss_frame_type ftype,
56507b8bcff2SJohannes Berg 		    const u8 *bssid, u64 tsf, u16 capability,
56517b8bcff2SJohannes Berg 		    u16 beacon_interval, const u8 *ie, size_t ielen,
5652dcd6eac1SSimon Wunderlich 		    s32 signal, gfp_t gfp)
5653dcd6eac1SSimon Wunderlich {
56546e19bc4bSDmitry Shmidt 	struct cfg80211_inform_bss data = {
56556e19bc4bSDmitry Shmidt 		.chan = rx_channel,
56566e19bc4bSDmitry Shmidt 		.scan_width = NL80211_BSS_CHAN_WIDTH_20,
56576e19bc4bSDmitry Shmidt 		.signal = signal,
56586e19bc4bSDmitry Shmidt 	};
56596e19bc4bSDmitry Shmidt 
56606e19bc4bSDmitry Shmidt 	return cfg80211_inform_bss_data(wiphy, &data, ftype, bssid, tsf,
56616e19bc4bSDmitry Shmidt 					capability, beacon_interval, ie, ielen,
5662dcd6eac1SSimon Wunderlich 					gfp);
5663dcd6eac1SSimon Wunderlich }
566406aa7afaSJussi Kivilinna 
566527548677SJohannes Berg /**
566627548677SJohannes Berg  * cfg80211_get_bss - get a BSS reference
566727548677SJohannes Berg  * @wiphy: the wiphy this BSS struct belongs to
566827548677SJohannes Berg  * @channel: the channel to search on (or %NULL)
566927548677SJohannes Berg  * @bssid: the desired BSSID (or %NULL)
567027548677SJohannes Berg  * @ssid: the desired SSID (or %NULL)
567127548677SJohannes Berg  * @ssid_len: length of the SSID (or 0)
567227548677SJohannes Berg  * @bss_type: type of BSS, see &enum ieee80211_bss_type
567327548677SJohannes Berg  * @privacy: privacy filter, see &enum ieee80211_privacy
567427548677SJohannes Berg  */
56752a519311SJohannes Berg struct cfg80211_bss *cfg80211_get_bss(struct wiphy *wiphy,
56762a519311SJohannes Berg 				      struct ieee80211_channel *channel,
56772a519311SJohannes Berg 				      const u8 *bssid,
567879420f09SJohannes Berg 				      const u8 *ssid, size_t ssid_len,
56796eb18137SDedy Lansky 				      enum ieee80211_bss_type bss_type,
568027548677SJohannes Berg 				      enum ieee80211_privacy privacy);
568179420f09SJohannes Berg static inline struct cfg80211_bss *
568279420f09SJohannes Berg cfg80211_get_ibss(struct wiphy *wiphy,
568379420f09SJohannes Berg 		  struct ieee80211_channel *channel,
568479420f09SJohannes Berg 		  const u8 *ssid, size_t ssid_len)
568579420f09SJohannes Berg {
568679420f09SJohannes Berg 	return cfg80211_get_bss(wiphy, channel, NULL, ssid, ssid_len,
56876eb18137SDedy Lansky 				IEEE80211_BSS_TYPE_IBSS,
56886eb18137SDedy Lansky 				IEEE80211_PRIVACY_ANY);
568979420f09SJohannes Berg }
569079420f09SJohannes Berg 
56914c0c0b75SJohannes Berg /**
56924c0c0b75SJohannes Berg  * cfg80211_ref_bss - reference BSS struct
56935b112d3dSJohannes Berg  * @wiphy: the wiphy this BSS struct belongs to
56944c0c0b75SJohannes Berg  * @bss: the BSS struct to reference
56954c0c0b75SJohannes Berg  *
56964c0c0b75SJohannes Berg  * Increments the refcount of the given BSS struct.
56974c0c0b75SJohannes Berg  */
56985b112d3dSJohannes Berg void cfg80211_ref_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
56994c0c0b75SJohannes Berg 
57004c0c0b75SJohannes Berg /**
57014c0c0b75SJohannes Berg  * cfg80211_put_bss - unref BSS struct
57025b112d3dSJohannes Berg  * @wiphy: the wiphy this BSS struct belongs to
57034c0c0b75SJohannes Berg  * @bss: the BSS struct
57044c0c0b75SJohannes Berg  *
57054c0c0b75SJohannes Berg  * Decrements the refcount of the given BSS struct.
57064c0c0b75SJohannes Berg  */
57075b112d3dSJohannes Berg void cfg80211_put_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
5708d3236553SJohannes Berg 
5709d491af19SJohannes Berg /**
5710d491af19SJohannes Berg  * cfg80211_unlink_bss - unlink BSS from internal data structures
5711d491af19SJohannes Berg  * @wiphy: the wiphy
5712d491af19SJohannes Berg  * @bss: the bss to remove
5713d491af19SJohannes Berg  *
5714d491af19SJohannes Berg  * This function removes the given BSS from the internal data structures
5715d491af19SJohannes Berg  * thereby making it no longer show up in scan results etc. Use this
5716d491af19SJohannes Berg  * function when you detect a BSS is gone. Normally BSSes will also time
5717d491af19SJohannes Berg  * out, so it is not necessary to use this function at all.
5718d491af19SJohannes Berg  */
5719d491af19SJohannes Berg void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *bss);
5720fee52678SJohannes Berg 
5721dcd6eac1SSimon Wunderlich static inline enum nl80211_bss_scan_width
5722dcd6eac1SSimon Wunderlich cfg80211_chandef_to_scan_width(const struct cfg80211_chan_def *chandef)
5723dcd6eac1SSimon Wunderlich {
5724dcd6eac1SSimon Wunderlich 	switch (chandef->width) {
5725dcd6eac1SSimon Wunderlich 	case NL80211_CHAN_WIDTH_5:
5726dcd6eac1SSimon Wunderlich 		return NL80211_BSS_CHAN_WIDTH_5;
5727dcd6eac1SSimon Wunderlich 	case NL80211_CHAN_WIDTH_10:
5728dcd6eac1SSimon Wunderlich 		return NL80211_BSS_CHAN_WIDTH_10;
5729dcd6eac1SSimon Wunderlich 	default:
5730dcd6eac1SSimon Wunderlich 		return NL80211_BSS_CHAN_WIDTH_20;
5731dcd6eac1SSimon Wunderlich 	}
5732dcd6eac1SSimon Wunderlich }
5733dcd6eac1SSimon Wunderlich 
57346039f6d2SJouni Malinen /**
57356ff57cf8SJohannes Berg  * cfg80211_rx_mlme_mgmt - notification of processed MLME management frame
57366039f6d2SJouni Malinen  * @dev: network device
57376039f6d2SJouni Malinen  * @buf: authentication frame (header + body)
57386039f6d2SJouni Malinen  * @len: length of the frame data
57396039f6d2SJouni Malinen  *
57406ff57cf8SJohannes Berg  * This function is called whenever an authentication, disassociation or
57416ff57cf8SJohannes Berg  * deauthentication frame has been received and processed in station mode.
57426ff57cf8SJohannes Berg  * After being asked to authenticate via cfg80211_ops::auth() the driver must
57436ff57cf8SJohannes Berg  * call either this function or cfg80211_auth_timeout().
57446ff57cf8SJohannes Berg  * After being asked to associate via cfg80211_ops::assoc() the driver must
57456ff57cf8SJohannes Berg  * call either this function or cfg80211_auth_timeout().
57466ff57cf8SJohannes Berg  * While connected, the driver must calls this for received and processed
57476ff57cf8SJohannes Berg  * disassociation and deauthentication frames. If the frame couldn't be used
57486ff57cf8SJohannes Berg  * because it was unprotected, the driver must call the function
57496ff57cf8SJohannes Berg  * cfg80211_rx_unprot_mlme_mgmt() instead.
57506ff57cf8SJohannes Berg  *
57516ff57cf8SJohannes Berg  * This function may sleep. The caller must hold the corresponding wdev's mutex.
57526039f6d2SJouni Malinen  */
57536ff57cf8SJohannes Berg void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
57546039f6d2SJouni Malinen 
57556039f6d2SJouni Malinen /**
57566ff57cf8SJohannes Berg  * cfg80211_auth_timeout - notification of timed out authentication
57571965c853SJouni Malinen  * @dev: network device
57581965c853SJouni Malinen  * @addr: The MAC address of the device with which the authentication timed out
5759cb0b4bebSJohannes Berg  *
57608d61ffa5SJohannes Berg  * This function may sleep. The caller must hold the corresponding wdev's
57618d61ffa5SJohannes Berg  * mutex.
57621965c853SJouni Malinen  */
57636ff57cf8SJohannes Berg void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
57641965c853SJouni Malinen 
57651965c853SJouni Malinen /**
57666ff57cf8SJohannes Berg  * cfg80211_rx_assoc_resp - notification of processed association response
57676039f6d2SJouni Malinen  * @dev: network device
57686ff57cf8SJohannes Berg  * @bss: the BSS that association was requested with, ownership of the pointer
57696ff57cf8SJohannes Berg  *	moves to cfg80211 in this call
57704d9ec73dSJouni Malinen  * @buf: (Re)Association Response frame (header + body)
57716039f6d2SJouni Malinen  * @len: length of the frame data
5772f438ceb8SEmmanuel Grumbach  * @uapsd_queues: bitmap of queues configured for uapsd. Same format
5773f438ceb8SEmmanuel Grumbach  *	as the AC bitmap in the QoS info field
57744d9ec73dSJouni Malinen  * @req_ies: information elements from the (Re)Association Request frame
57754d9ec73dSJouni Malinen  * @req_ies_len: length of req_ies data
57766039f6d2SJouni Malinen  *
57776ff57cf8SJohannes Berg  * After being asked to associate via cfg80211_ops::assoc() the driver must
57786ff57cf8SJohannes Berg  * call either this function or cfg80211_auth_timeout().
57796ff57cf8SJohannes Berg  *
57806ff57cf8SJohannes Berg  * This function may sleep. The caller must hold the corresponding wdev's mutex.
57816039f6d2SJouni Malinen  */
57826ff57cf8SJohannes Berg void cfg80211_rx_assoc_resp(struct net_device *dev,
57836ff57cf8SJohannes Berg 			    struct cfg80211_bss *bss,
5784b0b6aa2cSEliad Peller 			    const u8 *buf, size_t len,
57854d9ec73dSJouni Malinen 			    int uapsd_queues,
57864d9ec73dSJouni Malinen 			    const u8 *req_ies, size_t req_ies_len);
57876039f6d2SJouni Malinen 
57886039f6d2SJouni Malinen /**
57896ff57cf8SJohannes Berg  * cfg80211_assoc_timeout - notification of timed out association
57901965c853SJouni Malinen  * @dev: network device
5791959867faSJohannes Berg  * @bss: The BSS entry with which association timed out.
5792cb0b4bebSJohannes Berg  *
57938d61ffa5SJohannes Berg  * This function may sleep. The caller must hold the corresponding wdev's mutex.
57941965c853SJouni Malinen  */
5795959867faSJohannes Berg void cfg80211_assoc_timeout(struct net_device *dev, struct cfg80211_bss *bss);
57961965c853SJouni Malinen 
57971965c853SJouni Malinen /**
5798e6f462dfSJohannes Berg  * cfg80211_abandon_assoc - notify cfg80211 of abandoned association attempt
5799e6f462dfSJohannes Berg  * @dev: network device
5800e6f462dfSJohannes Berg  * @bss: The BSS entry with which association was abandoned.
5801e6f462dfSJohannes Berg  *
5802e6f462dfSJohannes Berg  * Call this whenever - for reasons reported through other API, like deauth RX,
5803e6f462dfSJohannes Berg  * an association attempt was abandoned.
5804e6f462dfSJohannes Berg  * This function may sleep. The caller must hold the corresponding wdev's mutex.
5805e6f462dfSJohannes Berg  */
5806e6f462dfSJohannes Berg void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss);
5807e6f462dfSJohannes Berg 
5808e6f462dfSJohannes Berg /**
58096ff57cf8SJohannes Berg  * cfg80211_tx_mlme_mgmt - notification of transmitted deauth/disassoc frame
58106039f6d2SJouni Malinen  * @dev: network device
58116ff57cf8SJohannes Berg  * @buf: 802.11 frame (header + body)
58126039f6d2SJouni Malinen  * @len: length of the frame data
58136039f6d2SJouni Malinen  *
58146039f6d2SJouni Malinen  * This function is called whenever deauthentication has been processed in
581553b46b84SJouni Malinen  * station mode. This includes both received deauthentication frames and
58168d61ffa5SJohannes Berg  * locally generated ones. This function may sleep. The caller must hold the
58178d61ffa5SJohannes Berg  * corresponding wdev's mutex.
58186039f6d2SJouni Malinen  */
58196ff57cf8SJohannes Berg void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len);
5820ce470613SHolger Schurig 
5821ce470613SHolger Schurig /**
58226ff57cf8SJohannes Berg  * cfg80211_rx_unprot_mlme_mgmt - notification of unprotected mlme mgmt frame
5823cf4e594eSJouni Malinen  * @dev: network device
5824cf4e594eSJouni Malinen  * @buf: deauthentication frame (header + body)
5825cf4e594eSJouni Malinen  * @len: length of the frame data
5826cf4e594eSJouni Malinen  *
58276ff57cf8SJohannes Berg  * This function is called whenever a received deauthentication or dissassoc
58286ff57cf8SJohannes Berg  * frame has been dropped in station mode because of MFP being used but the
5829cf4e594eSJouni Malinen  * frame was not protected. This function may sleep.
5830cf4e594eSJouni Malinen  */
58316ff57cf8SJohannes Berg void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev,
58326ff57cf8SJohannes Berg 				  const u8 *buf, size_t len);
5833cf4e594eSJouni Malinen 
5834cf4e594eSJouni Malinen /**
5835a3b8b056SJouni Malinen  * cfg80211_michael_mic_failure - notification of Michael MIC failure (TKIP)
5836a3b8b056SJouni Malinen  * @dev: network device
5837a3b8b056SJouni Malinen  * @addr: The source MAC address of the frame
5838a3b8b056SJouni Malinen  * @key_type: The key type that the received frame used
5839a66b98dbSArik Nemtsov  * @key_id: Key identifier (0..3). Can be -1 if missing.
5840a3b8b056SJouni Malinen  * @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
5841e6d6e342SJohannes Berg  * @gfp: allocation flags
5842a3b8b056SJouni Malinen  *
5843a3b8b056SJouni Malinen  * This function is called whenever the local MAC detects a MIC failure in a
5844a3b8b056SJouni Malinen  * received frame. This matches with MLME-MICHAELMICFAILURE.indication()
5845a3b8b056SJouni Malinen  * primitive.
5846a3b8b056SJouni Malinen  */
5847a3b8b056SJouni Malinen void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
5848a3b8b056SJouni Malinen 				  enum nl80211_key_type key_type, int key_id,
5849e6d6e342SJohannes Berg 				  const u8 *tsc, gfp_t gfp);
5850a3b8b056SJouni Malinen 
585104a773adSJohannes Berg /**
585204a773adSJohannes Berg  * cfg80211_ibss_joined - notify cfg80211 that device joined an IBSS
585304a773adSJohannes Berg  *
585404a773adSJohannes Berg  * @dev: network device
585504a773adSJohannes Berg  * @bssid: the BSSID of the IBSS joined
5856fe94f3a4SAntonio Quartulli  * @channel: the channel of the IBSS joined
585704a773adSJohannes Berg  * @gfp: allocation flags
585804a773adSJohannes Berg  *
585904a773adSJohannes Berg  * This function notifies cfg80211 that the device joined an IBSS or
586004a773adSJohannes Berg  * switched to a different BSSID. Before this function can be called,
586104a773adSJohannes Berg  * either a beacon has to have been received from the IBSS, or one of
586204a773adSJohannes Berg  * the cfg80211_inform_bss{,_frame} functions must have been called
586304a773adSJohannes Berg  * with the locally generated beacon -- this guarantees that there is
586404a773adSJohannes Berg  * always a scan result for this IBSS. cfg80211 will handle the rest.
586504a773adSJohannes Berg  */
5866fe94f3a4SAntonio Quartulli void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
5867fe94f3a4SAntonio Quartulli 			  struct ieee80211_channel *channel, gfp_t gfp);
586804a773adSJohannes Berg 
58691f87f7d3SJohannes Berg /**
5870c93b5e71SJavier Cardona  * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate
5871c93b5e71SJavier Cardona  *
5872c93b5e71SJavier Cardona  * @dev: network device
5873c93b5e71SJavier Cardona  * @macaddr: the MAC address of the new candidate
5874c93b5e71SJavier Cardona  * @ie: information elements advertised by the peer candidate
58755ac4a12dSMatteo Croce  * @ie_len: length of the information elements buffer
5876c93b5e71SJavier Cardona  * @gfp: allocation flags
5877c93b5e71SJavier Cardona  *
5878c93b5e71SJavier Cardona  * This function notifies cfg80211 that the mesh peer candidate has been
5879c93b5e71SJavier Cardona  * detected, most likely via a beacon or, less likely, via a probe response.
5880c93b5e71SJavier Cardona  * cfg80211 then sends a notification to userspace.
5881c93b5e71SJavier Cardona  */
5882c93b5e71SJavier Cardona void cfg80211_notify_new_peer_candidate(struct net_device *dev,
5883ecbc12adSBob Copeland 		const u8 *macaddr, const u8 *ie, u8 ie_len,
5884ecbc12adSBob Copeland 		int sig_dbm, gfp_t gfp);
5885c93b5e71SJavier Cardona 
5886c93b5e71SJavier Cardona /**
5887d70e9693SJohannes Berg  * DOC: RFkill integration
5888d70e9693SJohannes Berg  *
5889d70e9693SJohannes Berg  * RFkill integration in cfg80211 is almost invisible to drivers,
5890d70e9693SJohannes Berg  * as cfg80211 automatically registers an rfkill instance for each
5891d70e9693SJohannes Berg  * wireless device it knows about. Soft kill is also translated
5892d70e9693SJohannes Berg  * into disconnecting and turning all interfaces off, drivers are
5893d70e9693SJohannes Berg  * expected to turn off the device when all interfaces are down.
5894d70e9693SJohannes Berg  *
5895d70e9693SJohannes Berg  * However, devices may have a hard RFkill line, in which case they
5896d70e9693SJohannes Berg  * also need to interact with the rfkill subsystem, via cfg80211.
5897d70e9693SJohannes Berg  * They can do this with a few helper functions documented here.
5898d70e9693SJohannes Berg  */
5899d70e9693SJohannes Berg 
5900d70e9693SJohannes Berg /**
59011f87f7d3SJohannes Berg  * wiphy_rfkill_set_hw_state - notify cfg80211 about hw block state
59021f87f7d3SJohannes Berg  * @wiphy: the wiphy
59031f87f7d3SJohannes Berg  * @blocked: block status
59041f87f7d3SJohannes Berg  */
59051f87f7d3SJohannes Berg void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked);
59061f87f7d3SJohannes Berg 
59071f87f7d3SJohannes Berg /**
59081f87f7d3SJohannes Berg  * wiphy_rfkill_start_polling - start polling rfkill
59091f87f7d3SJohannes Berg  * @wiphy: the wiphy
59101f87f7d3SJohannes Berg  */
59111f87f7d3SJohannes Berg void wiphy_rfkill_start_polling(struct wiphy *wiphy);
59121f87f7d3SJohannes Berg 
59131f87f7d3SJohannes Berg /**
59141f87f7d3SJohannes Berg  * wiphy_rfkill_stop_polling - stop polling rfkill
59151f87f7d3SJohannes Berg  * @wiphy: the wiphy
59161f87f7d3SJohannes Berg  */
59171f87f7d3SJohannes Berg void wiphy_rfkill_stop_polling(struct wiphy *wiphy);
59181f87f7d3SJohannes Berg 
5919ad7e718cSJohannes Berg /**
5920ad7e718cSJohannes Berg  * DOC: Vendor commands
5921ad7e718cSJohannes Berg  *
5922ad7e718cSJohannes Berg  * Occasionally, there are special protocol or firmware features that
5923ad7e718cSJohannes Berg  * can't be implemented very openly. For this and similar cases, the
5924ad7e718cSJohannes Berg  * vendor command functionality allows implementing the features with
5925ad7e718cSJohannes Berg  * (typically closed-source) userspace and firmware, using nl80211 as
5926ad7e718cSJohannes Berg  * the configuration mechanism.
5927ad7e718cSJohannes Berg  *
5928ad7e718cSJohannes Berg  * A driver supporting vendor commands must register them as an array
5929ad7e718cSJohannes Berg  * in struct wiphy, with handlers for each one, each command has an
5930ad7e718cSJohannes Berg  * OUI and sub command ID to identify it.
5931ad7e718cSJohannes Berg  *
5932ad7e718cSJohannes Berg  * Note that this feature should not be (ab)used to implement protocol
5933ad7e718cSJohannes Berg  * features that could openly be shared across drivers. In particular,
5934ad7e718cSJohannes Berg  * it must never be required to use vendor commands to implement any
5935ad7e718cSJohannes Berg  * "normal" functionality that higher-level userspace like connection
5936ad7e718cSJohannes Berg  * managers etc. need.
5937ad7e718cSJohannes Berg  */
5938ad7e718cSJohannes Berg 
5939ad7e718cSJohannes Berg struct sk_buff *__cfg80211_alloc_reply_skb(struct wiphy *wiphy,
5940ad7e718cSJohannes Berg 					   enum nl80211_commands cmd,
5941ad7e718cSJohannes Berg 					   enum nl80211_attrs attr,
5942ad7e718cSJohannes Berg 					   int approxlen);
5943ad7e718cSJohannes Berg 
5944567ffc35SJohannes Berg struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
59456c09e791SAhmad Kholaif 					   struct wireless_dev *wdev,
5946567ffc35SJohannes Berg 					   enum nl80211_commands cmd,
5947567ffc35SJohannes Berg 					   enum nl80211_attrs attr,
594855c1fdf0SJohannes Berg 					   unsigned int portid,
5949567ffc35SJohannes Berg 					   int vendor_event_idx,
5950567ffc35SJohannes Berg 					   int approxlen, gfp_t gfp);
5951567ffc35SJohannes Berg 
5952567ffc35SJohannes Berg void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp);
5953567ffc35SJohannes Berg 
5954ad7e718cSJohannes Berg /**
5955ad7e718cSJohannes Berg  * cfg80211_vendor_cmd_alloc_reply_skb - allocate vendor command reply
5956ad7e718cSJohannes Berg  * @wiphy: the wiphy
5957ad7e718cSJohannes Berg  * @approxlen: an upper bound of the length of the data that will
5958ad7e718cSJohannes Berg  *	be put into the skb
5959ad7e718cSJohannes Berg  *
5960ad7e718cSJohannes Berg  * This function allocates and pre-fills an skb for a reply to
5961ad7e718cSJohannes Berg  * a vendor command. Since it is intended for a reply, calling
5962ad7e718cSJohannes Berg  * it outside of a vendor command's doit() operation is invalid.
5963ad7e718cSJohannes Berg  *
5964ad7e718cSJohannes Berg  * The returned skb is pre-filled with some identifying data in
5965ad7e718cSJohannes Berg  * a way that any data that is put into the skb (with skb_put(),
5966ad7e718cSJohannes Berg  * nla_put() or similar) will end up being within the
5967ad7e718cSJohannes Berg  * %NL80211_ATTR_VENDOR_DATA attribute, so all that needs to be done
5968ad7e718cSJohannes Berg  * with the skb is adding data for the corresponding userspace tool
5969ad7e718cSJohannes Berg  * which can then read that data out of the vendor data attribute.
5970ad7e718cSJohannes Berg  * You must not modify the skb in any other way.
5971ad7e718cSJohannes Berg  *
5972ad7e718cSJohannes Berg  * When done, call cfg80211_vendor_cmd_reply() with the skb and return
5973ad7e718cSJohannes Berg  * its error code as the result of the doit() operation.
5974ad7e718cSJohannes Berg  *
5975ad7e718cSJohannes Berg  * Return: An allocated and pre-filled skb. %NULL if any errors happen.
5976ad7e718cSJohannes Berg  */
5977ad7e718cSJohannes Berg static inline struct sk_buff *
5978ad7e718cSJohannes Berg cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int approxlen)
5979ad7e718cSJohannes Berg {
5980ad7e718cSJohannes Berg 	return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_VENDOR,
5981ad7e718cSJohannes Berg 					  NL80211_ATTR_VENDOR_DATA, approxlen);
5982ad7e718cSJohannes Berg }
5983ad7e718cSJohannes Berg 
5984ad7e718cSJohannes Berg /**
5985ad7e718cSJohannes Berg  * cfg80211_vendor_cmd_reply - send the reply skb
5986ad7e718cSJohannes Berg  * @skb: The skb, must have been allocated with
5987ad7e718cSJohannes Berg  *	cfg80211_vendor_cmd_alloc_reply_skb()
5988ad7e718cSJohannes Berg  *
5989ad7e718cSJohannes Berg  * Since calling this function will usually be the last thing
5990ad7e718cSJohannes Berg  * before returning from the vendor command doit() you should
5991ad7e718cSJohannes Berg  * return the error code.  Note that this function consumes the
5992ad7e718cSJohannes Berg  * skb regardless of the return value.
5993ad7e718cSJohannes Berg  *
5994ad7e718cSJohannes Berg  * Return: An error code or 0 on success.
5995ad7e718cSJohannes Berg  */
5996ad7e718cSJohannes Berg int cfg80211_vendor_cmd_reply(struct sk_buff *skb);
5997ad7e718cSJohannes Berg 
5998567ffc35SJohannes Berg /**
599955c1fdf0SJohannes Berg  * cfg80211_vendor_cmd_get_sender
600055c1fdf0SJohannes Berg  * @wiphy: the wiphy
600155c1fdf0SJohannes Berg  *
600255c1fdf0SJohannes Berg  * Return the current netlink port ID in a vendor command handler.
600355c1fdf0SJohannes Berg  * Valid to call only there.
600455c1fdf0SJohannes Berg  */
600555c1fdf0SJohannes Berg unsigned int cfg80211_vendor_cmd_get_sender(struct wiphy *wiphy);
600655c1fdf0SJohannes Berg 
600755c1fdf0SJohannes Berg /**
6008567ffc35SJohannes Berg  * cfg80211_vendor_event_alloc - allocate vendor-specific event skb
6009567ffc35SJohannes Berg  * @wiphy: the wiphy
60106c09e791SAhmad Kholaif  * @wdev: the wireless device
6011567ffc35SJohannes Berg  * @event_idx: index of the vendor event in the wiphy's vendor_events
6012567ffc35SJohannes Berg  * @approxlen: an upper bound of the length of the data that will
6013567ffc35SJohannes Berg  *	be put into the skb
6014567ffc35SJohannes Berg  * @gfp: allocation flags
6015567ffc35SJohannes Berg  *
6016567ffc35SJohannes Berg  * This function allocates and pre-fills an skb for an event on the
6017567ffc35SJohannes Berg  * vendor-specific multicast group.
6018567ffc35SJohannes Berg  *
60196c09e791SAhmad Kholaif  * If wdev != NULL, both the ifindex and identifier of the specified
60206c09e791SAhmad Kholaif  * wireless device are added to the event message before the vendor data
60216c09e791SAhmad Kholaif  * attribute.
60226c09e791SAhmad Kholaif  *
6023567ffc35SJohannes Berg  * When done filling the skb, call cfg80211_vendor_event() with the
6024567ffc35SJohannes Berg  * skb to send the event.
6025567ffc35SJohannes Berg  *
6026567ffc35SJohannes Berg  * Return: An allocated and pre-filled skb. %NULL if any errors happen.
6027567ffc35SJohannes Berg  */
6028567ffc35SJohannes Berg static inline struct sk_buff *
60296c09e791SAhmad Kholaif cfg80211_vendor_event_alloc(struct wiphy *wiphy, struct wireless_dev *wdev,
60306c09e791SAhmad Kholaif 			     int approxlen, int event_idx, gfp_t gfp)
6031567ffc35SJohannes Berg {
60326c09e791SAhmad Kholaif 	return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR,
6033567ffc35SJohannes Berg 					  NL80211_ATTR_VENDOR_DATA,
603455c1fdf0SJohannes Berg 					  0, event_idx, approxlen, gfp);
603555c1fdf0SJohannes Berg }
603655c1fdf0SJohannes Berg 
603755c1fdf0SJohannes Berg /**
603855c1fdf0SJohannes Berg  * cfg80211_vendor_event_alloc_ucast - alloc unicast vendor-specific event skb
603955c1fdf0SJohannes Berg  * @wiphy: the wiphy
604055c1fdf0SJohannes Berg  * @wdev: the wireless device
604155c1fdf0SJohannes Berg  * @event_idx: index of the vendor event in the wiphy's vendor_events
604255c1fdf0SJohannes Berg  * @portid: port ID of the receiver
604355c1fdf0SJohannes Berg  * @approxlen: an upper bound of the length of the data that will
604455c1fdf0SJohannes Berg  *	be put into the skb
604555c1fdf0SJohannes Berg  * @gfp: allocation flags
604655c1fdf0SJohannes Berg  *
604755c1fdf0SJohannes Berg  * This function allocates and pre-fills an skb for an event to send to
604855c1fdf0SJohannes Berg  * a specific (userland) socket. This socket would previously have been
604955c1fdf0SJohannes Berg  * obtained by cfg80211_vendor_cmd_get_sender(), and the caller MUST take
605055c1fdf0SJohannes Berg  * care to register a netlink notifier to see when the socket closes.
605155c1fdf0SJohannes Berg  *
605255c1fdf0SJohannes Berg  * If wdev != NULL, both the ifindex and identifier of the specified
605355c1fdf0SJohannes Berg  * wireless device are added to the event message before the vendor data
605455c1fdf0SJohannes Berg  * attribute.
605555c1fdf0SJohannes Berg  *
605655c1fdf0SJohannes Berg  * When done filling the skb, call cfg80211_vendor_event() with the
605755c1fdf0SJohannes Berg  * skb to send the event.
605855c1fdf0SJohannes Berg  *
605955c1fdf0SJohannes Berg  * Return: An allocated and pre-filled skb. %NULL if any errors happen.
606055c1fdf0SJohannes Berg  */
606155c1fdf0SJohannes Berg static inline struct sk_buff *
606255c1fdf0SJohannes Berg cfg80211_vendor_event_alloc_ucast(struct wiphy *wiphy,
606355c1fdf0SJohannes Berg 				  struct wireless_dev *wdev,
606455c1fdf0SJohannes Berg 				  unsigned int portid, int approxlen,
606555c1fdf0SJohannes Berg 				  int event_idx, gfp_t gfp)
606655c1fdf0SJohannes Berg {
606755c1fdf0SJohannes Berg 	return __cfg80211_alloc_event_skb(wiphy, wdev, NL80211_CMD_VENDOR,
606855c1fdf0SJohannes Berg 					  NL80211_ATTR_VENDOR_DATA,
606955c1fdf0SJohannes Berg 					  portid, event_idx, approxlen, gfp);
6070567ffc35SJohannes Berg }
6071567ffc35SJohannes Berg 
6072567ffc35SJohannes Berg /**
6073567ffc35SJohannes Berg  * cfg80211_vendor_event - send the event
6074567ffc35SJohannes Berg  * @skb: The skb, must have been allocated with cfg80211_vendor_event_alloc()
6075567ffc35SJohannes Berg  * @gfp: allocation flags
6076567ffc35SJohannes Berg  *
6077567ffc35SJohannes Berg  * This function sends the given @skb, which must have been allocated
6078567ffc35SJohannes Berg  * by cfg80211_vendor_event_alloc(), as an event. It always consumes it.
6079567ffc35SJohannes Berg  */
6080567ffc35SJohannes Berg static inline void cfg80211_vendor_event(struct sk_buff *skb, gfp_t gfp)
6081567ffc35SJohannes Berg {
6082567ffc35SJohannes Berg 	__cfg80211_send_event_skb(skb, gfp);
6083567ffc35SJohannes Berg }
6084567ffc35SJohannes Berg 
6085aff89a9bSJohannes Berg #ifdef CONFIG_NL80211_TESTMODE
6086aff89a9bSJohannes Berg /**
6087d70e9693SJohannes Berg  * DOC: Test mode
6088d70e9693SJohannes Berg  *
6089d70e9693SJohannes Berg  * Test mode is a set of utility functions to allow drivers to
6090d70e9693SJohannes Berg  * interact with driver-specific tools to aid, for instance,
6091d70e9693SJohannes Berg  * factory programming.
6092d70e9693SJohannes Berg  *
6093d70e9693SJohannes Berg  * This chapter describes how drivers interact with it, for more
6094d70e9693SJohannes Berg  * information see the nl80211 book's chapter on it.
6095d70e9693SJohannes Berg  */
6096d70e9693SJohannes Berg 
6097d70e9693SJohannes Berg /**
6098aff89a9bSJohannes Berg  * cfg80211_testmode_alloc_reply_skb - allocate testmode reply
6099aff89a9bSJohannes Berg  * @wiphy: the wiphy
6100aff89a9bSJohannes Berg  * @approxlen: an upper bound of the length of the data that will
6101aff89a9bSJohannes Berg  *	be put into the skb
6102aff89a9bSJohannes Berg  *
6103aff89a9bSJohannes Berg  * This function allocates and pre-fills an skb for a reply to
6104aff89a9bSJohannes Berg  * the testmode command. Since it is intended for a reply, calling
6105aff89a9bSJohannes Berg  * it outside of the @testmode_cmd operation is invalid.
6106aff89a9bSJohannes Berg  *
61070ae997dcSYacine Belkadi  * The returned skb is pre-filled with the wiphy index and set up in
61080ae997dcSYacine Belkadi  * a way that any data that is put into the skb (with skb_put(),
61090ae997dcSYacine Belkadi  * nla_put() or similar) will end up being within the
61100ae997dcSYacine Belkadi  * %NL80211_ATTR_TESTDATA attribute, so all that needs to be done
61110ae997dcSYacine Belkadi  * with the skb is adding data for the corresponding userspace tool
61120ae997dcSYacine Belkadi  * which can then read that data out of the testdata attribute. You
61130ae997dcSYacine Belkadi  * must not modify the skb in any other way.
6114aff89a9bSJohannes Berg  *
6115aff89a9bSJohannes Berg  * When done, call cfg80211_testmode_reply() with the skb and return
6116aff89a9bSJohannes Berg  * its error code as the result of the @testmode_cmd operation.
61170ae997dcSYacine Belkadi  *
61180ae997dcSYacine Belkadi  * Return: An allocated and pre-filled skb. %NULL if any errors happen.
6119aff89a9bSJohannes Berg  */
6120ad7e718cSJohannes Berg static inline struct sk_buff *
6121ad7e718cSJohannes Berg cfg80211_testmode_alloc_reply_skb(struct wiphy *wiphy, int approxlen)
6122ad7e718cSJohannes Berg {
6123ad7e718cSJohannes Berg 	return __cfg80211_alloc_reply_skb(wiphy, NL80211_CMD_TESTMODE,
6124ad7e718cSJohannes Berg 					  NL80211_ATTR_TESTDATA, approxlen);
6125ad7e718cSJohannes Berg }
6126aff89a9bSJohannes Berg 
6127aff89a9bSJohannes Berg /**
6128aff89a9bSJohannes Berg  * cfg80211_testmode_reply - send the reply skb
6129aff89a9bSJohannes Berg  * @skb: The skb, must have been allocated with
6130aff89a9bSJohannes Berg  *	cfg80211_testmode_alloc_reply_skb()
6131aff89a9bSJohannes Berg  *
61320ae997dcSYacine Belkadi  * Since calling this function will usually be the last thing
61330ae997dcSYacine Belkadi  * before returning from the @testmode_cmd you should return
61340ae997dcSYacine Belkadi  * the error code.  Note that this function consumes the skb
61350ae997dcSYacine Belkadi  * regardless of the return value.
61360ae997dcSYacine Belkadi  *
61370ae997dcSYacine Belkadi  * Return: An error code or 0 on success.
6138aff89a9bSJohannes Berg  */
6139ad7e718cSJohannes Berg static inline int cfg80211_testmode_reply(struct sk_buff *skb)
6140ad7e718cSJohannes Berg {
6141ad7e718cSJohannes Berg 	return cfg80211_vendor_cmd_reply(skb);
6142ad7e718cSJohannes Berg }
6143aff89a9bSJohannes Berg 
6144aff89a9bSJohannes Berg /**
6145aff89a9bSJohannes Berg  * cfg80211_testmode_alloc_event_skb - allocate testmode event
6146aff89a9bSJohannes Berg  * @wiphy: the wiphy
6147aff89a9bSJohannes Berg  * @approxlen: an upper bound of the length of the data that will
6148aff89a9bSJohannes Berg  *	be put into the skb
6149aff89a9bSJohannes Berg  * @gfp: allocation flags
6150aff89a9bSJohannes Berg  *
6151aff89a9bSJohannes Berg  * This function allocates and pre-fills an skb for an event on the
6152aff89a9bSJohannes Berg  * testmode multicast group.
6153aff89a9bSJohannes Berg  *
61540ae997dcSYacine Belkadi  * The returned skb is set up in the same way as with
61550ae997dcSYacine Belkadi  * cfg80211_testmode_alloc_reply_skb() but prepared for an event. As
61560ae997dcSYacine Belkadi  * there, you should simply add data to it that will then end up in the
61570ae997dcSYacine Belkadi  * %NL80211_ATTR_TESTDATA attribute. Again, you must not modify the skb
61580ae997dcSYacine Belkadi  * in any other way.
6159aff89a9bSJohannes Berg  *
6160aff89a9bSJohannes Berg  * When done filling the skb, call cfg80211_testmode_event() with the
6161aff89a9bSJohannes Berg  * skb to send the event.
61620ae997dcSYacine Belkadi  *
61630ae997dcSYacine Belkadi  * Return: An allocated and pre-filled skb. %NULL if any errors happen.
6164aff89a9bSJohannes Berg  */
6165567ffc35SJohannes Berg static inline struct sk_buff *
6166567ffc35SJohannes Berg cfg80211_testmode_alloc_event_skb(struct wiphy *wiphy, int approxlen, gfp_t gfp)
6167567ffc35SJohannes Berg {
61686c09e791SAhmad Kholaif 	return __cfg80211_alloc_event_skb(wiphy, NULL, NL80211_CMD_TESTMODE,
616955c1fdf0SJohannes Berg 					  NL80211_ATTR_TESTDATA, 0, -1,
6170567ffc35SJohannes Berg 					  approxlen, gfp);
6171567ffc35SJohannes Berg }
6172aff89a9bSJohannes Berg 
6173aff89a9bSJohannes Berg /**
6174aff89a9bSJohannes Berg  * cfg80211_testmode_event - send the event
6175aff89a9bSJohannes Berg  * @skb: The skb, must have been allocated with
6176aff89a9bSJohannes Berg  *	cfg80211_testmode_alloc_event_skb()
6177aff89a9bSJohannes Berg  * @gfp: allocation flags
6178aff89a9bSJohannes Berg  *
6179aff89a9bSJohannes Berg  * This function sends the given @skb, which must have been allocated
6180aff89a9bSJohannes Berg  * by cfg80211_testmode_alloc_event_skb(), as an event. It always
6181aff89a9bSJohannes Berg  * consumes it.
6182aff89a9bSJohannes Berg  */
6183567ffc35SJohannes Berg static inline void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
6184567ffc35SJohannes Berg {
6185567ffc35SJohannes Berg 	__cfg80211_send_event_skb(skb, gfp);
6186567ffc35SJohannes Berg }
6187aff89a9bSJohannes Berg 
6188aff89a9bSJohannes Berg #define CFG80211_TESTMODE_CMD(cmd)	.testmode_cmd = (cmd),
618971063f0eSWey-Yi Guy #define CFG80211_TESTMODE_DUMP(cmd)	.testmode_dump = (cmd),
6190aff89a9bSJohannes Berg #else
6191aff89a9bSJohannes Berg #define CFG80211_TESTMODE_CMD(cmd)
619271063f0eSWey-Yi Guy #define CFG80211_TESTMODE_DUMP(cmd)
6193aff89a9bSJohannes Berg #endif
6194aff89a9bSJohannes Berg 
6195b23aa676SSamuel Ortiz /**
619676804d28SArend Van Spriel  * struct cfg80211_fils_resp_params - FILS connection response params
619776804d28SArend Van Spriel  * @kek: KEK derived from a successful FILS connection (may be %NULL)
619876804d28SArend Van Spriel  * @kek_len: Length of @fils_kek in octets
619976804d28SArend Van Spriel  * @update_erp_next_seq_num: Boolean value to specify whether the value in
620076804d28SArend Van Spriel  *	@erp_next_seq_num is valid.
620176804d28SArend Van Spriel  * @erp_next_seq_num: The next sequence number to use in ERP message in
620276804d28SArend Van Spriel  *	FILS Authentication. This value should be specified irrespective of the
620376804d28SArend Van Spriel  *	status for a FILS connection.
620476804d28SArend Van Spriel  * @pmk: A new PMK if derived from a successful FILS connection (may be %NULL).
620576804d28SArend Van Spriel  * @pmk_len: Length of @pmk in octets
620676804d28SArend Van Spriel  * @pmkid: A new PMKID if derived from a successful FILS connection or the PMKID
620776804d28SArend Van Spriel  *	used for this FILS connection (may be %NULL).
620876804d28SArend Van Spriel  */
620976804d28SArend Van Spriel struct cfg80211_fils_resp_params {
621076804d28SArend Van Spriel 	const u8 *kek;
621176804d28SArend Van Spriel 	size_t kek_len;
621276804d28SArend Van Spriel 	bool update_erp_next_seq_num;
621376804d28SArend Van Spriel 	u16 erp_next_seq_num;
621476804d28SArend Van Spriel 	const u8 *pmk;
621576804d28SArend Van Spriel 	size_t pmk_len;
621676804d28SArend Van Spriel 	const u8 *pmkid;
621776804d28SArend Van Spriel };
621876804d28SArend Van Spriel 
621976804d28SArend Van Spriel /**
62205349a0f7SVidyullatha Kanchanapally  * struct cfg80211_connect_resp_params - Connection response params
62215349a0f7SVidyullatha Kanchanapally  * @status: Status code, %WLAN_STATUS_SUCCESS for successful connection, use
62225349a0f7SVidyullatha Kanchanapally  *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
62235349a0f7SVidyullatha Kanchanapally  *	the real status code for failures. If this call is used to report a
62245349a0f7SVidyullatha Kanchanapally  *	failure due to a timeout (e.g., not receiving an Authentication frame
62255349a0f7SVidyullatha Kanchanapally  *	from the AP) instead of an explicit rejection by the AP, -1 is used to
62265349a0f7SVidyullatha Kanchanapally  *	indicate that this is a failure, but without a status code.
62275349a0f7SVidyullatha Kanchanapally  *	@timeout_reason is used to report the reason for the timeout in that
62285349a0f7SVidyullatha Kanchanapally  *	case.
62295349a0f7SVidyullatha Kanchanapally  * @bssid: The BSSID of the AP (may be %NULL)
62305349a0f7SVidyullatha Kanchanapally  * @bss: Entry of bss to which STA got connected to, can be obtained through
62315349a0f7SVidyullatha Kanchanapally  *	cfg80211_get_bss() (may be %NULL). Only one parameter among @bssid and
62325349a0f7SVidyullatha Kanchanapally  *	@bss needs to be specified.
62335349a0f7SVidyullatha Kanchanapally  * @req_ie: Association request IEs (may be %NULL)
62345349a0f7SVidyullatha Kanchanapally  * @req_ie_len: Association request IEs length
62355349a0f7SVidyullatha Kanchanapally  * @resp_ie: Association response IEs (may be %NULL)
62365349a0f7SVidyullatha Kanchanapally  * @resp_ie_len: Association response IEs length
623776804d28SArend Van Spriel  * @fils: FILS connection response parameters.
62385349a0f7SVidyullatha Kanchanapally  * @timeout_reason: Reason for connection timeout. This is used when the
62395349a0f7SVidyullatha Kanchanapally  *	connection fails due to a timeout instead of an explicit rejection from
62405349a0f7SVidyullatha Kanchanapally  *	the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is
62415349a0f7SVidyullatha Kanchanapally  *	not known. This value is used only if @status < 0 to indicate that the
62425349a0f7SVidyullatha Kanchanapally  *	failure is due to a timeout and not due to explicit rejection by the AP.
62435349a0f7SVidyullatha Kanchanapally  *	This value is ignored in other cases (@status >= 0).
62445349a0f7SVidyullatha Kanchanapally  */
62455349a0f7SVidyullatha Kanchanapally struct cfg80211_connect_resp_params {
62465349a0f7SVidyullatha Kanchanapally 	int status;
62475349a0f7SVidyullatha Kanchanapally 	const u8 *bssid;
62485349a0f7SVidyullatha Kanchanapally 	struct cfg80211_bss *bss;
62495349a0f7SVidyullatha Kanchanapally 	const u8 *req_ie;
62505349a0f7SVidyullatha Kanchanapally 	size_t req_ie_len;
62515349a0f7SVidyullatha Kanchanapally 	const u8 *resp_ie;
62525349a0f7SVidyullatha Kanchanapally 	size_t resp_ie_len;
625376804d28SArend Van Spriel 	struct cfg80211_fils_resp_params fils;
62545349a0f7SVidyullatha Kanchanapally 	enum nl80211_timeout_reason timeout_reason;
62555349a0f7SVidyullatha Kanchanapally };
62565349a0f7SVidyullatha Kanchanapally 
62575349a0f7SVidyullatha Kanchanapally /**
62585349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_done - notify cfg80211 of connection result
62595349a0f7SVidyullatha Kanchanapally  *
62605349a0f7SVidyullatha Kanchanapally  * @dev: network device
62615349a0f7SVidyullatha Kanchanapally  * @params: connection response parameters
62625349a0f7SVidyullatha Kanchanapally  * @gfp: allocation flags
62635349a0f7SVidyullatha Kanchanapally  *
62645349a0f7SVidyullatha Kanchanapally  * It should be called by the underlying driver once execution of the connection
62655349a0f7SVidyullatha Kanchanapally  * request from connect() has been completed. This is similar to
62665349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_bss(), but takes a structure pointer for connection response
62675349a0f7SVidyullatha Kanchanapally  * parameters. Only one of the functions among cfg80211_connect_bss(),
62685349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_result(), cfg80211_connect_timeout(),
62695349a0f7SVidyullatha Kanchanapally  * and cfg80211_connect_done() should be called.
62705349a0f7SVidyullatha Kanchanapally  */
62715349a0f7SVidyullatha Kanchanapally void cfg80211_connect_done(struct net_device *dev,
62725349a0f7SVidyullatha Kanchanapally 			   struct cfg80211_connect_resp_params *params,
62735349a0f7SVidyullatha Kanchanapally 			   gfp_t gfp);
62745349a0f7SVidyullatha Kanchanapally 
62755349a0f7SVidyullatha Kanchanapally /**
6276e7054989SKanchanapally, Vidyullatha  * cfg80211_connect_bss - notify cfg80211 of connection result
6277e7054989SKanchanapally, Vidyullatha  *
6278e7054989SKanchanapally, Vidyullatha  * @dev: network device
6279e7054989SKanchanapally, Vidyullatha  * @bssid: the BSSID of the AP
6280e7054989SKanchanapally, Vidyullatha  * @bss: entry of bss to which STA got connected to, can be obtained
6281e7054989SKanchanapally, Vidyullatha  *	through cfg80211_get_bss (may be %NULL)
6282e7054989SKanchanapally, Vidyullatha  * @req_ie: association request IEs (maybe be %NULL)
6283e7054989SKanchanapally, Vidyullatha  * @req_ie_len: association request IEs length
6284e7054989SKanchanapally, Vidyullatha  * @resp_ie: association response IEs (may be %NULL)
6285e7054989SKanchanapally, Vidyullatha  * @resp_ie_len: assoc response IEs length
6286c88215d7SJouni Malinen  * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use
6287e7054989SKanchanapally, Vidyullatha  *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
6288c88215d7SJouni Malinen  *	the real status code for failures. If this call is used to report a
6289c88215d7SJouni Malinen  *	failure due to a timeout (e.g., not receiving an Authentication frame
6290c88215d7SJouni Malinen  *	from the AP) instead of an explicit rejection by the AP, -1 is used to
6291c88215d7SJouni Malinen  *	indicate that this is a failure, but without a status code.
6292c88215d7SJouni Malinen  *	@timeout_reason is used to report the reason for the timeout in that
6293c88215d7SJouni Malinen  *	case.
6294e7054989SKanchanapally, Vidyullatha  * @gfp: allocation flags
62953093ebbeSPurushottam Kushwaha  * @timeout_reason: reason for connection timeout. This is used when the
62963093ebbeSPurushottam Kushwaha  *	connection fails due to a timeout instead of an explicit rejection from
62973093ebbeSPurushottam Kushwaha  *	the AP. %NL80211_TIMEOUT_UNSPECIFIED is used when the timeout reason is
62983093ebbeSPurushottam Kushwaha  *	not known. This value is used only if @status < 0 to indicate that the
62993093ebbeSPurushottam Kushwaha  *	failure is due to a timeout and not due to explicit rejection by the AP.
63003093ebbeSPurushottam Kushwaha  *	This value is ignored in other cases (@status >= 0).
6301e7054989SKanchanapally, Vidyullatha  *
6302c88215d7SJouni Malinen  * It should be called by the underlying driver once execution of the connection
6303c88215d7SJouni Malinen  * request from connect() has been completed. This is similar to
6304c88215d7SJouni Malinen  * cfg80211_connect_result(), but with the option of identifying the exact bss
63055349a0f7SVidyullatha Kanchanapally  * entry for the connection. Only one of the functions among
63065349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_bss(), cfg80211_connect_result(),
63075349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
6308e7054989SKanchanapally, Vidyullatha  */
63095349a0f7SVidyullatha Kanchanapally static inline void
63105349a0f7SVidyullatha Kanchanapally cfg80211_connect_bss(struct net_device *dev, const u8 *bssid,
6311e7054989SKanchanapally, Vidyullatha 		     struct cfg80211_bss *bss, const u8 *req_ie,
6312e7054989SKanchanapally, Vidyullatha 		     size_t req_ie_len, const u8 *resp_ie,
63133093ebbeSPurushottam Kushwaha 		     size_t resp_ie_len, int status, gfp_t gfp,
63145349a0f7SVidyullatha Kanchanapally 		     enum nl80211_timeout_reason timeout_reason)
63155349a0f7SVidyullatha Kanchanapally {
63165349a0f7SVidyullatha Kanchanapally 	struct cfg80211_connect_resp_params params;
63175349a0f7SVidyullatha Kanchanapally 
63185349a0f7SVidyullatha Kanchanapally 	memset(&params, 0, sizeof(params));
63195349a0f7SVidyullatha Kanchanapally 	params.status = status;
63205349a0f7SVidyullatha Kanchanapally 	params.bssid = bssid;
63215349a0f7SVidyullatha Kanchanapally 	params.bss = bss;
63225349a0f7SVidyullatha Kanchanapally 	params.req_ie = req_ie;
63235349a0f7SVidyullatha Kanchanapally 	params.req_ie_len = req_ie_len;
63245349a0f7SVidyullatha Kanchanapally 	params.resp_ie = resp_ie;
63255349a0f7SVidyullatha Kanchanapally 	params.resp_ie_len = resp_ie_len;
63265349a0f7SVidyullatha Kanchanapally 	params.timeout_reason = timeout_reason;
63275349a0f7SVidyullatha Kanchanapally 
63285349a0f7SVidyullatha Kanchanapally 	cfg80211_connect_done(dev, &params, gfp);
63295349a0f7SVidyullatha Kanchanapally }
6330e7054989SKanchanapally, Vidyullatha 
6331e7054989SKanchanapally, Vidyullatha /**
6332b23aa676SSamuel Ortiz  * cfg80211_connect_result - notify cfg80211 of connection result
6333b23aa676SSamuel Ortiz  *
6334b23aa676SSamuel Ortiz  * @dev: network device
6335b23aa676SSamuel Ortiz  * @bssid: the BSSID of the AP
6336b23aa676SSamuel Ortiz  * @req_ie: association request IEs (maybe be %NULL)
6337b23aa676SSamuel Ortiz  * @req_ie_len: association request IEs length
6338b23aa676SSamuel Ortiz  * @resp_ie: association response IEs (may be %NULL)
6339b23aa676SSamuel Ortiz  * @resp_ie_len: assoc response IEs length
6340c88215d7SJouni Malinen  * @status: status code, %WLAN_STATUS_SUCCESS for successful connection, use
6341b23aa676SSamuel Ortiz  *	%WLAN_STATUS_UNSPECIFIED_FAILURE if your device cannot give you
6342b23aa676SSamuel Ortiz  *	the real status code for failures.
6343b23aa676SSamuel Ortiz  * @gfp: allocation flags
6344b23aa676SSamuel Ortiz  *
6345c88215d7SJouni Malinen  * It should be called by the underlying driver once execution of the connection
6346c88215d7SJouni Malinen  * request from connect() has been completed. This is similar to
6347c88215d7SJouni Malinen  * cfg80211_connect_bss() which allows the exact bss entry to be specified. Only
63485349a0f7SVidyullatha Kanchanapally  * one of the functions among cfg80211_connect_bss(), cfg80211_connect_result(),
63495349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
6350b23aa676SSamuel Ortiz  */
6351e7054989SKanchanapally, Vidyullatha static inline void
6352e7054989SKanchanapally, Vidyullatha cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
6353b23aa676SSamuel Ortiz 			const u8 *req_ie, size_t req_ie_len,
6354b23aa676SSamuel Ortiz 			const u8 *resp_ie, size_t resp_ie_len,
6355e7054989SKanchanapally, Vidyullatha 			u16 status, gfp_t gfp)
6356e7054989SKanchanapally, Vidyullatha {
6357e7054989SKanchanapally, Vidyullatha 	cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, resp_ie,
63583093ebbeSPurushottam Kushwaha 			     resp_ie_len, status, gfp,
63593093ebbeSPurushottam Kushwaha 			     NL80211_TIMEOUT_UNSPECIFIED);
6360e7054989SKanchanapally, Vidyullatha }
6361b23aa676SSamuel Ortiz 
6362b23aa676SSamuel Ortiz /**
6363bf1ecd21SJouni Malinen  * cfg80211_connect_timeout - notify cfg80211 of connection timeout
6364bf1ecd21SJouni Malinen  *
6365bf1ecd21SJouni Malinen  * @dev: network device
6366bf1ecd21SJouni Malinen  * @bssid: the BSSID of the AP
6367bf1ecd21SJouni Malinen  * @req_ie: association request IEs (maybe be %NULL)
6368bf1ecd21SJouni Malinen  * @req_ie_len: association request IEs length
6369bf1ecd21SJouni Malinen  * @gfp: allocation flags
63703093ebbeSPurushottam Kushwaha  * @timeout_reason: reason for connection timeout.
6371bf1ecd21SJouni Malinen  *
6372bf1ecd21SJouni Malinen  * It should be called by the underlying driver whenever connect() has failed
6373bf1ecd21SJouni Malinen  * in a sequence where no explicit authentication/association rejection was
6374bf1ecd21SJouni Malinen  * received from the AP. This could happen, e.g., due to not being able to send
6375bf1ecd21SJouni Malinen  * out the Authentication or Association Request frame or timing out while
63765349a0f7SVidyullatha Kanchanapally  * waiting for the response. Only one of the functions among
63775349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_bss(), cfg80211_connect_result(),
63785349a0f7SVidyullatha Kanchanapally  * cfg80211_connect_timeout(), and cfg80211_connect_done() should be called.
6379bf1ecd21SJouni Malinen  */
6380bf1ecd21SJouni Malinen static inline void
6381bf1ecd21SJouni Malinen cfg80211_connect_timeout(struct net_device *dev, const u8 *bssid,
63823093ebbeSPurushottam Kushwaha 			 const u8 *req_ie, size_t req_ie_len, gfp_t gfp,
63833093ebbeSPurushottam Kushwaha 			 enum nl80211_timeout_reason timeout_reason)
6384bf1ecd21SJouni Malinen {
6385bf1ecd21SJouni Malinen 	cfg80211_connect_bss(dev, bssid, NULL, req_ie, req_ie_len, NULL, 0, -1,
63863093ebbeSPurushottam Kushwaha 			     gfp, timeout_reason);
6387bf1ecd21SJouni Malinen }
6388bf1ecd21SJouni Malinen 
6389bf1ecd21SJouni Malinen /**
639029ce6ecbSAvraham Stern  * struct cfg80211_roam_info - driver initiated roaming information
639129ce6ecbSAvraham Stern  *
639229ce6ecbSAvraham Stern  * @channel: the channel of the new AP
639329ce6ecbSAvraham Stern  * @bss: entry of bss to which STA got roamed (may be %NULL if %bssid is set)
639429ce6ecbSAvraham Stern  * @bssid: the BSSID of the new AP (may be %NULL if %bss is set)
639529ce6ecbSAvraham Stern  * @req_ie: association request IEs (maybe be %NULL)
639629ce6ecbSAvraham Stern  * @req_ie_len: association request IEs length
639729ce6ecbSAvraham Stern  * @resp_ie: association response IEs (may be %NULL)
639829ce6ecbSAvraham Stern  * @resp_ie_len: assoc response IEs length
6399e841b7b1SArend Van Spriel  * @fils: FILS related roaming information.
640029ce6ecbSAvraham Stern  */
640129ce6ecbSAvraham Stern struct cfg80211_roam_info {
640229ce6ecbSAvraham Stern 	struct ieee80211_channel *channel;
640329ce6ecbSAvraham Stern 	struct cfg80211_bss *bss;
640429ce6ecbSAvraham Stern 	const u8 *bssid;
640529ce6ecbSAvraham Stern 	const u8 *req_ie;
640629ce6ecbSAvraham Stern 	size_t req_ie_len;
640729ce6ecbSAvraham Stern 	const u8 *resp_ie;
640829ce6ecbSAvraham Stern 	size_t resp_ie_len;
6409e841b7b1SArend Van Spriel 	struct cfg80211_fils_resp_params fils;
641029ce6ecbSAvraham Stern };
641129ce6ecbSAvraham Stern 
641229ce6ecbSAvraham Stern /**
6413b23aa676SSamuel Ortiz  * cfg80211_roamed - notify cfg80211 of roaming
6414b23aa676SSamuel Ortiz  *
6415b23aa676SSamuel Ortiz  * @dev: network device
641629ce6ecbSAvraham Stern  * @info: information about the new BSS. struct &cfg80211_roam_info.
6417b23aa676SSamuel Ortiz  * @gfp: allocation flags
6418b23aa676SSamuel Ortiz  *
641929ce6ecbSAvraham Stern  * This function may be called with the driver passing either the BSSID of the
642029ce6ecbSAvraham Stern  * new AP or passing the bss entry to avoid a race in timeout of the bss entry.
642129ce6ecbSAvraham Stern  * It should be called by the underlying driver whenever it roamed from one AP
642229ce6ecbSAvraham Stern  * to another while connected. Drivers which have roaming implemented in
642329ce6ecbSAvraham Stern  * firmware should pass the bss entry to avoid a race in bss entry timeout where
642429ce6ecbSAvraham Stern  * the bss entry of the new AP is seen in the driver, but gets timed out by the
642529ce6ecbSAvraham Stern  * time it is accessed in __cfg80211_roamed() due to delay in scheduling
6426adbde344SVasanthakumar Thiagarajan  * rdev->event_work. In case of any failures, the reference is released
642729ce6ecbSAvraham Stern  * either in cfg80211_roamed() or in __cfg80211_romed(), Otherwise, it will be
642829ce6ecbSAvraham Stern  * released while diconneting from the current bss.
6429adbde344SVasanthakumar Thiagarajan  */
643029ce6ecbSAvraham Stern void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
643129ce6ecbSAvraham Stern 		     gfp_t gfp);
6432adbde344SVasanthakumar Thiagarajan 
6433adbde344SVasanthakumar Thiagarajan /**
6434503c1fb9SAvraham Stern  * cfg80211_port_authorized - notify cfg80211 of successful security association
6435503c1fb9SAvraham Stern  *
6436503c1fb9SAvraham Stern  * @dev: network device
6437503c1fb9SAvraham Stern  * @bssid: the BSSID of the AP
6438503c1fb9SAvraham Stern  * @gfp: allocation flags
6439503c1fb9SAvraham Stern  *
6440503c1fb9SAvraham Stern  * This function should be called by a driver that supports 4 way handshake
6441503c1fb9SAvraham Stern  * offload after a security association was successfully established (i.e.,
6442503c1fb9SAvraham Stern  * the 4 way handshake was completed successfully). The call to this function
6443503c1fb9SAvraham Stern  * should be preceded with a call to cfg80211_connect_result(),
6444503c1fb9SAvraham Stern  * cfg80211_connect_done(), cfg80211_connect_bss() or cfg80211_roamed() to
6445503c1fb9SAvraham Stern  * indicate the 802.11 association.
6446503c1fb9SAvraham Stern  */
6447503c1fb9SAvraham Stern void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
6448503c1fb9SAvraham Stern 			      gfp_t gfp);
6449503c1fb9SAvraham Stern 
6450503c1fb9SAvraham Stern /**
6451b23aa676SSamuel Ortiz  * cfg80211_disconnected - notify cfg80211 that connection was dropped
6452b23aa676SSamuel Ortiz  *
6453b23aa676SSamuel Ortiz  * @dev: network device
6454b23aa676SSamuel Ortiz  * @ie: information elements of the deauth/disassoc frame (may be %NULL)
6455b23aa676SSamuel Ortiz  * @ie_len: length of IEs
6456b23aa676SSamuel Ortiz  * @reason: reason code for the disconnection, set it to 0 if unknown
645780279fb7SJohannes Berg  * @locally_generated: disconnection was requested locally
6458b23aa676SSamuel Ortiz  * @gfp: allocation flags
6459b23aa676SSamuel Ortiz  *
6460b23aa676SSamuel Ortiz  * After it calls this function, the driver should enter an idle state
6461b23aa676SSamuel Ortiz  * and not try to connect to any AP any more.
6462b23aa676SSamuel Ortiz  */
6463b23aa676SSamuel Ortiz void cfg80211_disconnected(struct net_device *dev, u16 reason,
646480279fb7SJohannes Berg 			   const u8 *ie, size_t ie_len,
646580279fb7SJohannes Berg 			   bool locally_generated, gfp_t gfp);
6466b23aa676SSamuel Ortiz 
64679588bbd5SJouni Malinen /**
64689588bbd5SJouni Malinen  * cfg80211_ready_on_channel - notification of remain_on_channel start
646971bbc994SJohannes Berg  * @wdev: wireless device
64709588bbd5SJouni Malinen  * @cookie: the request cookie
64719588bbd5SJouni Malinen  * @chan: The current channel (from remain_on_channel request)
64729588bbd5SJouni Malinen  * @duration: Duration in milliseconds that the driver intents to remain on the
64739588bbd5SJouni Malinen  *	channel
64749588bbd5SJouni Malinen  * @gfp: allocation flags
64759588bbd5SJouni Malinen  */
647671bbc994SJohannes Berg void cfg80211_ready_on_channel(struct wireless_dev *wdev, u64 cookie,
64779588bbd5SJouni Malinen 			       struct ieee80211_channel *chan,
64789588bbd5SJouni Malinen 			       unsigned int duration, gfp_t gfp);
64799588bbd5SJouni Malinen 
64809588bbd5SJouni Malinen /**
64819588bbd5SJouni Malinen  * cfg80211_remain_on_channel_expired - remain_on_channel duration expired
648271bbc994SJohannes Berg  * @wdev: wireless device
64839588bbd5SJouni Malinen  * @cookie: the request cookie
64849588bbd5SJouni Malinen  * @chan: The current channel (from remain_on_channel request)
64859588bbd5SJouni Malinen  * @gfp: allocation flags
64869588bbd5SJouni Malinen  */
648771bbc994SJohannes Berg void cfg80211_remain_on_channel_expired(struct wireless_dev *wdev, u64 cookie,
64889588bbd5SJouni Malinen 					struct ieee80211_channel *chan,
64899588bbd5SJouni Malinen 					gfp_t gfp);
6490b23aa676SSamuel Ortiz 
64918689c051SArend van Spriel /**
64928689c051SArend van Spriel  * cfg80211_sinfo_alloc_tid_stats - allocate per-tid statistics.
64938689c051SArend van Spriel  *
64948689c051SArend van Spriel  * @sinfo: the station information
64958689c051SArend van Spriel  * @gfp: allocation flags
64968689c051SArend van Spriel  */
64978689c051SArend van Spriel int cfg80211_sinfo_alloc_tid_stats(struct station_info *sinfo, gfp_t gfp);
649898b62183SJohannes Berg 
649998b62183SJohannes Berg /**
65007ea3e110SJohannes Berg  * cfg80211_sinfo_release_content - release contents of station info
65017ea3e110SJohannes Berg  * @sinfo: the station information
65027ea3e110SJohannes Berg  *
65037ea3e110SJohannes Berg  * Releases any potentially allocated sub-information of the station
65047ea3e110SJohannes Berg  * information, but not the struct itself (since it's typically on
65057ea3e110SJohannes Berg  * the stack.)
65067ea3e110SJohannes Berg  */
65077ea3e110SJohannes Berg static inline void cfg80211_sinfo_release_content(struct station_info *sinfo)
65087ea3e110SJohannes Berg {
65097ea3e110SJohannes Berg 	kfree(sinfo->pertid);
65107ea3e110SJohannes Berg }
65117ea3e110SJohannes Berg 
65127ea3e110SJohannes Berg /**
651398b62183SJohannes Berg  * cfg80211_new_sta - notify userspace about station
651498b62183SJohannes Berg  *
651598b62183SJohannes Berg  * @dev: the netdev
651698b62183SJohannes Berg  * @mac_addr: the station's address
651798b62183SJohannes Berg  * @sinfo: the station information
651898b62183SJohannes Berg  * @gfp: allocation flags
651998b62183SJohannes Berg  */
652098b62183SJohannes Berg void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
652198b62183SJohannes Berg 		      struct station_info *sinfo, gfp_t gfp);
652298b62183SJohannes Berg 
6523026331c4SJouni Malinen /**
6524cf5ead82SJohannes Berg  * cfg80211_del_sta_sinfo - notify userspace about deletion of a station
6525cf5ead82SJohannes Berg  * @dev: the netdev
6526cf5ead82SJohannes Berg  * @mac_addr: the station's address
6527cf5ead82SJohannes Berg  * @sinfo: the station information/statistics
6528cf5ead82SJohannes Berg  * @gfp: allocation flags
6529cf5ead82SJohannes Berg  */
6530cf5ead82SJohannes Berg void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
6531cf5ead82SJohannes Berg 			    struct station_info *sinfo, gfp_t gfp);
6532cf5ead82SJohannes Berg 
6533cf5ead82SJohannes Berg /**
6534ec15e68bSJouni Malinen  * cfg80211_del_sta - notify userspace about deletion of a station
6535ec15e68bSJouni Malinen  *
6536ec15e68bSJouni Malinen  * @dev: the netdev
6537ec15e68bSJouni Malinen  * @mac_addr: the station's address
6538ec15e68bSJouni Malinen  * @gfp: allocation flags
6539ec15e68bSJouni Malinen  */
6540cf5ead82SJohannes Berg static inline void cfg80211_del_sta(struct net_device *dev,
6541cf5ead82SJohannes Berg 				    const u8 *mac_addr, gfp_t gfp)
6542cf5ead82SJohannes Berg {
6543cf5ead82SJohannes Berg 	cfg80211_del_sta_sinfo(dev, mac_addr, NULL, gfp);
6544cf5ead82SJohannes Berg }
6545ec15e68bSJouni Malinen 
6546ec15e68bSJouni Malinen /**
6547ed44a951SPandiyarajan Pitchaimuthu  * cfg80211_conn_failed - connection request failed notification
6548ed44a951SPandiyarajan Pitchaimuthu  *
6549ed44a951SPandiyarajan Pitchaimuthu  * @dev: the netdev
6550ed44a951SPandiyarajan Pitchaimuthu  * @mac_addr: the station's address
6551ed44a951SPandiyarajan Pitchaimuthu  * @reason: the reason for connection failure
6552ed44a951SPandiyarajan Pitchaimuthu  * @gfp: allocation flags
6553ed44a951SPandiyarajan Pitchaimuthu  *
6554ed44a951SPandiyarajan Pitchaimuthu  * Whenever a station tries to connect to an AP and if the station
6555ed44a951SPandiyarajan Pitchaimuthu  * could not connect to the AP as the AP has rejected the connection
6556ed44a951SPandiyarajan Pitchaimuthu  * for some reasons, this function is called.
6557ed44a951SPandiyarajan Pitchaimuthu  *
6558ed44a951SPandiyarajan Pitchaimuthu  * The reason for connection failure can be any of the value from
6559ed44a951SPandiyarajan Pitchaimuthu  * nl80211_connect_failed_reason enum
6560ed44a951SPandiyarajan Pitchaimuthu  */
6561ed44a951SPandiyarajan Pitchaimuthu void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr,
6562ed44a951SPandiyarajan Pitchaimuthu 			  enum nl80211_connect_failed_reason reason,
6563ed44a951SPandiyarajan Pitchaimuthu 			  gfp_t gfp);
6564ed44a951SPandiyarajan Pitchaimuthu 
6565ed44a951SPandiyarajan Pitchaimuthu /**
65662e161f78SJohannes Berg  * cfg80211_rx_mgmt - notification of received, unprocessed management frame
656771bbc994SJohannes Berg  * @wdev: wireless device receiving the frame
6568026331c4SJouni Malinen  * @freq: Frequency on which the frame was received in MHz
65696c2fb1e6SSergey Matyukevich  * @sig_dbm: signal strength in dBm, or 0 if unknown
65702e161f78SJohannes Berg  * @buf: Management frame (header + body)
6571026331c4SJouni Malinen  * @len: length of the frame data
657219504cf5SVladimir Kondratiev  * @flags: flags, as defined in enum nl80211_rxmgmt_flags
65732e161f78SJohannes Berg  *
65740ae997dcSYacine Belkadi  * This function is called whenever an Action frame is received for a station
65750ae997dcSYacine Belkadi  * mode interface, but is not processed in kernel.
65760ae997dcSYacine Belkadi  *
65770ae997dcSYacine Belkadi  * Return: %true if a user space application has registered for this frame.
65782e161f78SJohannes Berg  * For action frames, that makes it responsible for rejecting unrecognized
65792e161f78SJohannes Berg  * action frames; %false otherwise, in which case for action frames the
65802e161f78SJohannes Berg  * driver is responsible for rejecting the frame.
6581026331c4SJouni Malinen  */
658271bbc994SJohannes Berg bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
6583970fdfa8SVladimir Kondratiev 		      const u8 *buf, size_t len, u32 flags);
6584026331c4SJouni Malinen 
6585026331c4SJouni Malinen /**
65862e161f78SJohannes Berg  * cfg80211_mgmt_tx_status - notification of TX status for management frame
658771bbc994SJohannes Berg  * @wdev: wireless device receiving the frame
65882e161f78SJohannes Berg  * @cookie: Cookie returned by cfg80211_ops::mgmt_tx()
65892e161f78SJohannes Berg  * @buf: Management frame (header + body)
6590026331c4SJouni Malinen  * @len: length of the frame data
6591026331c4SJouni Malinen  * @ack: Whether frame was acknowledged
6592026331c4SJouni Malinen  * @gfp: context flags
6593026331c4SJouni Malinen  *
65942e161f78SJohannes Berg  * This function is called whenever a management frame was requested to be
65952e161f78SJohannes Berg  * transmitted with cfg80211_ops::mgmt_tx() to report the TX status of the
6596026331c4SJouni Malinen  * transmission attempt.
6597026331c4SJouni Malinen  */
659871bbc994SJohannes Berg void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
6599026331c4SJouni Malinen 			     const u8 *buf, size_t len, bool ack, gfp_t gfp);
6600026331c4SJouni Malinen 
6601d6dc1a38SJuuso Oikarinen 
6602d6dc1a38SJuuso Oikarinen /**
66036a671a50SDenis Kenzior  * cfg80211_rx_control_port - notification about a received control port frame
66046a671a50SDenis Kenzior  * @dev: The device the frame matched to
6605a948f713SDenis Kenzior  * @skb: The skbuf with the control port frame.  It is assumed that the skbuf
6606a948f713SDenis Kenzior  *	is 802.3 formatted (with 802.3 header).  The skb can be non-linear.
6607a948f713SDenis Kenzior  *	This function does not take ownership of the skb, so the caller is
6608a948f713SDenis Kenzior  *	responsible for any cleanup.  The caller must also ensure that
6609a948f713SDenis Kenzior  *	skb->protocol is set appropriately.
66106a671a50SDenis Kenzior  * @unencrypted: Whether the frame was received unencrypted
66116a671a50SDenis Kenzior  *
66126a671a50SDenis Kenzior  * This function is used to inform userspace about a received control port
66136a671a50SDenis Kenzior  * frame.  It should only be used if userspace indicated it wants to receive
66146a671a50SDenis Kenzior  * control port frames over nl80211.
66156a671a50SDenis Kenzior  *
66166a671a50SDenis Kenzior  * The frame is the data portion of the 802.3 or 802.11 data frame with all
66176a671a50SDenis Kenzior  * network layer headers removed (e.g. the raw EAPoL frame).
66186a671a50SDenis Kenzior  *
66196a671a50SDenis Kenzior  * Return: %true if the frame was passed to userspace
66206a671a50SDenis Kenzior  */
66216a671a50SDenis Kenzior bool cfg80211_rx_control_port(struct net_device *dev,
6622a948f713SDenis Kenzior 			      struct sk_buff *skb, bool unencrypted);
66236a671a50SDenis Kenzior 
66246a671a50SDenis Kenzior /**
6625d6dc1a38SJuuso Oikarinen  * cfg80211_cqm_rssi_notify - connection quality monitoring rssi event
6626d6dc1a38SJuuso Oikarinen  * @dev: network device
6627d6dc1a38SJuuso Oikarinen  * @rssi_event: the triggered RSSI event
6628bee427b8SAndrzej Zaborowski  * @rssi_level: new RSSI level value or 0 if not available
6629d6dc1a38SJuuso Oikarinen  * @gfp: context flags
6630d6dc1a38SJuuso Oikarinen  *
6631d6dc1a38SJuuso Oikarinen  * This function is called when a configured connection quality monitoring
6632d6dc1a38SJuuso Oikarinen  * rssi threshold reached event occurs.
6633d6dc1a38SJuuso Oikarinen  */
6634d6dc1a38SJuuso Oikarinen void cfg80211_cqm_rssi_notify(struct net_device *dev,
6635d6dc1a38SJuuso Oikarinen 			      enum nl80211_cqm_rssi_threshold_event rssi_event,
6636bee427b8SAndrzej Zaborowski 			      s32 rssi_level, gfp_t gfp);
6637d6dc1a38SJuuso Oikarinen 
6638c063dbf5SJohannes Berg /**
6639c063dbf5SJohannes Berg  * cfg80211_cqm_pktloss_notify - notify userspace about packetloss to peer
6640c063dbf5SJohannes Berg  * @dev: network device
6641c063dbf5SJohannes Berg  * @peer: peer's MAC address
6642c063dbf5SJohannes Berg  * @num_packets: how many packets were lost -- should be a fixed threshold
6643c063dbf5SJohannes Berg  *	but probably no less than maybe 50, or maybe a throughput dependent
6644c063dbf5SJohannes Berg  *	threshold (to account for temporary interference)
6645c063dbf5SJohannes Berg  * @gfp: context flags
6646c063dbf5SJohannes Berg  */
6647c063dbf5SJohannes Berg void cfg80211_cqm_pktloss_notify(struct net_device *dev,
6648c063dbf5SJohannes Berg 				 const u8 *peer, u32 num_packets, gfp_t gfp);
6649c063dbf5SJohannes Berg 
6650e5497d76SJohannes Berg /**
665184f10708SThomas Pedersen  * cfg80211_cqm_txe_notify - TX error rate event
665284f10708SThomas Pedersen  * @dev: network device
665384f10708SThomas Pedersen  * @peer: peer's MAC address
665484f10708SThomas Pedersen  * @num_packets: how many packets were lost
665584f10708SThomas Pedersen  * @rate: % of packets which failed transmission
665684f10708SThomas Pedersen  * @intvl: interval (in s) over which the TX failure threshold was breached.
665784f10708SThomas Pedersen  * @gfp: context flags
665884f10708SThomas Pedersen  *
665984f10708SThomas Pedersen  * Notify userspace when configured % TX failures over number of packets in a
666084f10708SThomas Pedersen  * given interval is exceeded.
666184f10708SThomas Pedersen  */
666284f10708SThomas Pedersen void cfg80211_cqm_txe_notify(struct net_device *dev, const u8 *peer,
666384f10708SThomas Pedersen 			     u32 num_packets, u32 rate, u32 intvl, gfp_t gfp);
666484f10708SThomas Pedersen 
666584f10708SThomas Pedersen /**
666698f03342SJohannes Berg  * cfg80211_cqm_beacon_loss_notify - beacon loss event
666798f03342SJohannes Berg  * @dev: network device
666898f03342SJohannes Berg  * @gfp: context flags
666998f03342SJohannes Berg  *
667098f03342SJohannes Berg  * Notify userspace about beacon loss from the connected AP.
667198f03342SJohannes Berg  */
667298f03342SJohannes Berg void cfg80211_cqm_beacon_loss_notify(struct net_device *dev, gfp_t gfp);
667398f03342SJohannes Berg 
667498f03342SJohannes Berg /**
66755b97f49dSJohannes Berg  * cfg80211_radar_event - radar detection event
66765b97f49dSJohannes Berg  * @wiphy: the wiphy
66775b97f49dSJohannes Berg  * @chandef: chandef for the current channel
66785b97f49dSJohannes Berg  * @gfp: context flags
66795b97f49dSJohannes Berg  *
66805b97f49dSJohannes Berg  * This function is called when a radar is detected on the current chanenl.
66815b97f49dSJohannes Berg  */
66825b97f49dSJohannes Berg void cfg80211_radar_event(struct wiphy *wiphy,
66835b97f49dSJohannes Berg 			  struct cfg80211_chan_def *chandef, gfp_t gfp);
66845b97f49dSJohannes Berg 
66855b97f49dSJohannes Berg /**
6686466b9936Stamizhr@codeaurora.org  * cfg80211_sta_opmode_change_notify - STA's ht/vht operation mode change event
6687466b9936Stamizhr@codeaurora.org  * @dev: network device
6688466b9936Stamizhr@codeaurora.org  * @mac: MAC address of a station which opmode got modified
6689466b9936Stamizhr@codeaurora.org  * @sta_opmode: station's current opmode value
6690466b9936Stamizhr@codeaurora.org  * @gfp: context flags
6691466b9936Stamizhr@codeaurora.org  *
6692466b9936Stamizhr@codeaurora.org  * Driver should call this function when station's opmode modified via action
6693466b9936Stamizhr@codeaurora.org  * frame.
6694466b9936Stamizhr@codeaurora.org  */
6695466b9936Stamizhr@codeaurora.org void cfg80211_sta_opmode_change_notify(struct net_device *dev, const u8 *mac,
6696466b9936Stamizhr@codeaurora.org 				       struct sta_opmode_info *sta_opmode,
6697466b9936Stamizhr@codeaurora.org 				       gfp_t gfp);
6698466b9936Stamizhr@codeaurora.org 
6699466b9936Stamizhr@codeaurora.org /**
67005b97f49dSJohannes Berg  * cfg80211_cac_event - Channel availability check (CAC) event
67015b97f49dSJohannes Berg  * @netdev: network device
67025b97f49dSJohannes Berg  * @chandef: chandef for the current channel
67035b97f49dSJohannes Berg  * @event: type of event
67045b97f49dSJohannes Berg  * @gfp: context flags
67055b97f49dSJohannes Berg  *
67065b97f49dSJohannes Berg  * This function is called when a Channel availability check (CAC) is finished
67075b97f49dSJohannes Berg  * or aborted. This must be called to notify the completion of a CAC process,
67085b97f49dSJohannes Berg  * also by full-MAC drivers.
67095b97f49dSJohannes Berg  */
67105b97f49dSJohannes Berg void cfg80211_cac_event(struct net_device *netdev,
67115b97f49dSJohannes Berg 			const struct cfg80211_chan_def *chandef,
67125b97f49dSJohannes Berg 			enum nl80211_radar_event event, gfp_t gfp);
67135b97f49dSJohannes Berg 
67145b97f49dSJohannes Berg 
67155b97f49dSJohannes Berg /**
6716e5497d76SJohannes Berg  * cfg80211_gtk_rekey_notify - notify userspace about driver rekeying
6717e5497d76SJohannes Berg  * @dev: network device
6718e5497d76SJohannes Berg  * @bssid: BSSID of AP (to avoid races)
6719e5497d76SJohannes Berg  * @replay_ctr: new replay counter
6720af71ff85SJohannes Berg  * @gfp: allocation flags
6721e5497d76SJohannes Berg  */
6722e5497d76SJohannes Berg void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
6723e5497d76SJohannes Berg 			       const u8 *replay_ctr, gfp_t gfp);
6724e5497d76SJohannes Berg 
6725c9df56b4SJouni Malinen /**
6726c9df56b4SJouni Malinen  * cfg80211_pmksa_candidate_notify - notify about PMKSA caching candidate
6727c9df56b4SJouni Malinen  * @dev: network device
6728c9df56b4SJouni Malinen  * @index: candidate index (the smaller the index, the higher the priority)
6729c9df56b4SJouni Malinen  * @bssid: BSSID of AP
6730c9df56b4SJouni Malinen  * @preauth: Whether AP advertises support for RSN pre-authentication
6731c9df56b4SJouni Malinen  * @gfp: allocation flags
6732c9df56b4SJouni Malinen  */
6733c9df56b4SJouni Malinen void cfg80211_pmksa_candidate_notify(struct net_device *dev, int index,
6734c9df56b4SJouni Malinen 				     const u8 *bssid, bool preauth, gfp_t gfp);
6735c9df56b4SJouni Malinen 
673628946da7SJohannes Berg /**
673728946da7SJohannes Berg  * cfg80211_rx_spurious_frame - inform userspace about a spurious frame
673828946da7SJohannes Berg  * @dev: The device the frame matched to
673928946da7SJohannes Berg  * @addr: the transmitter address
674028946da7SJohannes Berg  * @gfp: context flags
674128946da7SJohannes Berg  *
674228946da7SJohannes Berg  * This function is used in AP mode (only!) to inform userspace that
674328946da7SJohannes Berg  * a spurious class 3 frame was received, to be able to deauth the
674428946da7SJohannes Berg  * sender.
67450ae997dcSYacine Belkadi  * Return: %true if the frame was passed to userspace (or this failed
674628946da7SJohannes Berg  * for a reason other than not having a subscription.)
674728946da7SJohannes Berg  */
674828946da7SJohannes Berg bool cfg80211_rx_spurious_frame(struct net_device *dev,
674928946da7SJohannes Berg 				const u8 *addr, gfp_t gfp);
675028946da7SJohannes Berg 
67517f6cf311SJohannes Berg /**
6752b92ab5d8SJohannes Berg  * cfg80211_rx_unexpected_4addr_frame - inform about unexpected WDS frame
6753b92ab5d8SJohannes Berg  * @dev: The device the frame matched to
6754b92ab5d8SJohannes Berg  * @addr: the transmitter address
6755b92ab5d8SJohannes Berg  * @gfp: context flags
6756b92ab5d8SJohannes Berg  *
6757b92ab5d8SJohannes Berg  * This function is used in AP mode (only!) to inform userspace that
6758b92ab5d8SJohannes Berg  * an associated station sent a 4addr frame but that wasn't expected.
6759b92ab5d8SJohannes Berg  * It is allowed and desirable to send this event only once for each
6760b92ab5d8SJohannes Berg  * station to avoid event flooding.
67610ae997dcSYacine Belkadi  * Return: %true if the frame was passed to userspace (or this failed
6762b92ab5d8SJohannes Berg  * for a reason other than not having a subscription.)
6763b92ab5d8SJohannes Berg  */
6764b92ab5d8SJohannes Berg bool cfg80211_rx_unexpected_4addr_frame(struct net_device *dev,
6765b92ab5d8SJohannes Berg 					const u8 *addr, gfp_t gfp);
6766b92ab5d8SJohannes Berg 
6767b92ab5d8SJohannes Berg /**
67687f6cf311SJohannes Berg  * cfg80211_probe_status - notify userspace about probe status
67697f6cf311SJohannes Berg  * @dev: the device the probe was sent on
67707f6cf311SJohannes Berg  * @addr: the address of the peer
67717f6cf311SJohannes Berg  * @cookie: the cookie filled in @probe_client previously
67727f6cf311SJohannes Berg  * @acked: indicates whether probe was acked or not
6773c4b50cd3SVenkateswara Naralasetty  * @ack_signal: signal strength (in dBm) of the ACK frame.
6774c4b50cd3SVenkateswara Naralasetty  * @is_valid_ack_signal: indicates the ack_signal is valid or not.
67757f6cf311SJohannes Berg  * @gfp: allocation flags
67767f6cf311SJohannes Berg  */
67777f6cf311SJohannes Berg void cfg80211_probe_status(struct net_device *dev, const u8 *addr,
6778c4b50cd3SVenkateswara Naralasetty 			   u64 cookie, bool acked, s32 ack_signal,
6779c4b50cd3SVenkateswara Naralasetty 			   bool is_valid_ack_signal, gfp_t gfp);
67807f6cf311SJohannes Berg 
67815e760230SJohannes Berg /**
67825e760230SJohannes Berg  * cfg80211_report_obss_beacon - report beacon from other APs
67835e760230SJohannes Berg  * @wiphy: The wiphy that received the beacon
67845e760230SJohannes Berg  * @frame: the frame
67855e760230SJohannes Berg  * @len: length of the frame
67865e760230SJohannes Berg  * @freq: frequency the frame was received on
67876c2fb1e6SSergey Matyukevich  * @sig_dbm: signal strength in dBm, or 0 if unknown
67885e760230SJohannes Berg  *
67895e760230SJohannes Berg  * Use this function to report to userspace when a beacon was
67905e760230SJohannes Berg  * received. It is not useful to call this when there is no
67915e760230SJohannes Berg  * netdev that is in AP/GO mode.
67925e760230SJohannes Berg  */
67935e760230SJohannes Berg void cfg80211_report_obss_beacon(struct wiphy *wiphy,
67945e760230SJohannes Berg 				 const u8 *frame, size_t len,
679537c73b5fSBen Greear 				 int freq, int sig_dbm);
67965e760230SJohannes Berg 
6797d58e7e37SJohannes Berg /**
6798683b6d3bSJohannes Berg  * cfg80211_reg_can_beacon - check if beaconing is allowed
679954858ee5SAlexander Simon  * @wiphy: the wiphy
6800683b6d3bSJohannes Berg  * @chandef: the channel definition
6801174e0cd2SIlan Peer  * @iftype: interface type
6802d58e7e37SJohannes Berg  *
68030ae997dcSYacine Belkadi  * Return: %true if there is no secondary channel or the secondary channel(s)
68040ae997dcSYacine Belkadi  * can be used for beaconing (i.e. is not a radar channel etc.)
680554858ee5SAlexander Simon  */
6806683b6d3bSJohannes Berg bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
6807174e0cd2SIlan Peer 			     struct cfg80211_chan_def *chandef,
6808174e0cd2SIlan Peer 			     enum nl80211_iftype iftype);
680954858ee5SAlexander Simon 
6810923b352fSArik Nemtsov /**
6811923b352fSArik Nemtsov  * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation
6812923b352fSArik Nemtsov  * @wiphy: the wiphy
6813923b352fSArik Nemtsov  * @chandef: the channel definition
6814923b352fSArik Nemtsov  * @iftype: interface type
6815923b352fSArik Nemtsov  *
6816923b352fSArik Nemtsov  * Return: %true if there is no secondary channel or the secondary channel(s)
6817923b352fSArik Nemtsov  * can be used for beaconing (i.e. is not a radar channel etc.). This version
6818923b352fSArik Nemtsov  * also checks if IR-relaxation conditions apply, to allow beaconing under
6819923b352fSArik Nemtsov  * more permissive conditions.
6820923b352fSArik Nemtsov  *
6821923b352fSArik Nemtsov  * Requires the RTNL to be held.
6822923b352fSArik Nemtsov  */
6823923b352fSArik Nemtsov bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
6824923b352fSArik Nemtsov 				   struct cfg80211_chan_def *chandef,
6825923b352fSArik Nemtsov 				   enum nl80211_iftype iftype);
6826923b352fSArik Nemtsov 
68278097e149SThomas Pedersen /*
68285314526bSThomas Pedersen  * cfg80211_ch_switch_notify - update wdev channel and notify userspace
68295314526bSThomas Pedersen  * @dev: the device which switched channels
6830683b6d3bSJohannes Berg  * @chandef: the new channel definition
68315314526bSThomas Pedersen  *
6832e487eaebSSimon Wunderlich  * Caller must acquire wdev_lock, therefore must only be called from sleepable
6833e487eaebSSimon Wunderlich  * driver context!
68345314526bSThomas Pedersen  */
6835683b6d3bSJohannes Berg void cfg80211_ch_switch_notify(struct net_device *dev,
6836683b6d3bSJohannes Berg 			       struct cfg80211_chan_def *chandef);
68375314526bSThomas Pedersen 
6838f8d7552eSLuciano Coelho /*
6839f8d7552eSLuciano Coelho  * cfg80211_ch_switch_started_notify - notify channel switch start
6840f8d7552eSLuciano Coelho  * @dev: the device on which the channel switch started
6841f8d7552eSLuciano Coelho  * @chandef: the future channel definition
6842f8d7552eSLuciano Coelho  * @count: the number of TBTTs until the channel switch happens
6843f8d7552eSLuciano Coelho  *
6844f8d7552eSLuciano Coelho  * Inform the userspace about the channel switch that has just
6845f8d7552eSLuciano Coelho  * started, so that it can take appropriate actions (eg. starting
6846f8d7552eSLuciano Coelho  * channel switch on other vifs), if necessary.
6847f8d7552eSLuciano Coelho  */
6848f8d7552eSLuciano Coelho void cfg80211_ch_switch_started_notify(struct net_device *dev,
6849f8d7552eSLuciano Coelho 				       struct cfg80211_chan_def *chandef,
6850f8d7552eSLuciano Coelho 				       u8 count);
6851f8d7552eSLuciano Coelho 
68521ce3e82bSJohannes Berg /**
68531ce3e82bSJohannes Berg  * ieee80211_operating_class_to_band - convert operating class to band
68541ce3e82bSJohannes Berg  *
68551ce3e82bSJohannes Berg  * @operating_class: the operating class to convert
68561ce3e82bSJohannes Berg  * @band: band pointer to fill
68571ce3e82bSJohannes Berg  *
68581ce3e82bSJohannes Berg  * Returns %true if the conversion was successful, %false otherwise.
68591ce3e82bSJohannes Berg  */
68601ce3e82bSJohannes Berg bool ieee80211_operating_class_to_band(u8 operating_class,
686157fbcce3SJohannes Berg 				       enum nl80211_band *band);
68621ce3e82bSJohannes Berg 
6863a38700ddSArik Nemtsov /**
6864a38700ddSArik Nemtsov  * ieee80211_chandef_to_operating_class - convert chandef to operation class
6865a38700ddSArik Nemtsov  *
6866a38700ddSArik Nemtsov  * @chandef: the chandef to convert
6867a38700ddSArik Nemtsov  * @op_class: a pointer to the resulting operating class
6868a38700ddSArik Nemtsov  *
6869a38700ddSArik Nemtsov  * Returns %true if the conversion was successful, %false otherwise.
6870a38700ddSArik Nemtsov  */
6871a38700ddSArik Nemtsov bool ieee80211_chandef_to_operating_class(struct cfg80211_chan_def *chandef,
6872a38700ddSArik Nemtsov 					  u8 *op_class);
6873a38700ddSArik Nemtsov 
68745314526bSThomas Pedersen /*
68753475b094SJouni Malinen  * cfg80211_tdls_oper_request - request userspace to perform TDLS operation
68763475b094SJouni Malinen  * @dev: the device on which the operation is requested
68773475b094SJouni Malinen  * @peer: the MAC address of the peer device
68783475b094SJouni Malinen  * @oper: the requested TDLS operation (NL80211_TDLS_SETUP or
68793475b094SJouni Malinen  *	NL80211_TDLS_TEARDOWN)
68803475b094SJouni Malinen  * @reason_code: the reason code for teardown request
68813475b094SJouni Malinen  * @gfp: allocation flags
68823475b094SJouni Malinen  *
68833475b094SJouni Malinen  * This function is used to request userspace to perform TDLS operation that
68843475b094SJouni Malinen  * requires knowledge of keys, i.e., link setup or teardown when the AP
68853475b094SJouni Malinen  * connection uses encryption. This is optional mechanism for the driver to use
68863475b094SJouni Malinen  * if it can automatically determine when a TDLS link could be useful (e.g.,
68873475b094SJouni Malinen  * based on traffic and signal strength for a peer).
68883475b094SJouni Malinen  */
68893475b094SJouni Malinen void cfg80211_tdls_oper_request(struct net_device *dev, const u8 *peer,
68903475b094SJouni Malinen 				enum nl80211_tdls_operation oper,
68913475b094SJouni Malinen 				u16 reason_code, gfp_t gfp);
68923475b094SJouni Malinen 
68933475b094SJouni Malinen /*
68948097e149SThomas Pedersen  * cfg80211_calculate_bitrate - calculate actual bitrate (in 100Kbps units)
68958097e149SThomas Pedersen  * @rate: given rate_info to calculate bitrate from
68968097e149SThomas Pedersen  *
68978097e149SThomas Pedersen  * return 0 if MCS index >= 32
68988097e149SThomas Pedersen  */
68998eb41c8dSVladimir Kondratiev u32 cfg80211_calculate_bitrate(struct rate_info *rate);
69008097e149SThomas Pedersen 
690198104fdeSJohannes Berg /**
690298104fdeSJohannes Berg  * cfg80211_unregister_wdev - remove the given wdev
690398104fdeSJohannes Berg  * @wdev: struct wireless_dev to remove
690498104fdeSJohannes Berg  *
690598104fdeSJohannes Berg  * Call this function only for wdevs that have no netdev assigned,
690698104fdeSJohannes Berg  * e.g. P2P Devices. It removes the device from the list so that
690798104fdeSJohannes Berg  * it can no longer be used. It is necessary to call this function
690898104fdeSJohannes Berg  * even when cfg80211 requests the removal of the interface by
690998104fdeSJohannes Berg  * calling the del_virtual_intf() callback. The function must also
691098104fdeSJohannes Berg  * be called when the driver wishes to unregister the wdev, e.g.
691198104fdeSJohannes Berg  * when the device is unbound from the driver.
691298104fdeSJohannes Berg  *
691398104fdeSJohannes Berg  * Requires the RTNL to be held.
691498104fdeSJohannes Berg  */
691598104fdeSJohannes Berg void cfg80211_unregister_wdev(struct wireless_dev *wdev);
691698104fdeSJohannes Berg 
69170ee45355SJohannes Berg /**
6918355199e0SJouni Malinen  * struct cfg80211_ft_event - FT Information Elements
6919355199e0SJouni Malinen  * @ies: FT IEs
6920355199e0SJouni Malinen  * @ies_len: length of the FT IE in bytes
6921355199e0SJouni Malinen  * @target_ap: target AP's MAC address
6922355199e0SJouni Malinen  * @ric_ies: RIC IE
6923355199e0SJouni Malinen  * @ric_ies_len: length of the RIC IE in bytes
6924355199e0SJouni Malinen  */
6925355199e0SJouni Malinen struct cfg80211_ft_event_params {
6926355199e0SJouni Malinen 	const u8 *ies;
6927355199e0SJouni Malinen 	size_t ies_len;
6928355199e0SJouni Malinen 	const u8 *target_ap;
6929355199e0SJouni Malinen 	const u8 *ric_ies;
6930355199e0SJouni Malinen 	size_t ric_ies_len;
6931355199e0SJouni Malinen };
6932355199e0SJouni Malinen 
6933355199e0SJouni Malinen /**
6934355199e0SJouni Malinen  * cfg80211_ft_event - notify userspace about FT IE and RIC IE
6935355199e0SJouni Malinen  * @netdev: network device
6936355199e0SJouni Malinen  * @ft_event: IE information
6937355199e0SJouni Malinen  */
6938355199e0SJouni Malinen void cfg80211_ft_event(struct net_device *netdev,
6939355199e0SJouni Malinen 		       struct cfg80211_ft_event_params *ft_event);
6940355199e0SJouni Malinen 
6941355199e0SJouni Malinen /**
69420ee45355SJohannes Berg  * cfg80211_get_p2p_attr - find and copy a P2P attribute from IE buffer
69430ee45355SJohannes Berg  * @ies: the input IE buffer
69440ee45355SJohannes Berg  * @len: the input length
69450ee45355SJohannes Berg  * @attr: the attribute ID to find
69460ee45355SJohannes Berg  * @buf: output buffer, can be %NULL if the data isn't needed, e.g.
69470ee45355SJohannes Berg  *	if the function is only called to get the needed buffer size
69480ee45355SJohannes Berg  * @bufsize: size of the output buffer
69490ee45355SJohannes Berg  *
69500ee45355SJohannes Berg  * The function finds a given P2P attribute in the (vendor) IEs and
69510ee45355SJohannes Berg  * copies its contents to the given buffer.
69520ee45355SJohannes Berg  *
69530ae997dcSYacine Belkadi  * Return: A negative error code (-%EILSEQ or -%ENOENT) if the data is
69540ae997dcSYacine Belkadi  * malformed or the attribute can't be found (respectively), or the
69550ae997dcSYacine Belkadi  * length of the found attribute (which can be zero).
69560ee45355SJohannes Berg  */
6957c216e641SArend van Spriel int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
6958c216e641SArend van Spriel 			  enum ieee80211_p2p_attr_id attr,
6959c216e641SArend van Spriel 			  u8 *buf, unsigned int bufsize);
69600ee45355SJohannes Berg 
6961cd8f7cb4SJohannes Berg /**
696229464cccSJohannes Berg  * ieee80211_ie_split_ric - split an IE buffer according to ordering (with RIC)
696329464cccSJohannes Berg  * @ies: the IE buffer
696429464cccSJohannes Berg  * @ielen: the length of the IE buffer
696529464cccSJohannes Berg  * @ids: an array with element IDs that are allowed before
69662512b1b1SLiad Kaufman  *	the split. A WLAN_EID_EXTENSION value means that the next
69672512b1b1SLiad Kaufman  *	EID in the list is a sub-element of the EXTENSION IE.
696829464cccSJohannes Berg  * @n_ids: the size of the element ID array
696929464cccSJohannes Berg  * @after_ric: array IE types that come after the RIC element
697029464cccSJohannes Berg  * @n_after_ric: size of the @after_ric array
697129464cccSJohannes Berg  * @offset: offset where to start splitting in the buffer
697229464cccSJohannes Berg  *
697329464cccSJohannes Berg  * This function splits an IE buffer by updating the @offset
697429464cccSJohannes Berg  * variable to point to the location where the buffer should be
697529464cccSJohannes Berg  * split.
697629464cccSJohannes Berg  *
697729464cccSJohannes Berg  * It assumes that the given IE buffer is well-formed, this
697829464cccSJohannes Berg  * has to be guaranteed by the caller!
697929464cccSJohannes Berg  *
698029464cccSJohannes Berg  * It also assumes that the IEs in the buffer are ordered
698129464cccSJohannes Berg  * correctly, if not the result of using this function will not
698229464cccSJohannes Berg  * be ordered correctly either, i.e. it does no reordering.
698329464cccSJohannes Berg  *
698429464cccSJohannes Berg  * The function returns the offset where the next part of the
698529464cccSJohannes Berg  * buffer starts, which may be @ielen if the entire (remainder)
698629464cccSJohannes Berg  * of the buffer should be used.
698729464cccSJohannes Berg  */
698829464cccSJohannes Berg size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
698929464cccSJohannes Berg 			      const u8 *ids, int n_ids,
699029464cccSJohannes Berg 			      const u8 *after_ric, int n_after_ric,
699129464cccSJohannes Berg 			      size_t offset);
699229464cccSJohannes Berg 
699329464cccSJohannes Berg /**
699429464cccSJohannes Berg  * ieee80211_ie_split - split an IE buffer according to ordering
699529464cccSJohannes Berg  * @ies: the IE buffer
699629464cccSJohannes Berg  * @ielen: the length of the IE buffer
699729464cccSJohannes Berg  * @ids: an array with element IDs that are allowed before
69982512b1b1SLiad Kaufman  *	the split. A WLAN_EID_EXTENSION value means that the next
69992512b1b1SLiad Kaufman  *	EID in the list is a sub-element of the EXTENSION IE.
700029464cccSJohannes Berg  * @n_ids: the size of the element ID array
700129464cccSJohannes Berg  * @offset: offset where to start splitting in the buffer
700229464cccSJohannes Berg  *
700329464cccSJohannes Berg  * This function splits an IE buffer by updating the @offset
700429464cccSJohannes Berg  * variable to point to the location where the buffer should be
700529464cccSJohannes Berg  * split.
700629464cccSJohannes Berg  *
700729464cccSJohannes Berg  * It assumes that the given IE buffer is well-formed, this
700829464cccSJohannes Berg  * has to be guaranteed by the caller!
700929464cccSJohannes Berg  *
701029464cccSJohannes Berg  * It also assumes that the IEs in the buffer are ordered
701129464cccSJohannes Berg  * correctly, if not the result of using this function will not
701229464cccSJohannes Berg  * be ordered correctly either, i.e. it does no reordering.
701329464cccSJohannes Berg  *
701429464cccSJohannes Berg  * The function returns the offset where the next part of the
701529464cccSJohannes Berg  * buffer starts, which may be @ielen if the entire (remainder)
701629464cccSJohannes Berg  * of the buffer should be used.
701729464cccSJohannes Berg  */
70180483eeacSJohannes Berg static inline size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
70190483eeacSJohannes Berg 					const u8 *ids, int n_ids, size_t offset)
70200483eeacSJohannes Berg {
70210483eeacSJohannes Berg 	return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
70220483eeacSJohannes Berg }
702329464cccSJohannes Berg 
702429464cccSJohannes Berg /**
7025cd8f7cb4SJohannes Berg  * cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN
7026cd8f7cb4SJohannes Berg  * @wdev: the wireless device reporting the wakeup
7027cd8f7cb4SJohannes Berg  * @wakeup: the wakeup report
7028cd8f7cb4SJohannes Berg  * @gfp: allocation flags
7029cd8f7cb4SJohannes Berg  *
7030cd8f7cb4SJohannes Berg  * This function reports that the given device woke up. If it
7031cd8f7cb4SJohannes Berg  * caused the wakeup, report the reason(s), otherwise you may
7032cd8f7cb4SJohannes Berg  * pass %NULL as the @wakeup parameter to advertise that something
7033cd8f7cb4SJohannes Berg  * else caused the wakeup.
7034cd8f7cb4SJohannes Berg  */
7035cd8f7cb4SJohannes Berg void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
7036cd8f7cb4SJohannes Berg 				   struct cfg80211_wowlan_wakeup *wakeup,
7037cd8f7cb4SJohannes Berg 				   gfp_t gfp);
7038cd8f7cb4SJohannes Berg 
70395de17984SArend van Spriel /**
70405de17984SArend van Spriel  * cfg80211_crit_proto_stopped() - indicate critical protocol stopped by driver.
70415de17984SArend van Spriel  *
70425de17984SArend van Spriel  * @wdev: the wireless device for which critical protocol is stopped.
704303f831a6SRobert P. J. Day  * @gfp: allocation flags
70445de17984SArend van Spriel  *
70455de17984SArend van Spriel  * This function can be called by the driver to indicate it has reverted
70465de17984SArend van Spriel  * operation back to normal. One reason could be that the duration given
70475de17984SArend van Spriel  * by .crit_proto_start() has expired.
70485de17984SArend van Spriel  */
70495de17984SArend van Spriel void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp);
70505de17984SArend van Spriel 
7051bdfbec2dSIlan Peer /**
7052bdfbec2dSIlan Peer  * ieee80211_get_num_supported_channels - get number of channels device has
7053bdfbec2dSIlan Peer  * @wiphy: the wiphy
7054bdfbec2dSIlan Peer  *
7055bdfbec2dSIlan Peer  * Return: the number of channels supported by the device.
7056bdfbec2dSIlan Peer  */
7057bdfbec2dSIlan Peer unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy);
7058bdfbec2dSIlan Peer 
7059cb2d956dSLuciano Coelho /**
7060cb2d956dSLuciano Coelho  * cfg80211_check_combinations - check interface combinations
7061cb2d956dSLuciano Coelho  *
7062cb2d956dSLuciano Coelho  * @wiphy: the wiphy
7063e227300cSPurushottam Kushwaha  * @params: the interface combinations parameter
7064cb2d956dSLuciano Coelho  *
7065cb2d956dSLuciano Coelho  * This function can be called by the driver to check whether a
7066cb2d956dSLuciano Coelho  * combination of interfaces and their types are allowed according to
7067cb2d956dSLuciano Coelho  * the interface combinations.
7068cb2d956dSLuciano Coelho  */
7069cb2d956dSLuciano Coelho int cfg80211_check_combinations(struct wiphy *wiphy,
7070e227300cSPurushottam Kushwaha 				struct iface_combination_params *params);
7071cb2d956dSLuciano Coelho 
707265a124ddSMichal Kazior /**
707365a124ddSMichal Kazior  * cfg80211_iter_combinations - iterate over matching combinations
707465a124ddSMichal Kazior  *
707565a124ddSMichal Kazior  * @wiphy: the wiphy
7076e227300cSPurushottam Kushwaha  * @params: the interface combinations parameter
707765a124ddSMichal Kazior  * @iter: function to call for each matching combination
707865a124ddSMichal Kazior  * @data: pointer to pass to iter function
707965a124ddSMichal Kazior  *
708065a124ddSMichal Kazior  * This function can be called by the driver to check what possible
708165a124ddSMichal Kazior  * combinations it fits in at a given moment, e.g. for channel switching
708265a124ddSMichal Kazior  * purposes.
708365a124ddSMichal Kazior  */
708465a124ddSMichal Kazior int cfg80211_iter_combinations(struct wiphy *wiphy,
7085e227300cSPurushottam Kushwaha 			       struct iface_combination_params *params,
708665a124ddSMichal Kazior 			       void (*iter)(const struct ieee80211_iface_combination *c,
708765a124ddSMichal Kazior 					    void *data),
708865a124ddSMichal Kazior 			       void *data);
708965a124ddSMichal Kazior 
7090f04c2203SMichal Kazior /*
7091f04c2203SMichal Kazior  * cfg80211_stop_iface - trigger interface disconnection
7092f04c2203SMichal Kazior  *
7093f04c2203SMichal Kazior  * @wiphy: the wiphy
7094f04c2203SMichal Kazior  * @wdev: wireless device
7095f04c2203SMichal Kazior  * @gfp: context flags
7096f04c2203SMichal Kazior  *
7097f04c2203SMichal Kazior  * Trigger interface to be stopped as if AP was stopped, IBSS/mesh left, STA
7098f04c2203SMichal Kazior  * disconnected.
7099f04c2203SMichal Kazior  *
7100f04c2203SMichal Kazior  * Note: This doesn't need any locks and is asynchronous.
7101f04c2203SMichal Kazior  */
7102f04c2203SMichal Kazior void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev,
7103f04c2203SMichal Kazior 			 gfp_t gfp);
7104f04c2203SMichal Kazior 
7105f6837ba8SJohannes Berg /**
7106f6837ba8SJohannes Berg  * cfg80211_shutdown_all_interfaces - shut down all interfaces for a wiphy
7107f6837ba8SJohannes Berg  * @wiphy: the wiphy to shut down
7108f6837ba8SJohannes Berg  *
7109f6837ba8SJohannes Berg  * This function shuts down all interfaces belonging to this wiphy by
7110f6837ba8SJohannes Berg  * calling dev_close() (and treating non-netdev interfaces as needed).
7111f6837ba8SJohannes Berg  * It shouldn't really be used unless there are some fatal device errors
7112f6837ba8SJohannes Berg  * that really can't be recovered in any other way.
7113f6837ba8SJohannes Berg  *
7114f6837ba8SJohannes Berg  * Callers must hold the RTNL and be able to deal with callbacks into
7115f6837ba8SJohannes Berg  * the driver while the function is running.
7116f6837ba8SJohannes Berg  */
7117f6837ba8SJohannes Berg void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy);
7118f6837ba8SJohannes Berg 
7119d75bb06bSGautam Kumar Shukla /**
7120d75bb06bSGautam Kumar Shukla  * wiphy_ext_feature_set - set the extended feature flag
7121d75bb06bSGautam Kumar Shukla  *
7122d75bb06bSGautam Kumar Shukla  * @wiphy: the wiphy to modify.
7123d75bb06bSGautam Kumar Shukla  * @ftidx: extended feature bit index.
7124d75bb06bSGautam Kumar Shukla  *
7125d75bb06bSGautam Kumar Shukla  * The extended features are flagged in multiple bytes (see
7126d75bb06bSGautam Kumar Shukla  * &struct wiphy.@ext_features)
7127d75bb06bSGautam Kumar Shukla  */
7128d75bb06bSGautam Kumar Shukla static inline void wiphy_ext_feature_set(struct wiphy *wiphy,
7129d75bb06bSGautam Kumar Shukla 					 enum nl80211_ext_feature_index ftidx)
7130d75bb06bSGautam Kumar Shukla {
7131d75bb06bSGautam Kumar Shukla 	u8 *ft_byte;
7132d75bb06bSGautam Kumar Shukla 
7133d75bb06bSGautam Kumar Shukla 	ft_byte = &wiphy->ext_features[ftidx / 8];
7134d75bb06bSGautam Kumar Shukla 	*ft_byte |= BIT(ftidx % 8);
7135d75bb06bSGautam Kumar Shukla }
7136d75bb06bSGautam Kumar Shukla 
7137d75bb06bSGautam Kumar Shukla /**
7138d75bb06bSGautam Kumar Shukla  * wiphy_ext_feature_isset - check the extended feature flag
7139d75bb06bSGautam Kumar Shukla  *
7140d75bb06bSGautam Kumar Shukla  * @wiphy: the wiphy to modify.
7141d75bb06bSGautam Kumar Shukla  * @ftidx: extended feature bit index.
7142d75bb06bSGautam Kumar Shukla  *
7143d75bb06bSGautam Kumar Shukla  * The extended features are flagged in multiple bytes (see
7144d75bb06bSGautam Kumar Shukla  * &struct wiphy.@ext_features)
7145d75bb06bSGautam Kumar Shukla  */
7146d75bb06bSGautam Kumar Shukla static inline bool
7147d75bb06bSGautam Kumar Shukla wiphy_ext_feature_isset(struct wiphy *wiphy,
7148d75bb06bSGautam Kumar Shukla 			enum nl80211_ext_feature_index ftidx)
7149d75bb06bSGautam Kumar Shukla {
7150d75bb06bSGautam Kumar Shukla 	u8 ft_byte;
7151d75bb06bSGautam Kumar Shukla 
7152d75bb06bSGautam Kumar Shukla 	ft_byte = wiphy->ext_features[ftidx / 8];
7153d75bb06bSGautam Kumar Shukla 	return (ft_byte & BIT(ftidx % 8)) != 0;
7154d75bb06bSGautam Kumar Shukla }
7155b7ffbd7eSJohannes Berg 
7156a442b761SAyala Beker /**
7157a442b761SAyala Beker  * cfg80211_free_nan_func - free NAN function
7158a442b761SAyala Beker  * @f: NAN function that should be freed
7159a442b761SAyala Beker  *
7160a442b761SAyala Beker  * Frees all the NAN function and all it's allocated members.
7161a442b761SAyala Beker  */
7162a442b761SAyala Beker void cfg80211_free_nan_func(struct cfg80211_nan_func *f);
7163a442b761SAyala Beker 
716450bcd31dSAyala Beker /**
716550bcd31dSAyala Beker  * struct cfg80211_nan_match_params - NAN match parameters
716650bcd31dSAyala Beker  * @type: the type of the function that triggered a match. If it is
716750bcd31dSAyala Beker  *	 %NL80211_NAN_FUNC_SUBSCRIBE it means that we replied to a subscriber.
716850bcd31dSAyala Beker  *	 If it is %NL80211_NAN_FUNC_PUBLISH, it means that we got a discovery
716950bcd31dSAyala Beker  *	 result.
717050bcd31dSAyala Beker  *	 If it is %NL80211_NAN_FUNC_FOLLOW_UP, we received a follow up.
717150bcd31dSAyala Beker  * @inst_id: the local instance id
717250bcd31dSAyala Beker  * @peer_inst_id: the instance id of the peer's function
717350bcd31dSAyala Beker  * @addr: the MAC address of the peer
717450bcd31dSAyala Beker  * @info_len: the length of the &info
717550bcd31dSAyala Beker  * @info: the Service Specific Info from the peer (if any)
717650bcd31dSAyala Beker  * @cookie: unique identifier of the corresponding function
717750bcd31dSAyala Beker  */
717850bcd31dSAyala Beker struct cfg80211_nan_match_params {
717950bcd31dSAyala Beker 	enum nl80211_nan_function_type type;
718050bcd31dSAyala Beker 	u8 inst_id;
718150bcd31dSAyala Beker 	u8 peer_inst_id;
718250bcd31dSAyala Beker 	const u8 *addr;
718350bcd31dSAyala Beker 	u8 info_len;
718450bcd31dSAyala Beker 	const u8 *info;
718550bcd31dSAyala Beker 	u64 cookie;
718650bcd31dSAyala Beker };
718750bcd31dSAyala Beker 
718850bcd31dSAyala Beker /**
718950bcd31dSAyala Beker  * cfg80211_nan_match - report a match for a NAN function.
719050bcd31dSAyala Beker  * @wdev: the wireless device reporting the match
719150bcd31dSAyala Beker  * @match: match notification parameters
719250bcd31dSAyala Beker  * @gfp: allocation flags
719350bcd31dSAyala Beker  *
719450bcd31dSAyala Beker  * This function reports that the a NAN function had a match. This
719550bcd31dSAyala Beker  * can be a subscribe that had a match or a solicited publish that
719650bcd31dSAyala Beker  * was sent. It can also be a follow up that was received.
719750bcd31dSAyala Beker  */
719850bcd31dSAyala Beker void cfg80211_nan_match(struct wireless_dev *wdev,
719950bcd31dSAyala Beker 			struct cfg80211_nan_match_params *match, gfp_t gfp);
720050bcd31dSAyala Beker 
7201368e5a7bSAyala Beker /**
7202368e5a7bSAyala Beker  * cfg80211_nan_func_terminated - notify about NAN function termination.
7203368e5a7bSAyala Beker  *
7204368e5a7bSAyala Beker  * @wdev: the wireless device reporting the match
7205368e5a7bSAyala Beker  * @inst_id: the local instance id
7206368e5a7bSAyala Beker  * @reason: termination reason (one of the NL80211_NAN_FUNC_TERM_REASON_*)
7207368e5a7bSAyala Beker  * @cookie: unique NAN function identifier
7208368e5a7bSAyala Beker  * @gfp: allocation flags
7209368e5a7bSAyala Beker  *
7210368e5a7bSAyala Beker  * This function reports that the a NAN function is terminated.
7211368e5a7bSAyala Beker  */
7212368e5a7bSAyala Beker void cfg80211_nan_func_terminated(struct wireless_dev *wdev,
7213368e5a7bSAyala Beker 				  u8 inst_id,
7214368e5a7bSAyala Beker 				  enum nl80211_nan_func_term_reason reason,
7215368e5a7bSAyala Beker 				  u64 cookie, gfp_t gfp);
7216368e5a7bSAyala Beker 
7217b7ffbd7eSJohannes Berg /* ethtool helper */
7218b7ffbd7eSJohannes Berg void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
7219b7ffbd7eSJohannes Berg 
722040cbfa90SSrinivas Dasari /**
722140cbfa90SSrinivas Dasari  * cfg80211_external_auth_request - userspace request for authentication
722240cbfa90SSrinivas Dasari  * @netdev: network device
722340cbfa90SSrinivas Dasari  * @params: External authentication parameters
722440cbfa90SSrinivas Dasari  * @gfp: allocation flags
722540cbfa90SSrinivas Dasari  * Returns: 0 on success, < 0 on error
722640cbfa90SSrinivas Dasari  */
722740cbfa90SSrinivas Dasari int cfg80211_external_auth_request(struct net_device *netdev,
722840cbfa90SSrinivas Dasari 				   struct cfg80211_external_auth_params *params,
722940cbfa90SSrinivas Dasari 				   gfp_t gfp);
723040cbfa90SSrinivas Dasari 
72319bb7e0f2SJohannes Berg /**
72329bb7e0f2SJohannes Berg  * cfg80211_pmsr_report - report peer measurement result data
72339bb7e0f2SJohannes Berg  * @wdev: the wireless device reporting the measurement
72349bb7e0f2SJohannes Berg  * @req: the original measurement request
72359bb7e0f2SJohannes Berg  * @result: the result data
72369bb7e0f2SJohannes Berg  * @gfp: allocation flags
72379bb7e0f2SJohannes Berg  */
72389bb7e0f2SJohannes Berg void cfg80211_pmsr_report(struct wireless_dev *wdev,
72399bb7e0f2SJohannes Berg 			  struct cfg80211_pmsr_request *req,
72409bb7e0f2SJohannes Berg 			  struct cfg80211_pmsr_result *result,
72419bb7e0f2SJohannes Berg 			  gfp_t gfp);
72429bb7e0f2SJohannes Berg 
72439bb7e0f2SJohannes Berg /**
72449bb7e0f2SJohannes Berg  * cfg80211_pmsr_complete - report peer measurement completed
72459bb7e0f2SJohannes Berg  * @wdev: the wireless device reporting the measurement
72469bb7e0f2SJohannes Berg  * @req: the original measurement request
72479bb7e0f2SJohannes Berg  * @gfp: allocation flags
72489bb7e0f2SJohannes Berg  *
72499bb7e0f2SJohannes Berg  * Report that the entire measurement completed, after this
72509bb7e0f2SJohannes Berg  * the request pointer will no longer be valid.
72519bb7e0f2SJohannes Berg  */
72529bb7e0f2SJohannes Berg void cfg80211_pmsr_complete(struct wireless_dev *wdev,
72539bb7e0f2SJohannes Berg 			    struct cfg80211_pmsr_request *req,
72549bb7e0f2SJohannes Berg 			    gfp_t gfp);
72559bb7e0f2SJohannes Berg 
7256e1db74fcSJoe Perches /* Logging, debugging and troubleshooting/diagnostic helpers. */
7257e1db74fcSJoe Perches 
7258e1db74fcSJoe Perches /* wiphy_printk helpers, similar to dev_printk */
7259e1db74fcSJoe Perches 
7260e1db74fcSJoe Perches #define wiphy_printk(level, wiphy, format, args...)		\
72619c376639SJoe Perches 	dev_printk(level, &(wiphy)->dev, format, ##args)
7262e1db74fcSJoe Perches #define wiphy_emerg(wiphy, format, args...)			\
72639c376639SJoe Perches 	dev_emerg(&(wiphy)->dev, format, ##args)
7264e1db74fcSJoe Perches #define wiphy_alert(wiphy, format, args...)			\
72659c376639SJoe Perches 	dev_alert(&(wiphy)->dev, format, ##args)
7266e1db74fcSJoe Perches #define wiphy_crit(wiphy, format, args...)			\
72679c376639SJoe Perches 	dev_crit(&(wiphy)->dev, format, ##args)
7268e1db74fcSJoe Perches #define wiphy_err(wiphy, format, args...)			\
72699c376639SJoe Perches 	dev_err(&(wiphy)->dev, format, ##args)
7270e1db74fcSJoe Perches #define wiphy_warn(wiphy, format, args...)			\
72719c376639SJoe Perches 	dev_warn(&(wiphy)->dev, format, ##args)
7272e1db74fcSJoe Perches #define wiphy_notice(wiphy, format, args...)			\
72739c376639SJoe Perches 	dev_notice(&(wiphy)->dev, format, ##args)
7274e1db74fcSJoe Perches #define wiphy_info(wiphy, format, args...)			\
72759c376639SJoe Perches 	dev_info(&(wiphy)->dev, format, ##args)
7276073730d7SJoe Perches 
7277a58d7525SStanislaw Gruszka #define wiphy_err_ratelimited(wiphy, format, args...)		\
7278a58d7525SStanislaw Gruszka 	dev_err_ratelimited(&(wiphy)->dev, format, ##args)
7279a58d7525SStanislaw Gruszka #define wiphy_warn_ratelimited(wiphy, format, args...)		\
7280a58d7525SStanislaw Gruszka 	dev_warn_ratelimited(&(wiphy)->dev, format, ##args)
7281a58d7525SStanislaw Gruszka 
72829c376639SJoe Perches #define wiphy_debug(wiphy, format, args...)			\
7283e1db74fcSJoe Perches 	wiphy_printk(KERN_DEBUG, wiphy, format, ##args)
72849c376639SJoe Perches 
7285e1db74fcSJoe Perches #define wiphy_dbg(wiphy, format, args...)			\
72869c376639SJoe Perches 	dev_dbg(&(wiphy)->dev, format, ##args)
7287e1db74fcSJoe Perches 
7288e1db74fcSJoe Perches #if defined(VERBOSE_DEBUG)
7289e1db74fcSJoe Perches #define wiphy_vdbg	wiphy_dbg
7290e1db74fcSJoe Perches #else
7291e1db74fcSJoe Perches #define wiphy_vdbg(wiphy, format, args...)				\
7292e1db74fcSJoe Perches ({									\
7293e1db74fcSJoe Perches 	if (0)								\
7294e1db74fcSJoe Perches 		wiphy_printk(KERN_DEBUG, wiphy, format, ##args);	\
7295e1db74fcSJoe Perches 	0;								\
7296e1db74fcSJoe Perches })
7297e1db74fcSJoe Perches #endif
7298e1db74fcSJoe Perches 
7299e1db74fcSJoe Perches /*
7300e1db74fcSJoe Perches  * wiphy_WARN() acts like wiphy_printk(), but with the key difference
7301e1db74fcSJoe Perches  * of using a WARN/WARN_ON to get the message out, including the
7302e1db74fcSJoe Perches  * file/line information and a backtrace.
7303e1db74fcSJoe Perches  */
7304e1db74fcSJoe Perches #define wiphy_WARN(wiphy, format, args...)			\
7305e1db74fcSJoe Perches 	WARN(1, "wiphy: %s\n" format, wiphy_name(wiphy), ##args);
7306e1db74fcSJoe Perches 
7307cb74e977SSunil Dutt /**
7308cb74e977SSunil Dutt  * cfg80211_update_owe_info_event - Notify the peer's OWE info to user space
7309cb74e977SSunil Dutt  * @netdev: network device
7310cb74e977SSunil Dutt  * @owe_info: peer's owe info
7311cb74e977SSunil Dutt  * @gfp: allocation flags
7312cb74e977SSunil Dutt  */
7313cb74e977SSunil Dutt void cfg80211_update_owe_info_event(struct net_device *netdev,
7314cb74e977SSunil Dutt 				    struct cfg80211_update_owe_info *owe_info,
7315cb74e977SSunil Dutt 				    gfp_t gfp);
7316cb74e977SSunil Dutt 
7317704232c2SJohannes Berg #endif /* __NET_CFG80211_H */
7318